<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Script on Natenoms Blog</title><link>https://natenom.de/tags/script/</link><description>Recent content in Script on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Sat, 05 Aug 2023 00:31:18 +0200</lastBuildDate><atom:link href="https://natenom.de/tags/script/index.xml" rel="self" type="application/rss+xml"/><item><title>KDE Custom Shortcuts nach Shortcuts umziehen</title><link>https://natenom.de/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/</link><pubDate>Sat, 05 Aug 2023 00:31:18 +0200</pubDate><guid>https://natenom.de/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/</guid><description><![CDATA[<p>Gestern hatte ich in einem <a  class='urlextern'  href="https://pointieststick.com/2023/07/26/what-we-plan-to-remove-in-plasma-6/">Blogbeitrag</a> gelesen, dass im zukünftigen Plasma 6 ein paar Dinge wegfallen würden. Unter anderem KHotKeys, das den Bereich &ldquo;Custom Shortcuts&rdquo; in den Systemeinstellungen zur Verfügung stellt, da dieser schon seit über sieben Jahren nicht mehr gepflegt wurde.</p>
<p>Da fiel mir ein, dass ich genau dort ein paar Tastenkombinationen für meinen Desktop definiert habe.</p>]]></description><content:encoded><![CDATA[<p>Gestern hatte ich in einem <a  class='urlextern'  href="https://pointieststick.com/2023/07/26/what-we-plan-to-remove-in-plasma-6/">Blogbeitrag</a> gelesen, dass im zukünftigen Plasma 6 ein paar Dinge wegfallen würden. Unter anderem KHotKeys, das den Bereich &ldquo;Custom Shortcuts&rdquo; in den Systemeinstellungen zur Verfügung stellt, da dieser schon seit über sieben Jahren nicht mehr gepflegt wurde.</p>
<p>Da fiel mir ein, dass ich genau dort ein paar Tastenkombinationen für meinen Desktop definiert habe.</p>
<p>Auf der Community-Website von KDE ist auch zu lesen, dass es schon lange <a  class='urlextern'  href="https://api.kde.org/frameworks/kglobalaccel/html/index.html">KGlobalAccel</a> gibt, das mehr Funktionen bietet und auch gepflegt wird. Das ist wohl der Bereich &ldquo;Shortcuts&rdquo; in dein Systemeinstellungen von KDE.</p>
<p>Der obere Bereich gehört zu KGlobelAccel (Shortcuts) und der untere, der wegfallen wird, zu KHotKey (Custom Shortcuts):</p>
 <figure class="image-caption"><a href="2023-08-05T-plasma-shortcuts-custom-shortcuts-cover.webp"><picture><source type="webp" srcset="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-plasma-shortcuts-custom-shortcuts-cover.webp" />
			         <img alt="" src="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-plasma-shortcuts-custom-shortcuts-cover.webp" title="" width="534" height="188" loading="lazy" /></picture></a></figure>
<p>Vermutlich wird es dann auch keine Unterbereiche mehr in Shortcuts geben.</p>
<p>Und wie bekomme ich nun meine Scripte zum neueren KGlobalAccel?</p>
<p>So sieht der entsprechende Eintrag im alten Bereich &ldquo;Custom Shortcuts&rdquo; aus:
 <figure class="image-caption"><a href="2023-08-05T-khotkeys-yt-script.webp"><picture><source type="webp" srcset="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-khotkeys-yt-script.webp" />
			         <img alt="" src="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-khotkeys-yt-script.webp" title="" width="787" height="242" loading="lazy" /></picture></a></figure></p>
<p>Und so im neueren Bereich &ldquo;Shortcuts&rdquo;, nachdem man via <code>Add Command…</code> den Pfad zum Script angegeben hat:</p>
 <figure class="image-caption"><a href="2023-08-05T-kglobelaccel-yt-script.webp"><picture><source type="webp" srcset="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-kglobelaccel-yt-script.webp" />
			         <img alt="" src="/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-kglobelaccel-yt-script.webp" title="" width="787" height="242" loading="lazy" /></picture></a></figure>
<p>Um z. B. krusader mit der Tastenkombination <code>Win + e</code> zu starten, klickt man auf &ldquo;Add Application…&rdquo;, wählt krusader aus und stellt die Kombination ein.</p>
<p>Passt.</p>]]></content:encoded><enclosure url="https://natenom.de/2023/08/kde-custom-shortcuts-nach-shortcuts-umziehen/2023-08-05T-plasma-shortcuts-custom-shortcuts-cover.webp" length="8606" type="image/webp"/></item><item><title>Bilder für Hugo automatisch korrekt ausrichten</title><link>https://natenom.de/2022/09/bilder-fuer-hugo-automatisch-korrekt-ausrichten/</link><pubDate>Fri, 30 Sep 2022 11:23:14 +0200</pubDate><guid>https://natenom.de/2022/09/bilder-fuer-hugo-automatisch-korrekt-ausrichten/</guid><description><![CDATA[<p>Hugo ignoriert beim Erstellen von Zwischengrößen von Bildern die Metadaten (Exif). Das führt dazu, dass Bilder auf der Seite liegen, die eigentlich hochkant fotografiert wurden. Dazu hatte ich bereits einen Blogbeitrag geschrieben, <a  href="/2022/09/falsch-gedrehte-bilder-in-hugo-durch-verwendung-von-funktionen-zur-bildbearbeitung/">siehe hier</a>.</p>
<p>Heute habe ich dafür mal ein Bash-Script erstellt, um in einem Verzeichnis rekursiv alle Bilder zu finden, in denen die Rotation nur in den Exif-Daten enthalten ist, die aber auf Dateiebene nicht ausgerichtet sind.</p>]]></description><content:encoded><![CDATA[<p>Hugo ignoriert beim Erstellen von Zwischengrößen von Bildern die Metadaten (Exif). Das führt dazu, dass Bilder auf der Seite liegen, die eigentlich hochkant fotografiert wurden. Dazu hatte ich bereits einen Blogbeitrag geschrieben, <a  href="/2022/09/falsch-gedrehte-bilder-in-hugo-durch-verwendung-von-funktionen-zur-bildbearbeitung/">siehe hier</a>.</p>
<p>Heute habe ich dafür mal ein Bash-Script erstellt, um in einem Verzeichnis rekursiv alle Bilder zu finden, in denen die Rotation nur in den Exif-Daten enthalten ist, die aber auf Dateiebene nicht ausgerichtet sind.</p>
<p>Diese Dateien werden dann mit dem Tool <code>mogrify</code> korrekt ausgerichtet, die Orientierung aus Exif entfernt und die Dateien gespeichert. <code>mogrify</code> ist im Paket ImageMagick enthalten.</p>

<h2 id="das-script" data-numberify>Das Script<a class="anchor ms-1" href="#das-script"></a></h2>
<p>Da ich es bevorzuge, dass mir ein Script mitteilt, was es tut, gibt es eine Ausgabe für jede Datei, ob es Exifdaten zur Rotation gibt. Damit das besser lesbar ist, werden Zeilen ohne Match eingerückt.</p>
<p>Hier das Shell-Script (Bash):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>SEARCH_IN_PATH<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>1<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>cd <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>SEARCH_IN_PATH<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>shopt -s globstar
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> file in **/*; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#echo &#34;${file}&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -f <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        filename<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>basename <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        extension<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>filename##*.<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> <span style="color:#e6db74">${</span>extension<span style="color:#e6db74">}</span> <span style="color:#f92672">=</span>~ <span style="color:#f92672">(</span>webp|gif|jpg|jpeg|png<span style="color:#f92672">)</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>            exiftool <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> | grep <span style="color:#e6db74">&#34;^Orientation&#34;</span> | grep <span style="color:#e6db74">&#34;Rotate&#34;</span> &gt;/dev/null
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> $? <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>                echo <span style="color:#e6db74">&#34;Image found, mogrifiy: </span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                mogrify -auto-orient <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>                echo -e <span style="color:#e6db74">&#34;\tNo exif orientation: </span><span style="color:#e6db74">${</span>file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">done</span>
</span></span></code></pre></div><div class="shortcode-codewarning">
    <details>
    <summary class="shortcode-codewarning summary">Vorsicht beim Ausführen von Shellkommandos via Copy & Paste</summary>
        <div class="shortcode-codewarning content"><p>
        Man sollte Shellkommandos aus Anleitungen, die in einem Browser angezeigt werden, grundsätzlich nicht einfach ungeprüft in die Shell einfügen und ausführen.</p>
        <p>Denn es ist möglich, Teile des Codes z. B. via CSS zu verstecken. Diese Teile werden aber trotzdem kopiert und landen auch in der Shell, wo sie ausgeführt werden.</p>
        <p>Besser ist es, die Kommandos erst in einen lokalen Texteditor einzufügen und dort zu prüfen, bevor man die ausführt.<p>
        <p>Kopiere doch mal dieses Beispiel und füge es – in die Shell (!NEIN) – in einen Editor ein:</p>
        <p><code>echo "Befehl 1"; <span class="shortcode-codewarning hidden">echo "Befehl 2. Im Browser unsichtbar, da font-size per CSS auf 0 gestellt wurde. Hier könnte z. B. die Festplatte gelöscht oder andere Dummheiten gemacht werden."; </span>echo "Befehl 3"</code></p></div>
    </details>
</div>

<h2 id="für-alte-blogbeiträge" data-numberify>Für alte Blogbeiträge<a class="anchor ms-1" href="#für-alte-blogbeiträge"></a></h2>
<p>Somit reicht ein Aufruf auf der Konsole, um alle Bilder in meinem Blog zu &ldquo;reparieren&rdquo;.</p>
<p>Beispielaufruf für meinen Blog</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ hugo_find_fix_orientation.sh blog/posts/2022/2022-09-01-fotos-der-letzten-tage/
</span></span><span style="display:flex;"><span>        No exif orientation: cover.jpg
</span></span><span style="display:flex;"><span>Image found, mogrifiy: images/2022-01-19-hachelallee-1.jpg
</span></span><span style="display:flex;"><span>        No exif orientation: images/2022-01-19-hachelallee-2.jpg
</span></span><span style="display:flex;"><span>        No exif orientation: images/2022-01-fahrrad-zob-pforzheim.jpg
</span></span><span style="display:flex;"><span>        No exif orientation: images/2022-01-schwann-radstation.jpg
</span></span><span style="display:flex;"><span>        No exif orientation: images/2022-01-wald-mit-sonne.jpg
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>…<span style="color:#f92672">]</span>
</span></span></code></pre></div><p>Insgesamt 25 Dateien wurden so gefunden und korrekt ausgerichtet.</p>
<p>Beim nächsten Rendern des Blogs erkennt Hugo die geänderten Bilddateien und erstellt dann automatisch neue Zwischengrößen daraus.</p>

<h2 id="für-neue-blogbeiträge" data-numberify>Für neue Blogbeiträge<a class="anchor ms-1" href="#für-neue-blogbeiträge"></a></h2>
<p>Das Script kann ich jetzt auch verwenden, um Bilder neuer Blogbeiträge automatisch korrekt auszurichten. Sobald ein Blogbeitrag fertig ist, lasse ich das Script einmalig über das <code>Page Bundle</code> laufen.</p>]]></content:encoded></item><item><title>Ein Python-Script für die Arbeit mit Hugo (Update 2024-01-09)</title><link>https://natenom.de/2022/03/python-script-fuer-die-arbeit-mit-hugo/</link><pubDate>Thu, 24 Mar 2022 05:35:39 +0100</pubDate><guid>https://natenom.de/2022/03/python-script-fuer-die-arbeit-mit-hugo/</guid><description><![CDATA[<p>Bei der <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">Umstellung meines Blogs auf Hugo</a> hatte ich mehrere Shell-Aliase in der <code>.bashrc</code> erstellt, um die Arbeit einfacher zu gestalten, wie z. B. eine tmux-Session im Verzeichnis der Website starten, nach Seitennamen, Kategorien und Tags zu suchen und einiges mehr. Es wurden immer mehr Aliase und es war nicht wirklich flexibel sondern nur richtig hacky.</p>]]></description><content:encoded><![CDATA[<p>Bei der <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">Umstellung meines Blogs auf Hugo</a> hatte ich mehrere Shell-Aliase in der <code>.bashrc</code> erstellt, um die Arbeit einfacher zu gestalten, wie z. B. eine tmux-Session im Verzeichnis der Website starten, nach Seitennamen, Kategorien und Tags zu suchen und einiges mehr. Es wurden immer mehr Aliase und es war nicht wirklich flexibel sondern nur richtig hacky.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">Update (2024-01-09): Ich habe eine ganz neue Version des Python-Scripts veröffentlicht, das deutlich mehr kann, siehe <a  href="/2024/01/wofuer-ich-mein-hugo-helper-python-script-verwende-und-wo-man-es-findet/">in diesem Blogbeitrag</a>.</div>
</div>


<p>Spätestens seitdem ich auch <a  href="/2022/03/umzug-dokuwiki-hugo-1-vorarbeiten/">mein neues Wiki mit Hugo</a> nutze, funktionieren die vielen Aliase nicht mehr, denn ich bräuchte alles doppelt, um auch die Arbeit mit meinem Wiki damit bewerkstelligen zu können. Flexibel ist anders.</p>
<p>Und weil auch Vri in Zukunft in der Lage sein soll, sowohl im Wiki als auch im Blog Dinge zu tun, musste ich da was Schönes bauen. Denn meine vorherige Frickellösung könnte ich guten Gewissens niemandem zumuten.</p>
<p>Also habe ich heute Nacht ohne Ahnung und viel $Suchmaschine ein Python-Script erstellt, das die ganzen Shell-Aliase ersetzt und jetzt für beliebig viele Webseiten funktioniert. Und dabei habe ich sogar einen fiesen Bug in der <a  class='urlextern'  href="https://community.kde.org/Plasma">Plasmashell</a> gefunden.</p>

<h2 id="was-kann-das-script" data-numberify>Was kann das Script?<a class="anchor ms-1" href="#was-kann-das-script"></a></h2>
<p>Mit dem neuen Script kann ich sehr einfach:</p>
<ul>
<li>Eine Website generieren lassen.</li>
<li>Eine Website hochladen (mit rsync synchronisieren).</li>
<li>Die beiden oberen Dinge in einem Aufruf.</li>
<li>Eine Website lokal zur Verfügung stellen (<code>hugo server</code>).</li>
<li>Eine tmux-Session innerhalb des lokalen Verzeichnisses starten, um dort z. B. git zu verwenden.</li>
<li>(Nur im Blog) nach verwendeten Tags und nach Kategorien suchen. Dabei funktionieren sowohl einfache Strings als auch Reguläre Ausdrücke.</li>
<li>Mittels <code>grep -r</code> suchen.</li>
<li>Aktuelle Uhrzeit inklusive Datum und Zeitzone erhalten. Für das Front Matter (Metadaten einer einzelnen Seite).</li>
</ul>
<p>Hier z. B. die Suche nach allen Seiten im Blog, in denen der String <code>hugo</code> vorkommt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[…]
</span></span><span style="display:flex;"><span>content/posts/2016/2016-12-02-hugo-kann-mehrsprachig.md,,Hugo kann mehrsprachig :),2016-12-02T13:29:05Z,0001-01-01T00:00:00Z,2016-12-02T13:29:05Z,false,/2016/12/hugo-kann-mehrsprachig/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>content/posts/2015/2015-12-10-gpeasy-php-durch-hugo-statisches-html-ersetzt.md,,gpEasy (PHP) durch Hugo (statisches HTML) ersetzt,2015-12-10T13:05:11Z,0001-01-01T00:00:00Z,2015-12-10T13:05:11Z,false,/2015/12/gpeasy-php-durch-hugo-statisches-html-ersetzt/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Format: path,slug,title,date,expiryDate,publishDate,draft,permalink
</span></span><span style="display:flex;"><span>Results for &#39;hugo&#39;: 27</span></span></code></pre></div>

<h3 id="externe-konfiguration" data-numberify>Externe Konfiguration<a class="anchor ms-1" href="#externe-konfiguration"></a></h3>
<p>Die Konfigurationsdatei mit den Einstellungen für beliebig viele Websites liegt in <code>~/.config/hugo-noms.conf</code>.</p>

<h3 id="hilfe" data-numberify>Hilfe<a class="anchor ms-1" href="#hilfe"></a></h3>
<p>Da das Script <a  class='urlextern'  href="https://docs.python.org/3/library/argparse.html">argparse</a> verwendet, gibt es automatisch eine schöne Hilfe: <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>usage: hg.py [-h] [--site SITE_NAME | --time | --printconfig | --sites]
</span></span><span style="display:flex;"><span>             [--cd | --build | --upload | --deploy | --tmux | --serve | --serve_light]
</span></span><span style="display:flex;"><span>             [--searchpost SEARCHPOST | --searchgrep SEARCHGREP | --searchtag SEARCHTAG | --searchcat SEARCHCAT]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Handles hugo stuff.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>optional arguments:
</span></span><span style="display:flex;"><span>  -h, --help            show this help message and exit
</span></span><span style="display:flex;"><span>  --site SITE_NAME      Name of the website to work on currently.
</span></span><span style="display:flex;"><span>  --time                Copy current date and time to clipboard.
</span></span><span style="display:flex;"><span>  --printconfig         Print the devices configuration.
</span></span><span style="display:flex;"><span>  --sites               Print sites from configuration
</span></span><span style="display:flex;"><span>  --cd                  Change directory to workdir of site.
</span></span><span style="display:flex;"><span>  --build               Build a site.
</span></span><span style="display:flex;"><span>  --upload              Build AND upload site to remote.
</span></span><span style="display:flex;"><span>  --deploy              Deploy (build AND upload) a site.
</span></span><span style="display:flex;"><span>  --tmux                Start the tmux session for --site.
</span></span><span style="display:flex;"><span>  --serve               Serves site (full).
</span></span><span style="display:flex;"><span>  --serve_light         Serves site (light).
</span></span><span style="display:flex;"><span>  --searchpost SEARCHPOST
</span></span><span style="display:flex;"><span>                        Find pages/posts containing search term in &#39;path, slug, title, date or permalink&#39;.
</span></span><span style="display:flex;"><span>                        Strings and Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchgrep SEARCHGREP
</span></span><span style="display:flex;"><span>                        Find pages/posts containing search term in file content. Uses &#39;grep -r&#39;. Strings and
</span></span><span style="display:flex;"><span>                        Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchtag SEARCHTAG
</span></span><span style="display:flex;"><span>                        Find tags containing search term. Strings and Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchcat SEARCHCAT
</span></span><span style="display:flex;"><span>                        Find categories containing search term. Strings and Regular Expressions (regex) are
</span></span><span style="display:flex;"><span>                        allowed.</span></span></code></pre></div>

<h2 id="wo-gibts-das-script" data-numberify>Wo gibts das Script?<a class="anchor ms-1" href="#wo-gibts-das-script"></a></h2>
<p>Vielleicht kann das ja noch jemand gebrauchen. Ich weiß aktuell nicht, wo ich es hinschubsen könnte, daher liegt es jetzt erst einmal in meinem Wiki im neuen Bereich <code>Hugo</code>, <a  href="https://wiki.natenom.de/docs/sammelsurium/hugo/">siehe hier</a>.</p>

<h2 id="nur-noch-zwei-aliase" data-numberify>Nur noch zwei Aliase<a class="anchor ms-1" href="#nur-noch-zwei-aliase"></a></h2>
<p>Da ich ein extrem fauler Mensch bin, habe ich aber später trotzdem noch zwei Aliase in der <code>.bashrc</code> definiert:</p>
<pre><code>alias hgb='/pfad/zu/hg.py --site blog'
alias hgw='/pfad/zu/hg.py --site wiki'
</code></pre>
<p>Somit kann ich z. B.</p>
<pre><code>hg.py --site blog --tmux
</code></pre>
<p>abkürzen mit</p>
<pre><code>hgb --tmux
</code></pre>
<p>🙂</p>

<h2 id="bug-in-plasmashell" data-numberify>Bug in Plasmashell<a class="anchor ms-1" href="#bug-in-plasmashell"></a></h2>
<p>Ruft man ein Script mit diesen beiden Zeilen auf oder führt es in iPython aus, dann hängt sich die Plasmashell entweder für ein paar Sekunden, lange oder komplett auf. Der String landet trotzdem nicht in der Zwischenablage obwohl xclip als auch xsel installiert sind.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> pyperclip
</span></span><span style="display:flex;"><span>pyperclip<span style="color:#f92672">.</span>copy(<span style="color:#e6db74">&#34;text&#34;</span>)</span></span></code></pre></div>
<p>Ich wollte diese Funktion nutzen, um einen generierten String mit Datum, Uhrzeit und Zeitzone in die Zwischenablage zu kopieren, um diesen dann im Front Matter eines Blogbeitrags manuell über die Zwischenablage einfügen zu können. Stattdessen nutze ich jetzt <code>os.system(&quot;date … | xsel …&quot;)</code>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>schlechtes Englisch darf behalten werden 🙂&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded></item><item><title>Shell Script konvertiert Markdown-Dateien zu Page Bundles</title><link>https://natenom.de/2022/02/script-konvertierung-markdown-nach-page-bundle/</link><pubDate>Thu, 17 Feb 2022 17:07:03 +0100</pubDate><guid>https://natenom.de/2022/02/script-konvertierung-markdown-nach-page-bundle/</guid><description>Ich habe dieses schöne Shell-Script gefunden, welches automatisch alle Markdown-Dateien im content-Verzeichnis einer Hugo-Website in so genannte Page Bundles konvertiert.
Das bedeutet, dass aus so einer Verzeichnisstruktur
content/ blog-beitrag-1.md blog-beitrag-2.md noch-ein-toller-beitrag.md eine solche Verzeichnisstruktur wird
content/ blog-beitrag-1/ index.md blog-beitrag-2/ index.md noch-ein-toller-beitrag/ index.md Die Inhalte der Dateien landen dabei in der jeweiligen index.md.</description><content:encoded><![CDATA[<p>Ich habe dieses schöne <a  class='urlextern'  href="https://github.com/wowchemy/awesome-hugo/blob/main/refactor-pages-to-page-bundles.sh">Shell-Script</a> gefunden, welches automatisch alle Markdown-Dateien im <code>content</code>-Verzeichnis einer Hugo-Website in so genannte Page Bundles konvertiert.</p>
<p>Das bedeutet, dass aus so einer Verzeichnisstruktur</p>
<pre tabindex="0"><code>content/
  blog-beitrag-1.md
  blog-beitrag-2.md
  noch-ein-toller-beitrag.md
</code></pre><p>eine solche Verzeichnisstruktur wird</p>
<pre tabindex="0"><code>content/
    blog-beitrag-1/
        index.md
    blog-beitrag-2/
        index.md
    noch-ein-toller-beitrag/
        index.md
</code></pre><p>Die Inhalte der Dateien landen dabei in der jeweiligen <code>index.md</code>.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/script-konvertierung-markdown-nach-page-bundle/2022-02-17-cover-file-to-page-bundle.png" length="20226" type="image/png"/></item><item><title>Alte Tweets, Likes, Retweets auf Twitter und Toots, Likes und Boosts auf Mastodon automatisiert löschen</title><link>https://natenom.de/2021/05/altes-mastodon-twitter-loeschen/</link><pubDate>Tue, 04 May 2021 03:25:43 +0000</pubDate><guid>https://natenom.de/2021/05/altes-mastodon-twitter-loeschen/</guid><description><![CDATA[<p>Wenn ich bei Twitter nicht alle x Zeit alte Tweets löschen würde, hätte ich dort vermutlich schon über 10.000 Tweets. Bei Mastodon wäre es sehr viel weniger, weil es dort nur wenig Kommunikation gibt.</p>
<p>Ich sehe beide Plattformen nicht als Archiv für die Ewigkeit, sondern als Kommunikationsplattform für den Moment. Das heißt, ich lösche alte Tweets und Toots.</p>
<p>Früher habe ich das nur selten manuell gemacht. Es war sehr umständlich und hat sehr lange gedauert. Dann habe ich zuerst ein Tool für Twitter gefunden und später eines für Mastodon.</p>]]></description><content:encoded><![CDATA[<p>Wenn ich bei Twitter nicht alle x Zeit alte Tweets löschen würde, hätte ich dort vermutlich schon über 10.000 Tweets. Bei Mastodon wäre es sehr viel weniger, weil es dort nur wenig Kommunikation gibt.</p>
<p>Ich sehe beide Plattformen nicht als Archiv für die Ewigkeit, sondern als Kommunikationsplattform für den Moment. Das heißt, ich lösche alte Tweets und Toots.</p>
<p>Früher habe ich das nur selten manuell gemacht. Es war sehr umständlich und hat sehr lange gedauert. Dann habe ich zuerst ein Tool für Twitter gefunden und später eines für Mastodon.</p>
<p>Seitdem mache ich das automatisiert alle paar Tage und lösche so Tweets, Replies, Retweets und Likes auf Twitter und Toots, Likes und Boosts auf Mastodon.</p>
<p>Für diejenigen Menschen, die das auch automatisiert machen möchten, habe ich auf zwei Seiten in meinem Wiki beschrieben, wie man die Tools installiert und verwendet. Dazu gibt es auch jeweils ein kleines Script.</p>
<p>Zum Löschen von Daten auf Twitter <a  href="https://wiki.natenom.de/docs/sammelsurium/semiphemeral">siehe hier</a>.</p>
<p>Zum Löschen von Daten auf Mastodon <a  href="https://wiki.natenom.de/docs/sammelsurium/ephemetoot">siehe hier</a>.</p>]]></content:encoded></item><item><title>Shellscript für Linux zum Testen auf Meltdown und Spectre</title><link>https://natenom.de/2018/01/shellscript-fuer-linux-zum-testen-auf-meltdown-und-spectre/</link><pubDate>Sat, 20 Jan 2018 13:06:29 +0000</pubDate><guid>https://natenom.de/2018/01/shellscript-fuer-linux-zum-testen-auf-meltdown-und-spectre/</guid><description>https://github.com/speed47/spectre-meltdown-checker
(Gefunden bei Admin-Magazin)</description><content:encoded><![CDATA[<p><a  class='urlextern'  href="https://github.com/speed47/spectre-meltdown-checker">https://github.com/speed47/spectre-meltdown-checker</a></p>
<p>(Gefunden bei <a  class='urlextern'  href="http://www.admin-magazin.de/News/Skript-testet-Linux-auf-Meltdown-und-Spectre">Admin-Magazin</a>)</p>
]]></content:encoded></item><item><title>acme.sh – Shellscript für LetsEncrypt TLS-Zertifikate</title><link>https://natenom.de/2017/11/acme-sh-shellscript-fuer-letsencrypt-tls-zertifikate/</link><pubDate>Tue, 14 Nov 2017 10:12:32 +0000</pubDate><guid>https://natenom.de/2017/11/acme-sh-shellscript-fuer-letsencrypt-tls-zertifikate/</guid><description><![CDATA[<p>TLS-Zertifikate von <a  class='urlextern'  href="https://letsencrypt.org/">LetsEncrypt</a> nutze ich seit der <a  href="/2015/11/https-for-natenoms-websites-thanks-letsencrypt-d/">„Closed Beta“</a> (2015). Von Anfang an hatte ich dafür das damals promotete Python-Script <a  class='urlextern'  href="https://github.com/certbot/certbot">Certbot</a> benutzt.</p>]]></description><content:encoded><![CDATA[<p>TLS-Zertifikate von <a  class='urlextern'  href="https://letsencrypt.org/">LetsEncrypt</a> nutze ich seit der <a  href="/2015/11/https-for-natenoms-websites-thanks-letsencrypt-d/">„Closed Beta“</a> (2015). Von Anfang an hatte ich dafür das damals promotete Python-Script <a  class='urlextern'  href="https://github.com/certbot/certbot">Certbot</a> benutzt.</p>
<p>Das ist aber nicht unbedingt schön, da es viele Abhängigkeiten nachinstalliert und sich eine eigene Python-Umgebung zurecht bastelt.</p>
<p>Daher steht seit längerem auf meiner Todo-Liste, ein möglichst einfaches Shell-Script für die Nutzung der LetsEncrypt-Zertifikate zu verwenden. Heute habe ich das auf einem meiner Server eingerichtet und es soll hier dokumentiert werden.</p>
<p>Verwendet habe ich das Shell-Script <a  class='urlextern'  href="https://github.com/Neilpang/acme.sh">acme.sh</a>.</p>
<p>Dies ist kein Howto, wie man LetsEncrypt nutzt; ich gehe davon aus, dass man Webserver usw. bereits darauf eingerichtet hat. Hier geht es nur darum, wie man acme.sh installiert und verwendet.</p>

<h2 id="installation" data-numberify>Installation<a class="anchor ms-1" href="#installation"></a></h2>
<p>Alle Befehle werden als root ausgeführt.</p>
<pre><code>apt-get install socat git
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install \
--home /root/.acme.sh \
--certhome /etc/acme/certs \
--accountemail &quot;mail@bladomain.tld&quot; \
--nocron
</code></pre>
<p>Auf die angegebene E-Mail-Adresse erhält man vor Ablauf eines Zertifikats entsprechende Erinnerungen.</p>
<p>Jetzt kann man das Verzeichnis <code>acme.sh</code> löschen. Das installierte Script hat selbst einen Update-Mechanismus.</p>
<p>Ausloggen und wieder einloggen, damit das Alias nutzbar wird.</p>

<h2 id="neues-zertifikate-beantragen" data-numberify>Neue(s) Zertifikat(e) beantragen<a class="anchor ms-1" href="#neues-zertifikate-beantragen"></a></h2>
<p>Wieder alles als root ausführen.</p>
<p>Man muss den Webserver beenden, damit der entsprechende Port vom Standalone-Server (socat) genutzt werden kann.</p>
<pre><code>systemctl stop apache2
acme.sh --tls --issue -d mumble.natenom.com -d m.natenom.com
</code></pre>
<p>Die Ausgabe sieht so aus:</p>
<pre><code>[Fri Nov 10 03:56:59 CET 2017] Standalone tls mode.
[...]
[Fri Nov 10 03:57:00 CET 2017] Registering account
[Fri Nov 10 03:57:02 CET 2017] Registered
[Fri Nov 10 03:57:03 CET 2017] Update account tos info success.
[Fri Nov 10 03:57:03 CET 2017] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxxxxxx'
[Fri Nov 10 03:57:03 CET 2017] Creating domain key
[Fri Nov 10 03:57:04 CET 2017] The domain key is here: /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.key
[Fri Nov 10 03:57:04 CET 2017] Multi domain='DNS:mumble.natenom.com,DNS:m.natenom.com'
[Fri Nov 10 03:57:04 CET 2017] Getting domain auth token for each domain
[Fri Nov 10 03:57:04 CET 2017] Getting webroot for domain='mumble.natenom.com'
[Fri Nov 10 03:57:04 CET 2017] Getting new-authz for domain='mumble.natenom.com'
[Fri Nov 10 03:57:05 CET 2017] The new-authz request is ok.
[...]
[Fri Nov 10 03:57:11 CET 2017] Verifying:mumble.natenom.com
[Fri Nov 10 03:57:11 CET 2017] Starting tls server.
[Fri Nov 10 03:57:11 CET 2017] Multi domain='DNS:xxxxxxxxxxxx.acme.invalid'
[Fri Nov 10 03:57:16 CET 2017] Success
/root/.acme.sh/acme.sh: line 3589: 20206 Terminated $__S_OPENSSL &amp;gt; /dev/null 2&amp;gt;&amp;1
[...]
[Fri Nov 10 03:57:48 CET 2017] Verify finished, start to sign.
[Fri Nov 10 03:57:49 CET 2017] Cert success.
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
[Fri Nov 10 03:57:49 CET 2017] Your cert is in /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.cer
[Fri Nov 10 03:57:49 CET 2017] Your cert key is in /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.key
[Fri Nov 10 03:57:49 CET 2017] The intermediate CA cert is in /etc/acme/certs/mumble.natenom.com/ca.cer
[Fri Nov 10 03:57:50 CET 2017] And the full chain certs is there: /etc/acme/certs/mumble.natenom.com/fullchain.cer
systemctl start apache2
</code></pre>
<p>Die Zertifikat relevanten Dateien sind danach im Verzeichnis <code>/etc/acme/certs</code> zu finden und in den entsprechenden Konfigurationsdateien z. B. des Webservers kann darauf verwiesen werden.</p>

<h2 id="zertifikate-erneuern" data-numberify>Zertifikat(e) erneuern<a class="anchor ms-1" href="#zertifikate-erneuern"></a></h2>
<p>Eine Liste aller Zertifikate erhält man mit:</p>
<pre><code>acme.sh --list
</code></pre>
<p>Und erneuern kann man mit:</p>
<pre><code>systemctl stop apache2
acme.sh --tls --renew-all

# Oder nur bestimmte Certs erneuern
# acme.sh --tls --renew -d mumble.natenom.com -d m.natenom.com

systemctl start apache2
</code></pre>

<h2 id="ohne-root-rechte-fast" data-numberify>Ohne root-Rechte, fast<a class="anchor ms-1" href="#ohne-root-rechte-fast"></a></h2>
<p>Mit etwas mehr Aufwand kann man das ganze auch noch ohne root-Rechte nutzen, zumindest alles bis auf den Standalone-Server. Denn nur root darf auf Ports ≤1023 lauschen.</p>
<p>Damit werde ich mich vielleicht später noch beschäftigen; insgesamt ist acme.sh aber auch mit root-Rechten wesentlich schöner als das alte Python-Script.</p>

<h2 id="cronsystemd-timer" data-numberify>Cron/Systemd timer<a class="anchor ms-1" href="#cronsystemd-timer"></a></h2>
<ul>
<li>Cron, <a  class='urlextern'  href="https://github.com/Neilpang/acme.sh">siehe hier</a> (nach cron suchen).</li>
<li>Systemd timer, <a  class='urlextern'  href="https://github.com/Neilpang/acme.sh/wiki/Using-systemd-units-instead-of-cron">siehe hier</a>.</li>
</ul>

<h2 id="hilfe" data-numberify>Hilfe<a class="anchor ms-1" href="#hilfe"></a></h2>
<p>Für alles weitere siehe:</p>
<pre><code>acme.sh --help
</code></pre>]]></content:encoded></item><item><title>Wie man alle Tweets eines Twitter-Accounts löscht</title><link>https://natenom.de/2017/06/wie-man-alle-tweets-eines-twitter-accounts-loescht/</link><pubDate>Sun, 25 Jun 2017 11:20:03 +0000</pubDate><guid>https://natenom.de/2017/06/wie-man-alle-tweets-eines-twitter-accounts-loescht/</guid><description>&lt;p>Ich habe auf diesem Weg vor ein paar Tagen alle 1972 Tweets meines Twitter-Accounts automatisch löschen lassen.&lt;/p></description><content:encoded><![CDATA[<p>Ich habe auf diesem Weg vor ein paar Tagen alle 1972 Tweets meines Twitter-Accounts automatisch löschen lassen.</p>
<p>Es gibt sicherlich noch viele andere Möglichkeiten, ich habe mich für dieses Python-Script entschieden: <a  class='urlextern'  href="https://github.com/volshebnikRAJ/tweepy-api">https://github.com/volshebnikRAJ/tweepy-api</a>.</p>
<p>Mittels VirtualEnv wird eine eigene Umgebung im Kontext eines Benutzers erstellt:</p>
<blockquote>
<pre>virtualenv2 removetwitter</pre>
<pre>cd removetwitter</pre>
<pre>source bin/activate</pre>
<pre>pip install tweepy</pre>
<pre>wget https://github.com/volshebnikRAJ/tweepy-api/archive/master.zip</pre>
<pre>unzip master.zip</pre>
<pre>cd tweepy-api-master</pre>
</blockquote>
<p>Jetzt öffnet man die Datei user_keys.py und fügt die 4 verschiedenen Schlüssel ein und auch den Twitter-Benutzernamen.</p>
<p>Für diese sogenannten Auth-Keys erstellt man eine eigene App bei <a  class='urlextern'  href="https://apps.twitter.com/app/new">apps.twitter.com</a>.</p>
<p>Dann startet man das Script:</p>
<blockquote>
<pre>python2 del_tweets.py</pre>
</blockquote>
<p>Es erfolgt die Ausgabe:</p>
<blockquote>
<pre>Getting all tweets...
</blockquote>
<p>Found: 200
Removing&hellip;</pre></p>
<p>Jetzt wird jede Sekunde ein Tweet gelöscht, insgesamt 200.</p>
<p>Bei 1972 Tweets meines <a  class='urlextern'  href="https://twitter.com/natenom">Accounts</a> musste ich das Script mehrfach aufrufen.</p>]]></content:encoded></item><item><title>You-Get – Open Source Downloader für viele Web-Plattformen</title><link>https://natenom.de/2013/05/you-get-open-source-downloader-fur-viele-web-plattformen/</link><pubDate>Fri, 24 May 2013 08:57:14 +0000</pubDate><guid>https://natenom.de/2013/05/you-get-open-source-downloader-fur-viele-web-plattformen/</guid><description><![CDATA[<p>Mit You-Get kann man unter anderem herunterladen von <a  class='urlextern'  href="http://soundcloud.com"title="http://soundcloud.com">Soundcloud</a>, <a  class='urlextern'  href="https://vimeo.com"title="Vimeo, Your Videos Belong Here">Vimeo</a>, <a  class='urlextern'  href="https://youtube.com"title="YouTube">YouTube</a> und <a  class='urlextern'  href="http://www.mixcloud.com/"title="Listen to great DJs and radio presenters | Mixcloud">MixCloud</a>. Das Programm kann noch viele weitere Web-Seiten, die ich aber nicht verwende.</p>]]></description><content:encoded><![CDATA[<p>Mit You-Get kann man unter anderem herunterladen von <a  class='urlextern'  href="http://soundcloud.com"title="http://soundcloud.com">Soundcloud</a>, <a  class='urlextern'  href="https://vimeo.com"title="Vimeo, Your Videos Belong Here">Vimeo</a>, <a  class='urlextern'  href="https://youtube.com"title="YouTube">YouTube</a> und <a  class='urlextern'  href="http://www.mixcloud.com/"title="Listen to great DJs and radio presenters | Mixcloud">MixCloud</a>. Das Programm kann noch viele weitere Web-Seiten, die ich aber nicht verwende.</p>
<p>Im Normalfall reicht der Aufruf</p>
<blockquote>
<p>you-get url</p>
</blockquote>
<p>Z. B.:</p>
<blockquote>
<p>you-get <a  class='urlextern'  href="https://vimeo.com/64783605">https://vimeo.com/64783605</a><br>
Video Site: Vimeo.com<br>
Title: Miniature Melbourne<br>
Type: MPEG-4 video (video/mp4)<br>
Size: 87.22 MB (91458462 Bytes)</p>
<p>Downloading Miniature Melbourne.mp4 …<br>
19.5% ( 17.0/87.2 MB) [========                                   ] 1/1</p>
</blockquote>
<p>Man kann auch direkt mehrere URLs angeben, die nacheinander heruntergeladen werden.</p>
<p>Das Programm von <a  class='urlextern'  href="https://github.com/soimort"title="soimort (Mort Yao) · GitHub">Mort Yao</a> gibt es bei <a  class='urlextern'  href="https://github.com/soimort/you-get"title="soimort/you-get · GitHub">Github</a>; dort findet sich auch eine komplette Liste der unterstützten Plattformen und eine Installationsanleitung.</p>
<p>Es wurde in Python geschrieben und steht unter der <a  class='urlextern'  href="https://de.wikipedia.org/wiki/MIT_License"title="MIT-Lizenz – Wikipedia">MIT-Lizenz</a>.</p>]]></content:encoded></item></channel></rss>