<?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>Daniel Hufschläger</title>
    <link>https://hufschlaeger.net/</link>
    <description>Recent content on Daniel Hufschläger</description>
    <image>
      <title>Daniel Hufschläger</title>
      <url>https://hufschlaeger.net/images/avatar.webp</url>
      <link>https://hufschlaeger.net/images/avatar.webp</link>
    </image>
    <generator>Hugo -- 0.152.2</generator>
    <language>en</language>
    <lastBuildDate>Sun, 05 Oct 2025 21:33:18 +0200</lastBuildDate>
    <atom:link href="https://hufschlaeger.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>macOS vom Schlafen abhalten</title>
      <link>https://hufschlaeger.net/blog/2025/10/05/macos-vom-schlafen-abhalten/</link>
      <pubDate>Sun, 05 Oct 2025 21:33:18 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2025/10/05/macos-vom-schlafen-abhalten/</guid>
      <description>&lt;p&gt;Beruflich muss ich Citrix benutzen um an die interne Infrastruktur zu kommen und meinen Dienst zu verrichten. Soweit
ist das auch ok, nur wenn das macBook den Bildschirm ausschaltet, wird auch automatisch die Verbindung getrennt und
ich muss mich wieder anmelden. Nicht nur das ist nervig, sondern auch der Umstand, dass der erneute Login manchmal
nicht funktioniert, da meine VM die ich dann nutze (oder genutzt habe) eingefroren ist und somit nicht mehr ansprechbar
war. Ein deaktivieren der Energieeinstellung hilft zwar, also dass das macBook nicht mehr schlafen geht.
Aber da es auch mein privat genutztes Gerät ist, nervt es, wenn bspw. das angeschlossene Display etc. nicht mehr
ausgeschaltet wird.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Beruflich muss ich Citrix benutzen um an die interne Infrastruktur zu kommen und meinen Dienst zu verrichten. Soweit
ist das auch ok, nur wenn das macBook den Bildschirm ausschaltet, wird auch automatisch die Verbindung getrennt und
ich muss mich wieder anmelden. Nicht nur das ist nervig, sondern auch der Umstand, dass der erneute Login manchmal
nicht funktioniert, da meine VM die ich dann nutze (oder genutzt habe) eingefroren ist und somit nicht mehr ansprechbar
war. Ein deaktivieren der Energieeinstellung hilft zwar, also dass das macBook nicht mehr schlafen geht.
Aber da es auch mein privat genutztes Gerät ist, nervt es, wenn bspw. das angeschlossene Display etc. nicht mehr
ausgeschaltet wird.</p>
<p>Mein derzeitiger Ansatz ist daher die automatisierte Nutzung von <em>caffinate</em>. Dabei wird das folgende Skript im
Hintergrund ausgeführt und prüft, ob aktuell eine Citrix-Verbindung besteht. Wenn ja, wird der Schlafmodus deaktiviert
indem caffinate gestartet wird. Besteht keine Citrix-Verbindung oder wurde diese in der Zwischenzeit beendet,
wird der Schlafmodus wieder deaktiviert indem der caffinate-Prozess beendet wird.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="c1"># Log-Datei für Debugging</span>
</span></span><span class="line"><span class="cl"><span class="nv">LOG_FILE</span><span class="o">=</span><span class="s2">&#34;/tmp/citrix_energy.log&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">exec</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span> 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Funktion: Schlafmodus deaktivieren</span>
</span></span><span class="line"><span class="cl">disable_sleep<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="k">$(</span>date<span class="k">)</span><span class="s2"> | Deaktiviere Schlafmodus (Citrix läuft)&#34;</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    caffeinate -dims <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">CAFFEINATE_PID</span><span class="o">=</span><span class="nv">$!</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;Caffeinate PID: </span><span class="nv">$CAFFEINATE_PID</span><span class="s2">&#34;</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Funktion: Schlafmodus wieder aktivieren</span>
</span></span><span class="line"><span class="cl">enable_sleep<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="k">$(</span>date<span class="k">)</span><span class="s2"> | Aktiviere Schlafmodus (Citrix beendet)&#34;</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">kill</span> <span class="s2">&#34;</span><span class="nv">$CAFFEINATE_PID</span><span class="s2">&#34;</span> 2&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;Caffeinate (</span><span class="nv">$CAFFEINATE_PID</span><span class="s2">) beendet&#34;</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;Fehler: Caffeinate-Prozess nicht gefunden&#34;</span> &gt;&gt; <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Hauptschleife</span>
</span></span><span class="line"><span class="cl"><span class="nv">LAST_STATE</span><span class="o">=</span><span class="nb">false</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> true<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Prüfe, ob Citrix Viewer läuft</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> pgrep -xq <span class="s1">&#39;Citrix Viewer&#39;</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CURRENT_STATE</span><span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$LAST_STATE</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="nb">false</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            disable_sleep
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CURRENT_STATE</span><span class="o">=</span><span class="nb">false</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$LAST_STATE</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            enable_sleep
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="nv">LAST_STATE</span><span class="o">=</span><span class="nv">$CURRENT_STATE</span>
</span></span><span class="line"><span class="cl">    sleep <span class="m">10</span>  <span class="c1"># Prüfe alle 10 Sekunden</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span></code></pre></div><p>Zusätzlich, wenn man das Ganze automatisch im Hintergrund starten möchte, müssten wir noch ein Iten für den LaunchAgent
unter ~/Library/LaunchAgents/com.user.citrixenergy.plist einrichten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE plist PUBLIC &#34;-//Apple//DTD PLIST 1.0//EN&#34; &#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&#34;&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;plist</span> <span class="na">version=</span><span class="s">&#34;1.0&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;dict&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>Label<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>com.user.citrixenergy<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>ProgramArguments<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;array&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;string&gt;</span>/Users/user/bin/citrix_energymanager.sh<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/array&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>RunAtLoad<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;true/&gt;</span> <span class="c">&lt;!-- Startet beim Login --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>KeepAlive<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;true/&gt;</span> <span class="c">&lt;!-- Startet neu, falls das Skript crasht --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>StandardOutPath<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>/tmp/citrix_energy.log<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>StandardErrorPath<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>/tmp/citrix_energy_error.log<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/dict&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/plist&gt;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Ghostty - terminfo</title>
      <link>https://hufschlaeger.net/blog/2025/09/08/ghostty-terminfo/</link>
      <pubDate>Mon, 08 Sep 2025 08:07:20 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2025/09/08/ghostty-terminfo/</guid>
      <description>&lt;p&gt;Als ich nach dem dreiwöchigem Urlaub auf eins meiner Systeme wollte, war die Welt nicht mehr so wie vor dem Urlaub &amp;#x1f600;.
Abgesehen, davon das der Urlaub vorbei war, verhielt sich die SSH-Session seltsam. Die History und der Output der Programme funktionierte nicht mehr, keine Farben etc..&lt;/p&gt;
&lt;p&gt;Irgendwann sah ich dann so etwas:&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;unknown terminal &lt;span class=&#34;s2&#34;&gt;&amp;#34;xterm-ghostty&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und siehe da, &lt;a href=&#34;https://ghostty.org&#34;&gt;Ghostty&lt;/a&gt; setzt die Variable $TERM nun anders (!? ist mir eventuell vorher nicht aufgefallen !?). Steht auch zusammen mit einigen Workarounds in der &lt;a href=&#34;https://ghostty.org/docs/help/terminfo&#34;&gt;Doku&lt;/a&gt; &amp;#x1f600;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Als ich nach dem dreiwöchigem Urlaub auf eins meiner Systeme wollte, war die Welt nicht mehr so wie vor dem Urlaub &#x1f600;.
Abgesehen, davon das der Urlaub vorbei war, verhielt sich die SSH-Session seltsam. Die History und der Output der Programme funktionierte nicht mehr, keine Farben etc..</p>
<p>Irgendwann sah ich dann so etwas:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">unknown terminal <span class="s2">&#34;xterm-ghostty&#34;</span>
</span></span></code></pre></div><p>Und siehe da, <a href="https://ghostty.org">Ghostty</a> setzt die Variable $TERM nun anders (!? ist mir eventuell vorher nicht aufgefallen !?). Steht auch zusammen mit einigen Workarounds in der <a href="https://ghostty.org/docs/help/terminfo">Doku</a> &#x1f600;.</p>
<p>Alternativ kann man auch das Folgende machen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$TERM</span><span class="s2">&#34;</span> <span class="o">=</span>~ <span class="s2">&#34;ghostty&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">export</span> <span class="nv">TERM</span><span class="o">=</span>xterm-256color
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>In den drei Zeilen wird geschaut, ob die Variable $TERM &ldquo;ghostty&rdquo; enthält und falls ja, wird diese durch xterm-256color überschrieben. Das Ganze kann man sich in seine <em>.bashrc</em> oder <em>.zshrc</em> packen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linkdump 27/2024</title>
      <link>https://hufschlaeger.net/blog/2024/07/07/linkdump-27/2024/</link>
      <pubDate>Sun, 07 Jul 2024 00:00:01 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2024/07/07/linkdump-27/2024/</guid>
      <description>&lt;h2 id=&#34;gitlab&#34;&gt;Gitlab&lt;/h2&gt;
&lt;h3 id=&#34;send-testmails&#34;&gt;Send testmails&lt;/h3&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;gitlab-rails console
&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;# on rails console:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Notify.test_email&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;you@example.com&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;Message Subject&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;Message Body&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.deliver_now
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;reset-you-initial-root-password&#34;&gt;Reset you initial root password&lt;/h3&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;gitlab-rake &lt;span class=&#34;s2&#34;&gt;&amp;#34;gitlab:password:reset[root]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;solve-error-500-when-changing-application-settings&#34;&gt;Solve Error 500 when (changing application settings)&lt;/h3&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;gitlab-psql -d gitlabhq_production
&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;# on PSQL-Shell &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DELETE FROM application_settings&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;h2 id=&#34;linux&#34;&gt;Linux&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://keycombiner.com/collections/terminal/&#34;&gt;Linux Terminal key combinations&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;kubernetes&#34;&gt;Kubernetes&lt;/h2&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube-nocookie.com/embed/1SaPfm96lY4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;h2 id=&#34;working-with-container-registries&#34;&gt;Working with container registries&lt;/h2&gt;
&lt;p&gt;Get all available container images&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="gitlab">Gitlab</h2>
<h3 id="send-testmails">Send testmails</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gitlab-rails console
</span></span><span class="line"><span class="cl"><span class="c1"># on rails console:</span>
</span></span><span class="line"><span class="cl">Notify.test_email<span class="o">(</span><span class="s1">&#39;you@example.com&#39;</span>, <span class="s1">&#39;Message Subject&#39;</span>, <span class="s1">&#39;Message Body&#39;</span><span class="o">)</span>.deliver_now
</span></span></code></pre></div><h3 id="reset-you-initial-root-password">Reset you initial root password</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gitlab-rake <span class="s2">&#34;gitlab:password:reset[root]&#34;</span>
</span></span></code></pre></div><h3 id="solve-error-500-when-changing-application-settings">Solve Error 500 when (changing application settings)</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gitlab-psql -d gitlabhq_production
</span></span><span class="line"><span class="cl"><span class="c1"># on PSQL-Shell </span>
</span></span><span class="line"><span class="cl">DELETE FROM application_settings<span class="p">;</span>
</span></span></code></pre></div><h2 id="linux">Linux</h2>
<p><a href="https://keycombiner.com/collections/terminal/">Linux Terminal key combinations</a></p>
<h2 id="kubernetes">Kubernetes</h2>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/1SaPfm96lY4?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="working-with-container-registries">Working with container registries</h2>
<p>Get all available container images</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">curl --insecure -s -X GET -u user:pass https://container-registry:5000/v2/_catalog <span class="p">|</span> jq
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;repositories&#34;</span>: <span class="o">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine-base&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_base&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_base_apache&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_base_tomcat&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_base_wildfly&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_dimag_ingestlist&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_dimag_ipm&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;alpine_dimag_km&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>Get al available tag of a container image</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"> curl -s --insecure -X GET -u user:pass https://container-registry:5000/v2/alpine_base_apache/tags/list <span class="p">|</span> jq
</span></span><span class="line"><span class="cl"> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;name&#34;</span>: <span class="s2">&#34;alpine_base_apache&#34;</span>,
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;tags&#34;</span>: <span class="o">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;latest&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;php82&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Caclulating QR-Code URLs for the Actimel/Pokémon lottery</title>
      <link>https://hufschlaeger.net/blog/2024/06/14/caclulating-qr-code-urls-for-the-actimel/pok%C3%A9mon-lottery/</link>
      <pubDate>Fri, 14 Jun 2024 21:23:00 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2024/06/14/caclulating-qr-code-urls-for-the-actimel/pok%C3%A9mon-lottery/</guid>
      <description>&lt;p&gt;Einfaches Python-Skript zur Berechnung der QR-Codes für das Acitmel Pokemon Gewinnspiel:&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;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;hashlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sha256&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;names&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;s1&#34;&gt;&amp;#39;dragonite&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;fidough&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;fuecoco&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gyarados&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;munchlax&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;bellibolt&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;greavard&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;charmeleon&amp;#39;&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;s1&#34;&gt;&amp;#39;charmander&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;bulbasaur&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;charizard&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;blastoise&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;ivysaur&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;pawmi&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;pichu&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;pikachu&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;quaxly&amp;#39;&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;s1&#34;&gt;&amp;#39;smoliv&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;raichu&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;sprigatito&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;squirtle&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;venusaur&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;wartortle&amp;#39;&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;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;names&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;hsh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sha256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;utf-8&amp;#39;&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;hexdigest&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;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;name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt; | https://pokemon.actimel.de/welcome?scan=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hsh&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&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;This results in  the following:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Pokémon&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;URL&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;dragonite&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=042ce75d492cb394999ff4fc039d13fa22678485056ab32812fdbd1b88480089&#34;&gt;https://pokemon.actimel.de/welcome?scan=042ce75d492cb394999ff4fc039d13fa22678485056ab32812fdbd1b88480089&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;fidough&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=2f67aac66c98287d52a3d4efc51b83c242c161889c7f42674eeda150ebdc771d&#34;&gt;https://pokemon.actimel.de/welcome?scan=2f67aac66c98287d52a3d4efc51b83c242c161889c7f42674eeda150ebdc771d&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;fuecoco&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=5a4647c1f3fa84997a6ddea1f4ad39461e218b0d8fc803df8fafe53600b46b9f&#34;&gt;https://pokemon.actimel.de/welcome?scan=5a4647c1f3fa84997a6ddea1f4ad39461e218b0d8fc803df8fafe53600b46b9f&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;gyarados&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=7cb2e6f544eb21f608aa5d8e60de3fb58636c34a03d1ed1226dfb0abad88598e&#34;&gt;https://pokemon.actimel.de/welcome?scan=7cb2e6f544eb21f608aa5d8e60de3fb58636c34a03d1ed1226dfb0abad88598e&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;munchlax&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=310a6e1a21da2d2d320237ccc713c93df80955f7933dd8a6a184ed23237ddfea&#34;&gt;https://pokemon.actimel.de/welcome?scan=310a6e1a21da2d2d320237ccc713c93df80955f7933dd8a6a184ed23237ddfea&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;bellibolt&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=de776cea1f7b724768844115f77ff826ee20a0f8f0b7792130c4b35dbe297a08&#34;&gt;https://pokemon.actimel.de/welcome?scan=de776cea1f7b724768844115f77ff826ee20a0f8f0b7792130c4b35dbe297a08&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;greavard&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=e240ed5c2cdbbefc3c48ea9a184665137cf8a553a5024fef78205338f4617a90&#34;&gt;https://pokemon.actimel.de/welcome?scan=e240ed5c2cdbbefc3c48ea9a184665137cf8a553a5024fef78205338f4617a90&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;charmeleon&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=dcc51a1369ed1884e6f26512b8811092181e07b3e386cebfed452fa51c70244e&#34;&gt;https://pokemon.actimel.de/welcome?scan=dcc51a1369ed1884e6f26512b8811092181e07b3e386cebfed452fa51c70244e&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;charmander&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=8cbfa8573683626c1609d1373f23b63bbfa5692fccad285e0306a500fa4b28f9&#34;&gt;https://pokemon.actimel.de/welcome?scan=8cbfa8573683626c1609d1373f23b63bbfa5692fccad285e0306a500fa4b28f9&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;bulbasaur&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=b5b5652a5dd3d781e2f6f412223e843cacbf2872091f485ed5fd61aa967a3719&#34;&gt;https://pokemon.actimel.de/welcome?scan=b5b5652a5dd3d781e2f6f412223e843cacbf2872091f485ed5fd61aa967a3719&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;charizard&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=73e512eccd9639bf632f1675f6a34a116f0abe5404dcebe98bf023be0e329d10&#34;&gt;https://pokemon.actimel.de/welcome?scan=73e512eccd9639bf632f1675f6a34a116f0abe5404dcebe98bf023be0e329d10&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;blastoise&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=9041324a9605633b12b6b65b4357af286cfad675ed5f5b1f1a564b27df821511&#34;&gt;https://pokemon.actimel.de/welcome?scan=9041324a9605633b12b6b65b4357af286cfad675ed5f5b1f1a564b27df821511&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;ivysaur&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=1f29ed0b79a8582771992cb656ea38e9c6fb16215d85f99b72af43a0722e163b&#34;&gt;https://pokemon.actimel.de/welcome?scan=1f29ed0b79a8582771992cb656ea38e9c6fb16215d85f99b72af43a0722e163b&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;pawmi&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=fa48a2842a0b0f8f5372bf347533edca563ba867851374bd3d0d632df066e3e1&#34;&gt;https://pokemon.actimel.de/welcome?scan=fa48a2842a0b0f8f5372bf347533edca563ba867851374bd3d0d632df066e3e1&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;pichu&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=fc23f358d8c9f72c56e093af3877723bb7d0b1f9d786d815acddd37a35a1012b&#34;&gt;https://pokemon.actimel.de/welcome?scan=fc23f358d8c9f72c56e093af3877723bb7d0b1f9d786d815acddd37a35a1012b&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;pikachu&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=43999461d22f67840fcd9b8824293eaa4f18146e57b2c651bcd925e3b3e4e429&#34;&gt;https://pokemon.actimel.de/welcome?scan=43999461d22f67840fcd9b8824293eaa4f18146e57b2c651bcd925e3b3e4e429&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;quaxly&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=6339e380b97b2ee89170ff4dcc51e19d2b5881a58ac7475cf7bf5f5369dd6ecb&#34;&gt;https://pokemon.actimel.de/welcome?scan=6339e380b97b2ee89170ff4dcc51e19d2b5881a58ac7475cf7bf5f5369dd6ecb&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;smoliv&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=d2b8de5e99f0dc7d8a207861a0dcded1de5a8a1ccd45c94828fb11565b2f1305&#34;&gt;https://pokemon.actimel.de/welcome?scan=d2b8de5e99f0dc7d8a207861a0dcded1de5a8a1ccd45c94828fb11565b2f1305&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;raichu&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=a9462f7c66b5833710cbb41d4ef19e4bd704b05c69b94f1bafb2e9b15bae1217&#34;&gt;https://pokemon.actimel.de/welcome?scan=a9462f7c66b5833710cbb41d4ef19e4bd704b05c69b94f1bafb2e9b15bae1217&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;sprigatito&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=5a68b137ceecaa8397262b9701c5ba0ed0b9d63927e4e14c17f56cd871134f0c&#34;&gt;https://pokemon.actimel.de/welcome?scan=5a68b137ceecaa8397262b9701c5ba0ed0b9d63927e4e14c17f56cd871134f0c&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;squirtle&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=43c9d997f68ee54a55f7a22062c895312250751d3505ef2da40d2a7cf32b39fe&#34;&gt;https://pokemon.actimel.de/welcome?scan=43c9d997f68ee54a55f7a22062c895312250751d3505ef2da40d2a7cf32b39fe&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;venusaur&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=74ac4c00f18fe573707f30310dc80ab513408e593b64b00c0cdfdfc3c174b370&#34;&gt;https://pokemon.actimel.de/welcome?scan=74ac4c00f18fe573707f30310dc80ab513408e593b64b00c0cdfdfc3c174b370&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;wartortle&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://pokemon.actimel.de/welcome?scan=eb2af329c8d993e4f8ada53717e945cf652428690b0ba68ef6030ca857a28eec&#34;&gt;https://pokemon.actimel.de/welcome?scan=eb2af329c8d993e4f8ada53717e945cf652428690b0ba68ef6030ca857a28eec&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Have fun &amp;#x1f609;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Einfaches Python-Skript zur Berechnung der QR-Codes für das Acitmel Pokemon Gewinnspiel:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">hashlib</span> <span class="kn">import</span> <span class="n">sha256</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;dragonite&#39;</span><span class="p">,</span> <span class="s1">&#39;fidough&#39;</span><span class="p">,</span> <span class="s1">&#39;fuecoco&#39;</span><span class="p">,</span> <span class="s1">&#39;gyarados&#39;</span><span class="p">,</span> <span class="s1">&#39;munchlax&#39;</span><span class="p">,</span> <span class="s1">&#39;bellibolt&#39;</span><span class="p">,</span> <span class="s1">&#39;greavard&#39;</span><span class="p">,</span> <span class="s1">&#39;charmeleon&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">         <span class="s1">&#39;charmander&#39;</span><span class="p">,</span> <span class="s1">&#39;bulbasaur&#39;</span><span class="p">,</span> <span class="s1">&#39;charizard&#39;</span><span class="p">,</span> <span class="s1">&#39;blastoise&#39;</span><span class="p">,</span> <span class="s1">&#39;ivysaur&#39;</span><span class="p">,</span> <span class="s1">&#39;pawmi&#39;</span><span class="p">,</span> <span class="s1">&#39;pichu&#39;</span><span class="p">,</span> <span class="s1">&#39;pikachu&#39;</span><span class="p">,</span> <span class="s1">&#39;quaxly&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">         <span class="s1">&#39;smoliv&#39;</span><span class="p">,</span> <span class="s1">&#39;raichu&#39;</span><span class="p">,</span> <span class="s1">&#39;sprigatito&#39;</span><span class="p">,</span> <span class="s1">&#39;squirtle&#39;</span><span class="p">,</span> <span class="s1">&#39;venusaur&#39;</span><span class="p">,</span> <span class="s1">&#39;wartortle&#39;</span><span class="p">]</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">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">hsh</span> <span class="o">=</span> <span class="n">sha256</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s1"> &lt;</span><span class="si">{</span><span class="mi">10</span><span class="si">}}</span><span class="s1"> | https://pokemon.actimel.de/welcome?scan=</span><span class="si">{</span><span class="n">hsh</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>This results in  the following:</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Pokémon</th>
          <th style="text-align: center">URL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">dragonite</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=042ce75d492cb394999ff4fc039d13fa22678485056ab32812fdbd1b88480089">https://pokemon.actimel.de/welcome?scan=042ce75d492cb394999ff4fc039d13fa22678485056ab32812fdbd1b88480089</a></td>
      </tr>
      <tr>
          <td style="text-align: left">fidough</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=2f67aac66c98287d52a3d4efc51b83c242c161889c7f42674eeda150ebdc771d">https://pokemon.actimel.de/welcome?scan=2f67aac66c98287d52a3d4efc51b83c242c161889c7f42674eeda150ebdc771d</a></td>
      </tr>
      <tr>
          <td style="text-align: left">fuecoco</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=5a4647c1f3fa84997a6ddea1f4ad39461e218b0d8fc803df8fafe53600b46b9f">https://pokemon.actimel.de/welcome?scan=5a4647c1f3fa84997a6ddea1f4ad39461e218b0d8fc803df8fafe53600b46b9f</a></td>
      </tr>
      <tr>
          <td style="text-align: left">gyarados</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=7cb2e6f544eb21f608aa5d8e60de3fb58636c34a03d1ed1226dfb0abad88598e">https://pokemon.actimel.de/welcome?scan=7cb2e6f544eb21f608aa5d8e60de3fb58636c34a03d1ed1226dfb0abad88598e</a></td>
      </tr>
      <tr>
          <td style="text-align: left">munchlax</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=310a6e1a21da2d2d320237ccc713c93df80955f7933dd8a6a184ed23237ddfea">https://pokemon.actimel.de/welcome?scan=310a6e1a21da2d2d320237ccc713c93df80955f7933dd8a6a184ed23237ddfea</a></td>
      </tr>
      <tr>
          <td style="text-align: left">bellibolt</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=de776cea1f7b724768844115f77ff826ee20a0f8f0b7792130c4b35dbe297a08">https://pokemon.actimel.de/welcome?scan=de776cea1f7b724768844115f77ff826ee20a0f8f0b7792130c4b35dbe297a08</a></td>
      </tr>
      <tr>
          <td style="text-align: left">greavard</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=e240ed5c2cdbbefc3c48ea9a184665137cf8a553a5024fef78205338f4617a90">https://pokemon.actimel.de/welcome?scan=e240ed5c2cdbbefc3c48ea9a184665137cf8a553a5024fef78205338f4617a90</a></td>
      </tr>
      <tr>
          <td style="text-align: left">charmeleon</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=dcc51a1369ed1884e6f26512b8811092181e07b3e386cebfed452fa51c70244e">https://pokemon.actimel.de/welcome?scan=dcc51a1369ed1884e6f26512b8811092181e07b3e386cebfed452fa51c70244e</a></td>
      </tr>
      <tr>
          <td style="text-align: left">charmander</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=8cbfa8573683626c1609d1373f23b63bbfa5692fccad285e0306a500fa4b28f9">https://pokemon.actimel.de/welcome?scan=8cbfa8573683626c1609d1373f23b63bbfa5692fccad285e0306a500fa4b28f9</a></td>
      </tr>
      <tr>
          <td style="text-align: left">bulbasaur</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=b5b5652a5dd3d781e2f6f412223e843cacbf2872091f485ed5fd61aa967a3719">https://pokemon.actimel.de/welcome?scan=b5b5652a5dd3d781e2f6f412223e843cacbf2872091f485ed5fd61aa967a3719</a></td>
      </tr>
      <tr>
          <td style="text-align: left">charizard</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=73e512eccd9639bf632f1675f6a34a116f0abe5404dcebe98bf023be0e329d10">https://pokemon.actimel.de/welcome?scan=73e512eccd9639bf632f1675f6a34a116f0abe5404dcebe98bf023be0e329d10</a></td>
      </tr>
      <tr>
          <td style="text-align: left">blastoise</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=9041324a9605633b12b6b65b4357af286cfad675ed5f5b1f1a564b27df821511">https://pokemon.actimel.de/welcome?scan=9041324a9605633b12b6b65b4357af286cfad675ed5f5b1f1a564b27df821511</a></td>
      </tr>
      <tr>
          <td style="text-align: left">ivysaur</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=1f29ed0b79a8582771992cb656ea38e9c6fb16215d85f99b72af43a0722e163b">https://pokemon.actimel.de/welcome?scan=1f29ed0b79a8582771992cb656ea38e9c6fb16215d85f99b72af43a0722e163b</a></td>
      </tr>
      <tr>
          <td style="text-align: left">pawmi</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=fa48a2842a0b0f8f5372bf347533edca563ba867851374bd3d0d632df066e3e1">https://pokemon.actimel.de/welcome?scan=fa48a2842a0b0f8f5372bf347533edca563ba867851374bd3d0d632df066e3e1</a></td>
      </tr>
      <tr>
          <td style="text-align: left">pichu</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=fc23f358d8c9f72c56e093af3877723bb7d0b1f9d786d815acddd37a35a1012b">https://pokemon.actimel.de/welcome?scan=fc23f358d8c9f72c56e093af3877723bb7d0b1f9d786d815acddd37a35a1012b</a></td>
      </tr>
      <tr>
          <td style="text-align: left">pikachu</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=43999461d22f67840fcd9b8824293eaa4f18146e57b2c651bcd925e3b3e4e429">https://pokemon.actimel.de/welcome?scan=43999461d22f67840fcd9b8824293eaa4f18146e57b2c651bcd925e3b3e4e429</a></td>
      </tr>
      <tr>
          <td style="text-align: left">quaxly</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=6339e380b97b2ee89170ff4dcc51e19d2b5881a58ac7475cf7bf5f5369dd6ecb">https://pokemon.actimel.de/welcome?scan=6339e380b97b2ee89170ff4dcc51e19d2b5881a58ac7475cf7bf5f5369dd6ecb</a></td>
      </tr>
      <tr>
          <td style="text-align: left">smoliv</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=d2b8de5e99f0dc7d8a207861a0dcded1de5a8a1ccd45c94828fb11565b2f1305">https://pokemon.actimel.de/welcome?scan=d2b8de5e99f0dc7d8a207861a0dcded1de5a8a1ccd45c94828fb11565b2f1305</a></td>
      </tr>
      <tr>
          <td style="text-align: left">raichu</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=a9462f7c66b5833710cbb41d4ef19e4bd704b05c69b94f1bafb2e9b15bae1217">https://pokemon.actimel.de/welcome?scan=a9462f7c66b5833710cbb41d4ef19e4bd704b05c69b94f1bafb2e9b15bae1217</a></td>
      </tr>
      <tr>
          <td style="text-align: left">sprigatito</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=5a68b137ceecaa8397262b9701c5ba0ed0b9d63927e4e14c17f56cd871134f0c">https://pokemon.actimel.de/welcome?scan=5a68b137ceecaa8397262b9701c5ba0ed0b9d63927e4e14c17f56cd871134f0c</a></td>
      </tr>
      <tr>
          <td style="text-align: left">squirtle</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=43c9d997f68ee54a55f7a22062c895312250751d3505ef2da40d2a7cf32b39fe">https://pokemon.actimel.de/welcome?scan=43c9d997f68ee54a55f7a22062c895312250751d3505ef2da40d2a7cf32b39fe</a></td>
      </tr>
      <tr>
          <td style="text-align: left">venusaur</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=74ac4c00f18fe573707f30310dc80ab513408e593b64b00c0cdfdfc3c174b370">https://pokemon.actimel.de/welcome?scan=74ac4c00f18fe573707f30310dc80ab513408e593b64b00c0cdfdfc3c174b370</a></td>
      </tr>
      <tr>
          <td style="text-align: left">wartortle</td>
          <td style="text-align: center"><a href="https://pokemon.actimel.de/welcome?scan=eb2af329c8d993e4f8ada53717e945cf652428690b0ba68ef6030ca857a28eec">https://pokemon.actimel.de/welcome?scan=eb2af329c8d993e4f8ada53717e945cf652428690b0ba68ef6030ca857a28eec</a></td>
      </tr>
  </tbody>
</table>
<p>Have fun &#x1f609;.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linkdump 26/2024</title>
      <link>https://hufschlaeger.net/blog/2024/05/10/linkdump-26/2024/</link>
      <pubDate>Fri, 10 May 2024 16:21:41 +0100</pubDate>
      <guid>https://hufschlaeger.net/blog/2024/05/10/linkdump-26/2024/</guid>
      <description>Guide to setup PWA in DoIt</description>
      <content:encoded><![CDATA[<p>Sehr schönes online Tool zum Frickeln an SED-Ausdrücken: <a href="https://sed.js.org">GNU sed REPL</a></p>
<p><img alt="GNU sed REPL" loading="lazy" src="/img/GNUsedREPL.png"></p>
<p>Kontrolle über S6 Services in Containern. <a href="https://skarnet.org/software/s6/s6-svc.html">S6-SVC Doku</a></p>
<p>Wass ist Chat-GPT eigentlich und warum funktioniert es überhaupt? <a href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/">Stephen Wolfram</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Suche nach den ersten hundert Primzahlen in C&#43;&#43;</title>
      <link>https://hufschlaeger.net/blog/2020/10/09/suche-nach-den-ersten-hundert-primzahlen-in-c-/</link>
      <pubDate>Fri, 09 Oct 2020 17:06:31 +0100</pubDate>
      <guid>https://hufschlaeger.net/blog/2020/10/09/suche-nach-den-ersten-hundert-primzahlen-in-c-/</guid>
      <description>&lt;p&gt;Suchen der Primzahlen kleiner 100 in C++.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// basic io
&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;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argv&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;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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iCount&lt;/span&gt;   &lt;span class=&#34;o&#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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iDivisor&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;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;// loop over all natural numbers 
&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;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iCount&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;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&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;iCount&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;// state if current number is a prime number
&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;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iPrime&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;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;// loop over each divisor candidate
&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;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iDivisor&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iDivisor&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iCount&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;iDivisor&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&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;// if divisor matches the current number -&amp;gt; change state
&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;&lt;/span&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;n&#34;&gt;iCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iDivisor&lt;/span&gt; &lt;span class=&#34;o&#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;iPrime&lt;/span&gt; &lt;span class=&#34;o&#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;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;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;// if prime print to stdout
&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;&lt;/span&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;n&#34;&gt;iPrime&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;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;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&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&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;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;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>Suchen der Primzahlen kleiner 100 in C++.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// basic io
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span> <span class="p">(</span> <span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">iCount</span>   <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">iDivisor</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// loop over all natural numbers 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">for</span> <span class="p">(</span> <span class="n">iCount</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">iCount</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">;</span> <span class="o">++</span><span class="n">iCount</span> <span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// state if current number is a prime number
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">int</span> <span class="n">iPrime</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// loop over each divisor candidate
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">for</span> <span class="p">(</span> <span class="n">iDivisor</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">iDivisor</span> <span class="o">&lt;</span> <span class="n">iCount</span><span class="p">;</span> <span class="o">++</span><span class="n">iDivisor</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      
</span></span><span class="line"><span class="cl">      <span class="c1">// if divisor matches the current number -&gt; change state
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="k">if</span> <span class="p">(</span> <span class="n">iCount</span> <span class="o">%</span> <span class="n">iDivisor</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="n">iPrime</span> <span class="o">=</span> <span class="mi">0</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="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// if prime print to stdout
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">if</span> <span class="p">(</span><span class="n">iPrime</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">iCount</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Über mich</title>
      <link>https://hufschlaeger.net/about/</link>
      <pubDate>Fri, 02 Aug 2019 11:04:49 +0800</pubDate>
      <guid>https://hufschlaeger.net/about/</guid>
      <description>&lt;p&gt;Hi, mein Name ist Daniel, ich bin Baujahr 1982 und komme aus dem schönen Brandenburg. Seit frühester Kindheit bastel ich an so ziemlich allem, was mit Technik zu tun hat. Spätestens mit dem C64 an Rechnern.&lt;/p&gt;
&lt;p&gt;Momentan arbeite ich als Fullstack JAVA-Entwickler im &lt;a href=&#34;https://dimag-wiki.la-bw.de/public/&#34;&gt;DIMAG-Verbund&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;technologien&#34;&gt;Technologien&lt;/h2&gt;
&lt;p&gt;In den letzten Zeit habe ich mich mit folgenden Technilogien auseinandergesetzt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes (K3s und OpenShift)&lt;/li&gt;
&lt;li&gt;Containerisierung mit Podman und Docker&lt;/li&gt;
&lt;li&gt;Virtualisierung mit Proxmox und Hyper-V&lt;/li&gt;
&lt;li&gt;Automatisierung mit Ansible&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;programmiersprachen&#34;&gt;Programmiersprachen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JAVA&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go(lang)&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>Hi, mein Name ist Daniel, ich bin Baujahr 1982 und komme aus dem schönen Brandenburg. Seit frühester Kindheit bastel ich an so ziemlich allem, was mit Technik zu tun hat. Spätestens mit dem C64 an Rechnern.</p>
<p>Momentan arbeite ich als Fullstack JAVA-Entwickler im <a href="https://dimag-wiki.la-bw.de/public/">DIMAG-Verbund</a>.</p>
<h2 id="technologien">Technologien</h2>
<p>In den letzten Zeit habe ich mich mit folgenden Technilogien auseinandergesetzt:</p>
<ul>
<li>Kubernetes (K3s und OpenShift)</li>
<li>Containerisierung mit Podman und Docker</li>
<li>Virtualisierung mit Proxmox und Hyper-V</li>
<li>Automatisierung mit Ansible</li>
</ul>
<h2 id="programmiersprachen">Programmiersprachen</h2>
<ul>
<li>JAVA</li>
<li>Python</li>
<li>Go(lang)</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Atmel ICE and OS X no 4</title>
      <link>https://hufschlaeger.net/blog/2018/05/20/atmel-ice-and-os-x-no-4/</link>
      <pubDate>Sun, 20 May 2018 10:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2018/05/20/atmel-ice-and-os-x-no-4/</guid>
      <description>&lt;p&gt;For tinkering with an ATmega32U4 board, (again) I need to get the ATMEL ICE under macOS. Since High Sierra kernel extensions have to be signed and the presented workarounds of earlier posts wouldn&amp;rsquo;t work anymore. However, there is a signed kext available at the &lt;a href=&#34;https://www.avrfreaks.net/forum/atmelice-signed-dummy-kext-macos-x-high-sierra&#34;&gt;AVRFreaks forums&lt;/a&gt;. In my case, I downloaded the file, extracted and moved it. Additionally, I adjusted the owner and access rights. Since these files are system relevant files, you will need to do these operations as super-user.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>For tinkering with an ATmega32U4 board, (again) I need to get the ATMEL ICE under macOS. Since High Sierra kernel extensions have to be signed and the presented workarounds of earlier posts wouldn&rsquo;t work anymore. However, there is a signed kext available at the <a href="https://www.avrfreaks.net/forum/atmelice-signed-dummy-kext-macos-x-high-sierra">AVRFreaks forums</a>. In my case, I downloaded the file, extracted and moved it. Additionally, I adjusted the owner and access rights. Since these files are system relevant files, you will need to do these operations as super-user.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo mv AtmelICE.kext /Library/Extensions/
</span></span><span class="line"><span class="cl">sudo chown -R root:wheel /Library/Extensions/AtmelICE.kext
</span></span><span class="line"><span class="cl">sudo chmod -R <span class="m">755</span> /Library/Extensions/AtmelICE.kext
</span></span><span class="line"><span class="cl">sudo kextload /Library/Extensions/AtmelICE.kext
</span></span></code></pre></div><p>Disconnect and reconnect your device, and it should be ready to use. For simple testing the device communication I used avrdude to talk to the device. Choose the correct programmer interface is essential for this part. If your board is using the ISP-interface, you would have to use <em>atmelice_isp</em>. For using JTAG, you have to use <em>atmelice</em>. Please check the avrdude docs for further information. You could install avrdude using homebrew.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">avrdude -c atmelice_isp -p m32u4 -P usb
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Setting Hugo frontmatter using Python</title>
      <link>https://hufschlaeger.net/blog/2018/01/16/setting-hugo-frontmatter-using-python/</link>
      <pubDate>Tue, 16 Jan 2018 20:43:31 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2018/01/16/setting-hugo-frontmatter-using-python/</guid>
      <description>&lt;p&gt;Recently I switched the theme of my blog (based on hugo). My &lt;a href=&#34;https://themes.gohugo.io/minimo/&#34;&gt;new theme&lt;/a&gt; is supporting some new features like authors. This feature requires some additional parameters in the front matter of the post. I found a very convenient way using the Python package &lt;a href=&#34;https://pypi.python.org/pypi/python-frontmatter/0.2.1&#34;&gt;front matter&lt;/a&gt;. The code below changes these parameters automatically. The original script was &lt;a href=&#34;https://stackoverflow.com/questions/25697664/how-would-i-parse-front-matter-with-python&#34;&gt;posted&lt;/a&gt; in a StackOverflow answer but doesn&amp;rsquo;t work for me. So I modified it slightly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#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 python&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;#&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;# https://stackoverflow.com/questions/25697664/how-would-i-parse-front-matter-with-python&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;#&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;frontmatter&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;io&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;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os.path&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;splitext&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;glob&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;auths&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;s1&#34;&gt;&amp;#39;daniel&amp;#39;&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;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content/docs/*.md&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;fname&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&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;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;r&amp;#39;&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;post&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;frontmatter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&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&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;post&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;s1&#34;&gt;&amp;#39;author&amp;#39;&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;kc&#34;&gt;None&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;post&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;authors&amp;#39;&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;auths&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;newfile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;w&amp;#39;&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;s1&#34;&gt;&amp;#39;utf8&amp;#39;&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;#frontmatter.dump(post, newfile)&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;newfile&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;frontmatter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dumps&lt;/span&gt;&lt;span class=&#34;p&#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 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;newfile&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;close&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;The script above checks the existence of authors in all markdown files inside the predefined path. Contains the post an existing parameter it does nothing, is it missing it will be added automatically. Very convenient!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently I switched the theme of my blog (based on hugo). My <a href="https://themes.gohugo.io/minimo/">new theme</a> is supporting some new features like authors. This feature requires some additional parameters in the front matter of the post. I found a very convenient way using the Python package <a href="https://pypi.python.org/pypi/python-frontmatter/0.2.1">front matter</a>. The code below changes these parameters automatically. The original script was <a href="https://stackoverflow.com/questions/25697664/how-would-i-parse-front-matter-with-python">posted</a> in a StackOverflow answer but doesn&rsquo;t work for me. So I modified it slightly.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># https://stackoverflow.com/questions/25697664/how-would-i-parse-front-matter-with-python</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">frontmatter</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">io</span> 
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">basename</span><span class="p">,</span> <span class="n">splitext</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">glob</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">auths</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;daniel&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">path</span> <span class="o">=</span> <span class="s2">&#34;content/docs/*.md&#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">fname</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="n">io</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s1">&#39;r&#39;</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">post</span> <span class="o">=</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</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">post</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;author&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">post</span><span class="p">[</span><span class="s1">&#39;authors&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">auths</span>
</span></span><span class="line"><span class="cl">            <span class="n">newfile</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">open</span><span class="p">(</span> <span class="n">fname</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="c1">#frontmatter.dump(post, newfile)</span>
</span></span><span class="line"><span class="cl">            <span class="n">newfile</span><span class="o">.</span><span class="n">write</span> <span class="p">(</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">post</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">newfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div><p>The script above checks the existence of authors in all markdown files inside the predefined path. Contains the post an existing parameter it does nothing, is it missing it will be added automatically. Very convenient!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sublime Text 3 using miniconda</title>
      <link>https://hufschlaeger.net/blog/2017/10/10/sublime-text-3-using-miniconda/</link>
      <pubDate>Tue, 10 Oct 2017 20:43:31 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2017/10/10/sublime-text-3-using-miniconda/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://docs.anaconda.com/anaconda/user-guide/tasks/integration/sublime&#34;&gt;conda package for Sublime Text 3&lt;/a&gt; in default configuration is prefering Anaconda. Neverless by adjusting some paths, you&amp;rsquo;ll be able to use miniconda aswell. The source block below was taken for a installation of miniconda (with Python 3.6) x64 on a Windows workstation. The paths might be different on a macOS or Linux machine.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;// Default settings for sublime-text-conda&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;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;l&#34;&gt;// executable is the path to anaconda&amp;#39;s python&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;l&#34;&gt;// this python executable is used in order to find conda&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;nt&#34;&gt;&amp;#34;executable&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;~\\AppData\\Local\\Continuum\\miniconda3\\python&amp;#34;&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;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// Directory in which the conda envs are stored&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;l&#34;&gt;// Default location is the user&amp;#39;s home directory&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;nt&#34;&gt;&amp;#34;environment_directory&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;~\\AppData\\Local\\Continuum\\miniconda3\\envs\\&amp;#34;&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;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// configuration is the path to conda&amp;#39;s configuration file&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;nt&#34;&gt;&amp;#34;configuration&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;~/.condarc&amp;#34;&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;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>The <a href="https://docs.anaconda.com/anaconda/user-guide/tasks/integration/sublime">conda package for Sublime Text 3</a> in default configuration is prefering Anaconda. Neverless by adjusting some paths, you&rsquo;ll be able to use miniconda aswell. The source block below was taken for a installation of miniconda (with Python 3.6) x64 on a Windows workstation. The paths might be different on a macOS or Linux machine.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">// Default settings for sublime-text-conda</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="l">// executable is the path to anaconda&#39;s python</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="l">// this python executable is used in order to find conda</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;executable&#34;: </span><span class="s2">&#34;~\\AppData\\Local\\Continuum\\miniconda3\\python&#34;</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="w">    </span><span class="l">// Directory in which the conda envs are stored</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="l">// Default location is the user&#39;s home directory</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;environment_directory&#34;: </span><span class="s2">&#34;~\\AppData\\Local\\Continuum\\miniconda3\\envs\\&#34;</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="w">    </span><span class="l">// configuration is the path to conda&#39;s configuration file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;configuration&#34;: </span><span class="s2">&#34;~/.condarc&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>}<span class="w">
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Amplitude modulation and demodulation using Python</title>
      <link>https://hufschlaeger.net/blog/2017/04/27/amplitude-modulation-and-demodulation-using-python/</link>
      <pubDate>Thu, 27 Apr 2017 10:43:31 +0200</pubDate>
      <guid>https://hufschlaeger.net/blog/2017/04/27/amplitude-modulation-and-demodulation-using-python/</guid>
      <description>&lt;p&gt;As the title promises, I have spent some time for recapitulating the amplitude modulation and several reconstruction techniques. Today amplitude modulation isn&amp;rsquo;t very common, but was used for varoius applications like audio or signal transmissions in general.&lt;/p&gt;
&lt;h2 id=&#34;math&#34;&gt;Math&lt;/h2&gt;
&lt;p&gt;The amplitude modulation uses a high frequency signal $U_{C}$ which carriers the low frequency signal $U_{NF}$ into a higher frequency band.&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
U_{NF} &amp;amp;= \hat{U}_{T} + \hat{U}_{NF} \cdot cos\left( \omega t \right)\\
U_{C}  &amp;amp;= \hat{U}_{C} \cdot cos \left( \Omega t \right)
\end{aligned}$$&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As the title promises, I have spent some time for recapitulating the amplitude modulation and several reconstruction techniques. Today amplitude modulation isn&rsquo;t very common, but was used for varoius applications like audio or signal transmissions in general.</p>
<h2 id="math">Math</h2>
<p>The amplitude modulation uses a high frequency signal $U_{C}$ which carriers the low frequency signal $U_{NF}$ into a higher frequency band.</p>
<p>$$
\begin{aligned}
U_{NF} &amp;= \hat{U}_{T} + \hat{U}_{NF} \cdot cos\left( \omega t \right)\\
U_{C}  &amp;= \hat{U}_{C} \cdot cos \left( \Omega t \right)
\end{aligned}$$</p>
<p>For mathematical description, we choose \(\hat{U}_{C}\) to be \(1\) and we will end up.</p>
<p>$$
\begin{aligned}
U_{AM} &amp;= U_{NF} \cdot U_{C} \\
&amp;= \left( \hat{U}_{T} + \hat{U}_{NF} cos\left( \omega t \right) \right) \cdot cos \left( \Omega t \right) \\
&amp;= \hat{U}_{T} \cdot cos \left( \Omega t \right) + \frac{\hat{U}_{NF}}{2}\left( cos \left( \left( \Omega - \omega \right) \right) + cos \left( \left( \Omega + \omega \right) \right) \right)
\end{aligned}$$</p>
<p>The last equation shows clearly the circumstance of three existing signals. The first one describes the DC<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> component of the used low frequency signal, but with carrier frequency. The remaining two parts describing the produced sideband signals. They have the half amplitude of the low frequency signal and are positioned around the carrier frequency.
For this script I demodulate the transmitted signal by using the convolution theory. Insted of use an envelope detector, it is also possible to multiply the time series of the carrier function again. Multiplication in the time domain will occur an convolution of booth signals in the frequency domain and as the low frequency part is shifted to higher frequencies, there will be existe multiple copies of the same alogn the frequency axis.</p>
<h2 id="python-implementation">Python implementation</h2>
<h3 id="import-packages-and-libs">Import packages and libs</h3>
<p>At first we will iport the needed packages. As you can see, I used matplotlib, numpy and scipy for this script. RaisedCos and Noisgen are selfwritten classes for signal generation.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">scipy</span> <span class="k">as</span> <span class="nn">sp</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">scipy.signal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">raised_cos</span> <span class="kn">import</span> <span class="n">RaisedCos</span><span class="p">,</span> <span class="n">Noisegen</span>
</span></span></code></pre></div><h3 id="define-constants">Define constants</h3>
<p>The constant values for this script are described below. I used a carrier frequency of 33 kHz and a signal frequency of 5.5 kHz for the lower signal part. The whole script uses a sample frequency of 1 MHz, so we get a sample period of 100 ns. <em>ffc</em> describes the cutoff frequency of the used reconstruction/low-pass filter and <em>N</em> is the number of used filter coefficients.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">fc</span> <span class="o">=</span> <span class="mf">33e3</span>                   <span class="c1"># 33 kHz carrier</span>
</span></span><span class="line"><span class="cl"><span class="n">fs</span> <span class="o">=</span> <span class="mf">5.5e3</span>                  <span class="c1"># 5.5 kHz signal</span>
</span></span><span class="line"><span class="cl"><span class="n">fa</span> <span class="o">=</span> <span class="mf">1e7</span>                    <span class="c1"># sample frequency</span>
</span></span><span class="line"><span class="cl"><span class="n">dt</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="n">fa</span>                   <span class="c1"># time resolution</span>
</span></span><span class="line"><span class="cl"><span class="n">ffc</span><span class="o">=</span> <span class="mf">1.5</span><span class="o">*</span><span class="n">fs</span><span class="o">/</span><span class="n">fa</span>              <span class="c1"># cutoff frequency fir</span>
</span></span><span class="line"><span class="cl"><span class="n">N</span>  <span class="o">=</span> <span class="mi">150</span>                    <span class="c1"># filter order</span>
</span></span></code></pre></div><h3 id="generate-signals-and-filter-coefficients">Generate Signals and filter coefficients</h3>
<p>For source signal generation I implemented the raised cosine function in Python. These function provides the possibility of a controllable bandwidth. The bandwidth may be modified by increasing the order \(N\).
$$
\begin{aligned}
U_{RC, N}\left( t\right) &amp;= \frac{\left( -1 \right)^N}{2} \left(1 - cos\left( \frac{\omega t}{N} - \phi \right) \right) \cdot cos \left( \frac{\omega}{2} t - \phi\right)
\end{aligned}$$</p>
<figure>
    <img loading="lazy" src="/img/RaisedCosine.png"/> <figcaption>
            Various pulses with different order and bandwith
        </figcaption>
</figure>

<p>The Figure above shows the generated signal in time and frequency domain without noisefloor for different orders. As you can see the bandwidth is decreasing while the order was increased.
For this example I used the sixth order, but neverless to say any other order would be also suitable.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">Points</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="mf">20e-4</span><span class="o">/</span><span class="n">dt</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1"># filter coefficients</span>
</span></span><span class="line"><span class="cl"><span class="n">h</span> <span class="o">=</span> <span class="n">sp</span><span class="o">.</span><span class="n">signal</span><span class="o">.</span><span class="n">firwin</span><span class="p">(</span><span class="n">numtaps</span><span class="o">=</span><span class="n">N</span><span class="p">,</span> <span class="n">cutoff</span><span class="o">=</span><span class="n">fc</span><span class="p">,</span> <span class="n">nyq</span><span class="o">=</span><span class="n">fa</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># time vector</span>
</span></span><span class="line"><span class="cl"><span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mf">20e-4</span><span class="p">,</span><span class="n">dt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ulf</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">Points</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># noise floor</span>
</span></span><span class="line"><span class="cl"><span class="n">noise</span> <span class="o">=</span> <span class="n">Noisegen</span><span class="p">(</span> <span class="n">Points</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#Points = int(round(4e-4/dt + 1))</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ultrasonic impulse</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">RaisedCos</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="n">Points</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">fs</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ulf</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">signal</span>
</span></span><span class="line"><span class="cl"><span class="c1">#ulf = np.sin(2*np.pi*fs*x)</span>
</span></span><span class="line"><span class="cl"><span class="n">ulf</span> <span class="o">+=</span> <span class="n">noise</span><span class="o">.</span><span class="n">signal</span>
</span></span><span class="line"><span class="cl"><span class="c1"># thermal signal carrier</span>
</span></span><span class="line"><span class="cl"><span class="n">ucr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="mi">2</span><span class="o">*</span><span class="n">fc</span><span class="o">*</span><span class="n">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># carrier multiplied with low frequency signal</span>
</span></span><span class="line"><span class="cl"><span class="n">uam</span> <span class="o">=</span> <span class="n">ucr</span><span class="o">*</span><span class="n">ulf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># demodulate signal by mupltiplying the amplitude modulated signal again</span>
</span></span><span class="line"><span class="cl"><span class="n">ud</span> <span class="o">=</span> <span class="n">uam</span> <span class="o">*</span> <span class="n">ucr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># applyng the lowpass filter</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">sp</span><span class="o">.</span><span class="n">signal</span><span class="o">.</span><span class="n">lfilter</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="n">ud</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Scaling the amplitude</span>
</span></span><span class="line"><span class="cl"><span class="n">y</span>  <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span>
</span></span></code></pre></div><h3 id="plotting-the-signals">Plotting the signals</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># plotting</span>
</span></span><span class="line"><span class="cl"><span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</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">set_size_inches</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mf">1e3</span><span class="p">,</span> <span class="n">ulf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Input signal&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">&#39;Amplitude [V]&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mf">1e3</span><span class="p">,</span> <span class="n">uam</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Modulated channel&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mf">1e3</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Rescaled reconstruction&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">&#39;Time [ms]&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">axarr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s1">&#39;signals.png&#39;</span><span class="p">,</span><span class="n">dpi</span><span class="o">=</span><span class="mi">150</span><span class="p">)</span>
</span></span></code></pre></div><figure>
    <img loading="lazy" src="/img/output_9_0.png"/> <figcaption>
            Plotted signals: source signal (left), modulated signal (mid) and the reconstructed time signal.
        </figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Direct current&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Interfacing a MS8607 sensor with Python using the bus pirate</title>
      <link>https://hufschlaeger.net/blog/2017/02/26/interfacing-a-ms8607-sensor-with-python-using-the-bus-pirate/</link>
      <pubDate>Sun, 26 Feb 2017 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2017/02/26/interfacing-a-ms8607-sensor-with-python-using-the-bus-pirate/</guid>
      <description>&lt;p&gt;A couple of days ago, I&amp;rsquo;ve read about &lt;a href=&#34;http://www.swharden.com/wp/2017-02-04-logging-i2c-data-with-bus-pirate-and-python/&#34;&gt;Scott Harden&amp;rsquo;s&lt;/a&gt; interesting approach of interfacing a twi temperature sensor by using Python and Hack-a-day&amp;rsquo;s bus pirate. Quite accidentally, I had an similar problem. For some experiments I need a good knowledge about my environmental sizes (e.g. ambient pressure, temperature and humidity). I decided to use a &lt;a href=&#34;http://www.thermalcomponents.com.au/wp-content/uploads/2014/10/Temp-Hum-Press-Sensor.pdf&#34;&gt;MS8607&lt;/a&gt; sensor produced by &amp;ldquo;&lt;em&gt;Measurement Specialities / TE Connectivity&lt;/em&gt;&amp;rdquo; and is distributed for example by &lt;a href=&#34;http://www.amsys.de/products/ms8607.htm&#34; title=&#34;ms8607 product page&#34;&gt;AMSYS&lt;/a&gt;. I&amp;rsquo;ve got some modules and started reading the datasheet. Due a permanent lack of time I was searching for a good and simple way for testing the sensor interface without the whole prototype circus (e.g. design and build some interface cards, testing the code by using debug interfaces and so on). Scott&amp;rsquo;s solution was simple and I had all tools already available, so I started to adapt his code for my needs.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A couple of days ago, I&rsquo;ve read about <a href="http://www.swharden.com/wp/2017-02-04-logging-i2c-data-with-bus-pirate-and-python/">Scott Harden&rsquo;s</a> interesting approach of interfacing a twi temperature sensor by using Python and Hack-a-day&rsquo;s bus pirate. Quite accidentally, I had an similar problem. For some experiments I need a good knowledge about my environmental sizes (e.g. ambient pressure, temperature and humidity). I decided to use a <a href="http://www.thermalcomponents.com.au/wp-content/uploads/2014/10/Temp-Hum-Press-Sensor.pdf">MS8607</a> sensor produced by &ldquo;<em>Measurement Specialities / TE Connectivity</em>&rdquo; and is distributed for example by <a href="http://www.amsys.de/products/ms8607.htm" title="ms8607 product page">AMSYS</a>. I&rsquo;ve got some modules and started reading the datasheet. Due a permanent lack of time I was searching for a good and simple way for testing the sensor interface without the whole prototype circus (e.g. design and build some interface cards, testing the code by using debug interfaces and so on). Scott&rsquo;s solution was simple and I had all tools already available, so I started to adapt his code for my needs.</p>
<h2 id="calculations">Calculations</h2>
<p>Difference between actual and reference temperature : $$\Delta T = D_2 - C_5 \cdot 2^8 $$
Offset for temperature compensated pressure :  $$OFF = C_2 \cdot 2^{17} + \frac{C_4 \cdot \Delta T} {2^6}$$
Sensivity for actual temperature :  $$SENS = C_1 \cdot 2^{16} + \frac{C_3 \cdot \Delta T}{2^7}$$</p>
<p>Temperature (in 0.01 °C resolution) : $$T = 2000 + \Delta T \cdot \frac{C_6}{2^{23}}$$
Pressure (in 0.01 mbar resolution): $$P = \frac{\dfrac{D_1 \cdot SENS}{2^{21}} - OFF}{2^{15}}$$
Relative humidity (in %) : $$RH = -6 + 125 \cdot \frac{S_{RH}}{2^{16}}$$</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">serial</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">math</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</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 class="n">BUSPIRATE_PORT</span> <span class="o">=</span> <span class="s1">&#39;com5&#39;</span> <span class="c1">#customize this! Find it in device manager.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="n">cmd</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    send the command and listen to the response.
</span></span></span><span class="line"><span class="cl"><span class="s2">    returns a list of the returned lines.
</span></span></span><span class="line"><span class="cl"><span class="s2">    The first item is always the command sent.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">ser</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">cmd</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;ascii&#39;</span><span class="p">))</span> <span class="c1"># send our command</span>
</span></span><span class="line"><span class="cl">    <span class="n">lines</span><span class="o">=</span><span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">ser</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span> <span class="c1"># while there&#39;s a response</span>
</span></span><span class="line"><span class="cl">        <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</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">silent</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;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="o">*</span><span class="mi">60</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">lines</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">sendSensor</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0xEC</span><span class="p">,</span>  <span class="n">addrread</span><span class="o">=</span><span class="mh">0xED</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Sending data to sensor by using the bus priate device
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span> <span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;[</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">addrwrite</span><span class="p">,</span> <span class="n">register</span><span class="p">),</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># read two bytes</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">readSensor</span> <span class="p">(</span><span class="n">ser</span><span class="p">,</span> <span class="n">noBytes</span><span class="p">,</span> <span class="n">register</span><span class="o">=</span><span class="mh">0x00</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0xEC</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0xED</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Reading data from sensor by using the bus priate device.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">readonly</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">lines</span><span class="o">=</span><span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;[</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1"> [ </span><span class="si">%s</span><span class="s1"> r:</span><span class="si">%d</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">addrwrite</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">noBytes</span> <span class="p">)</span> <span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># read three bytes from adc</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="n">lines</span><span class="o">=</span><span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;[</span><span class="si">%s</span><span class="s1"> r:</span><span class="si">%d</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">noBytes</span> <span class="p">)</span> <span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># read three bytes from adc</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">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;READ:&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">line</span><span class="o">=</span><span class="n">line</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 class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;ACK&#34;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">while</span> <span class="s2">&#34;  &#34;</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">line</span><span class="o">=</span><span class="s2">&#34; &#34;</span><span class="o">+</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</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></span><span class="line"><span class="cl">            <span class="n">word</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">            <span class="n">validx</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="n">line</span><span class="o">=</span><span class="s2">&#34; &#34;</span><span class="o">+</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;0x&#34;</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">vals</span> <span class="o">=</span> <span class="n">line</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">vals</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">nVals</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">iVal</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">cVal</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">iVal</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">word</span> <span class="o">+=</span> <span class="n">cVal</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pow</span> <span class="p">(</span> <span class="mi">2</span> <span class="p">,</span> <span class="mi">8</span> <span class="o">*</span> <span class="p">(</span><span class="n">nVals</span> <span class="o">-</span> <span class="n">validx</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">validx</span> <span class="o">+=</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">getPressure</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0xEC</span><span class="p">,</span> <span class="n">register</span><span class="o">=</span><span class="mh">0x4A</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0xED</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    get ambient pressure
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <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="mf">0.5</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">word</span> <span class="o">=</span> <span class="n">readSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="n">addrwrite</span><span class="p">,</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">getTemperature</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0xEC</span><span class="p">,</span> <span class="n">register</span><span class="o">=</span><span class="mh">0x5A</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0xED</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span><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="mf">0.5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">word</span> <span class="o">=</span> <span class="n">readSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="n">addrwrite</span><span class="p">,</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">word</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">getHumidity</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0x80</span><span class="p">,</span> <span class="n">register</span><span class="o">=</span><span class="mh">0xA0</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0x81</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># start humidity conversion</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 0xF5 no hold master</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 0xE5 hold master</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mh">0xF5</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="n">addrwrite</span><span class="p">,</span>  <span class="n">addrread</span><span class="o">=</span><span class="n">addrread</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <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="mf">0.5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">word</span> <span class="o">=</span> <span class="n">readSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">addrwrite</span><span class="p">,</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">getCalibrationWord</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0xEC</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0xED</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">word</span> <span class="o">=</span> <span class="n">readSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">register</span><span class="p">,</span> <span class="n">addrwrite</span><span class="p">,</span> <span class="n">addrread</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">word</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">initpirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># have a clean starting point</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;#&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># reset bus pirate (slow, maybe not needed)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#sendPirate(ser,&#39;v&#39;) # show current voltages</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># set mode to I2C</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;m&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># change mode (goal is to get away from HiZ)</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;4&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># mode 4 is I2C</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;3&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># 100KHz</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;W&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># turn power supply to ON. Lowercase w for OFF.</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;P&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># enable pull-up resistors</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendPirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="s1">&#39;(1)&#39;</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</span> <span class="c1"># scan I2C devices. Returns &#34;0x90(0x48 W) 0x91(0x48 R)&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">initSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mh">0x1E</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <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="mf">0.5</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># reset humidity sensor</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendSensor</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="mh">0xFE</span> <span class="p">,</span>  <span class="n">addrwrite</span><span class="o">=</span><span class="mh">0x80</span><span class="p">,</span> <span class="n">addrread</span><span class="o">=</span><span class="mh">0x81</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <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="mf">0.3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">PTCal</span> <span class="o">=</span> <span class="n">getPTCalibrationData</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="n">silent</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">PTCal</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">getPTCalibrationData</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span> <span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">PTCalibration</span><span class="o">=</span><span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">6</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">PTCalibration</span><span class="o">.</span><span class="n">append</span> <span class="p">(</span><span class="n">getCalibrationWord</span><span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">register</span><span class="o">=</span><span class="p">(</span><span class="mh">0xA2</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">),</span><span class="n">silent</span><span class="o">=</span><span class="n">silent</span><span class="p">)</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">silent</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;register 0x</span><span class="si">%X</span><span class="s2"> =&gt; 0x</span><span class="si">%X</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="p">(</span> <span class="nb">int</span><span class="p">(</span><span class="mh">0xA2</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">)</span> <span class="p">,</span> <span class="n">PTCalibration</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">PTCalibration</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="n">ser</span><span class="o">=</span><span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="n">BUSPIRATE_PORT</span><span class="p">,</span> <span class="mi">115200</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mf">.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># init buspirate</span>
</span></span><span class="line"><span class="cl"><span class="n">initpirate</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span><span class="n">silent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># reset PT sensor</span>
</span></span><span class="line"><span class="cl"><span class="n">PTCal</span><span class="o">=</span> <span class="n">initSensor</span><span class="p">(</span><span class="n">ser</span><span class="p">,</span> <span class="n">silent</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="c1"># start pressure conversion</span>
</span></span><span class="line"><span class="cl"><span class="n">D1</span>   <span class="o">=</span> <span class="n">getPressure</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">silent</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="c1"># start temperature conversion</span>
</span></span><span class="line"><span class="cl"><span class="n">D2</span>   <span class="o">=</span> <span class="n">getTemperature</span> <span class="p">(</span> <span class="n">ser</span> <span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">dT</span>   <span class="o">=</span> <span class="n">D2</span> <span class="o">-</span> <span class="n">PTCal</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">*</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="n">Temp</span> <span class="o">=</span> <span class="mi">2000</span> <span class="o">+</span> <span class="n">dT</span> <span class="o">*</span> <span class="n">PTCal</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">/</span> <span class="mi">8388608</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">OFF</span>  <span class="o">=</span> <span class="n">PTCal</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="mi">131072</span> <span class="o">+</span> <span class="p">(</span><span class="n">PTCal</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">*</span> <span class="n">dT</span><span class="p">)</span> <span class="o">/</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="n">SENS</span> <span class="o">=</span> <span class="n">PTCal</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">65536</span> <span class="o">+</span> <span class="p">(</span><span class="n">PTCal</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">*</span> <span class="n">dT</span> <span class="p">)</span> <span class="o">/</span> <span class="mi">128</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">Temp</span> <span class="o">&gt;=</span> <span class="mi">2000</span> <span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">Ti</span>   <span class="o">=</span> <span class="mi">5</span> <span class="o">*</span> <span class="p">(</span><span class="n">dT</span> <span class="o">*</span> <span class="n">dT</span><span class="p">)</span> <span class="o">/</span> <span class="mi">274877906944</span>
</span></span><span class="line"><span class="cl">    <span class="n">OFFi</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">SENSi</span><span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="n">Temp</span> <span class="o">&lt;</span> <span class="mi">2000</span> <span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">Ti</span>   <span class="o">=</span> <span class="mi">3</span> <span class="o">*</span> <span class="p">(</span><span class="n">dT</span> <span class="o">*</span> <span class="n">dT</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8589934592</span>
</span></span><span class="line"><span class="cl">    <span class="n">OFFi</span> <span class="o">=</span> <span class="mi">61</span> <span class="o">*</span> <span class="p">((</span><span class="n">Temp</span> <span class="o">-</span> <span class="mi">2000</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">Temp</span> <span class="o">-</span> <span class="mi">2000</span><span class="p">))</span> <span class="o">/</span> <span class="mi">16</span>
</span></span><span class="line"><span class="cl">    <span class="n">SENSi</span><span class="o">=</span> <span class="mi">29</span> <span class="o">*</span> <span class="p">((</span><span class="n">Temp</span> <span class="o">-</span> <span class="mi">2000</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">Temp</span> <span class="o">-</span> <span class="mi">2000</span><span class="p">))</span> <span class="o">/</span> <span class="mi">16</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">Temp</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mi">1500</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">OFFi</span> <span class="o">=</span> <span class="n">OFFi</span> <span class="o">+</span> <span class="mi">17</span> <span class="o">*</span> <span class="p">((</span><span class="n">Temp</span> <span class="o">+</span> <span class="mi">1500</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">Temp</span> <span class="o">+</span> <span class="mi">1500</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">SENSi</span><span class="o">=</span> <span class="n">SENSi</span> <span class="o">+</span> <span class="mi">9</span> <span class="o">*</span> <span class="p">((</span><span class="n">Temp</span> <span class="o">+</span> <span class="mi">1500</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">Temp</span> <span class="o">+</span><span class="mi">1500</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">OFF2</span>    <span class="o">=</span> <span class="n">OFF</span> <span class="o">-</span> <span class="n">OFFi</span>
</span></span><span class="line"><span class="cl"><span class="n">SENS2</span>   <span class="o">=</span> <span class="n">SENS</span> <span class="o">-</span> <span class="n">SENSi</span>
</span></span><span class="line"><span class="cl"><span class="n">cTemp</span>   <span class="o">=</span> <span class="p">(</span><span class="n">Temp</span> <span class="o">-</span> <span class="n">Ti</span><span class="p">)</span> <span class="o">/</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl"><span class="n">fTemp</span>   <span class="o">=</span>  <span class="n">cTemp</span> <span class="o">*</span> <span class="mf">1.8</span> <span class="o">+</span> <span class="mi">32</span>
</span></span><span class="line"><span class="cl"><span class="n">pressure</span><span class="o">=</span> <span class="p">((((</span><span class="n">D1</span> <span class="o">*</span> <span class="n">SENS2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2097152</span><span class="p">)</span> <span class="o">-</span> <span class="n">OFF2</span><span class="p">)</span> <span class="o">/</span> <span class="mf">32768.0</span><span class="p">)</span> <span class="o">/</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl"><span class="n">D3</span>      <span class="o">=</span> <span class="n">getHumidity</span> <span class="p">(</span> <span class="n">ser</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">True</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">humidity</span><span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="mf">6.0</span> <span class="o">+</span> <span class="p">(</span><span class="mf">125.0</span> <span class="o">*</span> <span class="p">(</span><span class="n">D3</span> <span class="o">/</span> <span class="mf">65536.0</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span> <span class="p">(</span> <span class="s2">&#34;Temperature </span><span class="si">%2.2f</span><span class="s2"> °C / Pressure </span><span class="si">%3.2f</span><span class="s2"> mbar / Humidity </span><span class="si">%3.1f</span><span class="s2"> </span><span class="si">%%</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">cTemp</span> <span class="p">,</span> <span class="n">pressure</span><span class="p">,</span> <span class="n">humidity</span> <span class="p">))</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>CFD simulations using Scientific Python</title>
      <link>https://hufschlaeger.net/blog/2016/12/18/cfd-simulations-using-scientific-python/</link>
      <pubDate>Sun, 18 Dec 2016 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2016/12/18/cfd-simulations-using-scientific-python/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For some simulation topics of my Ph.D., I had to learn/recapitulate some basics about simulations techniques and fluid simulations. The original procedure and code could be found at &lt;a href=&#34;http://www.archer.ac.uk/training/course-material/2014/07/SciPython_Cranfield/&#34;&gt;Archer (UK National Supercomputing Service)&lt;/a&gt;. This is a simple example for applying the finite difference approach to determine the flow pattern (CFD&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;) in a cavity. For simplicity, we&amp;rsquo;re assuming a perfect liquid without viscosity, which also implies that there&amp;rsquo;re no vortices. The \(z\)-dimension of this setup was defined to be endless. We are interested in the directional velocity of the fluid.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="introduction">Introduction</h2>
<p>For some simulation topics of my Ph.D., I had to learn/recapitulate some basics about simulations techniques and fluid simulations. The original procedure and code could be found at <a href="http://www.archer.ac.uk/training/course-material/2014/07/SciPython_Cranfield/">Archer (UK National Supercomputing Service)</a>. This is a simple example for applying the finite difference approach to determine the flow pattern (CFD<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>) in a cavity. For simplicity, we&rsquo;re assuming a perfect liquid without viscosity, which also implies that there&rsquo;re no vortices. The \(z\)-dimension of this setup was defined to be endless. We are interested in the directional velocity of the fluid.</p>
<p><img alt="Simulation  setup" loading="lazy" src="/img/boundary_and_cavities.png" title="Simulation  setup"></p>
<h2 id="a-bit-of-math">A bit of math</h2>
<h3 id="finite-difference-method">Finite Difference Method</h3>
<h4 id="first-order-pde">First order PDE</h4>
<p>For solving a first or higher order PDE<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> several methods exist. The easiest one is the finite difference method. For that method we&rsquo;re needing a suitable approximation for the first derivative, for example the left aligned or forward difference:</p>
<p>$$
\frac{\partial}{\partial x} F \approx \frac{F(x + \Delta x) - F(x)}{\Delta x} + \mathcal{O(\Delta x)}
$$</p>
<p>Also possible, the right aligned or backward difference:</p>
<p>$$
\frac{\partial}{\partial x} F \approx \frac{F(x) - F(x - \Delta x)}{\Delta x} + \mathcal{O(\Delta x)}
$$</p>
<p>For a better approximation, we could also use the combination of forward and backward difference. This method is called the centered difference and is able to describe the derivative on position \(x\) only with knowledge about the neighbors left and right.</p>
<p>$$
\frac{\partial}{\partial x} F \approx \frac{F(x + \Delta x) - F(x - \Delta x)}{2\Delta x} + \mathcal{O(\Delta x)}
$$</p>
<h4 id="second-and-higher-order-pde">Second and higher order PDE</h4>
<p>$$
\begin{align}
\frac{\partial^2 F}{\partial x^2} &amp; = \frac{\partial } {\partial x} \left( \frac{\partial F}{\partial x}\right) \\
&amp; \approx \frac{1}{\Delta x}\left(\frac{\partial F(x + \Delta x)}{\partial x} - \frac{\partial F(x - \Delta x)}{\partial x} \right) \\
&amp; \approx \frac{1}{ \Delta x} \left( \frac{F(x+\Delta x) - F(x)}{  \Delta x} - \frac{F(x)  - F(x - \Delta x)}{  \Delta x} \right)+ \mathcal{O}(\Delta x)^2 \\
&amp; \approx \frac{1}{(\Delta x)^2} \Bigg( F(x + \Delta x) - 2F(x)  + F(x - \Delta x) \Bigg) + \mathcal{O}(\Delta x)^2
\end{align}
$$</p>
<h2 id="cavity-problem-solving">Cavity problem solving</h2>
<p>For the given problem the following second-order PDE exist for the fluid flow \(\Psi\) which neglecting the existence of viscosity and toroids.</p>
<p>$$\frac{\partial^2 \Psi}{\partial x^2}  + \frac{\partial^2 \Psi}{\partial y^2} = 0$$</p>
<p>Using the finite difference approach for second order PDEs we could rewrite the equation, which fully satisfies our problem.</p>
<p>$$
\begin{align}
\frac{\partial^2 \Psi}{\partial x^2}  + \frac{\partial^2 \Psi}{\partial y^2} &amp; \approx \frac{1}{(\Delta x)^2} \Bigg( \Psi(x + \Delta x, y ) - 2 \Psi (x, y)  + \Psi (x - \Delta x, y) \Bigg)\\
&amp; + \frac{1}{(\Delta y)^2} \Bigg( \Psi(x, y + \Delta y) - 2 \Psi(x,y)  + \Psi(x, y - \Delta y) \Bigg)
\end{align}
$$</p>
<p>For discretization we replace the continous terms \(x\) and \(y\) by their discrete replacements \(i\) and \(j\) and set the spatial resolution in \(x\)- and \(y\)-direction to \(1\) (\(\Delta x=\Delta y=1\) ).</p>
<p>$$
\frac{\partial^2 \Psi}{\partial x^2}  + \frac{\partial^2 \Psi}{\partial y^2} \approx \Psi_{i+1,j} + \Psi_{i-1, j} + \Psi_{i,j-1} + \Psi_{i, j+1} - 4\cdot\Psi_{i,j} = 0
$$</p>
<p>With this approximation and the usage of the Dirchlet boundary condition (borders without sources are set to \(0\)) we could solve our problem. For velocity field \( \vec{u} \) computation, we calculate the partial differentiations.</p>
<p>$$
u_x (x,y) = \frac{\partial\Psi}{\partial y} = \frac{1}{2} \left( \Psi_{i,j+1} - \Psi_{i,j-1} \right)$$</p>
<p>$$ u_y (x,y) = \frac{\partial\Psi}{\partial x} = \frac{1}{2} \left( \Psi_{i+1,j} - \Psi_{i-1,j} \right)
$$</p>
<h3 id="implementation">Implementation</h3>
<h4 id="boundary-conditions">Boundary conditions</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">    <span class="n">psi</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Set the bondary conditions on bottom edge</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="o">+</span><span class="n">w</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">psi</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="n">w</span><span class="p">,</span> <span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">psi</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Set the bondary conditions on right edge</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">h</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">psi</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">h</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">h</span><span class="o">+</span><span class="n">w</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">psi</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">w</span><span class="o">-</span><span class="n">j</span><span class="o">+</span><span class="n">h</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="solver-implementation">Solver implementation</h4>
<p>The implementation supports booth convergence criteria: maximum number of iteration steps and minimum achievable tolerance \(\sigma\).
For determining the current tolerance we consider the current and iteration step before. Therefore we calculate the Euclidean distance (magnitude normal) to get the achieved gain between these steps. Was the change less than the given tolerance, we skip further iterations.</p>
<p>$$
| \Psi_k - \Psi_{k-1}| \le \sigma
$$</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">solver</span> <span class="p">(</span> <span class="n">tol</span><span class="p">,</span> <span class="n">nMaxIterations</span><span class="p">,</span> <span class="n">psi</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span> <span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">M</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">psi</span><span class="p">)</span> <span class="o">-</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">psi</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="n">tmp</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">M</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">        <span class="n">cStep</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">xs</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">ys</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">dy</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="p">(</span> <span class="n">cStep</span> <span class="o">&lt;</span> <span class="n">nMaxIterations</span> <span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># store old residue</span>
</span></span><span class="line"><span class="cl">            <span class="n">res_old</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span> <span class="p">(</span> <span class="n">psi</span> <span class="p">)</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span> <span class="p">(</span> <span class="n">tmp</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># differeniation in booth directions</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">M</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                    <span class="n">tmp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.25</span> <span class="o">*</span> <span class="p">(</span><span class="n">psi</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="o">+</span><span class="n">psi</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="o">+</span><span class="n">psi</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">psi</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">cStep</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># update residue</span>
</span></span><span class="line"><span class="cl">            <span class="n">res_new</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span> <span class="p">(</span> <span class="n">psi</span> <span class="p">)</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span> <span class="p">(</span> <span class="n">tmp</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># updating flow for next iteration</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">M</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                    <span class="n">psi</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</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="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span> <span class="n">res_new</span> <span class="o">-</span> <span class="n">res_old</span> <span class="p">)</span> <span class="o">&lt;=</span> <span class="n">tol</span> <span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">cStep</span>
</span></span></code></pre></div><h3 id="results">Results</h3>
<figure>
    <img loading="lazy" src="/img/flow.png"/> <figcaption>
            Simulation results
        </figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Computational fluid dynamics&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Partial difference equation&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Scientific Python - first contact</title>
      <link>https://hufschlaeger.net/blog/2016/12/05/scientific-python-first-contact/</link>
      <pubDate>Mon, 05 Dec 2016 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2016/12/05/scientific-python-first-contact/</guid>
      <description>&lt;p&gt;To be honest, my last contact with Python was some &lt;a href=&#34;https://hufschlaeger.net/2008-11-messwerte-schnell-mit-gnuplot-und-python-plotten/&#34;&gt;years ago&lt;/a&gt;. It&amp;rsquo;s a pretty cool language, nice packaging system (pip and so on) like CPAN&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; or CTAN&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. But to be more focused on C/C++, Python and myself are going different ways. Last year I purchased a textbook &amp;ldquo;Python Machine Learning&amp;rdquo;  Sebastian Raschka in a fortunate coincidence and as I had read it, I was fascinated by a bundle of new Python libraries like Numpy, SciPy, Mathplotlib and so on.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>To be honest, my last contact with Python was some <a href="/2008-11-messwerte-schnell-mit-gnuplot-und-python-plotten/">years ago</a>. It&rsquo;s a pretty cool language, nice packaging system (pip and so on) like CPAN<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> or CTAN<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. But to be more focused on C/C++, Python and myself are going different ways. Last year I purchased a textbook &ldquo;Python Machine Learning&rdquo;  Sebastian Raschka in a fortunate coincidence and as I had read it, I was fascinated by a bundle of new Python libraries like Numpy, SciPy, Mathplotlib and so on.</p>
<h2 id="first-contact-and-results">First contact and results</h2>
<p>For data machining, there&rsquo;re lots of tools inside these packages and they are able to compete with such huge software packages like Mathworks MATLAB<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. Of course, MATLAB is in most cases the first choice for quick results and spontaneously written scripts. But there are lots of advantages like the platform independence, there existing Open Source licensed packages and it is highly automatable.</p>
<p>So in preparation for a presentation, I was tinkering with these Python packages and was able to generate these nice bivariate distributions. They are running on my office system (Windows 7), on my private MacBook and of course on my CI<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> server. A win-win-win situation I guess.</p>
<h2 id="results">Results</h2>
<p><figure>
    <img loading="lazy" src="/img/A_height_dist.png"/> <figcaption>
            Bivariate distribution #1
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/img/A_size_dist.png"/> <figcaption>
            Bivariate distribution #2
        </figcaption>
</figure>
</p>
<h2 id="conclusion">Conclusion</h2>
<p>As I mentioned &ldquo;Scientific Python&rdquo; is a great way for data processing and visualization.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Comprehensive Perl Archive Network&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Comprehensive TeX Archive Network&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Matrix laboratory.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Continuous Integration&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Get your drive info</title>
      <link>https://hufschlaeger.net/blog/2016/04/22/get-your-drive-info/</link>
      <pubDate>Fri, 22 Apr 2016 19:10:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2016/04/22/get-your-drive-info/</guid>
      <description>&lt;p&gt;Since two weeks my server is reporting some S.M.A.R.T-errors on one of my hard drives. For a quick overview about all drives (serial numbers, mode) and finding the one which has to been replaced, I&amp;rsquo;ve written a small script. The script produces a fancy list of all available drives on your Linux host. It uses hdparm in combination with sed for retrieving the drive information, so both are the only dependencies. With a few changes it could be used directly for generating content as Markdown.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Since two weeks my server is reporting some S.M.A.R.T-errors on one of my hard drives. For a quick overview about all drives (serial numbers, mode) and finding the one which has to been replaced, I&rsquo;ve written a small script. The script produces a fancy list of all available drives on your Linux host. It uses hdparm in combination with sed for retrieving the drive information, so both are the only dependencies. With a few changes it could be used directly for generating content as Markdown.</p>
<h2 id="code">Code</h2>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nb">printf</span> <span class="s2">&#34;%.0s-&#34;</span> <span class="o">{</span>1..58<span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;\n&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;| DEVICE%2s | SERIALNO%12s | MODEL%15s |\n&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;%.0s-&#34;</span> <span class="o">{</span>1..58<span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;\n&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> i in <span class="k">$(</span> ls /dev/sd* <span class="k">)</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="o">[[</span> <span class="nv">$i</span> <span class="o">=</span>~ ^<span class="o">[</span>A-Za-z_//<span class="o">]</span>+$ <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">		<span class="nv">SERNO</span><span class="o">=</span><span class="k">$(</span>hdparm -i <span class="nv">$i</span> <span class="p">|</span>grep -i SerialNo <span class="p">|</span>cut -d <span class="s1">&#39;,&#39;</span> -f <span class="m">3</span> <span class="p">|</span> sed <span class="s1">&#39;s/^[ ]*[[:alnum:]]*=//&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">		<span class="nv">MODEL</span><span class="o">=</span><span class="k">$(</span>hdparm -i <span class="nv">$i</span> <span class="p">|</span>grep -i Model <span class="p">|</span>cut -d <span class="s1">&#39;,&#39;</span> -f <span class="m">1</span> <span class="p">|</span> sed <span class="s1">&#39;s/^[ ]*[[:alnum:]]*=//&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">		<span class="nb">printf</span> <span class="s2">&#34;| %8s | %20s | %20s |\n&#34;</span> <span class="s2">&#34;</span><span class="nv">$i</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$SERNO</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$MODEL</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;%.0s-&#34;</span> <span class="o">{</span>1..58<span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;\n&#34;</span>
</span></span></code></pre></div><h2 id="output">Output</h2>
<table>
  <thead>
      <tr>
          <th>DEVICE</th>
          <th>SERIALNO</th>
          <th>MODEL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>/dev/sda</td>
          <td>WD-WMAZA5927357</td>
          <td>WDC WD20EURS-63S48Y0</td>
      </tr>
      <tr>
          <td>/dev/sdb</td>
          <td>WD-WCAYY0133809</td>
          <td>WDC WD20EARS-00J2GB0</td>
      </tr>
      <tr>
          <td>/dev/sdc</td>
          <td>WD-WCAYY0136723</td>
          <td>WDC WD20EARS-00J2GB0</td>
      </tr>
      <tr>
          <td>/dev/sdd</td>
          <td>000000001221090B8B09</td>
          <td>M4-CT128M4SSD2</td>
      </tr>
      <tr>
          <td>/dev/sde</td>
          <td>WD-WCAYY0136514</td>
          <td>WDC WD20EARS-00J2GB0</td>
      </tr>
      <tr>
          <td>/dev/sdf</td>
          <td>WD-WCAYY0136732</td>
          <td>WDC WD20EARS-00J2GB0</td>
      </tr>
      <tr>
          <td>/dev/sdg</td>
          <td>WD-WCAZAA410704</td>
          <td>WDC WD20EARS-00MVWB0</td>
      </tr>
  </tbody>
</table>
<p>Could by handy for later. &#x1f603;</p>
]]></content:encoded>
    </item>
    <item>
      <title>Using githooks for generating documentation on gitweb</title>
      <link>https://hufschlaeger.net/blog/2016/04/22/using-githooks-for-generating-documentation-on-gitweb/</link>
      <pubDate>Fri, 22 Apr 2016 19:10:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2016/04/22/using-githooks-for-generating-documentation-on-gitweb/</guid>
      <description>&lt;p&gt;Github offers an automatic processing of markdown files (e.g. README.md) for simple and easy repository description and/or documentation. Recently I replaced gitlist with gitweb. A great pity was that gitweb hasn&amp;rsquo;t the ability to process Markdown-Code by it&amp;rsquo;s self.&lt;/p&gt;
&lt;p&gt;Anyway, nice chance to play around with git&amp;rsquo;s hooks and let them do the hard work for us.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A hook is a trivial BASH-Script which would be executed by git under special circumstances like a new push to a special branch or special content inside the committed source (or what ever you wnat to keep managed).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Github offers an automatic processing of markdown files (e.g. README.md) for simple and easy repository description and/or documentation. Recently I replaced gitlist with gitweb. A great pity was that gitweb hasn&rsquo;t the ability to process Markdown-Code by it&rsquo;s self.</p>
<p>Anyway, nice chance to play around with git&rsquo;s hooks and let them do the hard work for us.</p>
<blockquote>
<p>A hook is a trivial BASH-Script which would be executed by git under special circumstances like a new push to a special branch or special content inside the committed source (or what ever you wnat to keep managed).</p>
</blockquote>
<p>So what must be done to create and activate a git-hook? The answer is very simple and including only three steps:</p>
<p>If it isn&rsquo;t available, we&rsquo;ve to install markdown first. On a machine which is based on Debian you could use your packaging-system for this task.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get install markdown
</span></span></code></pre></div><p>Inside the &ldquo;hooks&rdquo;-directory of our bare repository, we only have to create a file named &lsquo;post-receive&rsquo; and make it executable. As content we paste the following two line into the fresh file. The filename is mandatory in this case, because git will proof the existence of specific files and will execute them if possible.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/sh
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>git cat-file blob HEAD:README.md <span class="p">|</span> markdown &gt; <span class="nv">$GIT_DIR</span>/README.html
</span></span></code></pre></div><p>So making it executable should be the easiest part of the job.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chmod +x post-recevie
</span></span></code></pre></div><p>And that&rsquo;s it. You could find a very nice overview of all available hooks <a href="https://git-scm.com/book/it/v2/Customizing-Git-Git-Hooks">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Atmel ICE and OS X no 3</title>
      <link>https://hufschlaeger.net/blog/2016/03/16/atmel-ice-and-os-x-no-3/</link>
      <pubDate>Wed, 16 Mar 2016 19:10:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2016/03/16/atmel-ice-and-os-x-no-3/</guid>
      <description>&lt;p&gt;All available fixes and patches are already included in AVRDude 6.3 (fragmentation support, eeprom crash and so on). Unfortunately homebrew isn&amp;rsquo;t up-to-date and only version 6.2 is available online.&lt;/p&gt;
&lt;p&gt;The updated one should be something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Avrdude&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Formula&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;desc&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Atmel AVR MCU programmer&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;homepage&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://savannah.nongnu.org/projects/avrdude/&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz&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;mirror&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;0f9f731b6394ca7795b88359689a7fa1fba818c6e1d962513eb28da670e0a196&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;n&#34;&gt;bottle&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b2ac65f070879456e2047ba543a7fafb1d45c98b745b7915b4059ea90c10dfcd&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:el_capitan&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;4c092d851e6ed8ed58ac5a1997606db420ee153289d4289917fad50f8432d5ad&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:yosemite&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;a3b312dde0f3a268d6ccc9085e4a14d8d7703ff1ae09a9257b373976e7cf49ec&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:mavericks&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;end&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;head&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/&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;n&#34;&gt;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;autoconf&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;automake&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libtool&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;end&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;depends_on&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:macos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:snow_leopard&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# needs GCD/libdispatch&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libusb-compat&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libftdi0&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libelf&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libhid&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:optional&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;install&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;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;head?&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;inreplace&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bootstrap&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/libtoolize/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;glibtoolize&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./bootstrap&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;k&#34;&gt;end&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;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./configure&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--disable-dependency-tracking&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;--prefix=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;make&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;make&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;install&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;k&#34;&gt;end&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;nb&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;assert_equal&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;avrdude done.  Thank you.&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;shell_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/avrdude -c jtag2 -p x16a4 2&amp;gt;&amp;amp;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&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;strip&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;end&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;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Until now, everything works fine for me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>All available fixes and patches are already included in AVRDude 6.3 (fragmentation support, eeprom crash and so on). Unfortunately homebrew isn&rsquo;t up-to-date and only version 6.2 is available online.</p>
<p>The updated one should be something like this:</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Avrdude</span> <span class="o">&lt;</span> <span class="no">Formula</span>
</span></span><span class="line"><span class="cl">  <span class="n">desc</span> <span class="s2">&#34;Atmel AVR MCU programmer&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">homepage</span> <span class="s2">&#34;https://savannah.nongnu.org/projects/avrdude/&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">url</span> <span class="s2">&#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">mirror</span> <span class="s2">&#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">sha256</span> <span class="s2">&#34;0f9f731b6394ca7795b88359689a7fa1fba818c6e1d962513eb28da670e0a196&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">bottle</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha256</span> <span class="s2">&#34;b2ac65f070879456e2047ba543a7fafb1d45c98b745b7915b4059ea90c10dfcd&#34;</span> <span class="o">=&gt;</span> <span class="ss">:el_capitan</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha256</span> <span class="s2">&#34;4c092d851e6ed8ed58ac5a1997606db420ee153289d4289917fad50f8432d5ad&#34;</span> <span class="o">=&gt;</span> <span class="ss">:yosemite</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha256</span> <span class="s2">&#34;a3b312dde0f3a268d6ccc9085e4a14d8d7703ff1ae09a9257b373976e7cf49ec&#34;</span> <span class="o">=&gt;</span> <span class="ss">:mavericks</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">head</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="s2">&#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;autoconf&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;automake&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;libtool&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="ss">:macos</span> <span class="o">=&gt;</span> <span class="ss">:snow_leopard</span> <span class="c1"># needs GCD/libdispatch</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libusb-compat&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libftdi0&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libelf&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libhid&#34;</span> <span class="o">=&gt;</span> <span class="ss">:optional</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="nf">install</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">build</span><span class="o">.</span><span class="n">head?</span>
</span></span><span class="line"><span class="cl">      <span class="n">inreplace</span> <span class="s2">&#34;bootstrap&#34;</span><span class="p">,</span> <span class="sr">/libtoolize/</span><span class="p">,</span> <span class="s2">&#34;glibtoolize&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nb">system</span> <span class="s2">&#34;./bootstrap&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">end</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;./configure&#34;</span><span class="p">,</span> <span class="s2">&#34;--disable-dependency-tracking&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                          <span class="s2">&#34;--prefix=</span><span class="si">#{</span><span class="n">prefix</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;make&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;make&#34;</span><span class="p">,</span> <span class="s2">&#34;install&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nb">test</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert_equal</span> <span class="s2">&#34;avrdude done.  Thank you.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">shell_output</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">#{</span><span class="n">bin</span><span class="si">}</span><span class="s2">/avrdude -c jtag2 -p x16a4 2&gt;&amp;1&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div><p>Until now, everything works fine for me.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Owncloud - Keine Internetverbindung</title>
      <link>https://hufschlaeger.net/blog/2015/10/23/owncloud-keine-internetverbindung/</link>
      <pubDate>Fri, 23 Oct 2015 13:01:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/10/23/owncloud-keine-internetverbindung/</guid>
      <description>&lt;p&gt;Scheinbar gibt es wieder einige Probleme beim Upgraden von Owncloud. Leider kann ich nicht explizit sagen wie lange diese schon bestehen, oder ob die Lösung dazu schon ausreichend dokumentiert wurde. Anyway. Scheinbar vergisst der Updater von Owncloud das von curl benötigte Zertifikat zu kopieren und eine misslungener Verbindungsaufbau ist die Folge. Als Abhilfe begibt man sich in das config-Verzeichnis von Owncloud und versorgt sich händisch damit.&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;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ...../config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Danach sollte dieses Problem aus der Welt sein.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Scheinbar gibt es wieder einige Probleme beim Upgraden von Owncloud. Leider kann ich nicht explizit sagen wie lange diese schon bestehen, oder ob die Lösung dazu schon ausreichend dokumentiert wurde. Anyway. Scheinbar vergisst der Updater von Owncloud das von curl benötigte Zertifikat zu kopieren und eine misslungener Verbindungsaufbau ist die Folge. Als Abhilfe begibt man sich in das config-Verzeichnis von Owncloud und versorgt sich händisch damit.</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
</span></span><span class="line"><span class="cl">wget https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
</span></span></code></pre></div><p>Danach sollte dieses Problem aus der Welt sein.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Atmel ICE and OS X no 2</title>
      <link>https://hufschlaeger.net/blog/2015/10/16/atmel-ice-and-os-x-no-2/</link>
      <pubDate>Fri, 16 Oct 2015 21:41:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/10/16/atmel-ice-and-os-x-no-2/</guid>
      <description>&lt;p&gt;Eigentlich passt der Titel nicht ganz, denn es betrifft eigentlich alle Plattformen also auch Linux und Windows (sollte man avrdude anstelle von Atmet Studio verwenden).
Wie ich ja &lt;a href=&#34;https://hufschlaeger.net/atmelice-and-os-x-1/&#34;&gt;hier&lt;/a&gt; beschrieben habe, war die erste Nutzung des neuen Atmel ICE anfänglich mehr als einfach. Weiterhin ist avrdude in der Release-Version noch nicht soweit, dass alle Programmierschnittstellen funktionieren. Dazu müssen zwei Patches eingepflegt werden.Dazu habe ich die Homebrew Formula angepasst:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Avrdude&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Formula&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;desc&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Atmel AVR MCU programmer&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;homepage&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://savannah.nongnu.org/projects/avrdude/&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz&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;mirror&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;9e98baca8e57cad402aaa1c7b61c8de750ed4f6fed577f7e4935db0430783d3b&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;n&#34;&gt;bottle&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;sha1&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;2d759fea880b097754defe8016e026390dbcfb31&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:mavericks&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;sha1&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;83017c7fb34b0a2da5919b6b1dde9c05bf237f2a&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:mountain_lion&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;sha1&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;438562a4b84b4e868cdf01b81e7543053a89a7ff&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:lion&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;end&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;head&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/&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;n&#34;&gt;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;autoconf&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;automake&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libtool&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:build&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;end&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;patch&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:p2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://savannah.nongnu.org/file/stdint-fix.patch?file_id=31187&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;709b82cacdf2bcb6b638dd855e57a176705a3c816d6d7b866bae9370b4511843&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;k&#34;&gt;end&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;patch&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:p3&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&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;url&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://www.avrfreaks.net/sites/default/files/forum_attachments/avrice_fragment_fix2.patch&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;sha256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;e4cd8db7802c76b61fb953c055bdde066bd7e9f34ac0f7808fd29e909f57ee8a&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;k&#34;&gt;end&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;depends_on&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:macos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:snow_leopard&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# needs GCD/libdispatch&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libusb-compat&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libftdi0&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libelf&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;depends_on&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;libhid&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:optional&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;install&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;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;head?&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;inreplace&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bootstrap&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/libtoolize/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;glibtoolize&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./bootstrap&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;k&#34;&gt;end&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;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./configure&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--disable-dependency-tracking&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;--prefix=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;make&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;nb&#34;&gt;system&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;make&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;install&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;k&#34;&gt;end&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;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit funktionierte (bisher) avrdude unter El Capitan ohne weitere Einschränkungen. Ich werde das Ganze natürlich weiter beobachten.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Eigentlich passt der Titel nicht ganz, denn es betrifft eigentlich alle Plattformen also auch Linux und Windows (sollte man avrdude anstelle von Atmet Studio verwenden).
Wie ich ja <a href="/atmelice-and-os-x-1/">hier</a> beschrieben habe, war die erste Nutzung des neuen Atmel ICE anfänglich mehr als einfach. Weiterhin ist avrdude in der Release-Version noch nicht soweit, dass alle Programmierschnittstellen funktionieren. Dazu müssen zwei Patches eingepflegt werden.Dazu habe ich die Homebrew Formula angepasst:</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Avrdude</span> <span class="o">&lt;</span> <span class="no">Formula</span>
</span></span><span class="line"><span class="cl">  <span class="n">desc</span> <span class="s2">&#34;Atmel AVR MCU programmer&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">homepage</span> <span class="s2">&#34;https://savannah.nongnu.org/projects/avrdude/&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">url</span> <span class="s2">&#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">mirror</span> <span class="s2">&#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">sha256</span> <span class="s2">&#34;9e98baca8e57cad402aaa1c7b61c8de750ed4f6fed577f7e4935db0430783d3b&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">bottle</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha1</span> <span class="s2">&#34;2d759fea880b097754defe8016e026390dbcfb31&#34;</span> <span class="o">=&gt;</span> <span class="ss">:mavericks</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha1</span> <span class="s2">&#34;83017c7fb34b0a2da5919b6b1dde9c05bf237f2a&#34;</span> <span class="o">=&gt;</span> <span class="ss">:mountain_lion</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha1</span> <span class="s2">&#34;438562a4b84b4e868cdf01b81e7543053a89a7ff&#34;</span> <span class="o">=&gt;</span> <span class="ss">:lion</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">head</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="s2">&#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;autoconf&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;automake&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">    <span class="n">depends_on</span> <span class="s2">&#34;libtool&#34;</span> <span class="o">=&gt;</span> <span class="ss">:build</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">patch</span> <span class="ss">:p2</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="s2">&#34;http://savannah.nongnu.org/file/stdint-fix.patch?file_id=31187&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha256</span> <span class="s2">&#34;709b82cacdf2bcb6b638dd855e57a176705a3c816d6d7b866bae9370b4511843&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">patch</span> <span class="ss">:p3</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="s2">&#34;http://www.avrfreaks.net/sites/default/files/forum_attachments/avrice_fragment_fix2.patch&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">sha256</span> <span class="s2">&#34;e4cd8db7802c76b61fb953c055bdde066bd7e9f34ac0f7808fd29e909f57ee8a&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="ss">:macos</span> <span class="o">=&gt;</span> <span class="ss">:snow_leopard</span> <span class="c1"># needs GCD/libdispatch</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libusb-compat&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libftdi0&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libelf&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">depends_on</span> <span class="s2">&#34;libhid&#34;</span> <span class="o">=&gt;</span> <span class="ss">:optional</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="nf">install</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">build</span><span class="o">.</span><span class="n">head?</span>
</span></span><span class="line"><span class="cl">      <span class="n">inreplace</span> <span class="s2">&#34;bootstrap&#34;</span><span class="p">,</span> <span class="sr">/libtoolize/</span><span class="p">,</span> <span class="s2">&#34;glibtoolize&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nb">system</span> <span class="s2">&#34;./bootstrap&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">end</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;./configure&#34;</span><span class="p">,</span> <span class="s2">&#34;--disable-dependency-tracking&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                          <span class="s2">&#34;--prefix=</span><span class="si">#{</span><span class="n">prefix</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;make&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">system</span> <span class="s2">&#34;make&#34;</span><span class="p">,</span> <span class="s2">&#34;install&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div><p>Damit funktionierte (bisher) avrdude unter El Capitan ohne weitere Einschränkungen. Ich werde das Ganze natürlich weiter beobachten.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Atmel ICE and OS X no 1</title>
      <link>https://hufschlaeger.net/blog/2015/08/21/atmel-ice-and-os-x-no-1/</link>
      <pubDate>Fri, 21 Aug 2015 09:55:49 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/08/21/atmel-ice-and-os-x-no-1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://d3v0.de/wp-content/uploads/2015/08/AT_ATMEL_ICE_05.png&#34; data-rel=&#34;lightbox-0&#34; title=&#34;&#34;&gt;&lt;br /&gt; &lt;/a&gt;So der erste OS X relevante Post auf der Seite. Kurze Vorgeschichte zu dem Thema: Ich habe mich von einigen Tools bzgl. meiner Bastelsachen getrennt und – natürlich – auch wieder neues Spielzeug besorgt. Darunter einen neuen Programmieradapter, den ATMEL ICE. Grund war eigentlich nur der Support für die SAMs und natürlich das er im Vergleich zum Dragon alles bis auf HVPP bietet und (wahlweise) in einem Gehäuse geliefert wird.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://d3v0.de/wp-content/uploads/2015/08/AT_ATMEL_ICE_05.png" data-rel="lightbox-0" title=""><br /> </a>So der erste OS X relevante Post auf der Seite. Kurze Vorgeschichte zu dem Thema: Ich habe mich von einigen Tools bzgl. meiner Bastelsachen getrennt und – natürlich – auch wieder neues Spielzeug besorgt. Darunter einen neuen Programmieradapter, den ATMEL ICE. Grund war eigentlich nur der Support für die SAMs und natürlich das er im Vergleich zum Dragon alles bis auf HVPP bietet und (wahlweise) in einem Gehäuse geliefert wird.</p>
<p><img alt="ATMEL ICE programmer" loading="lazy" src="/img/AT_ATMEL_ICE_05.png" title="ATMEL ICE programmer"></p>
<p>Kommen wir nun zum eigentlichen Anlass des Beitrags. Er wollte unter OS X nicht funktionieren. AVRDude bekam einfach keinen Zugriff auf das USB-Device, da es von OS X gesperrt wurde. Ähnliches kann man <a href="http://www.proxmark.org/forum/viewtopic.php?id=986">hier</a> nach lesen. Anscheinend ist es notwendig eine Kernel Extension (kext-File) zu laden um dem Problem Herr zu werden.</p>
<p>Besagtes kext-File gibt es im Forum bei <a href="http://www.avrfreaks.net/comment/1421981#comment-1421981">avrfreaks.net</a> inklusive der Anleitung was zu tun ist.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar -xf AtmelICE.kext.tar.bz2
</span></span><span class="line"><span class="cl">sudo cp -R AtmelICE.kext /System/Library/Extensions
</span></span><span class="line"><span class="cl"><span class="c1"># change permissions and ownership:</span>
</span></span><span class="line"><span class="cl">sudo chown -R root:wheel /System/Library/Extensions/AtmelICE.kext
</span></span><span class="line"><span class="cl">sudo chmod -R <span class="m">755</span> /System/Library/Extensions/AtmelICE.kext
</span></span><span class="line"><span class="cl"><span class="c1"># reload the kext cache:</span>
</span></span><span class="line"><span class="cl">sudo kextcache -system-caches
</span></span></code></pre></div><p>Gerät abziehen und neu anschließen und es funktionierte auf Anhieb.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>~/Downloads<span class="o">]</span>$ avrdude -c atmelice -p x128a1 -P usb
</span></span><span class="line"><span class="cl">avrdude: AVR device initialized and ready to accept instructions
</span></span><span class="line"><span class="cl">Reading <span class="p">|</span> <span class="c1">################################################## | 100% 0.01s</span>
</span></span><span class="line"><span class="cl">avrdude: Device <span class="nv">signature</span> <span class="o">=</span> 0x1e974c
</span></span><span class="line"><span class="cl">avrdude <span class="k">done</span>.  Thank you.
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>OpenSSL Passphrase aus Private key entfernen</title>
      <link>https://hufschlaeger.net/blog/2015/06/23/openssl-passphrase-aus-private-key-entfernen/</link>
      <pubDate>Tue, 23 Jun 2015 18:14:45 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/06/23/openssl-passphrase-aus-private-key-entfernen/</guid>
      <description>&lt;p&gt;Manchmal setzt man eine Passphrase für SSL-Zrtifikate und muss dann feststellen, dass man sich entweder gar nicht oder nur sehr schwer an das vergebene Passwort erinnern kann. Gleichzeitig ist es natürlich ungemein sinnvoll, einen essentiellen und automatisch startenden Dienst durch eine Passworteingabe am Starten zu hindern.&lt;/p&gt;
&lt;p&gt;Naja lange Rede, kurze Hilfestellung. Mit folgendem Befehl lässt sich das Zertifikat von der Passphrase befreien und gut ists.&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;openssl rsa -in fqdn.key.back -out fqdn.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Manchmal setzt man eine Passphrase für SSL-Zrtifikate und muss dann feststellen, dass man sich entweder gar nicht oder nur sehr schwer an das vergebene Passwort erinnern kann. Gleichzeitig ist es natürlich ungemein sinnvoll, einen essentiellen und automatisch startenden Dienst durch eine Passworteingabe am Starten zu hindern.</p>
<p>Naja lange Rede, kurze Hilfestellung. Mit folgendem Befehl lässt sich das Zertifikat von der Passphrase befreien und gut ists.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openssl rsa -in fqdn.key.back -out fqdn.key
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Windows 7 ohne Adminrechte - Umgebungsvariablen</title>
      <link>https://hufschlaeger.net/blog/2015/06/22/windows-7-ohne-adminrechte-umgebungsvariablen/</link>
      <pubDate>Mon, 22 Jun 2015 15:30:52 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/06/22/windows-7-ohne-adminrechte-umgebungsvariablen/</guid>
      <description>&lt;p&gt;Im Folgenden möchte ich einige Probleme bzw. Herausforderungen beschreiben, die bei der Nutzung von Windows 7 ohne administrative Rechte auftreten und wie man sie beheben könnte. Im Wesentlichen dient der Artikel eigentlich nur als Notizblock, damit ich mir das Ganze nicht merken muss und hier auch mal wieder ein Beitrag verfasst wird.&lt;/p&gt;
&lt;h2 id=&#34;umgebungsvariablen-setzen&#34;&gt;Umgebungsvariablen setzen&lt;/h2&gt;
&lt;p&gt;Ich brauche des Öfteren einige Umgebungsvariablen (Qt, OpenCV etc.) um nicht jedesmal den Pfad für die entsprechenden Bibliotheken angeben zu müssen. Die erweiterten Systemeinstellungen benötigen jedoch ein entsprechendes Administratorkonto. Um die spezifischen, den Benutzer betreffenden Variablen zu setzen, reicht es jedoch folgenden Befehl auszuführen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Im Folgenden möchte ich einige Probleme bzw. Herausforderungen beschreiben, die bei der Nutzung von Windows 7 ohne administrative Rechte auftreten und wie man sie beheben könnte. Im Wesentlichen dient der Artikel eigentlich nur als Notizblock, damit ich mir das Ganze nicht merken muss und hier auch mal wieder ein Beitrag verfasst wird.</p>
<h2 id="umgebungsvariablen-setzen">Umgebungsvariablen setzen</h2>
<p>Ich brauche des Öfteren einige Umgebungsvariablen (Qt, OpenCV etc.) um nicht jedesmal den Pfad für die entsprechenden Bibliotheken angeben zu müssen. Die erweiterten Systemeinstellungen benötigen jedoch ein entsprechendes Administratorkonto. Um die spezifischen, den Benutzer betreffenden Variablen zu setzen, reicht es jedoch folgenden Befehl auszuführen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">rundll32</span> <span class="n">sysdm</span><span class="p">.</span><span class="n">cpl</span><span class="p">,</span><span class="n">EditEnvironmentVariables</span>
</span></span></code></pre></div><p>Interessanterweise darf man dann seine eigenen Umgebungsvariablen selbst erstellen, verwalten etc.. Also genau das was man über den „Maus/Klick“-Weg nicht durfte.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ersatzteile durch den 3D-Drucker</title>
      <link>https://hufschlaeger.net/blog/2015/06/21/ersatzteile-durch-den-3d-drucker/</link>
      <pubDate>Sun, 21 Jun 2015 14:43:08 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2015/06/21/ersatzteile-durch-den-3d-drucker/</guid>
      <description>&lt;p&gt;Nachdem die Blumenkästen auf dem Balkon neu gefüllt waren, fiel uns auf das zwei Kunststoffkappen für die Blumenkästen abtrünnig sind. Eigentlich ideal um sich mal etwas mit &lt;a href=&#34;http://www.freecadweb.org&#34;&gt;FreeCad&lt;/a&gt; zu beschäftigen und sich die Teile aus dem 3D-Drucker zu holen. Idealerweise sind beide Kappen, bis auf eine Bohrung für die Füllstandsanzeige, identisch. So muss dort nicht allzuviel Aufwand getrieben werden. Netterweise kann man bei WordPress auch 3D-Modelle einbinden um diese anzeigen zu können. (Schon recht lustig, was man mit zwei Klicks so schaffen kann.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nachdem die Blumenkästen auf dem Balkon neu gefüllt waren, fiel uns auf das zwei Kunststoffkappen für die Blumenkästen abtrünnig sind. Eigentlich ideal um sich mal etwas mit <a href="http://www.freecadweb.org">FreeCad</a> zu beschäftigen und sich die Teile aus dem 3D-Drucker zu holen. Idealerweise sind beide Kappen, bis auf eine Bohrung für die Füllstandsanzeige, identisch. So muss dort nicht allzuviel Aufwand getrieben werden. Netterweise kann man bei WordPress auch 3D-Modelle einbinden um diese anzeigen zu können. (Schon recht lustig, was man mit zwei Klicks so schaffen kann.)</p>
<p><img alt="Lekuza with meter" loading="lazy" src="/img/Lekuza_withMeter.png" title="3D Modell der Verschlusskappe"></p>
<p>Ansonsten war der Dreh recht schnell raus und nachdem die Grundform in <a href="http://www.freecadweb.org">FreeCAD</a> erstellt wurde, hatte man mehr oder weniger die Bedienung verstanden. Das Einzigste was mir bisher noch fehlt ist die Erstellung simpler Bilder. Aber gut, das Manko macht die angesprochene 3D-Ansicht wett.
Anbei die beiden Modelle (<a href="/downloads/Lekuza_nonMeter.stl">ohne Bohrung</a> und <a href="/downloads/Lekuza_withMeter.stl">mit Bohrung</a> ) als Download. Die Dateien wurden bisher noch nicht gedruckt, daher gibt es auch keine Gewähr ob die Teile wirklich passen. Ich hoffe ich kann die Teile – zum Testen vom 3D-Drucker natürlich – morgen drucken und dann Feedback geben ob sie nun wirklich passen oder nicht.
Btw. ist mir aufgefallen, dass es mit neuen Blogbeiträgen wie mit dem Vorhaben „Kellerausmisten“ ist. Man will es zwar machen, aber sich wirklich die Zeit dafür zu nehmen ist schon eine andere Hausnummer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arch Linux - pacman und libapm</title>
      <link>https://hufschlaeger.net/blog/2014/12/29/arch-linux-pacman-und-libapm/</link>
      <pubDate>Mon, 29 Dec 2014 14:28:35 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/12/29/arch-linux-pacman-und-libapm/</guid>
      <description>&lt;p&gt;Nach dem Upgrade von pacman könnte die folgende Fehlermeldung erscheinen:&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;Fehler: Konnte alpm-Bibliothek nicht initialisieren &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Konnte Verzeichniss &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt; nicht finden oder lesen&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;&lt;p&gt;Schnelle Abhilfe schafft ein kurzes:&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;pacman-db-upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Einen guten Rutsch.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nach dem Upgrade von pacman könnte die folgende Fehlermeldung erscheinen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Fehler: Konnte alpm-Bibliothek nicht initialisieren <span class="o">(</span>Konnte Verzeichniss <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> nicht finden oder lesen<span class="o">)</span>
</span></span></code></pre></div><p>Schnelle Abhilfe schafft ein kurzes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pacman-db-upgrade
</span></span></code></pre></div><p>Einen guten Rutsch.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arch Linux - Auf dem Raspberry Pi</title>
      <link>https://hufschlaeger.net/blog/2014/09/21/arch-linux-auf-dem-raspberry-pi/</link>
      <pubDate>Sun, 21 Sep 2014 17:48:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/21/arch-linux-auf-dem-raspberry-pi/</guid>
      <description>&lt;p&gt;Wie sicherlich jeder mitbekommen haben wird, ist mittlerweile schon die dritte Version des Raspberry Pis erschienen und man hat mittlerweile auch dort die Möglichkeit sich eine Distribution seiner Wahl zu installieren. Zwar ist die Wahl noch nicht so groß wie man es (verwöhnterweise) vom Desktop gewohnt ist. Jedoch die (für mich) wichtigsten Distributionen sind vertreten.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Arch Linux auf einem Raspberry Pi&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/archey-rpi.png&#34; title=&#34;Arch Linux auf einem Raspberry Pi&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dazu gehören das teils ausgelieferte Rasbian basierend auf Debian und einer, zur ARM Plattform kompatiblen, Version von Arch Linux. Vorteil ist hier natürlich, dass man durch die Wahl gleicher Systeme sich Zeit bzgl. Umgewöhnung und einarbeitung spart, da man in der Regel sein Desktop-System am Besten kennt. Die Installation von &lt;a href=&#34;http://archlinuxarm.org/&#34; title=&#34;Arch Linux ARM - ALARM&#34;&gt;ALARM&lt;/a&gt; (Arch Linux ARM) geht dabei eigentlich recht zügig und ist wie so Vieles andere auch &lt;a href=&#34;http://archlinuxarm.org/platforms/armv6/raspberry-pi&#34; title=&#34;Install on Raspberry Pi&#34;&gt;ausführlich beschrieben&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wie sicherlich jeder mitbekommen haben wird, ist mittlerweile schon die dritte Version des Raspberry Pis erschienen und man hat mittlerweile auch dort die Möglichkeit sich eine Distribution seiner Wahl zu installieren. Zwar ist die Wahl noch nicht so groß wie man es (verwöhnterweise) vom Desktop gewohnt ist. Jedoch die (für mich) wichtigsten Distributionen sind vertreten.</p>
<p><img alt="Arch Linux auf einem Raspberry Pi" loading="lazy" src="/img/archey-rpi.png" title="Arch Linux auf einem Raspberry Pi"></p>
<p>Dazu gehören das teils ausgelieferte Rasbian basierend auf Debian und einer, zur ARM Plattform kompatiblen, Version von Arch Linux. Vorteil ist hier natürlich, dass man durch die Wahl gleicher Systeme sich Zeit bzgl. Umgewöhnung und einarbeitung spart, da man in der Regel sein Desktop-System am Besten kennt. Die Installation von <a href="http://archlinuxarm.org/" title="Arch Linux ARM - ALARM">ALARM</a> (Arch Linux ARM) geht dabei eigentlich recht zügig und ist wie so Vieles andere auch <a href="http://archlinuxarm.org/platforms/armv6/raspberry-pi" title="Install on Raspberry Pi">ausführlich beschrieben</a>.</p>
<h2 id="partitionierung">Partitionierung</h2>
<p>Zunächst wird, wie am Desktop auch, die SD-Karte entsprechend partitioniert und formatiert. Dazu wird das Blockdevice der Speicherkarte mittels fdisk geöffnet, dabei sollte jedoch das richtige Gerät ausgewählt werden. Nicht das man sich die Partitionierung der eigenen Festplatte zerlegt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">fdisk /dev/mmcblk0
</span></span></code></pre></div><p>Da der Bootloader (UBoot) Raspberry Pi einen Bootbereich auf der SD-Karte erwartet, müssen wir zwei Partitionen anlegen. Eine, mit 100 MB, etwas kleineren Bootbereich den UBoot lesen kann und eine entsprechende Linux Root-Partition.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Löschen der vorhandenen Partitionen</span>
</span></span><span class="line"><span class="cl">o
</span></span><span class="line"><span class="cl"><span class="c1"># Anlegen einer neuen Partition</span>
</span></span><span class="line"><span class="cl">n
</span></span><span class="line"><span class="cl"><span class="c1"># primär</span>
</span></span><span class="line"><span class="cl">p
</span></span><span class="line"><span class="cl"><span class="c1"># 1 für die erste Partition</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Enter für den ersten Sektor als Startsektor</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Für den letzten Sektor einen Offset von 100 MB angeben</span>
</span></span><span class="line"><span class="cl">+100M
</span></span><span class="line"><span class="cl"><span class="c1"># Partitionstyp auf FAT32 mit LBA setzen</span>
</span></span><span class="line"><span class="cl">t
</span></span><span class="line"><span class="cl">c
</span></span><span class="line"><span class="cl"><span class="c1"># Anlegen einer neuen zweiten Partition</span>
</span></span><span class="line"><span class="cl">n
</span></span><span class="line"><span class="cl"><span class="c1"># primär</span>
</span></span><span class="line"><span class="cl">p
</span></span><span class="line"><span class="cl"><span class="c1"># 2 für die zweite Partition</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="c1"># zweimal Enter drücken um den restlichen Speicher auszuwählen</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="c1"># Änderungen speichern und auf das Blockdevice schreiben</span>
</span></span><span class="line"><span class="cl">w
</span></span></code></pre></div><h2 id="formatierung">Formatierung</h2>
<p>Formatiert wird wie unter Linux gewohnt mit den mkfs-Kommandos.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkfs.vfat /dev/mmcblk0p1
</span></span><span class="line"><span class="cl">mkfs.ext4 /dev/mmcblk0p2
</span></span></code></pre></div><h2 id="einbinden-und-installation-von-alarm">Einbinden und Installation von ALARM</h2>
<p>Um die SD-Karte einzubinden, brauchen wir natürlich entsprechende mountpoints. Diese erstelle ich meinst unter /mnt und hänge die Partitionen mit mount auf die erstellten mountpoints.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p /mnt/boot
</span></span><span class="line"><span class="cl">mkdir -p /mnt/root
</span></span><span class="line"><span class="cl">mount /dev/mmcblk0p1 /mnt/boot
</span></span><span class="line"><span class="cl">mount /dev/mmcblk0p2 /mnt/root
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /mnt
</span></span></code></pre></div><p>Anschließend holen wir uns das aktuelle ALARM-Image von der Projektseite und entpacken es direkt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget http//archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
</span></span><span class="line"><span class="cl">tar xpf ArchLinuxARM-rpi-latest.tar.gz -C root
</span></span><span class="line"><span class="cl">sync
</span></span><span class="line"><span class="cl">mv root/boot/* boot
</span></span></code></pre></div><p>Nun noch die Paritionen aushängen und wir sind fertig.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">umount /mnt/root /mnt/boot
</span></span></code></pre></div><p>Speicherkarte aus dem Kartenleser entnehmen und ins Raspberry Pi stecken und booten lassen. Nach ein paar Sekunden sollte man sich via SSH als root mit dem Passwort root einloggen können. Der Standard-Host ist dabei dann alarmpi. Damit sollte die Installation von ALARM abgeschlossen sein und funktionieren.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arch Linux - Signierung von Paketen</title>
      <link>https://hufschlaeger.net/blog/2014/09/19/arch-linux-signierung-von-paketen/</link>
      <pubDate>Fri, 19 Sep 2014 15:41:54 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/19/arch-linux-signierung-von-paketen/</guid>
      <description>&lt;p&gt;Nach dem wir nun wissen wie wir Pakete erzeugen und ausliefern können, kommt unweigerlich der nächste Schritt, die Signierung der Pakete und des Repositoriums. Dabei wurde die Signierung mit Version 4 von pacman eingeführt und die offiziellen Paketquellen, sowie die Pakete, sind alle signiert.&lt;/p&gt;
&lt;p&gt;Zunächst, was brauchen wir?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://hufschlaeger.net/arch-linux-pakete-erstellen/&#34; title=&#34;Arch Linux – Pakete selbst erstellen&#34;&gt;Pakete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hufschlaeger.net/arch-linux-eigenes-repository-einrichten/&#34; title=&#34;Arch Linux – Eigenes Repository einrichten&#34;&gt;Pfad wo das Repository eingebunden ist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPG-Schlüssel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die ersten beiden Punkte sind dabei ja schon vorab geklärt worden. Die Erzeugung eines GPG-Schlüsselpaars kann nach dieser &lt;a href=&#34;http://wiki.ubuntuusers.de/GnuPG#Schluesselpaar-erzeugen&#34; title=&#34;Ubuntuusers Wiki Schlüsselpaar Signierung&#34;&gt;Anleitung&lt;/a&gt; durchgeführt werden.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nach dem wir nun wissen wie wir Pakete erzeugen und ausliefern können, kommt unweigerlich der nächste Schritt, die Signierung der Pakete und des Repositoriums. Dabei wurde die Signierung mit Version 4 von pacman eingeführt und die offiziellen Paketquellen, sowie die Pakete, sind alle signiert.</p>
<p>Zunächst, was brauchen wir?</p>
<ul>
<li><a href="/arch-linux-pakete-erstellen/" title="Arch Linux – Pakete selbst erstellen">Pakete</a></li>
<li><a href="/arch-linux-eigenes-repository-einrichten/" title="Arch Linux – Eigenes Repository einrichten">Pfad wo das Repository eingebunden ist</a></li>
<li>GPG-Schlüssel</li>
</ul>
<p>Die ersten beiden Punkte sind dabei ja schon vorab geklärt worden. Die Erzeugung eines GPG-Schlüsselpaars kann nach dieser <a href="http://wiki.ubuntuusers.de/GnuPG#Schluesselpaar-erzeugen" title="Ubuntuusers Wiki Schlüsselpaar Signierung">Anleitung</a> durchgeführt werden.</p>
<h2 id="notwendige-änderungen-bzgl-gpg">Notwendige Änderungen bzgl. GPG</h2>
<p>Zunächst muss das Build-System für die Signierung konfiguriert werden. Dazu sind einige kleinere Änderungen in der Datei /etc/makepkg.conf notwendig. Dazu wird die Signierung durch das Entfernen des Ausrufzeichens vor dem Wort sign in Zeile 56 aktiviert.</p>
<div class="highlight" open="false"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/makepkg.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SOURCE ACQUISITION</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- The download utilities that makepkg should use to acquire sources</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  Format: &#39;protocol::agent&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DLAGENTS</span><span class="o">=(</span><span class="s1">&#39;ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;rsync::/usr/bin/rsync --no-motd -z %u %o&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;scp::/usr/bin/scp -C %u %o&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Other common tools:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/snarf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/lftpget -c</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/wget</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ARCHITECTURE, COMPILE FLAGS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">CARCH</span><span class="o">=</span><span class="s2">&#34;x86_64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CHOST</span><span class="o">=</span><span class="s2">&#34;x86_64-unknown-linux-gnu&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#-- Compiler and Linker Flags</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -march (or -mcpu) builds exclusively for an architecture</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -mtune optimizes for an architecture, but builds for whole processor family</span>
</span></span><span class="line"><span class="cl"><span class="nv">CPPFLAGS</span><span class="o">=</span><span class="s2">&#34;-D_FORTIFY_SOURCE=2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CXXFLAGS</span><span class="o">=</span><span class="s2">&#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">&#34;-Wl,-O1,--sort-common,--as-needed,-z,relro&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Make Flags: change this for DistCC/SMP systems</span>
</span></span><span class="line"><span class="cl"><span class="c1">#MAKEFLAGS=&#34;-j2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Debugging flags</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEBUG_CFLAGS</span><span class="o">=</span><span class="s2">&#34;-g -fvar-tracking-assignments&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEBUG_CXXFLAGS</span><span class="o">=</span><span class="s2">&#34;-g -fvar-tracking-assignments&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># BUILD ENVIRONMENT</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  A negated environment option will do the opposite of the comments below.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- fakeroot: Allow building packages as a non-root user</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- distcc:   Use the Distributed C/C++/ObjC compiler</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- color:    Colorize output messages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- ccache:   Use ccache to cache compilation</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- check:    Run the check() function if present in the PKGBUILD</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- sign:     Generate PGP signature file</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">BUILDENV</span><span class="o">=(</span>fakeroot !distcc color !ccache check sign<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- specify a space-delimited list of hosts running in the DistCC cluster.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#DISTCC_HOSTS=&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Specify a directory for package building.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#BUILDDIR=/tmp/makepkg</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># GLOBAL PACKAGE OPTIONS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   These are default values for the options=() settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  A negated option will do the opposite of the comments below.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- strip:      Strip symbols from binaries/libraries</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- docs:       Save doc directories specified by DOC_DIRS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- libtool:    Leave libtool (.la) files in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- staticlibs: Leave static library (.a) files in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- emptydirs:  Leave empty directories in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- zipman:     Compress manual (man and info) pages in MAN_DIRS with gzip</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- purge:      Remove files specified by PURGE_TARGETS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- upx:        Compress binary executable files using UPX</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- debug:      Add debugging flags as specified in DEBUG_* variables</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">OPTIONS</span><span class="o">=(</span>strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512</span>
</span></span><span class="line"><span class="cl"><span class="nv">INTEGRITY_CHECK</span><span class="o">=(</span>md5<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping binaries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_BINARIES</span><span class="o">=</span><span class="s2">&#34;--strip-all&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping shared libraries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_SHARED</span><span class="o">=</span><span class="s2">&#34;--strip-unneeded&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping static libraries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_STATIC</span><span class="o">=</span><span class="s2">&#34;--strip-debug&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Manual (man and info) directories to compress (if zipman is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">MAN_DIRS</span><span class="o">=({</span>usr<span class="o">{</span>,/local<span class="o">}{</span>,/share<span class="o">}</span>,opt/*<span class="o">}</span>/<span class="o">{</span>man,info<span class="o">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Doc directories to remove (if !docs is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">DOC_DIRS</span><span class="o">=(</span>usr/<span class="o">{</span>,local/<span class="o">}{</span>,share/<span class="o">}{</span>doc,gtk-doc<span class="o">}</span> opt/*/<span class="o">{</span>doc,gtk-doc<span class="o">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Files to be removed from all packages (if purge is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">PURGE_TARGETS</span><span class="o">=(</span>usr/<span class="o">{</span>,share<span class="o">}</span>/info/dir .packlist *.pod<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># PACKAGE OUTPUT</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default: put built package and cached source in build directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Destination: specify a fixed directory where all packages will be placed</span>
</span></span><span class="line"><span class="cl"><span class="c1">#PKGDEST=/home/packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Source cache: specify a fixed directory where source files will be cached</span>
</span></span><span class="line"><span class="cl"><span class="c1">#SRCDEST=/home/sources</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Source packages: specify a fixed directory where all src packages will be placed</span>
</span></span><span class="line"><span class="cl"><span class="c1">#SRCPKGDEST=/home/srcpackages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Packager: name/email of the person or organization building packages</span>
</span></span><span class="line"><span class="cl"><span class="nv">PACKAGER</span><span class="o">=</span><span class="s2">&#34;Daniel Kotschate &amp;lt;daniel@epyx-online.de&amp;gt;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Specify a key to use for package signing</span>
</span></span><span class="line"><span class="cl"><span class="nv">GPGKEY</span><span class="o">=</span><span class="s2">&#34;866FE6E2&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># COMPRESSION DEFAULTS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSGZ</span><span class="o">=(</span>gzip -c -f -n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSBZ2</span><span class="o">=(</span>bzip2 -c -f<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSXZ</span><span class="o">=(</span>xz -c -z -<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSLRZ</span><span class="o">=(</span>lrzip -q<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSLZO</span><span class="o">=(</span>lzop -q<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSZ</span><span class="o">=(</span>compress -c -f<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># EXTENSION DEFAULTS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># WARNING: Do NOT modify these variables unless you know what you are</span>
</span></span><span class="line"><span class="cl"><span class="c1">#          doing.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">PKGEXT</span><span class="o">=</span><span class="s1">&#39;.pkg.tar.xz&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SRCEXT</span><span class="o">=</span><span class="s1">&#39;.src.tar.gz&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># vim: set ft=sh ts=2 sw=2 et:&lt;/pre&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Weiterhin sollten wir die dafür vorgesehenen Daten für den Paket-Maintainer <span class="o">(</span>Betreuer<span class="o">)</span> abändern und die ID unseres GPG-Schlüssels eintragen. Dies erfolg in den Zeilen <span class="m">112</span> bis <span class="m">116</span> und ist denke ich selbst erklärend.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;pre <span class="nv">class</span><span class="o">=</span><span class="s2">&#34;lang:default mark:113,115 range:112-116 decode:true &#34;</span>&gt;#
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/makepkg.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SOURCE ACQUISITION</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- The download utilities that makepkg should use to acquire sources</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  Format: &#39;protocol::agent&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DLAGENTS</span><span class="o">=(</span><span class="s1">&#39;ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;rsync::/usr/bin/rsync --no-motd -z %u %o&#39;</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;scp::/usr/bin/scp -C %u %o&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Other common tools:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/snarf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/lftpget -c</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /usr/bin/wget</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ARCHITECTURE, COMPILE FLAGS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">CARCH</span><span class="o">=</span><span class="s2">&#34;x86_64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CHOST</span><span class="o">=</span><span class="s2">&#34;x86_64-unknown-linux-gnu&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#-- Compiler and Linker Flags</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -march (or -mcpu) builds exclusively for an architecture</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -mtune optimizes for an architecture, but builds for whole processor family</span>
</span></span><span class="line"><span class="cl"><span class="nv">CPPFLAGS</span><span class="o">=</span><span class="s2">&#34;-D_FORTIFY_SOURCE=2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">CXXFLAGS</span><span class="o">=</span><span class="s2">&#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">&#34;-Wl,-O1,--sort-common,--as-needed,-z,relro&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Make Flags: change this for DistCC/SMP systems</span>
</span></span><span class="line"><span class="cl"><span class="c1">#MAKEFLAGS=&#34;-j2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Debugging flags</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEBUG_CFLAGS</span><span class="o">=</span><span class="s2">&#34;-g -fvar-tracking-assignments&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEBUG_CXXFLAGS</span><span class="o">=</span><span class="s2">&#34;-g -fvar-tracking-assignments&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># BUILD ENVIRONMENT</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  A negated environment option will do the opposite of the comments below.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- fakeroot: Allow building packages as a non-root user</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- distcc:   Use the Distributed C/C++/ObjC compiler</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- color:    Colorize output messages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- ccache:   Use ccache to cache compilation</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- check:    Run the check() function if present in the PKGBUILD</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- sign:     Generate PGP signature file</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">BUILDENV</span><span class="o">=(</span>fakeroot !distcc color !ccache check sign<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- specify a space-delimited list of hosts running in the DistCC cluster.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#DISTCC_HOSTS=&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Specify a directory for package building.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#BUILDDIR=/tmp/makepkg</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># GLOBAL PACKAGE OPTIONS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   These are default values for the options=() settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  A negated option will do the opposite of the comments below.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- strip:      Strip symbols from binaries/libraries</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- docs:       Save doc directories specified by DOC_DIRS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- libtool:    Leave libtool (.la) files in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- staticlibs: Leave static library (.a) files in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- emptydirs:  Leave empty directories in packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- zipman:     Compress manual (man and info) pages in MAN_DIRS with gzip</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- purge:      Remove files specified by PURGE_TARGETS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- upx:        Compress binary executable files using UPX</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- debug:      Add debugging flags as specified in DEBUG_* variables</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">OPTIONS</span><span class="o">=(</span>strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512</span>
</span></span><span class="line"><span class="cl"><span class="nv">INTEGRITY_CHECK</span><span class="o">=(</span>md5<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping binaries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_BINARIES</span><span class="o">=</span><span class="s2">&#34;--strip-all&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping shared libraries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_SHARED</span><span class="o">=</span><span class="s2">&#34;--strip-unneeded&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Options to be used when stripping static libraries. See `man strip&#39; for details.</span>
</span></span><span class="line"><span class="cl"><span class="nv">STRIP_STATIC</span><span class="o">=</span><span class="s2">&#34;--strip-debug&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Manual (man and info) directories to compress (if zipman is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">MAN_DIRS</span><span class="o">=({</span>usr<span class="o">{</span>,/local<span class="o">}{</span>,/share<span class="o">}</span>,opt/*<span class="o">}</span>/<span class="o">{</span>man,info<span class="o">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Doc directories to remove (if !docs is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">DOC_DIRS</span><span class="o">=(</span>usr/<span class="o">{</span>,local/<span class="o">}{</span>,share/<span class="o">}{</span>doc,gtk-doc<span class="o">}</span> opt/*/<span class="o">{</span>doc,gtk-doc<span class="o">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Files to be removed from all packages (if purge is specified)</span>
</span></span><span class="line"><span class="cl"><span class="nv">PURGE_TARGETS</span><span class="o">=(</span>usr/<span class="o">{</span>,share<span class="o">}</span>/info/dir .packlist *.pod<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># PACKAGE OUTPUT</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default: put built package and cached source in build directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Destination: specify a fixed directory where all packages will be placed</span>
</span></span><span class="line"><span class="cl"><span class="c1">#PKGDEST=/home/packages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Source cache: specify a fixed directory where source files will be cached</span>
</span></span><span class="line"><span class="cl"><span class="c1">#SRCDEST=/home/sources</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Source packages: specify a fixed directory where all src packages will be placed</span>
</span></span><span class="line"><span class="cl"><span class="c1">#SRCPKGDEST=/home/srcpackages</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Packager: name/email of the person or organization building packages</span>
</span></span><span class="line"><span class="cl"><span class="nv">PACKAGER</span><span class="o">=</span><span class="s2">&#34;Daniel Kotschate &amp;lt;daniel@epyx-online.de&amp;gt;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#-- Specify a key to use for package signing</span>
</span></span><span class="line"><span class="cl"><span class="nv">GPGKEY</span><span class="o">=</span><span class="s2">&#34;866FE6E2&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># COMPRESSION DEFAULTS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSGZ</span><span class="o">=(</span>gzip -c -f -n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSBZ2</span><span class="o">=(</span>bzip2 -c -f<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSXZ</span><span class="o">=(</span>xz -c -z -<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSLRZ</span><span class="o">=(</span>lrzip -q<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSLZO</span><span class="o">=(</span>lzop -q<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">COMPRESSZ</span><span class="o">=(</span>compress -c -f<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1"># EXTENSION DEFAULTS</span>
</span></span><span class="line"><span class="cl"><span class="c1">#########################################################################</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># WARNING: Do NOT modify these variables unless you know what you are</span>
</span></span><span class="line"><span class="cl"><span class="c1">#          doing.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="nv">PKGEXT</span><span class="o">=</span><span class="s1">&#39;.pkg.tar.xz&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SRCEXT</span><span class="o">=</span><span class="s1">&#39;.src.tar.gz&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># vim: set ft=sh ts=2 sw=2 et:</span>
</span></span></code></pre></div><p>Die beschriebenen Änderungen führen dazu, dass ihr eure Passphrase (für den GPG-Key) eingeben müsst, sobald ein neues Paket währende der Erstellung signiert wird. Wenn man möchte, kann man seinen öffentlichen Schlüssel auch sofort manuell der eigenen Paketverwaltung hinzufügen. Jedoch wird bei der Aktualisierung der Paketlisten auch der Schlüssel in die Keyring eingetragen.</p>
<h2 id="signierung-vom-repository">Signierung vom Repository</h2>
<p>Die Pakete sind nun signiert, fehlt nur noch die Paketdatenbank. Dazu muss die <a href="/arch-linux-eigenes-repository-einrichten/" title="Arch Linux – Eigenes Repository einrichten">bekannte</a> Vorgehensweise nur minimal geändert werden und zu dem Aufruf von <strong><em>repo-add</em></strong> nur der Schalter <em><strong>-s</strong></em> hinzugefügt werden. Auch hier gilt, wie für die Paketerstellung, dass die Signierung eure Passphrase erfordert.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Jabber / XMPP - einfaches Status-Monitoring</title>
      <link>https://hufschlaeger.net/blog/2014/09/19/jabber-/-xmpp-einfaches-status-monitoring/</link>
      <pubDate>Fri, 19 Sep 2014 11:41:11 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/19/jabber-/-xmpp-einfaches-status-monitoring/</guid>
      <description>&lt;p&gt;Der klassische (und wohl auch gängiste) Weg sich über Ereignisse wie gescheiterte Backups, mögliche Virenfunde oder Sonstiges informieren zu lassen ist sicherlich die gute E-Mail. Allerdings setzt dies natürlich auch einen funktionierenden und vor allem richtig konfigurierten Mail-Server voraus. Gerade der letzte Punkt ist meiner Meinung nach sehr kritisch, da ein falsch eingerichteter SMTP-Server schnell zur Spam-Schleuder mutiert oder aber man will erst gar keinen auf seiner Workstation installieren.&lt;/p&gt;
&lt;p&gt;Daher habe ich mich mal etwas umgeschaut und dachte mir, dass es im Zeitalter der Smartphones und Instant Messenger (&lt;a href=&#34;http://www.whatsapp.com/&#34; title=&#34;Whats-App Homepage&#34;&gt;Whats-App&lt;/a&gt;, &lt;a href=&#34;https://threema.ch&#34; title=&#34;Threema Homepage&#34;&gt;Threema&lt;/a&gt; und Co sind ja auch nichts Anderes) eine andere Möglichkeit geben müsste.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Der klassische (und wohl auch gängiste) Weg sich über Ereignisse wie gescheiterte Backups, mögliche Virenfunde oder Sonstiges informieren zu lassen ist sicherlich die gute E-Mail. Allerdings setzt dies natürlich auch einen funktionierenden und vor allem richtig konfigurierten Mail-Server voraus. Gerade der letzte Punkt ist meiner Meinung nach sehr kritisch, da ein falsch eingerichteter SMTP-Server schnell zur Spam-Schleuder mutiert oder aber man will erst gar keinen auf seiner Workstation installieren.</p>
<p>Daher habe ich mich mal etwas umgeschaut und dachte mir, dass es im Zeitalter der Smartphones und Instant Messenger (<a href="http://www.whatsapp.com/" title="Whats-App Homepage">Whats-App</a>, <a href="https://threema.ch" title="Threema Homepage">Threema</a> und Co sind ja auch nichts Anderes) eine andere Möglichkeit geben müsste.</p>
<p><img alt="Jabber Monitoring Handy" loading="lazy" src="/img/jabberphone.jpg" title="Bild von Kamil Porembiński - SMS Monitoring"></p>
<h2 id="jabber-als-alternative">Jabber als Alternative?</h2>
<p>Als mögliche Alternative sah ich Jabber. Mittlerweile wird Jabber/XMPP mit Cisco in Verbindung gebracht, was auch ok ist, da sie es  ja für ihre kommerziellen <a href="http://www.golem.de/0809/62528.html" title="Cisco kauft Jabber">Produkte als Know-How eingekauft</a> haben. Allerdings wird das Protokoll durch die <a href="http://xmpp.org/about-xmpp/xsf/" title="XMPP Stadards Foundation">XMPP Standards Foundation</a> betreut. Wichtigster Punkt ist natürlich, dass es frei ist und es ein recht großes Portfolio an Bibliotheken (in verschiedenen Programmier-/Skriptsprachen) geben sollte. Das ist bei XMPP gegeben. So gibt es Bibliotheken für Hochsprachen wie C/C++ aber auch Module für Python und Perl.</p>
<h2 id="anwendungsfälle-für-jabber">Anwendungsfälle für Jabber</h2>
<p>Wie oben genannt, lassen sich die Anwendungsszenarios beliebig wählen. Ich persönlich nutze es für meine privaten Backups mit rsnapshot. Sofern der Backupbefehl eine Ausgabe auf stderr zurückgibt, werde ich per Jabber benachrichtigt und kann dem Fehler auf die Spur gehen. Dabei nutze ich das folgende Python-Skript, welches ich einfach in meine Anacron-Tasks eingepflegt habe.</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/python2</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">xmpp</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">ConfigParser</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="nb">len</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">3</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;usage: sendxmpp.py resource text</span><span class="se">\n</span><span class="s2">&#34;</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;  resource:    jabber resource&#34;</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;  text:        message to send</span><span class="se">\n</span><span class="s2">&#34;</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="n">snd</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">msg</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># read ini file to ConfigParser</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">read</span> <span class="p">(</span> <span class="s1">&#39;statxmpp.ini&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</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;could not read &gt;&gt;statxmpp.ini&lt;&lt;&#34;</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="c1"># get values</span>
</span></span><span class="line"><span class="cl">        <span class="n">login</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;user&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">pwd</span>   <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">srv</span>   <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;server&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">recv</span>  <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;destination&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">cnx</span> <span class="o">=</span> <span class="n">xmpp</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span> <span class="n">srv</span><span class="p">,</span> <span class="n">debug</span><span class="o">=</span><span class="p">[]</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">cnx</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span> <span class="n">server</span><span class="o">=</span><span class="p">(</span> <span class="n">srv</span> <span class="p">,</span><span class="mi">5222</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">cnx</span><span class="o">.</span><span class="n">auth</span><span class="p">(</span><span class="n">login</span><span class="p">,</span> <span class="n">pwd</span><span class="p">,</span> <span class="n">snd</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">cnx</span><span class="o">.</span><span class="n">send</span><span class="p">(</span> <span class="n">xmpp</span><span class="o">.</span><span class="n">Message</span><span class="p">(</span> <span class="n">recv</span> <span class="p">,</span> <span class="n">msg</span> <span class="p">)</span> <span class="p">)</span>
</span></span></code></pre></div><p>Das Skript erwartet eine Konfigurationsdatei mit den entsprechenden Einträgen für den erfolgreichen Verbindungsaufbau. Dazu zählen Benutzername, Passwort, der genutzte Server und natürlich die Empfängeradresse. Das Muster 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">[Connection]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># username</span>
</span></span><span class="line"><span class="cl"><span class="na">user</span><span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="c1"># password</span>
</span></span><span class="line"><span class="cl"><span class="na">password</span><span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="c1"># receiver</span>
</span></span><span class="line"><span class="cl"><span class="na">destination</span><span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="c1"># jabberserver to connect</span>
</span></span><span class="line"><span class="cl"><span class="na">server</span><span class="o">=</span>
</span></span></code></pre></div><p>Abhängigkeiten des Skriptes sind die Pythonmodule pyxmpp (<a href="https://www.archlinux.de/?page=PackageDetails;repo=community;arch=x86_64;pkgname=python2-pyxmpp" title="Paketdetails python2-pyxmpp">community</a>) und ConfigParser (<a href="https://aur.archlinux.org/packages/python2-configparser/" title="Paketinformationen python2-configparser">AUR</a>), welche recht schnell installiert sind. Der rsnapshot wurde von mir dann noch wie folgt abgeändert</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/sh
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">## save stderr to var</span>
</span></span><span class="line"><span class="cl"><span class="nv">ERR</span><span class="o">=</span><span class="k">$(</span>/usr/bin/rsnapshot daily 3<span class="p">&amp;</span>gt<span class="p">;&amp;</span><span class="m">1</span> 1<span class="p">&amp;</span>gt<span class="p">;&amp;</span><span class="m">2</span> 2<span class="p">&amp;</span>gt<span class="p">;&amp;</span>3<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">### if command fails report via xmpp</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -ne <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        sendxmpp.py backup_status <span class="s2">&#34;</span><span class="si">${</span><span class="nv">ERR</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>und benachrichtigt mich über Probleme beim Backup. Empfangen kann man das Ganze dann mit einem Jabber-Client seiner Wahl (bspw. Pidgin, Empathy usw.) oder lässt es sich gleich auf Telefon schicken mit IM+ oder so, je nach Plattform oder App. Einziges Manko ist natürlich, dass die Nachricht auf dem Client quittiert wird, von dem sie abgerufen wird.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Chromium - Downloadordner öffnet Anjuta?</title>
      <link>https://hufschlaeger.net/blog/2014/09/19/chromium-downloadordner-%C3%B6ffnet-anjuta/</link>
      <pubDate>Fri, 19 Sep 2014 07:50:42 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/19/chromium-downloadordner-%C3%B6ffnet-anjuta/</guid>
      <description>&lt;p&gt;Völlig nervig. Nach der Installation von &lt;a href=&#34;http://www.chromium.org/&#34; title=&#34;Chromiunm project&#34;&gt;Chromium&lt;/a&gt; unter der &lt;a href=&#34;http://www.gnome.org/&#34; title=&#34;GNOME Project&#34;&gt;GNOME&lt;/a&gt;-Version von &lt;a href=&#34;http://manjaro.org/&#34; title=&#34;Manjaro project&#34;&gt;Manjaro&lt;/a&gt;, öffnet dieser nicht den Downloadordner. Stattdessen versucht er diesen mit Anjuta zu importieren/öffnen. Recht schnell war klar irgendetwas stimmt mit den &lt;a href=&#34;http://de.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions&#34; title=&#34;Wikipedia (de) Artikel MIME&#34;&gt;MIME&lt;/a&gt;-Zuordnungen nicht und diese sollten zu recht gebogen werden.
Also erst einmal auslesen was als Standard-Applikation definiert ist.&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;xdg-mime query default inode/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Was in meinem Fall `anjuta.desktop lieferte. Ok Treffer. Zum Setzen der zugehörigen Anwendung nutzen wir erneut &lt;a href=&#34;https://wiki.archlinux.org/index.php/Xdg-open#Configuration&#34; title=&#34;Arch Linux Wiki xdg-open&#34;&gt;xdg-mime&lt;/a&gt; und setzen unsere Anwendung wie folgt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Völlig nervig. Nach der Installation von <a href="http://www.chromium.org/" title="Chromiunm project">Chromium</a> unter der <a href="http://www.gnome.org/" title="GNOME Project">GNOME</a>-Version von <a href="http://manjaro.org/" title="Manjaro project">Manjaro</a>, öffnet dieser nicht den Downloadordner. Stattdessen versucht er diesen mit Anjuta zu importieren/öffnen. Recht schnell war klar irgendetwas stimmt mit den <a href="http://de.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions" title="Wikipedia (de) Artikel MIME">MIME</a>-Zuordnungen nicht und diese sollten zu recht gebogen werden.
Also erst einmal auslesen was als Standard-Applikation definiert ist.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xdg-mime query default inode/directory
</span></span></code></pre></div><p>Was in meinem Fall `anjuta.desktop lieferte. Ok Treffer. Zum Setzen der zugehörigen Anwendung nutzen wir erneut <a href="https://wiki.archlinux.org/index.php/Xdg-open#Configuration" title="Arch Linux Wiki xdg-open">xdg-mime</a> und setzen unsere Anwendung wie folgt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xdg-mime default nautilus.desktop inode/directory
</span></span></code></pre></div><p>Auf der gleichen Art und Weise funktioniert das natürlich auch mit anderen MIME-Typen und Anwendungen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arch Linux - Eigenes Repository einrichten</title>
      <link>https://hufschlaeger.net/blog/2014/09/18/arch-linux-eigenes-repository-einrichten/</link>
      <pubDate>Thu, 18 Sep 2014 13:54:24 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/18/arch-linux-eigenes-repository-einrichten/</guid>
      <description>&lt;p&gt;Nachdem zunächst geklärt wurde, wie man sich &lt;a href=&#34;https://hufschlaeger.net/arch-linux-pakete-erstellen/&#34; title=&#34;Arch Linux – Pakete selbst erstellen&#34;&gt;seine eigenen Pakete&lt;/a&gt; erstellt, folgt nun die Beschreibung wie man ein eigenes Repository einrichtet. Im Prinzip das Vorgehen unter Arch Linux recht einfach gehalten, daher möchte ich das Ganze nicht wirklich als Tutorial/Anleitung bezeichnen.&lt;/p&gt;
&lt;h2 id=&#34;was-braucht-man&#34;&gt;Was braucht man?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;einen Webserver (bzw. wenn das Repository lokal ist nicht einmal den) + Zugriff auf das Dateisystem
Dabei ist es von Vorteil, wenn man (zu mindestens für das Repository) das Indexing erlaubt (&lt;a href=&#34;http://nginxlibrary.com/enable-directory-listing/&#34; title=&#34;Indexing für nginx&#34;&gt;bspw. für nginx&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;seine Pakete&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;anlegen-und-füllen-des-repository-unter-arch-linux&#34;&gt;Anlegen und Füllen des Repository (unter Arch Linux)&lt;/h2&gt;
&lt;p&gt;Ich bin mir nicht ganz sicher ob die Skripte zur Erzeugung der Datenbank nicht auch auf anderen Distributionen laufen würden, daher die Einschränkung. Die Auslieferung funktioniert unabhängig von der Distribution, da nur ein Webserver benötigt wird.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nachdem zunächst geklärt wurde, wie man sich <a href="/arch-linux-pakete-erstellen/" title="Arch Linux – Pakete selbst erstellen">seine eigenen Pakete</a> erstellt, folgt nun die Beschreibung wie man ein eigenes Repository einrichtet. Im Prinzip das Vorgehen unter Arch Linux recht einfach gehalten, daher möchte ich das Ganze nicht wirklich als Tutorial/Anleitung bezeichnen.</p>
<h2 id="was-braucht-man">Was braucht man?</h2>
<ul>
<li>einen Webserver (bzw. wenn das Repository lokal ist nicht einmal den) + Zugriff auf das Dateisystem
Dabei ist es von Vorteil, wenn man (zu mindestens für das Repository) das Indexing erlaubt (<a href="http://nginxlibrary.com/enable-directory-listing/" title="Indexing für nginx">bspw. für nginx</a>).</li>
<li>seine Pakete</li>
</ul>
<h2 id="anlegen-und-füllen-des-repository-unter-arch-linux">Anlegen und Füllen des Repository (unter Arch Linux)</h2>
<p>Ich bin mir nicht ganz sicher ob die Skripte zur Erzeugung der Datenbank nicht auch auf anderen Distributionen laufen würden, daher die Einschränkung. Die Auslieferung funktioniert unabhängig von der Distribution, da nur ein Webserver benötigt wird.</p>
<ol>
<li>Zu allererst verschafft man sich Zugang zu seinem Webserver. Dabei bietet es sich an, den Ort wo die Pakete liegen sollen in das lokale Dateisystem zu mounten. Wie man es macht ist eigentlich egal, ich benutzte zur Zeit <a href="https://wiki.archlinux.org/index.php/sshfs" title="Arch Wiki sshfs">sshfs</a> jedoch würde es sicherlich auch mit einer <a href="https://wiki.archlinux.org/index.php/Nfs" title="Arch Wiki NFS">nfs</a>-Freigabe funktionieren.</li>
<li>Kopieren der fertigen Pakete in das Verzeichnis</li>
<li>Erzeugen der Paketdatenbank (im Verzeichnis)</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">## hinzufügen aller Pakete</span>
</span></span><span class="line"><span class="cl">repo-add mypkgs.db.tar.gz *.pkg.tar.xz 
</span></span><span class="line"><span class="cl"><span class="c1">## hinzufügen eines Pakets</span>
</span></span><span class="line"><span class="cl">repo-add <span class="o">{</span>reponame<span class="o">}</span>.db.tar.gz <span class="o">{</span>paketname<span class="o">}</span>.pkg.tar.xz
</span></span></code></pre></div><h2 id="repository-in-die-paketverwaltung-eintragen">Repository in die Paketverwaltung eintragen</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[{reponame}]</span>
</span></span><span class="line"><span class="cl"><span class="na">SigLevel</span> <span class="o">=</span> <span class="s">Optional TrustAll</span>
</span></span><span class="line"><span class="cl"><span class="na">Server</span> <span class="o">=</span> <span class="s">http://host/pfad/zur/datenbank</span>
</span></span></code></pre></div><p>Dabei sollten die Werte für {reponame} in Schritt 3 und 4 übereinstimmen. Wichtig ist dabei, dass man das <a href="https://wiki.archlinux.org/index.php/Pacman#Package_security" title="Arch Linux Wiki Paketsicherheit">Siglevel</a> entsprechend anpasst. Optional TrustAll setzt keine Signierung der Pakete durch den Ersteller voraus und bietet sich daher zum Testen an.</p>
<h2 id="aktualisieren-der-paketlisten-auf-jedem-rechner">Aktualisieren der Paketlisten (auf jedem Rechner)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pacman -Syuu
</span></span></code></pre></div><p>Fertig ist das eigene Arch Linux Repository. So muss ich nicht alle Pakete auf jedem Rechner mit Arch Linux bauen, sondern kann sie via vServer allen Rechnern an denen ich arbeite bequem aktuell halten. Der nächste Schritt wäre die Signierung und ein bis zwei Spiegelserver. Wobei diese dann auch im LAN stehen könnten.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arch Linux - Pakete selbst erstellen</title>
      <link>https://hufschlaeger.net/blog/2014/09/18/arch-linux-pakete-selbst-erstellen/</link>
      <pubDate>Thu, 18 Sep 2014 10:43:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/09/18/arch-linux-pakete-selbst-erstellen/</guid>
      <description>&lt;h2 id=&#34;warum-selbst-pakete-erstellen&#34;&gt;Warum selbst Pakete erstellen?&lt;/h2&gt;
&lt;p&gt;Ein großer Vorteil von Arch Linux ist ohne Zweifel das &lt;a href=&#34;https://aur.archlinux.org&#34; title=&#34;Arch Linux User Repository&#34;&gt;Arch User Repository (AUR)&lt;/a&gt;, welches der Community ermöglicht Pakete in Form von &lt;a href=&#34;https://wiki.archlinux.org/index.php/PKGBUILD&#34; title=&#34;PKGBUILD&#34;&gt;PKGBUILD&lt;/a&gt;s bereit zu stellen.&lt;/p&gt;
&lt;p&gt;Hierbei handelt es sich um „Vorschriften“ zur Erzeugung der Pakete und beinhalten das Herunterladen und Bearbeiten der Quellen sowie die Installation in einer &lt;em&gt;Fakeroot&lt;/em&gt;-Umgebung sowie die Erstellung des Pakets. Natürlich könnte man danach aufhören und mit &lt;a href=&#34;https://wiki.archlinux.org/index.php/Pacman&#34; title=&#34;Pacman&#34;&gt;&lt;em&gt;pacman -U&lt;/em&gt;&lt;/a&gt; das erzeugte Paket einfach installieren, jedoch kann die Übersetzungszeit bei großen Bibliotheken auf schwächeren Systemen schon mal eine halbe Ewigkeit dauern. Weiterhin können die Pakete aus dem &lt;a href=&#34;https://aur.archlinux.org&#34; title=&#34;Arch Linux User Repository&#34;&gt;AUR&lt;/a&gt; durchaus instabil arbeiten und/oder neue Funktionen enthalten, die das Arbeiten im bisherigen Sinne verkomplizieren oder unmöglich machen.
Um mir zu mindestens nur einmal die Zeit für die Erstellung der Pakete nehmen zu müssen, war der Entschluss für ein eigenes privates Repository (plus folgendem Spiegelserver im LAN) schnell gefasst.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="warum-selbst-pakete-erstellen">Warum selbst Pakete erstellen?</h2>
<p>Ein großer Vorteil von Arch Linux ist ohne Zweifel das <a href="https://aur.archlinux.org" title="Arch Linux User Repository">Arch User Repository (AUR)</a>, welches der Community ermöglicht Pakete in Form von <a href="https://wiki.archlinux.org/index.php/PKGBUILD" title="PKGBUILD">PKGBUILD</a>s bereit zu stellen.</p>
<p>Hierbei handelt es sich um „Vorschriften“ zur Erzeugung der Pakete und beinhalten das Herunterladen und Bearbeiten der Quellen sowie die Installation in einer <em>Fakeroot</em>-Umgebung sowie die Erstellung des Pakets. Natürlich könnte man danach aufhören und mit <a href="https://wiki.archlinux.org/index.php/Pacman" title="Pacman"><em>pacman -U</em></a> das erzeugte Paket einfach installieren, jedoch kann die Übersetzungszeit bei großen Bibliotheken auf schwächeren Systemen schon mal eine halbe Ewigkeit dauern. Weiterhin können die Pakete aus dem <a href="https://aur.archlinux.org" title="Arch Linux User Repository">AUR</a> durchaus instabil arbeiten und/oder neue Funktionen enthalten, die das Arbeiten im bisherigen Sinne verkomplizieren oder unmöglich machen.
Um mir zu mindestens nur einmal die Zeit für die Erstellung der Pakete nehmen zu müssen, war der Entschluss für ein eigenes privates Repository (plus folgendem Spiegelserver im LAN) schnell gefasst.</p>
<h2 id="pakete-erstellen-unter-arch-linux">Pakete erstellen unter Arch Linux</h2>
<p>Wie oben beschrieben, gibt es im <a href="https://aur.archlinux.org" title="Arch Linux 'User Repository">AUR</a> schon vorgefertigte Kochrezepte für die Erstellung Pakete.</p>
<p>Also sollte man dort zunächst mit der Suche starten. Als Beispiel habe ich mit die Bibliothek „<a href="http://sourceforge.net/projects/matio/" title="MAT File I/O Library">MAT File I/O Library</a>“ ausgesucht, da ich sie auch des Öfteren für eigene Programme benötige. Das dazugehörige <a href="https://wiki.archlinux.org/index.php/PKGBUILD" title="PKGBUILD">PKGBUILD</a> sieht dabei wie folgt aus:</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># Maintainer: Stefan Husmann &lt;stefan-husmann@t-online.de&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Contributor: Alexander Rødseth &lt;rodseth@gmail.com&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Contributor: William Rea &lt;sillywilly@gmail.com&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pkgname</span><span class="o">=</span><span class="n">libmatio</span>
</span></span><span class="line"><span class="cl"><span class="n">pkgver</span><span class="o">=</span><span class="mi">1</span><span class="o">.</span><span class="mi">5</span><span class="o">.</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="n">pkgrel</span><span class="o">=</span><span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="n">pkgdesc</span><span class="o">=</span><span class="s1">&#39;C library with a fortran 90/95 module interface for reading/writing MATLAB MAT-files&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">arch</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;x86_64&#39;</span> <span class="s1">&#39;i686&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">license</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;custom:BSD&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">url</span><span class="o">=</span><span class="s1">&#39;http://sourceforge.net/projects/matio&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">depends</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;zlib&#39;</span> <span class="s1">&#39;hdf5&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">options</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;!libtool&#39;</span> <span class="s1">&#39;!emptydirs&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">=</span><span class="p">(</span><span class="s2">&#34;http://downloads.sourceforge.net/matio/matio-$pkgver.tar.gz&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">sha1sums</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;d5a83a51eb2550d75811d2dde967ef3e167d4f52&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">build</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">cd</span> <span class="n">matio</span><span class="o">-</span><span class="vg">$pkgver</span>
</span></span><span class="line"><span class="cl">  <span class="o">.</span><span class="n">/</span><span class="n">configure</span> <span class="o">--</span><span class="n">prefix</span><span class="o">=</span><span class="sr">/usr --enable-shared --with-hdf5
</span></span></span><span class="line"><span class="cl"><span class="sr">  make
</span></span></span><span class="line"><span class="cl"><span class="sr">}
</span></span></span><span class="line"><span class="cl"><span class="sr"> 
</span></span></span><span class="line"><span class="cl"><span class="sr">package() {
</span></span></span><span class="line"><span class="cl"><span class="sr">  cd matio-$pkgver
</span></span></span><span class="line"><span class="cl"><span class="sr">  make DESTDIR=&#34;$pkgdir&#34; install
</span></span></span><span class="line"><span class="cl"><span class="sr">  install -Dm644 COPYING &#34;$pkgdir&#34;/us</span><span class="n">r</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">licenses</span><span class="o">/</span><span class="vg">$pkgname</span><span class="o">/</span><span class="no">COPYING</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Die einzige Bedingung für das Gelingen sind also nur ein Internetanschluss und das Paket „base-devel“ (eventuell auch abs) installiert ist und die Abhängigkeiten (siehe depends Zeile) geklärt sind. Lädt man sich diese <a href="https://aur.archlinux.org/packages/li/libmatio/PKGBUILD" title="PKGBUILD matio">hier</a> herunter, speichert man es sinnvollerweise in einem Verzeichnis eurer Wahl. wichtig ist dabei, dass es die einzige Datei im Verzeichnis ist. Dies ist notwendig da das Skript, welches von Arch Linux ausgeliefert wird, den notwendigen Verzeichnisbaum für die Paketierung selbstständig erzeugt und es somit zwangsläufig Probleme bei mehr als einem Paket geben wird. Anschließend wechselt man mit dem Terminal in das Verzeichnis und startet das Skript: </p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">makepkg -s
</span></span></code></pre></div><p>Das Skript erledigt die im <a href="https://wiki.archlinux.org/index.php/PKGBUILD" title="PKGBUILD">PKGBUILD</a> definierten Aufgaben und komprimiert anschließend das Paket, so das es für <a href="https://wiki.archlinux.org/index.php/Pacman" title="pacman">pacman</a> verdaubar wird. Ist der Vorgang abgeschlossen, sollte eine Datei mit der Endung „*.xz“ im Verzeichnis vorliegen, welche ihr wie oben beschrieben installieren könnt.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">==</span>&gt; Säubere Installation...
</span></span><span class="line"><span class="cl">  -&gt; Bereinige ungewollte Dateien...
</span></span><span class="line"><span class="cl">  -&gt; Entferne libtool Dateien...
</span></span><span class="line"><span class="cl">  -&gt; Entferne static library Dateien...
</span></span><span class="line"><span class="cl">  -&gt; Entferne leere Verzeichnisse... 
</span></span><span class="line"><span class="cl">  -&gt; Komprimiere Man-Pages und Info-Seiten...
</span></span><span class="line"><span class="cl">  -&gt; Entferne unnötige Symbole aus Binär-Dateien und Bibliotheken...
</span></span><span class="line"><span class="cl"><span class="o">==</span>&gt; Erstelle Paket <span class="s2">&#34;libmatio&#34;</span>...
</span></span><span class="line"><span class="cl">  -&gt; Erstelle .PKGINFO Datei...
</span></span><span class="line"><span class="cl">  -&gt; Erstelle .MTREE-Datei
</span></span><span class="line"><span class="cl">  -&gt; Komprimiere Paket ... 
</span></span><span class="line"><span class="cl"><span class="o">==</span>&gt; Verlasse fakeroot Umgebung.
</span></span><span class="line"><span class="cl"><span class="o">==</span>&gt; Beendete make: libmatio 1.5.2-2 <span class="o">(</span>Do 18. Sep 10:27:01 CEST 2014<span class="o">)</span>
</span></span></code></pre></div><p>Weiter mit dem eigenen Repository geht es dann im nächsten Beitrag zu dem Thema. Bei Fragen nutzt bitte die Kommentarfunktion.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Atmel Mikrocontroller - Boards und Bibliotheken</title>
      <link>https://hufschlaeger.net/blog/2014/07/14/atmel-mikrocontroller-boards-und-bibliotheken/</link>
      <pubDate>Mon, 14 Jul 2014 20:12:20 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/07/14/atmel-mikrocontroller-boards-und-bibliotheken/</guid>
      <description>&lt;h2 id=&#34;atmel-stuff&#34;&gt;Atmel Stuff&lt;/h2&gt;
&lt;h3 id=&#34;programmiergeräte--starterkits&#34;&gt;Programmiergeräte / Starterkits&lt;/h3&gt;
&lt;p&gt;Originale Geräte haben zwar meist eine höhere Qualität und lassen sich im Betrieb meist problemlos nutzen, haben meiner Meinung nach aber einen großen Nachteil was die ISP-Schnittstelle angeht. Denn Leider ist bei den meisten ATMEL Boards der VCC Pin spannungslos und wird vom Programmierer stets genutzt um die Versorgungsspannung des Targets einzulesen. Das heißt also, das eine externe Spannungsquelle von Nöten ist. Beim STK600 ist es allerdings möglich die Spannung via AVRStudio zu regeln. Unter Linux hat man bekanntlich kein AVRStudio/ ATMEL Studio, aber die &lt;a href=&#34;http://support.atmel.no/knowledgebase/avrstudiohelp/&#34; title=&#34;ATMEL online help&#34;&gt;Onlinehilfe&lt;/a&gt; gibt Infos bzgl der Connection-Sheets usw..&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="atmel-stuff">Atmel Stuff</h2>
<h3 id="programmiergeräte--starterkits">Programmiergeräte / Starterkits</h3>
<p>Originale Geräte haben zwar meist eine höhere Qualität und lassen sich im Betrieb meist problemlos nutzen, haben meiner Meinung nach aber einen großen Nachteil was die ISP-Schnittstelle angeht. Denn Leider ist bei den meisten ATMEL Boards der VCC Pin spannungslos und wird vom Programmierer stets genutzt um die Versorgungsspannung des Targets einzulesen. Das heißt also, das eine externe Spannungsquelle von Nöten ist. Beim STK600 ist es allerdings möglich die Spannung via AVRStudio zu regeln. Unter Linux hat man bekanntlich kein AVRStudio/ ATMEL Studio, aber die <a href="http://support.atmel.no/knowledgebase/avrstudiohelp/" title="ATMEL online help">Onlinehilfe</a> gibt Infos bzgl der Connection-Sheets usw..</p>
<h4 id="avr-dragon">AVR-Dragon</h4>
<p>Sehr preisgünstiger Original-Programmiergerät, welches JTAG, PDI (bei einigen Modellen), ISP und HVPP unterstützt. Leider kommt das Gerät völlig nackt ohne Kabel, Sockel oder Gehäuse daher. Darüber hinaus ist das AVR-Dragon sehr anfällig was statische Aufladungen angeht. Abhilfe was die ESD-Schwäche betrifft kann und soll das <a href="http://www.aplomb.nl/TechStuff/Dragon/Dragon.html" title="Dragon Lair">Dragon Lair</a> schaffen.</p>
<p><img alt="AVR Dragon" loading="lazy" src="/img/avrdragon_top_small.jpg" title="AVR Dragon"></p>
<p>Auf der gleichen Seite findet man auch eine Anleitung wie man eventuell beschädigte Spannungswandler austauscht, da bei einigen Versionen zu kleine Exemplare verbaut wurden. Auskunft bzgl. Pinbelegungen der Programmierschnittstellen, Prototyping-Area etc gibt es in der <a href="http://support.atmel.no/knowledgebase/avrstudiohelp/mergedProjects/AVRDragon/AVRDragon.htm" title="Online Hilfe zum AVR Dragon">AVRStudio-Onlinehilfe</a>. Aus eigener <a href="https://d3v0.de/2012-04-avr-dragon-wiederbelebung/" title="AVR Dragon Wiederbelebung">Erfahrung</a> kann ich sagen, dass das Gerät trotz der Schwächen zu empfehlen ist.</p>
<h4 id="avr-mkii">AVR-MKII</h4>
<p>Der wohl beliebteste und weit verbreitetste Programmierer den es zu kaufen gibt. Relativ günstig in der Anschaffung, verfügt er jedoch nur über ISP und PDI als Programmierschnittstellen. Ich besitze privat keinen mkII, aber programmiere damit auf der Arbeit meine Targets.</p>
<p><img alt="Atmel ISP mkII" loading="lazy" src="/img/atmelispMKII.jpg" title="Atmel ISP mkII"></p>
<h4 id="starterkit-stk-600">Starterkit (STK) 600</h4>
<p>Der STK500-Nachfolger, scheinbar nicht so angesagt und verbreitet wie das Vorbild. Angesichts des Preises aber auch nicht weiter verwunderlich. Bekommt man das STK500 für knapp 80 € muss man beim STK600 (ohne Daughterboards) mit 300 € schon etwas tiefer in die Tasche fassen. Vorteil gegenüber dem STK500 ist, dass das Starterkit über eine USB-Schnittstelle (STK500 serielle Schnittstelle mit Problemen bei USB-RS232-Wandler, soweit mit bekannt ist) verfügt und sogar bis 300 mA ohne Netzteil betrieben werden kann. Im Lieferumfang sind enthalten :</p>
<ul>
<li>STK600</li>
<li>Netzstrippe ohne Wandwarze ( kann man für 300 € nicht verlangen}</li>
<li>Flachbandkabel ( zum programmieren )</li>
<li>USB-B-Kabel</li>
<li>Daughter-Board mit ATMega2560</li>
<li>zweipolige Verbindungskabel ( für UART, CAN, TWI denke ich )</li>
</ul>
<p><img alt="Atmel STK600" loading="lazy" src="/img/stk600_large.jpg" title="Atmel STK600"></p>
<p>Komisch finde ich, dass das Board über eine JTAG-Programmierschnittstelle verfügt, aber das Debugging über jene nicht im Funktionsumfang ist. Nicht umsonst liest man von verdutzten Käufern, dass sie Hilfe beim JTAG-Debugging brauchen und man ihnen meist nur sagen kann : „Es geht nicht!“. Weiterhin ist das sog. DIP-Package sehr interessant, wohinter sich eine Sammlung von Adapter-Boards und ein Daughter-Board mit Testsockel verbirgt um Controller im Dual-Inline-Package flashen zu können.</p>
<h4 id="usbprog">usbPROG</h4>
<p>Die eierlegende Wollmilchsau von Benedikt Sauter <a href="http://projekte.embedded-projects.net/index.php?module=content&amp;action=show&amp;page=usbprog" title="Projektseite">Projektseite</a>, die mittels Firmwarepool alles geben kann was man in einen ATMega32 bekommt. Mit der Firmware für den mkII-Klon verwandelt sich das USB-Gerät in einen vollwertigen AVR-Programmer und lässt sich wie das Original via AVRStudio oder avrdude nutzen. Vor kurzem wurde die Firmware aktualisiert, so das man den mkII-Klon auch mit AVRStudio 5 nutzen kann.</p>
<h4 id="mysmartusb-mk2">mySmartUSB MK2</h4>
<p>Das war es auch schon mit dem kurzem Überblick. Sollte jemand noch andere spannende Bibliotheken (außer Arduino-Kram), dann kann er diese ja in einem kurzem Kommentar vorstellen.</p>
<h3 id="atmel-softwarebibliotheken">Atmel Softwarebibliotheken</h3>
<p>Ein wirklich schöner und auf das Wesentliche beschränkter Programmer ist der mySmartUSB MK2 von myAVR. Er bietet neben einem AVR911-Programmer auch noch über die Möglichkeiten einen USB-RS232-Wandler (CP2102) zu nutzen und lässt sich im <a href="https://d3v0.de/2009-01-progswitch-fuer-mysmartusb-unter-linux/" title="Progswitch für mySmartUSB unter Linux">Betrieb </a><a href="https://d3v0.de/progswitch/" title="myAVR – Progswitch">umschalten</a>. Ich besitze ihn zwar immer noch, aber er kommt nicht mehr zum Einsatz.</p>
<p>So nun zum zweiten Teil der (hoffentlich mehrteiligen) Serie. In diesem Beitrag solle es jedoch mehr um die Software-Ebene bzw. genauer um Bibliotheken handeln. Es ist natürlich auch klar, dass ich nicht alle Bibliotheken auflisten kann. Daher beschränke ich mich im Wesentlichen auf die, die ich schon benutzt habe bzw. mit denen ich schon etwas herumgespielt habe. Klassiker wie die TWI-Master- oder die UART-Bibliothek von <a href="http://homepage.hispeed.ch/peterfleury/avr-software.html" title="AVR Software Seite von Peter Fleury">Peter Fleury</a> lasse ich mal außen vor, möchte sie jedoch wenigstens erwähnt haben. Grund dafür ist, dass man dafür genügend Artikel bei <a href="http://www.mikrocontroller.net/" title="mikrocontroller.net Forum">mikrocontroller.net</a> oder ähnlichen Seiten findet.</p>
<h4 id="software-usb-11-mit-vusb-für-atmel-controller">Software USB 1.1 mit VUSB für Atmel Controller</h4>
<p><img alt="V-USB Level conversion" loading="lazy" src="/imag/level-conversion-with-zener.gif" title="V-USB Level conversion"></p>
<p>Unter VUSB (<a href="http://www.obdev.at/products/vusb/index-de.html" title="Projekt Homepage von VUSB">Projekt-Homepage</a>) verbirgt sich eine Softwareimplementierung des USB 1.1 Standards für Atmel Mikrocontroller und stellt eine kostengünstige Alternative zu den USB/RS232-Wandlern der Firma FTDI da. In der gängigsten Variante sind nur 3 Widerstände und zwei Zener-Dioden notwendig um die Hardwareseite zu erfüllen. Ein stark abgespeckter Softcore ist sogar auf einem Atmel ATTiny45 mit internem Oszillator und PLL lauffähig. Vorteil dieser Variante ist, dass der Mikrocontroller weiterhin mit +5V betrieben werden kann.</p>
<p>Kleines Beispiel für eine HID-Schnittstelle:</p>
<style>
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
</style><div class="s_video_simple __h_video">
          <a href="https://vimeo.com/161924140" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/564266273-53eaf99077938cca19c6cf882d0b6ac78ce79494afb47c8fdec3b5c09c32f98d-d_295x166?region=us" srcset="https://i.vimeocdn.com/video/564266273-53eaf99077938cca19c6cf882d0b6ac78ce79494afb47c8fdec3b5c09c32f98d-d_295x166?region=us 1x, https://i.vimeocdn.com/video/564266273-53eaf99077938cca19c6cf882d0b6ac78ce79494afb47c8fdec3b5c09c32f98d-d_295x166?region=us 2x" alt="V-USB Software USB demo">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<h4 id="hardware-usb-für-atmel-controller-mit-usb-interface">Hardware USB für Atmel Controller mit USB-Interface</h4>
<p>Eine wahre Fundgrube an Beispielen und verschiedenen Implementierungen der USB-Schnittstelle für neuere Controller mit Hardware-Schnittstelle ist die <a href="http://www.fourwalledcubicle.com/LUFA.php" title="LUFA Lib">LUFA-Biliothek</a>. Dabei stehen dem geneigten Entwickler eigentlich alle Türen und Tore offen. Ob es nun HI-Devices (Mäuse, Tastaturen oder ähnliches Gerät) oder eine Kommunikationsgerät (bspw. CDC) ist, es ist realisierbar. Nicht umsonst haben die Entwickler der Arduino-Plattform im letzen Hardware-Rework den FT232 von ihren Boards geputzt und ihn gegen einen USB-fähigen Controller ersetzt. Unter den Beispielen der LUFA-Bibliothek sind daher nicht umsonst ein Arduino Programmer (Duce) und ein AVRISP-MK2 Clone vertreten. 😉 Letzterer bildet dabei die Protokolle <a style="color: #554433;" href="http://www.fourwalledcubicle.com/AVRISP.php">ISP, PDI und TPI </a>ab und wird vom ATMEL Studio als Original erkannt.</p>
<h4 id="usi-twi-slave-für-die-kleinen-attiny-µcs">USI TWI-Slave für die kleinen ATTiny-µCs</h4>
<p>Martin Junghans stellt auf seiner <a href="http://www.jtronics.de/avr-projekte/library-i2c/twi-slave-mit-usi-avr" title="Martin Junghans jtronics">Projektseite</a> eine Bibliothek samt Beispielimplementierung zur Ansteuerung der USI (Universal Serial Interface)-Schnittstelle als TWI-Interface bereit. Das US-Interface findet besonders bei den kleinen Controllern von Atmel Verwendung. <del>Bisher noch nicht getestet, aber einige Ideen zur Verwendung gäbe es da schon.</del> Die Bibliothek konnte ich erfolgreich einsetzen um bei einem Roboter die <a href="/twi-slave-zur-motorsteuerung-mit-attiny2313" title="TWI-Slave zur Motorsteuerung mit ATTiny2313">Motorsteuerung</a> durch einen ATTiny2313 zu realisieren.</p>
]]></content:encoded>
    </item>
    <item>
      <title>XRandr - Automatisch zwischen Display und Monitor umschalten</title>
      <link>https://hufschlaeger.net/blog/2014/06/23/xrandr-automatisch-zwischen-display-und-monitor-umschalten/</link>
      <pubDate>Mon, 23 Jun 2014 20:18:14 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/23/xrandr-automatisch-zwischen-display-und-monitor-umschalten/</guid>
      <description>&lt;p&gt;Ich benutze bevorzugt leichtgewichtige Window-Manager wie i3 oder awesome. Leider bedeutet dies unter Umständen auch, dass man etwas mehr Zeit bzw. Fleiß in die ein oder andere Komfortfunktion investieren muss, um diese nutzen zu können.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;xrandr Multi-Monitor Desktop http://en.wikipedia.org/wiki/Xinerama&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/Xmonad-screen-triplehead-dons.png&#34; title=&#34;xrandr Multi-Monitor Desktop http://en.wikipedia.org/wiki/Xinerama&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bspw. bei der Nutzung eines Notebooks möchte man nach Möglichkeit zwischen mehreren Anzeigegeräten automatisch umschalten. Andernfalls müsste man das Gerät immer herunterfahren und nach einem Neustart entsprechend mit xrandr konfigurieren – von Hand natürlich! Nachdem mir das Ganze heute mehr als auf die Nerven ging, habe ich mir auf die „Schnelle“ ein kleines Skript geschrieben und führe dieses nun mittels Udev-Regel aus um automatisch umschalten zu können.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich benutze bevorzugt leichtgewichtige Window-Manager wie i3 oder awesome. Leider bedeutet dies unter Umständen auch, dass man etwas mehr Zeit bzw. Fleiß in die ein oder andere Komfortfunktion investieren muss, um diese nutzen zu können.</p>
<p><img alt="xrandr Multi-Monitor Desktop http://en.wikipedia.org/wiki/Xinerama" loading="lazy" src="/img/Xmonad-screen-triplehead-dons.png" title="xrandr Multi-Monitor Desktop http://en.wikipedia.org/wiki/Xinerama"></p>
<p>Bspw. bei der Nutzung eines Notebooks möchte man nach Möglichkeit zwischen mehreren Anzeigegeräten automatisch umschalten. Andernfalls müsste man das Gerät immer herunterfahren und nach einem Neustart entsprechend mit xrandr konfigurieren – von Hand natürlich! Nachdem mir das Ganze heute mehr als auf die Nerven ging, habe ich mir auf die „Schnelle“ ein kleines Skript geschrieben und führe dieses nun mittels Udev-Regel aus um automatisch umschalten zu können.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="nv">DP2STATUS</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>cat /sys/class/drm/card0-DP-2/status<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DP3STATUS</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>cat /sys/class/drm/card0-DP-3/status<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">DISPLAY</span><span class="o">=</span>:0.0
</span></span><span class="line"><span class="cl"><span class="nv">XAUTHORITY</span><span class="o">=</span>/home/daniel/.Xauthority
</span></span><span class="line"><span class="cl"><span class="c1">#XAUTHORITY=/var/run/slim.auth</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">authtoken</span><span class="o">=</span><span class="k">$(</span> xauth -f <span class="s2">&#34;</span><span class="si">${</span><span class="nv">XAUTHORITY</span><span class="si">}</span><span class="s2">&#34;</span>  nlist <span class="p">|</span> cut -d<span class="s2">&#34; &#34;</span> -f <span class="m">9</span> <span class="k">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">xauth add <span class="nv">$DISPLAY</span> MIT-MAGIC-COOKIE-1 <span class="nv">$authtoken</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## get current display number from process list</span>
</span></span><span class="line"><span class="cl"><span class="c1"># export DISPLAY=`ps aux | grep X |  awk &#39;$12 ~ /:[0-9]/ {print $12}&#39;`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;changing&#34;</span> &gt;&gt; /tmp/dock
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DP2STATUS</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">=</span> disconnected <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="k">then</span>
</span></span><span class="line"><span class="cl">    xrandr --output LVDS1 --auto --primary --output DP2 --off
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DP2STATUS</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">=</span> connected <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DP3STATUS</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">==</span> disconnected <span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">then</span>
</span></span><span class="line"><span class="cl">        xrandr --output LVDS1 --off --output DP2 --primary --auto
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        xrandr --output DP2 --primary --auto
</span></span><span class="line"><span class="cl">        xrandr --output LVDS1 --off
</span></span><span class="line"><span class="cl">        xrandr --output DP3 --right-of DP2 --auto
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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">/usr/bin/which nitrogen <span class="m">1</span> <span class="p">&amp;</span>&gt; /dev/null <span class="m">2</span> <span class="p">&amp;</span>&gt; /dev/null
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    nitrogen --restore
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>Die dazugehörige <a href="https://wiki.archlinux.org/index.php/udev" title="Arch Linux Wiki Udev">Udev</a>-Regel sieht folgendermaßen aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">KERNEL</span><span class="o">==</span><span class="s2">&#34;card0&#34;</span>, <span class="nv">ACTION</span><span class="o">==</span><span class="s2">&#34;change&#34;</span>, <span class="nv">RUN</span><span class="o">+=</span><span class="s2">&#34;/home/daniel/bin/monitor.sh&#34;</span>
</span></span></code></pre></div><p>Wichtig ist dabei, dass der <a href="http://en.wikipedia.org/wiki/X_Window_authorization" title="X Window authorization">Xauthority</a>-Token und das Display exportiert werden, sonst geht es in die Hose. Natürlich sollten die Pfade, die Schnittstelle des Displays und eventuell die Grafikkarte entsprechend angepasst werden.</p>
]]></content:encoded>
    </item>
    <item>
      <title>git und gource</title>
      <link>https://hufschlaeger.net/blog/2014/06/23/git-und-gource/</link>
      <pubDate>Mon, 23 Jun 2014 13:51:15 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/23/git-und-gource/</guid>
      <description>&lt;p&gt;Wie bereits für meine Bachelorarbeit&lt;/p&gt;
&lt;style&gt;
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
&lt;/style&gt;&lt;div class=&#34;s_video_simple __h_video&#34;&gt;
          &lt;a href=&#34;https://vimeo.com/161915722&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;
            &lt;img src=&#34;https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us&#34; srcset=&#34;https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us 1x, https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us 2x&#34; alt=&#34;Software development during my bachelor thesis&#34;&gt;
            &lt;div class=&#34;play&#34;&gt;
              &lt;svg version=&#34;1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 61 61&#34;&gt;&lt;circle cx=&#34;30.5&#34; cy=&#34;30.5&#34; r=&#34;30.5&#34; opacity=&#34;.8&#34; fill=&#34;#000&#34;&gt;&lt;/circle&gt;&lt;path d=&#34;M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z&#34; fill=&#34;#fff&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
            &lt;/div&gt;
          &lt;/a&gt;
        &lt;/div&gt;

&lt;p&gt;habe ich die Commits meiner Masterarbeit auch durch &lt;a href=&#34;https://code.google.com/p/gource/&#34; title=&#34;software version control visualization&#34;&gt;gource&lt;/a&gt; als Video darstellen lassen. Nicht das man das machen müsste, aber man ist ja irgendwie erleichtert und froh das man das Kapitel ruhen lassen kann.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wie bereits für meine Bachelorarbeit</p>
<style>
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
</style><div class="s_video_simple __h_video">
          <a href="https://vimeo.com/161915722" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us" srcset="https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us 1x, https://i.vimeocdn.com/video/564255681-58b179a2e829a7cbbebd61e7f5ccb78efbd378eead7f822582d7a66ac577fe5b-d_640?region=us 2x" alt="Software development during my bachelor thesis">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<p>habe ich die Commits meiner Masterarbeit auch durch <a href="https://code.google.com/p/gource/" title="software version control visualization">gource</a> als Video darstellen lassen. Nicht das man das machen müsste, aber man ist ja irgendwie erleichtert und froh das man das Kapitel ruhen lassen kann.</p>
<div class="s_video_simple __h_video">
          <a href="https://vimeo.com/161916385" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/564256597-ccf8da0c149c317a4a4a21b5b278cb50065855f9c1d509e2a920c585fbbea531-d_295x166?region=us" srcset="https://i.vimeocdn.com/video/564256597-ccf8da0c149c317a4a4a21b5b278cb50065855f9c1d509e2a920c585fbbea531-d_295x166?region=us 1x, https://i.vimeocdn.com/video/564256597-ccf8da0c149c317a4a4a21b5b278cb50065855f9c1d509e2a920c585fbbea531-d_295x166?region=us 2x" alt="Development during my master thesis">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<p>Noch ein Vortrag und es ist komplett. Wer das selbst mal machen will, der findet das Skript (Einzeiler) hier:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>gource -s 0.4 -i <span class="m">0</span> -1280x800 --highlight-users --highlight-dirs --file-extensions --hide mouse,filenames --key --stop-at-end <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --output-ppm-stream - <span class="p">|</span> ffmpeg -y -r <span class="m">60</span> -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf <span class="m">1</span> -threads <span class="m">2</span> -bf <span class="m">0</span> gource.mp4
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>GitList Installation und Konfiguration</title>
      <link>https://hufschlaeger.net/blog/2014/06/22/gitlist-installation-und-konfiguration/</link>
      <pubDate>Sun, 22 Jun 2014 18:26:14 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/22/gitlist-installation-und-konfiguration/</guid>
      <description>&lt;p&gt;Wie bereits im &lt;a href=&#34;https://hufschlaeger.net/gitolite-und-gitlist-unter-debian/&#34;&gt;Artikel über gitolite angekündigt&lt;/a&gt;, folgt nun der versprochene Post bzgl. Installation und Konfiguration von gitlist. Gitlist stellt dabei ein Web-Interface für die Repositories eurer Projekte dar und orientiert sich optisch stark an gitHub. Es ist möglich mehrere Projekte/Repositories, separate Branches und einzelne Commits anzuzeigen.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;gitlist webinterface&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/gitlist.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;vorbereitung&#34;&gt;Vorbereitung&lt;/h2&gt;
&lt;p&gt;Zunächst müssen wir uns gitlist von der offiziellen Projektseite herunterladen. Das geht relativ fix mittels wget und sollte keine großen Probleme machen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wie bereits im <a href="/gitolite-und-gitlist-unter-debian/">Artikel über gitolite angekündigt</a>, folgt nun der versprochene Post bzgl. Installation und Konfiguration von gitlist. Gitlist stellt dabei ein Web-Interface für die Repositories eurer Projekte dar und orientiert sich optisch stark an gitHub. Es ist möglich mehrere Projekte/Repositories, separate Branches und einzelne Commits anzuzeigen.</p>
<p><img alt="gitlist webinterface" loading="lazy" src="/img/gitlist.jpg"></p>
<h2 id="vorbereitung">Vorbereitung</h2>
<p>Zunächst müssen wir uns gitlist von der offiziellen Projektseite herunterladen. Das geht relativ fix mittels wget und sollte keine großen Probleme machen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Verzeichnis erstellen</span>
</span></span><span class="line"><span class="cl">mkdir -p /var/www/gitlist/
</span></span><span class="line"><span class="cl"><span class="c1"># Verzeichnis wechseln</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /var/www/gitlist
</span></span><span class="line"><span class="cl"><span class="c1"># downloaden von gitlist</span>
</span></span><span class="line"><span class="cl">wget –no-check-certificate https://s3.amazonaws.com/gitlist/gitlist-0.4.0.tar.gz
</span></span></code></pre></div><h2 id="installation-von-gitlist">Installation von gitlist</h2>
<p>Zur Installation sollten wir das Archiv noch entpacken und mit den entsprechenden Rechten versehen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Archiv entpacken</span>
</span></span><span class="line"><span class="cl">tar -xzvf gitlist-0.4.tar.gz
</span></span><span class="line"><span class="cl"><span class="c1"># Rechte anpassen</span>
</span></span><span class="line"><span class="cl">chown -R www-data:www-data /var/www/gitlist
</span></span><span class="line"><span class="cl">find /var/www/gitlist/ -type d -exec chmod <span class="m">775</span> <span class="o">{}</span> <span class="se">\;</span> 
</span></span><span class="line"><span class="cl">find /var/www/gitlist/ -type f -exec chmod <span class="m">664</span> <span class="o">{}</span> <span class="se">\;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Cache Verzeichnis benötigt gesondert Rechte</span>
</span></span><span class="line"><span class="cl">chmod <span class="m">777</span> /var/www/gitlist/cache
</span></span></code></pre></div><p>Schon ist gitlist installiert. Natürlich muss euer Web-Server ( bspw. apache, nginx oder lighttpd) entsprechend konfiguriert werden, damit er den Inhalt auch entsprechend anzeigen kann.</p>
<h2 id="konfiguration-von-gitlist">Konfiguration von gitlist</h2>
<p>Im erstellten Verzeichnis gitlist sollte sich neben einigen PHP-Skripten auch eine Datei mit dem Namen „config.ini-example“ befinden. Diese wird zunächst kopiert bzw. umbenannt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp config.ini-example config.ini
</span></span></code></pre></div><p>Die Datei sollte im Groben so aussehen:</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">[git]</span>
</span></span><span class="line"><span class="cl"><span class="na">client</span> <span class="o">=</span> <span class="s">&#39;/usr/bin/git&#39; ; Your git executable path</span>
</span></span><span class="line"><span class="cl"><span class="na">default_branch</span> <span class="o">=</span> <span class="s">&#39;master&#39; ; Default branch when HEAD is detached</span>
</span></span><span class="line"><span class="cl"><span class="na">repositories[]</span> <span class="o">=</span> <span class="s">&#39;/home/git/repositories/&#39; ; Path to your repositories
</span></span></span><span class="line"><span class="cl"><span class="s">                                           ; If you wish to add more repositories, just add a new line</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; WINDOWS USERS</span>
</span></span><span class="line"><span class="cl"><span class="c1">;client = &#39;&#34;C:\Program Files (x86)\Git\bin\git.exe&#34;&#39; ; Your git executable path</span>
</span></span><span class="line"><span class="cl"><span class="c1">;repositories[] = &#39;C:\Path\to\Repos\&#39; ; Path to your repositories</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; You can hide repositories from GitList, just copy this for each repository you want to hide</span>
</span></span><span class="line"><span class="cl"><span class="c1">; hidden[] = &#39;/home/git/repositories/BetaTest&#39;</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">debug</span> <span class="o">=</span> <span class="s">false</span>
</span></span><span class="line"><span class="cl"><span class="na">cache</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="c1">; If you need to specify custom filetypes for certain extensions, do this here</span>
</span></span><span class="line"><span class="cl"><span class="k">[filetypes]</span>
</span></span><span class="line"><span class="cl"><span class="c1">; extension = type</span>
</span></span><span class="line"><span class="cl"><span class="c1">; dist = xml</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; If you need to set file types as binary or not, do this here</span>
</span></span><span class="line"><span class="cl"><span class="k">[binary_filetypes]</span>
</span></span><span class="line"><span class="cl"><span class="c1">; extension = true</span>
</span></span><span class="line"><span class="cl"><span class="c1">; svh = false</span>
</span></span><span class="line"><span class="cl"><span class="c1">; map = true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; set the timezone</span>
</span></span><span class="line"><span class="cl"><span class="k">[Date]</span>
</span></span><span class="line"><span class="cl"><span class="c1">; timezone = UTC</span>
</span></span></code></pre></div><p>Unter der Annahme, dass der Befehl git sich unter /usr/bin finden lässt ist Zeile 4 sehr entscheidend. Sie setzt den Pfad, unter dem sich eure Repositories finden lassen. Sollen einige Repositories ausgeblendet werden, so kann man diese nach dem Muster in Zeile 12 einfügen. Es bietet sich an, hier das Repository für die Verwaltung (gitolite-admin) einzutragen.</p>
<h2 id="anpassung-von-gitolite">Anpassung von gitolite</h2>
<p>Leider muss die Standard umask von gitolite angepasst werden, da sonst die Rechte zu restriktiv vergeben werden und die Inhalte der einzelnen References aus den Repositories nicht gelesen werden können.</p>
<p>Dazu verändert man die Datei gitolite.rc unter /home/git/.gitolite.rc in Zeile 21 entsprechend ab.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="c1"># Orginal</span>
</span></span><span class="line"><span class="cl"><span class="na">-    UMASK</span>                           <span class="o">=</span><span class="s">&gt;  0700</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Änderung</span>
</span></span><span class="line"><span class="cl"><span class="na">+    UMASK</span>                           <span class="o">=</span><span class="s">&gt;  0002</span>
</span></span></code></pre></div><p>Führt man diese Änderung nicht aus, so wird gitlist sich jedesmal beschweren, dass es keine Informationen des Repositories lesen konnte und euch mit einer Fehlermeldung begrüßen/abspeisen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Gitolite und GitList unter Debian</title>
      <link>https://hufschlaeger.net/blog/2014/06/20/gitolite-und-gitlist-unter-debian/</link>
      <pubDate>Fri, 20 Jun 2014 16:16:14 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/20/gitolite-und-gitlist-unter-debian/</guid>
      <description>&lt;p&gt;Ob für die eigenen Konfigurationsdateien, Softwareprojekte oder für Webseiten bzw. Blogs bieten sich Versionsverwaltungen an. Eine, von Linus Torvalds entwickelte, Möglichkeit zu Versionsverwaltung – Git – hat sich mittlerweile fest etabliert.Möchte man nicht auf Plattformen wie &lt;a title=&#34;gitHub&#34; href=&#34;https://github.com/&#34; target=&#34;_blank&#34;&gt;GitHub&lt;/a&gt; oder &lt;a title=&#34;BitBucket&#34; href=&#34;https://bitbucket.org/&#34; target=&#34;_blank&#34;&gt;BitBucket&lt;/a&gt; setzen und hat einen vServer oder Ähnliches zur Verfügung, bietet es sich geradezu an seine Projekte etc. selbst zu Hosten.
&lt;img alt=&#34;gitlist webinterface&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/gitlist.jpg&#34; title=&#34;gitlist webinterface&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dabei wird die Einrichtung in zwei Schritte gegliedert:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Einrichten der Server-Schnittstelle „&lt;a title=&#34;gitolite&#34; href=&#34;http://gitolite.com/&#34; target=&#34;_blank&#34;&gt;gitolite&lt;/a&gt;“ (machen wir hier)&lt;/li&gt;
&lt;li&gt;Einrichten des Webfrontends „&lt;a title=&#34;gitlist&#34; href=&#34;http://gitlist.org/&#34; target=&#34;_blank&#34;&gt;gitlist&lt;/a&gt;“ (&lt;a href=&#34;https://hufschlaeger.net/gitlist-installation-und-konfiguration/&#34;&gt;gibt es noch einen Post zu&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;gitolite&#34;&gt;Gitolite&lt;/h2&gt;
&lt;p&gt;Gitolite ist ein Fork bzw. eine Weiterentwicklung des Projektes gitosis und ist in der Lage mehrere Repositories zu verwalten und verfügt obendrein noch über eine Rechte- und Benutzerverwaltung in Form einer Konfigurationsdatei. Die Authentifizierung erfolgt dabei über SSH und Private- bzw. Public-Keys.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ob für die eigenen Konfigurationsdateien, Softwareprojekte oder für Webseiten bzw. Blogs bieten sich Versionsverwaltungen an. Eine, von Linus Torvalds entwickelte, Möglichkeit zu Versionsverwaltung – Git – hat sich mittlerweile fest etabliert.Möchte man nicht auf Plattformen wie <a title="gitHub" href="https://github.com/" target="_blank">GitHub</a> oder <a title="BitBucket" href="https://bitbucket.org/" target="_blank">BitBucket</a> setzen und hat einen vServer oder Ähnliches zur Verfügung, bietet es sich geradezu an seine Projekte etc. selbst zu Hosten.
<img alt="gitlist webinterface" loading="lazy" src="/img/gitlist.jpg" title="gitlist webinterface"></p>
<p>Dabei wird die Einrichtung in zwei Schritte gegliedert:</p>
<ol>
<li>Einrichten der Server-Schnittstelle „<a title="gitolite" href="http://gitolite.com/" target="_blank">gitolite</a>“ (machen wir hier)</li>
<li>Einrichten des Webfrontends „<a title="gitlist" href="http://gitlist.org/" target="_blank">gitlist</a>“ (<a href="/gitlist-installation-und-konfiguration/">gibt es noch einen Post zu</a>)</li>
</ol>
<h2 id="gitolite">Gitolite</h2>
<p>Gitolite ist ein Fork bzw. eine Weiterentwicklung des Projektes gitosis und ist in der Lage mehrere Repositories zu verwalten und verfügt obendrein noch über eine Rechte- und Benutzerverwaltung in Form einer Konfigurationsdatei. Die Authentifizierung erfolgt dabei über SSH und Private- bzw. Public-Keys.</p>
<h3 id="vorbereitung">Vorbereitung</h3>
<p>Da die Installation von gitolite git benötigt, sollte das entsprechende Paket auch installiert sein.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Paketlisten updaten</span>
</span></span><span class="line"><span class="cl">apt-get update
</span></span><span class="line"><span class="cl"><span class="c1"># Updates installieren sofern nötig</span>
</span></span><span class="line"><span class="cl">apt-get upgrade
</span></span><span class="line"><span class="cl"><span class="c1"># das PAket git installieren</span>
</span></span><span class="line"><span class="cl">apt-get install git
</span></span></code></pre></div><p>Weiterhin wird zur sauberen Trennung, ein separater Nutzer eingerichtet.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">adduser git
</span></span></code></pre></div><p>Daraufhin wechselt man den Benutzer, nimmt die Umgebung mit und wechselt in das Benutzerverzeichnis des soeben erstellten Benutzers.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">su - git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span></code></pre></div><p>Da für die Authentifizierung ein SSH-Publickey (s.o.) benötigt wird, muss dieser zunächst erzeugt werden. Sicherlich kann auch ein bestehender Key verwendet werden, jedoch sollte man hinsichtlich sauberer Trennung einen separaten Key erstellen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># RSA-Schlüsselpaar erzeugen</span>
</span></span><span class="line"><span class="cl">ssh-keygen -t rsa
</span></span></code></pre></div><h3 id="installation">Installation</h3>
<p>Zur Installation bleibt eigentlich nicht viel zu sagen. Der aktuelle Stand wird ausgecheckt und über die mitgelieferten Skripte installiert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># aktuellen Stand klonen</span>
</span></span><span class="line"><span class="cl">git clone git://github.com/sitaramc/gitolite
</span></span><span class="line"><span class="cl"><span class="c1"># Verzeichnis für die Binaries im Benutzerverzeichnis erstellen</span>
</span></span><span class="line"><span class="cl">mkdir -p <span class="nv">$HOME</span>/bin
</span></span><span class="line"><span class="cl"><span class="c1"># gitolite installieren</span>
</span></span><span class="line"><span class="cl">gitolite/install -to <span class="nv">$HOME</span>/bin
</span></span><span class="line"><span class="cl"><span class="c1"># public-key integrieren</span>
</span></span><span class="line"><span class="cl">gitolite setup -pk git.pub
</span></span></code></pre></div><p>Je nach Konfiguration, kann es sein das der letzte Befehl scheitert. Warum? Ganz einfach er kann den entsprechenden Befehl nicht finden, da nicht jede Distribution per Default das bin-Verzeichnis im Home an den PATH anhängt. Schnelle Abhilfe schafft ein entsprechender export oder ein Aufruf mit vollem Pfad.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$HOME</span>/bin/gitolite setup -pk git.pub
</span></span></code></pre></div><p>Soweit so gut, ist man soweit gekommen, ist eigentlich alles Nötige erledigt und gitolite funktioniert.</p>
<h3 id="abschluss">Abschluss</h3>
<p>In einer lokalen Shell kann nun das Repository für die Konfiguration ausgecheckt werden und Benutzer sowie Repositories hinzugefügt werden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone git@example.com:/gitolite-admin
</span></span></code></pre></div><p>Daraufhin erhält man einen neuen lokalen Ordner „gitolite-admin“. Darin befinden sich die Ordner keydir und conf. Möchte man einen neuen Public-Key hinzufügen, so kopiert man diesen als Datei in den Ordner keydir und für innerhalb der Konfiguration im Ordner conf die entsprechenden Einträge hinzu. Dabei sieht die Konfiguration schematisch so 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="na">@entwickler</span> <span class="o">=</span> <span class="s">daniel felix simon</span>
</span></span><span class="line"><span class="cl"><span class="na">@admins</span> <span class="o">=</span> <span class="s">git </span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">repo meinprojektrepo</span>
</span></span><span class="line"><span class="cl">    <span class="na">RW+</span> <span class="o">=</span> <span class="s">daniel
</span></span></span><span class="line"><span class="cl"><span class="s">    RW = felix
</span></span></span><span class="line"><span class="cl"><span class="s">    R = @entwickler</span>
</span></span></code></pre></div><p>Dabei entsprechen @entwickler und @admins Gruppen, welche das hinzufügen von Benutzern recht komfortabel gestalten. Möchte man alle Nutzer hinzufügen bietet gitolite die Gruppe @all an. Die Zeile „repo meinprojektrepo“ stellt dabei ein Repository dar und definiert die Zugriffsrechte der Benutzer auf das Repository. Möchte man weitere Repositories erstellen, fügt man einfach weitere Abschnitte hinzu und gitolite wird die entfernten Repositories mit dem nächsten push erstellen und entsprechend einrichten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># neuen Public-Key hinzufügen</span>
</span></span><span class="line"><span class="cl">git add keydir/neuer_key
</span></span><span class="line"><span class="cl"><span class="c1"># Änderungen commiten/einpflegen</span>
</span></span><span class="line"><span class="cl">git commit -am <span class="s2">&#34;Neuer Key von Max Mustermann&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Änderungen an Remote-Server übertragen</span>
</span></span><span class="line"><span class="cl">git push
</span></span></code></pre></div><p>So das war es eigentlich. Da der Post relativ lang geworden ist, werde ich den Part über gitlist später in einem weiteren Post erläutern. Sollten Fehler oder Fragen existieren, bitte einfach melden.</p>
]]></content:encoded>
    </item>
    <item>
      <title>VIM Einzeiler</title>
      <link>https://hufschlaeger.net/blog/2014/06/17/vim-einzeiler/</link>
      <pubDate>Tue, 17 Jun 2014 18:16:42 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/17/vim-einzeiler/</guid>
      <description>&lt;p&gt;Ich dachte mir, dass ich eventuell mal einige hilfreiche &lt;a href=&#34;http://www.vim.org/&#34; title=&#34;Vi Improved project site&#34;&gt;VIM&lt;/a&gt; Einzeiler sammle, könnte ja nicht nur mir hilfreich sein. Mit der Zeit werde ich diese noch erweitern, wer ein paar gute Sachen parat hat, kann mir auch gern welche zukommen lassen.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;gVIM Instanz&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/gvim.png&#34; title=&#34;gVIM Instanz&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;zeilenumbrüche-m-entfernen&#34;&gt;Zeilenumbrüche (^M) entfernen:&lt;/h2&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;:%s/^V^M//g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wobei ^V und ^M durch gedrückt halten der Steuerungstaste (STRG/CTRL) und des jeweiligen Buchstabens gebildet werden.&lt;/p&gt;
&lt;h2 id=&#34;n-zeilen-auskommentieren&#34;&gt;N Zeilen auskommentieren:&lt;/h2&gt;
&lt;p&gt;Unter der Angabe des Bereichs mit absolutem Start- und Endwert&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich dachte mir, dass ich eventuell mal einige hilfreiche <a href="http://www.vim.org/" title="Vi Improved project site">VIM</a> Einzeiler sammle, könnte ja nicht nur mir hilfreich sein. Mit der Zeit werde ich diese noch erweitern, wer ein paar gute Sachen parat hat, kann mir auch gern welche zukommen lassen.</p>
<p><img alt="gVIM Instanz" loading="lazy" src="/img/gvim.png" title="gVIM Instanz"></p>
<h2 id="zeilenumbrüche-m-entfernen">Zeilenumbrüche (^M) entfernen:</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:%s/^V^M//g
</span></span></code></pre></div><p>Wobei ^V und ^M durch gedrückt halten der Steuerungstaste (STRG/CTRL) und des jeweiligen Buchstabens gebildet werden.</p>
<h2 id="n-zeilen-auskommentieren">N Zeilen auskommentieren:</h2>
<p>Unter der Angabe des Bereichs mit absolutem Start- und Endwert</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">&lt;Startzeile&gt;,&lt;Endzeile&gt;s/^/#/
</span></span></code></pre></div><p>Oder unter Angabe der Startzeile und der Anzahl der Zeilen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:&lt;Startzeile&gt;,&lt;+-Zeilenanzahl&gt;s/^/#/
</span></span></code></pre></div><p>Dabei ist die Raute (#) das jeweilige Zeichen um einen Kommentar einzuleiten. Für Octave-Code würde man das Prozentzeichen wählen (%) oder bei C/C++-Code eben // wobei diese jedoch jeweils mit einem vorangestelltem \ versehen werden müssen. Natürlich kann man damit auch alles Andere auf die Zeilen anwenden. Entfernen kann man die Kommentare natürlich auch wieder.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:&lt;Startzeile&gt;,&lt;Endzeile&gt;s/^#//
</span></span></code></pre></div><p>Für die Kombination aus Start- und Endzeile, sowie für die Angabe von Startzeilen und der Anzahl der folgenden Zeilen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:&lt;Startzeile&gt;,&lt;+-Zeilenanzahl&gt;s/^#//
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>KiCAD EDA Software Suite</title>
      <link>https://hufschlaeger.net/blog/2014/06/02/kicad-eda-software-suite/</link>
      <pubDate>Mon, 02 Jun 2014 20:24:33 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/06/02/kicad-eda-software-suite/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite&#34; title=&#34;KiCAD Homepage&#34;&gt;KiCAD&lt;/a&gt; ist ein relativ gutes und vor allem freies Tool zur Erstellung von Schaltplänen und Layouts. Daher wird es auch zur Gruppe der sog. &lt;a href=&#34;http://de.wikipedia.org/wiki/Electronic_Design_Automation&#34; title=&#34;Electronic Design Automation&#34;&gt;EDA&lt;/a&gt;-Tools und soll den Entwickler technologisch bei der Entwicklung von elektronischen Systemen unterstützen (ähnlich wie CAD-Programme). Da die Weiterentwicklung von KiCAD, nicht zuletzt durch den großen Merge des CERNs, stetig voranschreitet wird es nicht nur immer benutzbarer, sondern steigt auch die Verbreitung. Darüber hinaus fließen durchaus interessante Features wie der &lt;a href=&#34;https://www.youtube.com/watch?v=irqlrVUbjuQ&#34; title=&#34;KiCAD - Push and Shove Router&#34;&gt;Push and Shove-Router&lt;/a&gt; in den Hauptzweig ein.
&lt;img alt=&#34;Mamashield, made with KiCAD&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/mama-shiled-kicad.jpg&#34; title=&#34;Mamashield, made with KiCAD&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite" title="KiCAD Homepage">KiCAD</a> ist ein relativ gutes und vor allem freies Tool zur Erstellung von Schaltplänen und Layouts. Daher wird es auch zur Gruppe der sog. <a href="http://de.wikipedia.org/wiki/Electronic_Design_Automation" title="Electronic Design Automation">EDA</a>-Tools und soll den Entwickler technologisch bei der Entwicklung von elektronischen Systemen unterstützen (ähnlich wie CAD-Programme). Da die Weiterentwicklung von KiCAD, nicht zuletzt durch den großen Merge des CERNs, stetig voranschreitet wird es nicht nur immer benutzbarer, sondern steigt auch die Verbreitung. Darüber hinaus fließen durchaus interessante Features wie der <a href="https://www.youtube.com/watch?v=irqlrVUbjuQ" title="KiCAD - Push and Shove Router">Push and Shove-Router</a> in den Hauptzweig ein.
<img alt="Mamashield, made with KiCAD" loading="lazy" src="/img/mama-shiled-kicad.jpg" title="Mamashield, made with KiCAD"></p>
<h2 id="kicad-beziehen">KiCAD beziehen</h2>
<p>Für die üblichen Plattformen wie <a href="http://iut-tice.ujf-grenoble.fr/cao/KiCad_stable-2013.07.07-BZR4022_Win_full_version.exe" title="KiCAD Windows Installer">Windows</a>, Linux usw. gibt es Pakete bzw. Installationsroutinen auf der <a href="http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite" title="KiCAD Homepage">Homepage</a>. In der Regel sind diese jedoch etwas „gesetzt“. Möchte man eine aktuelle Version des Entwicklungszweigs nutzen, bleibt daher nur das eigenhändige Kompilieren. Unter <a href="https://github.com/mangelajo/KicadOSXBuilder" title="MacOSX Buildscript">MacOSX</a> existieren ein oder zwei verschiedene Build-Scripts, wobei der Build-Vorgang wohl mehr oder weniger erfolgreich ist. Für Ubuntu wie üblich ein <a href="https://code.launchpad.net/~js-reynaud/+archive/ppa-kicad">PPA</a>. Unter Arch Linux nutzt man für den aktuellsten Stand das PKGBUILD aus dem <a href="https://aur.archlinux.org/packages/kicad-bzr/" title="AUR KiCAD-bzr">AUR</a>. Natürlich ist bei sämtlichen Build-Skripten zu bedenken, dass das Resultat mehr oder weniger stabil ausfallen kann. Sogar für Windows-Nutzer hat sich jemand erbarmt und versucht den Build-Vorgang in ein <a href="https://launchpad.net/kicad-winbuilder" title="kicad winbuilder">Skript</a> zu packen und somit die Unbekannten Gefilde vor ihm zu vestecken.</p>
<h2 id="kicad-videos">KiCAD-Videos</h2>
<p>Klar gibt es auch Videos und einige Video-Tutorials. <a href="http://www.youtube.com/playlist?list=PL67B2290F4C62B5F2&amp;feature=plcp" title="Playlist von Madworm">Playlist</a></p>
<h2 id="kicad-quellen">KiCAD-Quellen</h2>
<p>Da ein EDA-Programm nur so gut ist wie seine Bauteilquellen, folgen nun einige gute Quellen für ebensolche. Dabei ist jedoch auf die Lizenzen des jeweiligen Autors zu achten. Sollte jemand noch weitere Bibliotheken kennen, dann würde ich mich über eine kurze Meldung freuen.</p>
<p><a href="http://www.kicadcloud.com/" title="kicadcloud">kicadcloud</a> (hauptsächlich Bauteile, Footprints)
<a href="http://smisioto.no-ip.org/sysop/kicad.htm" title="smisioto">smisioto</a> (Bauteile, Footprints und 3D-Modelle)
<a href="http://www.reniemarquet.com/bibliotecas_en.html" title="reniemarquet"><span style="color: #0000ff;"><span style="color: #0000ff;">Renie S. Marquet</span></span></a> (Bauteile, Footprints und 3D-Modelle)
<a href="http://library.oshec.org/" title="oshec">Konvertierte EAGLE Bibliotheken</a> (Bauteile und Footprints)
<a href="http://www.saturnal.eu/guest/external/freedata/download/index.php?dir=kicad/my%20library/" title="saturnal.eu">saturnal.eu</a> (Bauteile, Footprints und 3D-Modelle)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Octave Stapel- oder Batchverarbeitung von Dateien</title>
      <link>https://hufschlaeger.net/blog/2014/05/20/octave-stapel-oder-batchverarbeitung-von-dateien/</link>
      <pubDate>Tue, 20 May 2014 20:33:39 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2014/05/20/octave-stapel-oder-batchverarbeitung-von-dateien/</guid>
      <description>&lt;h2 id=&#34;batchverarbeitung&#34;&gt;Batchverarbeitung&lt;/h2&gt;
&lt;p&gt;Programme wie MATLAB oder &lt;a href=&#34;https://gnu.org/software/octave/&#34; title=&#34;GNU Octave&#34;&gt;Octave&lt;/a&gt; sind schon recht hilfreiche Programme, wenn es darum geht Daten mathematisch auszuwerten oder zu visualisieren. Dabei ist es oftmals extrem nervig, wenn mehrere Dateien des gleichen Typs verarbeitet werden – also mittels Stapel- oder Batchverarbeitung – sollen um bspw. Trainingsdaten für einen Klassifikator zu verarbeiten etc.. Für MATLAB ist mir dazu mal eine 32-Bit-DLL untergekommen, aber leider funktioniert diese nicht unter Octave.&lt;/p&gt;
&lt;h2 id=&#34;oct-files---funktionsumfang&#34;&gt;Oct-Files - Funktionsumfang&lt;/h2&gt;
&lt;p&gt;Daher habe ich mir ein oct-File geschrieben, welches genau diese Aufgabe übernimmt. &lt;a href=&#34;https://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles&#34; title=&#34;Oct-Files Dokumentation&#34;&gt;Oct-Files&lt;/a&gt; sind dabei das Pendant zu den mex-Files von Matlab und stellen eine C++-API bereit um den Funktionsumfang von Octave zu erhöhen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="batchverarbeitung">Batchverarbeitung</h2>
<p>Programme wie MATLAB oder <a href="https://gnu.org/software/octave/" title="GNU Octave">Octave</a> sind schon recht hilfreiche Programme, wenn es darum geht Daten mathematisch auszuwerten oder zu visualisieren. Dabei ist es oftmals extrem nervig, wenn mehrere Dateien des gleichen Typs verarbeitet werden – also mittels Stapel- oder Batchverarbeitung – sollen um bspw. Trainingsdaten für einen Klassifikator zu verarbeiten etc.. Für MATLAB ist mir dazu mal eine 32-Bit-DLL untergekommen, aber leider funktioniert diese nicht unter Octave.</p>
<h2 id="oct-files---funktionsumfang">Oct-Files - Funktionsumfang</h2>
<p>Daher habe ich mir ein oct-File geschrieben, welches genau diese Aufgabe übernimmt. <a href="https://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles" title="Oct-Files Dokumentation">Oct-Files</a> sind dabei das Pendant zu den mex-Files von Matlab und stellen eine C++-API bereit um den Funktionsumfang von Octave zu erhöhen.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="nf">DEFUN_DLD</span> <span class="p">(</span> <span class="n">scandir</span> <span class="p">,</span> <span class="n">args</span><span class="p">,</span>  <span class="p">,</span> <span class="s">&#34;-*- texinfo -*-</span><span class="se">\n</span><span class="s">\
</span></span></span><span class="line"><span class="cl"><span class="s">        @deftypefn {Scan Dir} {} scandir (@var{n}, @var{m})</span><span class="se">\n</span><span class="s">\
</span></span></span><span class="line"><span class="cl"><span class="s">        A function that scans the passed directory for files with the given files extension.</span><span class="se">\n</span><span class="s">\
</span></span></span><span class="line"><span class="cl"><span class="s">        This could be helpfull for writing applications where serveral files schould be proccessed in batchmode.</span><span class="se">\n</span><span class="s">\
</span></span></span><span class="line"><span class="cl"><span class="s">        @end deftypefn&#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="cm">/* return values */</span>
</span></span><span class="line"><span class="cl">        <span class="n">octave_value_list</span> <span class="n">retval</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* number of input arguments */</span>
</span></span><span class="line"><span class="cl">        <span class="kt">int</span> <span class="n">nargin</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="nf">length</span> <span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="cm">/* do something fancy */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="cm">/* return results */</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">retval</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Dabei habe ich mir ein entsprechendes octfile geschrieben, um einen angegebenen Pfad nach Dateien einer bestimmten Endung durchsucht und eine Liste dieser Dateien als CharMatrix zurück liefert. Dabei kann die so kreierte Funktion „scandir“ – sofern im Suchpfad von Octave – wie jede andere Funktion aufgerufen werden:</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>~/Dokumente/Projekte/Messdaten/Volumen<span class="o">]</span>$ ls                                                                         
</span></span><span class="line"><span class="cl">Tauchtechnik_Schallfeld_ZEUS  WS1232-10KK200-03.3d
</span></span><span class="line"><span class="cl"><span class="o">[</span>~/Dokumente/Projekte/Messdaten/Volumen<span class="o">]</span>$ octave -q
</span></span><span class="line"><span class="cl">octave:1&gt; <span class="nv">dir</span> <span class="o">=</span> <span class="nb">pwd</span>
</span></span><span class="line"><span class="cl"><span class="nv">dir</span> <span class="o">=</span> /home/daniel/Dokumente/Projekte/Messdaten/Volumen
</span></span><span class="line"><span class="cl">octave:2&gt; <span class="nv">name</span> <span class="o">=</span> scandir <span class="o">(</span>dir, <span class="s1">&#39;3d&#39;</span> <span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">name</span> <span class="o">=</span> /home/daniel/Dokumente/Projekte/Messdaten/Volumen/WS1232-10KK200-03.3d
</span></span></code></pre></div><p>Somit ist es möglich mehrere Dateien (plus Pfad) automatisch in einer Liste zu verwalten und ggf. an seine Octave-Skripte übergeben und somit recht viel Zeit gespart werden. Damit ist nun die Batchverarbeitung recht einfach möglich. Ich hoffe das Ganze ist für den ein oder anderen nützlich.</p>
<p><a href="/downloads/octave_scandir.tar.gz">Octave Oct-file Scandir</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Patchen mit git</title>
      <link>https://hufschlaeger.net/blog/2013/08/11/patchen-mit-git/</link>
      <pubDate>Sun, 11 Aug 2013 15:51:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2013/08/11/patchen-mit-git/</guid>
      <description>&lt;p&gt;Mal etwas Kurzes, was ich mir anscheinend aber nicht merken kann.&lt;/p&gt;
&lt;h3 id=&#34;patch-erstellen&#34;&gt;Patch erstellen&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git diff --no-prefix &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; patchfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;patch-einspielen-mit-patch&#34;&gt;Patch einspielen mit patch&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;patch -p0 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; patchfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sollte –no-prefix weggelassen werden, dann enthält der Patch die Prefixe a/ b/ für die Quelldateien. Mit folgender Änderung werden diese ignoriert.&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-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;patch -p1 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; patchfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;patch-einspielen-mit-git-apply&#34;&gt;Patch einspielen mit git apply&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git apply --index patchfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Mal etwas Kurzes, was ich mir anscheinend aber nicht merken kann.</p>
<h3 id="patch-erstellen">Patch erstellen</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">git diff --no-prefix <span class="p">&gt;</span> patchfile
</span></span></code></pre></div><h3 id="patch-einspielen-mit-patch">Patch einspielen mit patch</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">patch -p0 <span class="p">&lt;</span> patchfile
</span></span></code></pre></div><p>Sollte –no-prefix weggelassen werden, dann enthält der Patch die Prefixe a/ b/ für die Quelldateien. Mit folgender Änderung werden diese ignoriert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">patch -p1 <span class="p">&lt;</span> patchfile
</span></span></code></pre></div><h3 id="patch-einspielen-mit-git-apply">Patch einspielen mit git apply</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">git apply --index patchfile
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>ADXL345 als Input-Device</title>
      <link>https://hufschlaeger.net/blog/2013/04/01/adxl345-als-input-device/</link>
      <pubDate>Mon, 01 Apr 2013 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2013/04/01/adxl345-als-input-device/</guid>
      <description>&lt;h2 id=&#34;vorgeplänkel&#34;&gt;Vorgeplänkel&lt;/h2&gt;
&lt;p&gt;Beschleunigungssensoren (ADXL345) sind ja nahezu alltags-tauglich und begleiten mittlerweile fast jedermann im Smartphone oder Tablet. Interessant sind sie daher auch für eigene Spielerreien. Da ich noch ein eBay-Modul rumliegen hatte und sowohl für den Beschleunigungssensor als auch für das Raspberry Pi einen halbwegs sinnvollen Zweck finden wollte, dachte ich mir ich verheirate die beiden miteinander.&lt;/p&gt;
&lt;p&gt;Überrascht war ich als ich sah, dass Analog Devices wohl recht aktiv in der Dokumentation und Entwicklung von Gerätetreibern unter Linux (device drivers) ist und es ein nahezu fertiges
&lt;a href=&#34;http://wiki.analog.com/resources/tools-software/linux-drivers/input-misc/adxl345#adxl345_on_raspberry_pi_-_a_worked_example&#34; title=&#34;Wiki von Analog Devices&#34;&gt;Kochrezept&lt;/a&gt; für das Raspberry Pi gibt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="vorgeplänkel">Vorgeplänkel</h2>
<p>Beschleunigungssensoren (ADXL345) sind ja nahezu alltags-tauglich und begleiten mittlerweile fast jedermann im Smartphone oder Tablet. Interessant sind sie daher auch für eigene Spielerreien. Da ich noch ein eBay-Modul rumliegen hatte und sowohl für den Beschleunigungssensor als auch für das Raspberry Pi einen halbwegs sinnvollen Zweck finden wollte, dachte ich mir ich verheirate die beiden miteinander.</p>
<p>Überrascht war ich als ich sah, dass Analog Devices wohl recht aktiv in der Dokumentation und Entwicklung von Gerätetreibern unter Linux (device drivers) ist und es ein nahezu fertiges
<a href="http://wiki.analog.com/resources/tools-software/linux-drivers/input-misc/adxl345#adxl345_on_raspberry_pi_-_a_worked_example" title="Wiki von Analog Devices">Kochrezept</a> für das Raspberry Pi gibt.</p>
<h2 id="einrichten-der-entwicklungsumgebung">Einrichten der Entwicklungsumgebung</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Arbeitsverzeichnis erzeugen</span>
</span></span><span class="line"><span class="cl">mkdir RaspberryPi
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> RaspberryPi
</span></span><span class="line"><span class="cl"><span class="c1"># Entwicklungstools klonen</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/raspberrypi/tools.git
</span></span><span class="line"><span class="cl"><span class="c1"># Kernelquellen klonen</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/raspberrypi/linux.git
</span></span></code></pre></div><h2 id="anwenden-desder-patchfiles">Anwenden des/der Patchfiles</h2>
<p>Leider funktionieren die <em>Patch-Files</em> aus dem <em>Analog Devices-Wiki</em> <strong>nicht</strong> mehr mit der aktuellen Version. Daher habe ich die Änderungen manuell übernommen. Zunächst benötigen wir die Änderungen, welche ich als <a href="/downloads/raspi_adxl34x.patch">Patch</a> (Ausgabe von diff) zum Download bereitgestellt habe. Somit ist es nicht notwendig die Änderungen bzgl. des aktuellen Stands vom Kernel-Repository per Hand einzupflegen. Das geht natürlich auch, aber warum mehr Arbeit als nötig aufhalsen. Hat man das Repo ausgecheckt und das Patch-File im aktuellen Ordner (linux), so folgt das normale „Applying“ via Git.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git apply path/file.patch
</span></span></code></pre></div><h2 id="kompilieren-des-kernels-und-der-module">Kompilieren des Kernels und der Module</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Exportieren der relevanten Informationen zum Übersetzen</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span>PFAD_ZU_TOOLS_ORDNER/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/:<span class="nv">$PATH</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">ARCH</span><span class="o">=</span>arm
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CROSS_COMPILE</span><span class="o">=</span>arm-linux-gnueabihf-
</span></span><span class="line"><span class="cl"><span class="c1"># Konfigurieren</span>
</span></span><span class="line"><span class="cl">make bcmrpi_defconfig
</span></span><span class="line"><span class="cl"><span class="c1"># Starten des Kompilierens</span>
</span></span><span class="line"><span class="cl">make
</span></span></code></pre></div><h2 id="übernehmen-des-kernels-und-der-module">Übernehmen des Kernels und der Module</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp arch/arm/boot/zImage /PFAD_ZUR_FAT_PARTITION_SDKARTE/kernel.img
</span></span><span class="line"><span class="cl">sudo <span class="nv">ARCH</span><span class="o">=</span>arm make modules_install <span class="nv">INSTALL_MOD_PATH</span><span class="o">=</span>/media/10b4c001-2137-4418-b29e-57b7d15a6cbc&lt;/pre&gt;
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Kleines ATTiny2313 Board</title>
      <link>https://hufschlaeger.net/blog/2012/11/07/kleines-attiny2313-board/</link>
      <pubDate>Wed, 07 Nov 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/11/07/kleines-attiny2313-board/</guid>
      <description>&lt;p&gt;Mal etwas Hardware zum Abend. Das Board schlummert auch schon etwas länger in der Schublade und war meine erste selbstständig geätzte Platine. Man möge die schlecht Anordnung von Pufferkondensator hinter dem Linearregler verzeihen, aber es musste wie immer schnell gehen.
&lt;img alt=&#34;ATTiny2313 schematic&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/2313-board-schematic.png&#34; title=&#34;ATTiny2313 schematic&#34;&gt;
Ansonsten ist nicht viel drauf außer Regler, Mikrocontroller (&lt;a href=&#34;http://www.atmel.com/devices/attiny2313.aspx&#34; title=&#34;ATMEL ATTiny2313 product page&#34;&gt;ATTiny2313&lt;/a&gt;), eine ICSP-Wanne und natürlich vielen Steckverbindern.
&lt;img alt=&#34;ATTiny2313 layout&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/2313-board-layout.png&#34; title=&#34;ATTiny2313 layout&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mal etwas Hardware zum Abend. Das Board schlummert auch schon etwas länger in der Schublade und war meine erste selbstständig geätzte Platine. Man möge die schlecht Anordnung von Pufferkondensator hinter dem Linearregler verzeihen, aber es musste wie immer schnell gehen.
<img alt="ATTiny2313 schematic" loading="lazy" src="/img/2313-board-schematic.png" title="ATTiny2313 schematic">
Ansonsten ist nicht viel drauf außer Regler, Mikrocontroller (<a href="http://www.atmel.com/devices/attiny2313.aspx" title="ATMEL ATTiny2313 product page">ATTiny2313</a>), eine ICSP-Wanne und natürlich vielen Steckverbindern.
<img alt="ATTiny2313 layout" loading="lazy" src="/img/2313-board-layout.png" title="ATTiny2313 layout"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Rigol DS1052E USB-Kommunikation</title>
      <link>https://hufschlaeger.net/blog/2012/11/07/rigol-ds1052e-usb-kommunikation/</link>
      <pubDate>Wed, 07 Nov 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/11/07/rigol-ds1052e-usb-kommunikation/</guid>
      <description>&lt;p&gt;Seit zwei Jahren habe ich das günstige Einsteiger-DSO (Rigol DS1052E) und bin damit recht zufrieden. Die mitgelieferte Software ist allerdings recht bescheiden, aber scheint zu funktionieren. Zumindest für Einzelbilder. Vor einer ganzen Weile habe ich mich mal mit dem USB-Protokoll beschäftigt und eine kleine Demo-Applikation auf Basis von Qt, Qwt und den Agilent IO Libraries umgesetzt. Im Video sieht man die Visualisierung des Datenstroms. Das Signal ist – recht unspektakulär – der Referenzkanal des DSOs zum Abstimmen der Tastköpfe.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seit zwei Jahren habe ich das günstige Einsteiger-DSO (Rigol DS1052E) und bin damit recht zufrieden. Die mitgelieferte Software ist allerdings recht bescheiden, aber scheint zu funktionieren. Zumindest für Einzelbilder. Vor einer ganzen Weile habe ich mich mal mit dem USB-Protokoll beschäftigt und eine kleine Demo-Applikation auf Basis von Qt, Qwt und den Agilent IO Libraries umgesetzt. Im Video sieht man die Visualisierung des Datenstroms. Das Signal ist – recht unspektakulär – der Referenzkanal des DSOs zum Abstimmen der Tastköpfe.</p>
<style>
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
</style><div class="s_video_simple __h_video">
          <a href="https://vimeo.com/161916721" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/564257053-e6679fb1c239cfbfb1cbd8f870275ca0107da6e0a576a8529b69840618260399-d_640?region=us" srcset="https://i.vimeocdn.com/video/564257053-e6679fb1c239cfbfb1cbd8f870275ca0107da6e0a576a8529b69840618260399-d_640?region=us 1x, https://i.vimeocdn.com/video/564257053-e6679fb1c239cfbfb1cbd8f870275ca0107da6e0a576a8529b69840618260399-d_640?region=us 2x" alt="Rigol DS1052 Demo application">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<p>Das Wichtigste zum Anfang ist es natürlich alle angeschlossenen Geräte – in diesem Fall USB-Geräte – ausfindig zu machen. Wie der unten stehende Code zeigt, ist dies recht schnell erledigt. Wichtig ist dabei eigentlich nur <code>?*INSTR</code>, welches an jedes angeschlossene Gerät geschickt wird. Anschließend erhält man als Antwort die Identifikationsnummer. Alles Andere ist nun abhängig von den implementierten Befehlen des Geräts selber, wozu man die Dokumentation des Herstellers konsultieren sollte.
PS: Die maximale Wiederholrate ist limitiert auf 50 Hz. Diese wird durch das Gerät und nicht durch die Applikation oder Qwt oder Sonstiges herabgesetzt.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;QtCore/QCoreApplication&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;visa.h&gt; </span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</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">QCoreApplication</span> <span class="nf">a</span><span class="p">(</span><span class="n">argc</span><span class="p">,</span> <span class="n">argv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">ViUInt32</span> <span class="n">retCnt</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">        <span class="kt">char</span> <span class="n">buf</span> <span class="p">[</span><span class="mi">256</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span> 
</span></span><span class="line"><span class="cl">        <span class="kt">char</span> <span class="n">instrDesc</span><span class="p">[</span><span class="mi">100</span><span class="p">]</span><span class="o">=</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">ViSession</span> <span class="n">defaultRM</span><span class="p">,</span><span class="n">vi</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">        <span class="n">ViStatus</span> <span class="n">status</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">        <span class="n">ViFindList</span> <span class="n">find_list</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">        <span class="nf">viOpenDefaultRM</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">defaultRM</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">        <span class="n">status</span> <span class="o">=</span> <span class="nf">viFindRsrc</span><span class="p">(</span><span class="n">defaultRM</span><span class="p">,</span> <span class="s">&#34;USB0::?*INSTR&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">find_list</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">retCnt</span><span class="p">,</span> <span class="n">instrDesc</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">        <span class="n">status</span> <span class="o">=</span> <span class="nf">viOpen</span><span class="p">(</span><span class="n">defaultRM</span><span class="p">,</span><span class="n">instrDesc</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="n">VI_NULL</span><span class="p">,</span><span class="n">VI_NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">vi</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="n">VI_SUCCESS</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="nf">printf</span><span class="p">(</span><span class="s">&#34;Can not find USBTMC device!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viClose</span><span class="p">(</span><span class="n">vi</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viClose</span> <span class="p">(</span><span class="n">defaultRM</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;USBTMC device : %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">instrDesc</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viPrintf</span><span class="p">(</span><span class="n">vi</span><span class="p">,</span><span class="s">&#34;*idn?</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viScanf</span> <span class="p">(</span><span class="n">vi</span><span class="p">,</span> <span class="s">&#34;%t&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">buf</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">buf</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viClose</span> <span class="p">(</span><span class="n">vi</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">viClose</span> <span class="p">(</span><span class="n">defaultRM</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="k">return</span> <span class="n">a</span><span class="p">.</span><span class="nf">exec</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Ich muss mal schauen wo ich das Programm geparkt habe. Eventuell kann man ja doch noch etwas Sinnvolles daraus machen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>RN-Control 1.4 Modifikationen</title>
      <link>https://hufschlaeger.net/blog/2012/11/07/rn-control-1.4-modifikationen/</link>
      <pubDate>Wed, 07 Nov 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/11/07/rn-control-1.4-modifikationen/</guid>
      <description>&lt;p&gt;Da ich günstig in den Genuss des ATMEL-Boards RN-Control gekommen bin, wollte ich es auch für meinen Roboter benutzen. Bevor es jedoch los gehen konnte, waren einige wenige Modifikationen notwendig. Zunächst wurde der zusätzliche Motortreiber entfernt, da &lt;a href=&#34;https://hufschlaeger.net/twi-slave-zur-motorsteuerung-mit-attiny2313/&#34; title=&#34;WI-Slave zur Motorsteuerung mit ATTiny2313&#34;&gt;TWI-Slave zur Motorsteuerung mit ATTiny2313&lt;/a&gt; schon fertig war und dort nur die &lt;a title=&#34;RN-Definitionen&#34; href=&#34;http://www.rn-wissen.de/index.php/RN-Definitionen#I2C-Bus_Stecker&#34; target=&#34;_blank&#34;&gt;TWI-Wanne&lt;/a&gt; nach &lt;a title=&#34;RN-Definitionen&#34; href=&#34;http://www.rn-wissen.de/index.php/RN-Definitionen&#34; target=&#34;_blank&#34;&gt;RN-Definitionen&lt;/a&gt; hinzugefügt werden musste.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;BTM-Mini-Modul&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/BTM-Mini-Modul.jpg&#34; title=&#34;BTM-Mini-Modul&#34;&gt;&lt;/p&gt;
&lt;p&gt;Anschließend wurde der Pegelwandler für die RS232-Schnittstelle entfernt und gegen einen Adapter in Form eines Lochrasteraufbaus ersetzt. Dieser ermöglicht die Nutzung des &lt;a href=&#34;http://robotrack.org/include.php?path=article&amp;amp;contentid=279&#34;&gt;BTM-Mini-S-Moduls&lt;/a&gt;, also eines Raysons BTM-222 Bluetooth-SPP (Serial over Bluetooth) Adapters. Die Schnittstelle soll später noch einmal gegen eine USB-Serial-zu-Wlan-Bridge ausgetauscht werden (wenn die Chinapost noch ankommen sollte). Soweit so gut. Der mitgelieferte ATmega32 wurde durch einen ATmega1284P getauscht. Zwar würde der Mega32 sicher fürs Erste reichen, aber der Tatendrang will befriedigt werden.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da ich günstig in den Genuss des ATMEL-Boards RN-Control gekommen bin, wollte ich es auch für meinen Roboter benutzen. Bevor es jedoch los gehen konnte, waren einige wenige Modifikationen notwendig. Zunächst wurde der zusätzliche Motortreiber entfernt, da <a href="/twi-slave-zur-motorsteuerung-mit-attiny2313/" title="WI-Slave zur Motorsteuerung mit ATTiny2313">TWI-Slave zur Motorsteuerung mit ATTiny2313</a> schon fertig war und dort nur die <a title="RN-Definitionen" href="http://www.rn-wissen.de/index.php/RN-Definitionen#I2C-Bus_Stecker" target="_blank">TWI-Wanne</a> nach <a title="RN-Definitionen" href="http://www.rn-wissen.de/index.php/RN-Definitionen" target="_blank">RN-Definitionen</a> hinzugefügt werden musste.</p>
<p><img alt="BTM-Mini-Modul" loading="lazy" src="/img/BTM-Mini-Modul.jpg" title="BTM-Mini-Modul"></p>
<p>Anschließend wurde der Pegelwandler für die RS232-Schnittstelle entfernt und gegen einen Adapter in Form eines Lochrasteraufbaus ersetzt. Dieser ermöglicht die Nutzung des <a href="http://robotrack.org/include.php?path=article&amp;contentid=279">BTM-Mini-S-Moduls</a>, also eines Raysons BTM-222 Bluetooth-SPP (Serial over Bluetooth) Adapters. Die Schnittstelle soll später noch einmal gegen eine USB-Serial-zu-Wlan-Bridge ausgetauscht werden (wenn die Chinapost noch ankommen sollte). Soweit so gut. Der mitgelieferte ATmega32 wurde durch einen ATmega1284P getauscht. Zwar würde der Mega32 sicher fürs Erste reichen, aber der Tatendrang will befriedigt werden.</p>
<p>Abschließend muss man eigentlich nur noch bemerken, dass sich Hausschuhe auf Laminat hervorragend statisch aufladen können. Die LED zu Anzeige der Akkuspannung hat es beim Anschalten nicht überlebt. Eventuell ist so ein Armbändchen doch nicht ganz verkehrt!</p>
<p><img alt="BTM-Mini-Max232" loading="lazy" src="/img/BTM-Mini-Max232.jpg" title="BTM-Mini-Max232"></p>
]]></content:encoded>
    </item>
    <item>
      <title>TWI-Slave zur Motorsteuerung mit ATTiny2313</title>
      <link>https://hufschlaeger.net/blog/2012/11/07/twi-slave-zur-motorsteuerung-mit-attiny2313/</link>
      <pubDate>Wed, 07 Nov 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/11/07/twi-slave-zur-motorsteuerung-mit-attiny2313/</guid>
      <description>&lt;p&gt;Irgendwann sollte mein CCRP5/RP6-Chassis auch mal fahren! So der Wunsch. Natürlich fällt es einem schwer zwischen Prüfungen, Arbeit und dem restlichen Kram genügend Zeit aufzubringen so etwas wie einen Roboter selbst fertig zu stellen. Selbst wenn er erst einmal nur fahren soll, kann das unter Umständen schon recht lange dauern. Da ich jedoch nichts Fertiges oder einfach ein Arduino-Shield kaufen wollte, musste - ob nun Wohl oder Übel - eine modulare Lösung her.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Irgendwann sollte mein CCRP5/RP6-Chassis auch mal fahren! So der Wunsch. Natürlich fällt es einem schwer zwischen Prüfungen, Arbeit und dem restlichen Kram genügend Zeit aufzubringen so etwas wie einen Roboter selbst fertig zu stellen. Selbst wenn er erst einmal nur fahren soll, kann das unter Umständen schon recht lange dauern. Da ich jedoch nichts Fertiges oder einfach ein Arduino-Shield kaufen wollte, musste - ob nun Wohl oder Übel - eine modulare Lösung her.</p>
<p><img alt="Motorsteuerung via I²C durch einen ATtiny2313" loading="lazy" src="/img/2313-twi-motorcontrol.png" title="Motorsteuerung via I²C durch einen ATtiny2313"></p>
<p>Die Wahl viel dabei auf eine Vernetzung von mehreren Teilkomponenten mittels TWI oder I²C. Gesagt getan, das erste Modul lief auf dem Steckbrett und funktioniert nun auch als Lochrasteraufbau,nur zur Platine hat es bisher noch nicht reichen wollen.</p>
<p><img alt="RP6 TWI-Slave Motorsteuerung" loading="lazy" src="/img/RP6-Chassi_TWI-Slave.jpg" title="RP6 TWI-Slave Motorsteuerung"></p>
<p>Für die Kommunikation mit der USI-Schnittstelle des Tinys hat sich <a href="http://www.jtronics.de/avr-projekte/library-i2c-twi-slave-usi.html">Martin  Junghans</a> schon Gedanken gemacht. Daher war die Anpassung/Erweiterung nicht sonderlich schwierig und konnte nach kurzer Zeit mittels BusPirate getestet werden. Hinzu sind noch die Rad-Encoder für das Chassis (RP6v2-Encoder) gekommen, welche man seit einiger Zeit separat bei Conrad erstehen kann. Mittlerweile kann man nahezu alles per TWI konfigurieren und sogar im EEPROM des AVRs speichern.</p>
<p>Da wären :</p>
<ul>
<li>Tastgrad für alle PWM-Ausgänge separat variiert werden</li>
<li>Vorteiler für PWM-Frequenz können paarweise gesetzt werden</li>
<li>PWM-Ausgänge können komplett deaktiviert werden</li>
<li>Encoderwerte können ausgelesen uns zurückgesetzt werden</li>
<li>Laufrichtung für zwei (vier gingen mit Anpassungen auch) Motoren kann gesetzt und invertiert werden</li>
<li>Speichern der aktuellen Einstellungen im EEPROM</li>
</ul>
<p>Natürlich kann jeder Parameter auch gesetzt werden. Interessanter Weise ist trotz der
Programmierung in C noch etwas Platz übrig.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Program Memory Usage   : <span class="m">1354</span> bytes   66.1 % Full
</span></span><span class="line"><span class="cl">Data Memory Usage      :   <span class="m">19</span> bytes   14.8 % Full
</span></span><span class="line"><span class="cl">EEPROM Memory Usage    :    <span class="m">8</span> bytes    6.3 % Full
</span></span></code></pre></div><p>Was die Überlegung weckt die Regelung für den Geradeauslauf (wenn mal Zeit ist) noch zu integrieren.</p>
<p>Der Code und etwas Dokumentation ist ab sofort auf <a href="https://github.com/dhufe/TinyMotorSlave">Github</a> zu finden.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows 7 - Benutzerprofil konnte nicht geladen werden</title>
      <link>https://hufschlaeger.net/blog/2012/11/07/windows-7-benutzerprofil-konnte-nicht-geladen-werden/</link>
      <pubDate>Wed, 07 Nov 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/11/07/windows-7-benutzerprofil-konnte-nicht-geladen-werden/</guid>
      <description>&lt;p&gt;Es soll ja hin und wieder Probleme mit Windows geben. Besonders wenn man wegen einer neuen SSD sein Benutzerprofil etc auf eine andere Platte schubsen will und das Ganze irgendwie nicht funktioniert hat. Der pragmatische Mensch würde sich jetzt denken : „Na und – schieb ich wieder zurück!“. Ist leider nicht so einfach, denn Windows merkt sich seit Vista, dass da was krumm lief und weigert sich immer noch das Profil zu laden. Ist mir selbst mehr als einmal passiert und daher will ich mir selbst und anderen eine Neuinstallation ersparen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Es soll ja hin und wieder Probleme mit Windows geben. Besonders wenn man wegen einer neuen SSD sein Benutzerprofil etc auf eine andere Platte schubsen will und das Ganze irgendwie nicht funktioniert hat. Der pragmatische Mensch würde sich jetzt denken : „Na und – schieb ich wieder zurück!“. Ist leider nicht so einfach, denn Windows merkt sich seit Vista, dass da was krumm lief und weigert sich immer noch das Profil zu laden. Ist mir selbst mehr als einmal passiert und daher will ich mir selbst und anderen eine Neuinstallation ersparen.</p>
<p><img alt="Benutzerprofil : windows user profile could not loaded" loading="lazy" src="/img/bmg-ian-laptoploginerr.png" title="Benutzerprofil konnte nicht geladen werden"></p>
<ul>
<li>Ab in den abgesicherten Modus und als User mit Adminrechten einloggen (auch wenn es der ist, der nicht mehr funktioniert!)</li>
<li>regedit öffnen und nach : <code>HKEY\_LOCAL\_MACHINE\SOFTWARE\MICROSOFT\WindowsNT\CurrentVersion\ProfileList</code> gehen</li>
<li>Profil suchen, welches hinten ein .bak aufweist (das sollte zweimal vorkommen!)</li>
<li>das ohne .bak in Name.old umbennen und anschließend bei dem anderen das .bak entfernen</li>
<li>Den Wert State auf 0 setzen</li>
<li>Neustarten und freuen!</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>AVR Dragon Wiederbelebung</title>
      <link>https://hufschlaeger.net/blog/2012/04/20/avr-dragon-wiederbelebung/</link>
      <pubDate>Fri, 20 Apr 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/04/20/avr-dragon-wiederbelebung/</guid>
      <description>&lt;p&gt;Da denkt man man bleibt verschont und ist eine Ausnahme der Regel. Pustekuchen. Leider hat es mich auch erwischt, mein &lt;a href=&#34;http://www.atmel.com/tools/avrdragon.aspx&#34; title=&#34;ATMEL AVR Dragon&#34;&gt;AVR Dragon&lt;/a&gt; ist/war tot. Leider war es auch meine eigene Dummheit, so hatte ich dem VTarget-Pin kurzzeitig etwas mehr als 5V gegönnt. &lt;a href=&#34;http://www.atmel.com/microsite/atmel_studio6/&#34; title=&#34;ATMEL Studio&#34;&gt;AVRStudio&lt;/a&gt; kommunizierte noch mit dem Dragon, allerdings war kein Target ansprechbar. Also musste es die Programmierleitungen getroffen haben.&lt;/p&gt;
&lt;p&gt;Nach ein wenig „Durchklingeln“ und Internetrecherche konnte ich die SMD-ICs mit der Aufschrift AHT als Analogschalter identifizieren. Wermutstropfen ist jedoch, dass diese nicht mehr produziert werden. Zum Glück hat aber TI, bis auf den Namen, identische im Programm welche man auch als Muster bekommen konnte.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da denkt man man bleibt verschont und ist eine Ausnahme der Regel. Pustekuchen. Leider hat es mich auch erwischt, mein <a href="http://www.atmel.com/tools/avrdragon.aspx" title="ATMEL AVR Dragon">AVR Dragon</a> ist/war tot. Leider war es auch meine eigene Dummheit, so hatte ich dem VTarget-Pin kurzzeitig etwas mehr als 5V gegönnt. <a href="http://www.atmel.com/microsite/atmel_studio6/" title="ATMEL Studio">AVRStudio</a> kommunizierte noch mit dem Dragon, allerdings war kein Target ansprechbar. Also musste es die Programmierleitungen getroffen haben.</p>
<p>Nach ein wenig „Durchklingeln“ und Internetrecherche konnte ich die SMD-ICs mit der Aufschrift AHT als Analogschalter identifizieren. Wermutstropfen ist jedoch, dass diese nicht mehr produziert werden. Zum Glück hat aber TI, bis auf den Namen, identische im Programm welche man auch als Muster bekommen konnte.</p>
<p><img alt="AVR Dragon revive analog switch" loading="lazy" src="/img/avrdragon_revive.jpg" title="AVR Dragon revive analog switch"></p>
<p>Nach etwas Gefummel – die defekten ICs gingen schneller runter als die neuen drauf waren sie dann auch ausgetauscht. Nach einem erfolglosen Test, bemerkte ich heute eine Lötbrücke an zwei Pins, welche ich schnell entfernte. Firmware-Update mit AVRStudio 5 durchgeführt und alles war wieder in Butter. 50 € gespart und verdammt viel Glück gehabt, dass es nicht der Spannungswandler war.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Debian Netinstall von einem USB-Stick</title>
      <link>https://hufschlaeger.net/blog/2012/04/12/debian-netinstall-von-einem-usb-stick/</link>
      <pubDate>Thu, 12 Apr 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/04/12/debian-netinstall-von-einem-usb-stick/</guid>
      <description>&lt;h2 id=&#34;1-schritt-partitionstabelle-auf-den-stick-bringen&#34;&gt;1. Schritt Partitionstabelle auf den Stick bringen&lt;/h2&gt;
&lt;p&gt;Wie unter Unixoiden üblich geschieht die mittels Pipe. Da das Bootimage mit &lt;a href=&#34;http://www.gzip.org/&#34; title=&#34;gzip project site&#34;&gt;GZip&lt;/a&gt; komprimiert wurde, erledigt &lt;strong&gt;zcat&lt;/strong&gt; das Dekomprimieren und Kopieren in einem Rutsch. Wichtig ist hier nur, dass alle Partitionen die sich auf den Stick befanden überschrieben werden.&lt;/p&gt;
&lt;p&gt;Eine Angabe der Partitionsnummer ist auch nicht notwendig, da wir diese ja gerade erstellen wollen. Daher genügt die Angabe des entsprechenden Blockdevices, welche für unseren Stick steht.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="1-schritt-partitionstabelle-auf-den-stick-bringen">1. Schritt Partitionstabelle auf den Stick bringen</h2>
<p>Wie unter Unixoiden üblich geschieht die mittels Pipe. Da das Bootimage mit <a href="http://www.gzip.org/" title="gzip project site">GZip</a> komprimiert wurde, erledigt <strong>zcat</strong> das Dekomprimieren und Kopieren in einem Rutsch. Wichtig ist hier nur, dass alle Partitionen die sich auf den Stick befanden überschrieben werden.</p>
<p>Eine Angabe der Partitionsnummer ist auch nicht notwendig, da wir diese ja gerade erstellen wollen. Daher genügt die Angabe des entsprechenden Blockdevices, welche für unseren Stick steht.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget ftp://ftp2.de.debian.org/debian/dists/squeeze/main/installer-i386/current/images/hd-media/boot.img.gz
</span></span><span class="line"><span class="cl">zcat boot.img.gz &gt; /dev/sdb
</span></span></code></pre></div><blockquote>
<p>Der Vorgang kann, je nach USB-Stick und dessen Schreib-/Lesegeschwindigkeit etwas Zeit in Anspruch nehmen.</p>
</blockquote>
<h2 id="2-schritt-dateien-auf-den-stick-bringen-und-fertig">2. Schritt Dateien auf den Stick bringen und fertig</h2>
<p>So der erste Schritt ist getan. Der <a href="http://www.debian.org/index.de.html" title="Debian Linux project site">Debian</a>-Installer ist auf dem Stick, welcher auch bootfähig ist. Fehlt nur noch das ISO-Image der Netzwerkinstallation. Diese kann man mit folgenden 4 Zeilen schnell und bequem auf den Stick werfen und ist fertig.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mount /dev/sdb1 /mnt
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /mnt
</span></span><span class="line"><span class="cl">wget http://cdimage.debian.org/debian-cd/6.0.1a/i386/iso-cd/debian-6.0.1a-i386-netinst.iso
</span></span><span class="line"><span class="cl"><span class="nb">cd</span>
</span></span><span class="line"><span class="cl">umount /mnt
</span></span></code></pre></div><p>So nun haben wir einen bootfähigen Stick, welcher alles Notwendige beinhaltet um eine Installation über das Netzwerk vorzunehmen. Danach hat man eine minimale Installation und alle Pakete werden via Internet in der aktuellsten Version installiert. So spart man sich auch gleich die Update-Orgie nach der Installation.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Bidirektionaler Levelshifter für I²C/TWI</title>
      <link>https://hufschlaeger.net/blog/2012/02/12/bidirektionaler-levelshifter-f%C3%BCr-ic/twi/</link>
      <pubDate>Sun, 12 Feb 2012 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2012/02/12/bidirektionaler-levelshifter-f%C3%BCr-ic/twi/</guid>
      <description>&lt;p&gt;Ich hab irgendwann besteht das Problem, das man  Gräte mit unterschiedlichen Versorgungs- und Logikspannungen über einen Bus betreiben will. Bei SPI oder USART ist das relativ Wurscht, da für beide Datenrichtung eine separate Leitung existiert. Da helfen Transistoren, Logikgatter oder Spannungsteiler. Bloß was tun bei TWI/I²C ? Schließlich ist der Bus bidirektional. Es muss also ein Levelshifter her. Eine Lösung ist die Nutzung von integrierten Schaltkreisen wie dem PCA9306. Allerdings sind die recht schwer zu bekommen bzw. recht teuer. Eine funktionierende Lösung mit 4 Widerständen und zwei N-Kanal-Mosfets zeigt die nächste Abbildung.
&lt;img alt=&#34;bidirektionaler Levelshifter für TWI&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/bilevelshifter.jpg&#34; title=&#34;bidirektionaler Levelshifter für TWI&#34;&gt;
Die Funktion ist, bis auf das Abkoppeln vom Bus identisch. Vorteil ist der geringer Kostenfaktor von zirka einem Euro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich hab irgendwann besteht das Problem, das man  Gräte mit unterschiedlichen Versorgungs- und Logikspannungen über einen Bus betreiben will. Bei SPI oder USART ist das relativ Wurscht, da für beide Datenrichtung eine separate Leitung existiert. Da helfen Transistoren, Logikgatter oder Spannungsteiler. Bloß was tun bei TWI/I²C ? Schließlich ist der Bus bidirektional. Es muss also ein Levelshifter her. Eine Lösung ist die Nutzung von integrierten Schaltkreisen wie dem PCA9306. Allerdings sind die recht schwer zu bekommen bzw. recht teuer. Eine funktionierende Lösung mit 4 Widerständen und zwei N-Kanal-Mosfets zeigt die nächste Abbildung.
<img alt="bidirektionaler Levelshifter für TWI" loading="lazy" src="/img/bilevelshifter.jpg" title="bidirektionaler Levelshifter für TWI">
Die Funktion ist, bis auf das Abkoppeln vom Bus identisch. Vorteil ist der geringer Kostenfaktor von zirka einem Euro.</p>
<p>Quellen:</p>
<ul>
<li>Philips/NXP Application Note <a href="http://www.adafruit.com/datasheets/an97055.pdf" title="Phillips NXP Levelshifter Application Note">AN97055</a></li>
<li>Datenblatt <a href="http://www.ti.com/lit/ds/symlink/pca9306.pdf" title="PCA9306 Levelshifter ">PCA9306</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>The Naked And Famous - Young Blood</title>
      <link>https://hufschlaeger.net/blog/2011/07/22/the-naked-and-famous-young-blood/</link>
      <pubDate>Fri, 22 Jul 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/07/22/the-naked-and-famous-young-blood/</guid>
      <description>&lt;p&gt;Zum Abschalten - in den Pausen der Nahrungsaufnahme - während des Lernens für die noch übrig gebliebenen Prüfungen.&lt;/p&gt;
&lt;style&gt;
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
&lt;/style&gt;&lt;div class=&#34;s_video_simple __h_video&#34;&gt;
          &lt;a href=&#34;https://vimeo.com/11730491&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;
            &lt;img src=&#34;https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us&#34; srcset=&#34;https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us 1x, https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us 2x&#34; alt=&#34;The Naked And Famous - Young Blood&#34;&gt;
            &lt;div class=&#34;play&#34;&gt;
              &lt;svg version=&#34;1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 61 61&#34;&gt;&lt;circle cx=&#34;30.5&#34; cy=&#34;30.5&#34; r=&#34;30.5&#34; opacity=&#34;.8&#34; fill=&#34;#000&#34;&gt;&lt;/circle&gt;&lt;path d=&#34;M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z&#34; fill=&#34;#fff&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
            &lt;/div&gt;
          &lt;/a&gt;
        &lt;/div&gt;

&lt;p&gt;Wobei „Punching In A Dream“ auch sehr cool ist. Aber das kann man sich bei folgender &lt;a href=&#34;http://www.youtube.com/playlist?list=PL6688290A1D684A5D&#34;&gt;YouTube-Playlist&lt;/a&gt; per Auto-Replay reinpfeiffen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zum Abschalten - in den Pausen der Nahrungsaufnahme - während des Lernens für die noch übrig gebliebenen Prüfungen.</p>
<style>
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
</style><div class="s_video_simple __h_video">
          <a href="https://vimeo.com/11730491" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us" srcset="https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us 1x, https://i.vimeocdn.com/video/65013047-f90fee41c72780cb6f5a90c4c2deea6cd5072af2e601fe24e24eeba8bec8d691-d_640?region=us 2x" alt="The Naked And Famous - Young Blood">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<p>Wobei „Punching In A Dream“ auch sehr cool ist. Aber das kann man sich bei folgender <a href="http://www.youtube.com/playlist?list=PL6688290A1D684A5D">YouTube-Playlist</a> per Auto-Replay reinpfeiffen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux - Mausbewegungen auslesen</title>
      <link>https://hufschlaeger.net/blog/2011/07/19/linux-mausbewegungen-auslesen/</link>
      <pubDate>Tue, 19 Jul 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/07/19/linux-mausbewegungen-auslesen/</guid>
      <description>&lt;p&gt;Kann man ja eventuell mal gebrauchen.&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;linux/input.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#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;cp&#34;&gt;#define MOUSEFILE &amp;#34;/dev/input/event5&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;cp&#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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&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;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;input_event&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ie&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;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MOUSEFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;O_RDONLY&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;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&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;nf&#34;&gt;perror&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;opening device&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;nf&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EXIT_FAILURE&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;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;input_event&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;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;time %ld . %06ldttype %dtcode %dtvalue %dn&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;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tv_sec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tv_usec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&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;k&#34;&gt;return&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;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>Kann man ja eventuell mal gebrauchen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/input.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#define MOUSEFILE &#34;/dev/input/event5&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="n">input_event</span> <span class="n">ie</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">((</span><span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="n">MOUSEFILE</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">perror</span><span class="p">(</span><span class="s">&#34;opening device&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">exit</span><span class="p">(</span><span class="n">EXIT_FAILURE</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="k">while</span><span class="p">(</span><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ie</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">input_event</span><span class="p">)))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;time %ld . %06ldttype %dtcode %dtvalue %dn&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">ie</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">tv_sec</span><span class="p">,</span> <span class="n">ie</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">tv_usec</span><span class="p">,</span> <span class="n">ie</span><span class="p">.</span><span class="n">type</span><span class="p">,</span> <span class="n">ie</span><span class="p">.</span><span class="n">code</span><span class="p">,</span> <span class="n">ie</span><span class="p">.</span><span class="n">value</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="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>nitrogen - Wallpapersetter with patch inside</title>
      <link>https://hufschlaeger.net/blog/2011/04/05/nitrogen-wallpapersetter-with-patch-inside/</link>
      <pubDate>Tue, 05 Apr 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/04/05/nitrogen-wallpapersetter-with-patch-inside/</guid>
      <description>&lt;p&gt;Unter Linux benutze ich meist recht minimalistische Window-Manager wie Fluxbox, welche zu meist das Root-Window nutzen um ein Wallpaper zu setzen. Da ich es meist nicht hin bekomme die Wallpaper zu kategorisieren oder wenigstens vernünftige Namen zu geben, mag ich das dadurch resultierende Rate-Spiel nicht, da es einfach nervt. Irgendwann hab ich mal etwas über &lt;a href=&#34;http://projects.l3ib.org/nitrogen/&#34; title=&#34;nitrogen project site&#34;&gt;nitrogen&lt;/a&gt; gelesen, einen Wallpaper-Setter der als Übergabe ein Verzeichnis erwartet und die enthaltenden Bilder in einer Miniaturansicht darstellt. Sprich, Bild auswählen, Apply anklicken und fertig.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Unter Linux benutze ich meist recht minimalistische Window-Manager wie Fluxbox, welche zu meist das Root-Window nutzen um ein Wallpaper zu setzen. Da ich es meist nicht hin bekomme die Wallpaper zu kategorisieren oder wenigstens vernünftige Namen zu geben, mag ich das dadurch resultierende Rate-Spiel nicht, da es einfach nervt. Irgendwann hab ich mal etwas über <a href="http://projects.l3ib.org/nitrogen/" title="nitrogen project site">nitrogen</a> gelesen, einen Wallpaper-Setter der als Übergabe ein Verzeichnis erwartet und die enthaltenden Bilder in einer Miniaturansicht darstellt. Sprich, Bild auswählen, Apply anklicken und fertig.</p>
<p><img alt="Gepatchte Version von nitrogen" loading="lazy" src="/img/nitrogen_patch.png" title="Gepatchte Version von nitrogen"></p>
<p>Nun versuchte ich die aktuelle Version, die übrigens auf <a href="https://github.com/l3ib/nitrogen" title="nitrogen  - github repository">github</a> zu finden ist, zu übersetzen und scheiterte fürs Erste. Nach kurzem Suchen im Internet, war das Problem gefunden und kurz darauf auch gefixet. Das Problem bestand darin, dass nicht gegen die Xlib-gelinkt wurde usw. usw.. Da mein Window-Manager keine dekorativen Elemente wie Kreuze zum Schließen hat, habe ich auch einen Quit-Button eingefügt, so muss der Prozess nicht jedes mal abgewürgt werden. Im Übrigen hat die Gtk einen schlechteren Ruf, als sie wirklich ist. Als Gtk-Novize war das Anpassen mit Google und der Dokumentation kein wirkliches Problem.</p>
<p><a href="/downloads/quitbtn_with_xliblink.patch">Patch for nitrogen Quit button and xlib</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Apple Wireless Keyboard unter Windows 7</title>
      <link>https://hufschlaeger.net/blog/2011/02/13/apple-wireless-keyboard-unter-windows-7/</link>
      <pubDate>Sun, 13 Feb 2011 11:02:02 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/02/13/apple-wireless-keyboard-unter-windows-7/</guid>
      <description>&lt;p&gt;Zu meinen neusten Errungenschaften in Punkto Technik gehört seit Freitag ein Apple Wireless Keyboard und bevor ich mich weiter dem Lernen für meine anstehende Klausur in der Hochfrequenztechnik widme, wollte ich wenigstens noch schnell diesen Artikel zu Ende schreiben. Natürlich kommen gleich wieder die auf der Hand liegenden Vorurteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple-Produkte nur wegen des Styles her&lt;/li&gt;
&lt;li&gt;Wenn Apfel, dann ganz Apfel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Apple Wireless Keyboard&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/2011-02-13_10-42-12_476_Berlin.jpg&#34; title=&#34;Apple Wireless Keyboard&#34;&gt;
Nun ganz so ist es jedoch nicht. Durch den ganzen Kram von Uni, Arbeit und meinem privatem Elektronik-Bastel-Krams habe ich immer weniger Platz auf dem Schreibtisch. Da kommt kommt die kleine Apfel-Tastatur genau richtig, denn Sie hat einen recht schmalen Formfaktor. Da mir bisher immer noch das nötige Kleingeld fehlt um mir ein Apfel-Komplettpaket hinzustellen, wird das auch sicherlich noch eine ganze Weile auf sich warten lassen müssen. Aber zurück zur Tastatur. Diese wird via Bluetooth in das bestehende System eingebunden, wobei eigentlich keinerlei Gerätetreiber notwendig sind. Nun kommen die bisher einzigen Haken an dem Gerät.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zu meinen neusten Errungenschaften in Punkto Technik gehört seit Freitag ein Apple Wireless Keyboard und bevor ich mich weiter dem Lernen für meine anstehende Klausur in der Hochfrequenztechnik widme, wollte ich wenigstens noch schnell diesen Artikel zu Ende schreiben. Natürlich kommen gleich wieder die auf der Hand liegenden Vorurteile:</p>
<ul>
<li>Apple-Produkte nur wegen des Styles her</li>
<li>Wenn Apfel, dann ganz Apfel</li>
</ul>
<p><img alt="Apple Wireless Keyboard" loading="lazy" src="/img/2011-02-13_10-42-12_476_Berlin.jpg" title="Apple Wireless Keyboard">
Nun ganz so ist es jedoch nicht. Durch den ganzen Kram von Uni, Arbeit und meinem privatem Elektronik-Bastel-Krams habe ich immer weniger Platz auf dem Schreibtisch. Da kommt kommt die kleine Apfel-Tastatur genau richtig, denn Sie hat einen recht schmalen Formfaktor. Da mir bisher immer noch das nötige Kleingeld fehlt um mir ein Apfel-Komplettpaket hinzustellen, wird das auch sicherlich noch eine ganze Weile auf sich warten lassen müssen. Aber zurück zur Tastatur. Diese wird via Bluetooth in das bestehende System eingebunden, wobei eigentlich keinerlei Gerätetreiber notwendig sind. Nun kommen die bisher einzigen Haken an dem Gerät.</p>
<ul>
<li>Zum einen ist man, wenn man ins BIOS oder bei GRUB ein anderes OS auswählen möchte komplett aufgeschmissen</li>
<li>Die Funktionstasten funktionieren nicht out-of the-box</li>
<li>Für knappe 70 Tacken, hält man es bei Apple nicht für nötig einen Bluetooth-Dongle oder Ähnliches beizulegen (hier wird darauf gebaut das die Mac-Hardware Bluetooth intern verbaut hat)<br>
Die doppelt belegten Tasten lassen sich mit den entsprechenden <a href="https://docs.google.com/leaf?id=0B3hEMkuRLxRhZmQyNjhlNzYtNjdhYi00MjdlLWI4OTItMzM5YWVjNzhhZDdi&amp;hl=en">Bootcamp-Treibern</a> schnell in Gang bringen und die Multimedia-Tasten kann man, wenn man möchte mit dem Tool <a href="http://applewirelesskbrd.codeplex.com/">AppleWirelessKeyboard</a> von Codeplex mit Overlay-Grafik zur Funktion überreden. Vorausgesetzt ist natürlich, dass man einen entsprechenden Dongle in der Schublade liegen hat oder wie bei der Apple-Hardware auf internes Bluetooth setzen kann. Alles in allem funktioniert das Keyboard ausgesprochen gut. Der Tastenanschlag ist sehr angenehm und durch die geringen Maße geht das Tippen deutlich schneller von der Hand als bei meiner alten Cherry-Tastatur. Durch den leichten Neigungswinkel den die Tastatur hat, sind die Tasten sehr gut zu erreichen und es fühlt sich an, als würde ich meine M1330-Tastatur benutzen. Gewöhnungsbedürftig sind die Shotcuts für Delete, die Bildlauf-Tasten und Pos1 bzw. Ende. Allerdings muss man nun einmal damit leben, wenn man eine Winzlingtastatur kauft, dann muss der Platz schließlich irgendwo auch eingespart werden.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Raised Fist - Friends and Traitors</title>
      <link>https://hufschlaeger.net/blog/2011/02/08/raised-fist-friends-and-traitors/</link>
      <pubDate>Tue, 08 Feb 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/02/08/raised-fist-friends-and-traitors/</guid>
      <description>&lt;p&gt;Scheinbar schon etwas älter, aber was solls besser spät als nie. Erinnert etwas an Stactic-X. Auf jeden Fall hat es sich mal wieder gelohnt, treu &lt;a href=&#34;http://starfm.de/&#34;&gt;StarFM FromHell&lt;/a&gt; zu hören.&lt;/p&gt;
&lt;style&gt;
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
&lt;/style&gt;&lt;div class=&#34;s_video_simple __h_video&#34;&gt;
          &lt;a href=&#34;https://vimeo.com/6448552&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;
            &lt;img src=&#34;https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us&#34; srcset=&#34;https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us 1x, https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us 2x&#34; alt=&#34;Raised Fist - Friends and Traitors&#34;&gt;
            &lt;div class=&#34;play&#34;&gt;
              &lt;svg version=&#34;1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 61 61&#34;&gt;&lt;circle cx=&#34;30.5&#34; cy=&#34;30.5&#34; r=&#34;30.5&#34; opacity=&#34;.8&#34; fill=&#34;#000&#34;&gt;&lt;/circle&gt;&lt;path d=&#34;M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z&#34; fill=&#34;#fff&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
            &lt;/div&gt;
          &lt;/a&gt;
        &lt;/div&gt;

&lt;p&gt;In dem Sinne viel Spaß beim Anschauen und eine schöne Restwoche. (Morgen ist ja schon Bergfest !!)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Scheinbar schon etwas älter, aber was solls besser spät als nie. Erinnert etwas an Stactic-X. Auf jeden Fall hat es sich mal wieder gelohnt, treu <a href="http://starfm.de/">StarFM FromHell</a> zu hören.</p>
<style>
.__h_video {
   position: relative;
   padding-bottom: 56.23%;
   height: 0;
   overflow: hidden;
   width: 100%;
   background: #000;
}
.__h_video img {
   width: 100%;
   height: auto;
   color: #000;
}
.__h_video .play {
   height: 72px;
   width: 72px;
   left: 50%;
   top: 50%;
   margin-left: -36px;
   margin-top: -36px;
   position: absolute;
   cursor: pointer;
}
</style><div class="s_video_simple __h_video">
          <a href="https://vimeo.com/6448552" rel="noopener" target="_blank">
            <img src="https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us" srcset="https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us 1x, https://i.vimeocdn.com/video/26162903-0648f7690e9f4a6f484a91cdff4023441d9e34c53fead1b3169791bf8612ac0d-d_640?region=us 2x" alt="Raised Fist - Friends and Traitors">
            <div class="play">
              <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61 61"><circle cx="30.5" cy="30.5" r="30.5" opacity=".8" fill="#000"></circle><path d="M25.3 19.2c-2.1-1.2-3.8-.2-3.8 2.2v18.1c0 2.4 1.7 3.4 3.8 2.2l16.6-9.1c2.1-1.2 2.1-3.2 0-4.4l-16.6-9z" fill="#fff"></path></svg>
            </div>
          </a>
        </div>

<p>In dem Sinne viel Spaß beim Anschauen und eine schöne Restwoche. (Morgen ist ja schon Bergfest !!)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Centos 5.5 Netinstall vom Stick</title>
      <link>https://hufschlaeger.net/blog/2011/01/16/centos-5.5-netinstall-vom-stick/</link>
      <pubDate>Sun, 16 Jan 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/01/16/centos-5.5-netinstall-vom-stick/</guid>
      <description>&lt;p&gt;Will man Linux installieren fügen bekanntlich viele Wege nach Rom, man hat die Wahl zwischen Live-CDs, Installations-CDs / DVDs oder der Netzwerkinstallation. Letzte ist in Anbetracht einer schnellen Internetverbindung natürlich unschlagbar, denn man erspart sich den Update-Marathon nach der Installation und kann dennoch das System nach belieben konfigurieren und/oder die Paketwahl beeinflussen, was ja bei Servern eine wichtige Rolle spielt. Um sich nun den Brennvorgang und mit der Zeit die vielen Rohlinge zu sparen und das Zielsystem vom USB-Stick zu booten, ist es möglich das diskimage direkt mit dd auf den Stick zu pressen. Das geht erstens unglaublich schnell und zweitens ist das Download-Volumen für die Erstellung des Sticks wesentlich geringer als das einer Live-CD. Zum Vergleich, eine Live-CD kommt mit einem Volumen von 700 MB, das Diskimage beträgt nur mit 12 MB. Natürlich steigt dann der Traffic bei der Installation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Will man Linux installieren fügen bekanntlich viele Wege nach Rom, man hat die Wahl zwischen Live-CDs, Installations-CDs / DVDs oder der Netzwerkinstallation. Letzte ist in Anbetracht einer schnellen Internetverbindung natürlich unschlagbar, denn man erspart sich den Update-Marathon nach der Installation und kann dennoch das System nach belieben konfigurieren und/oder die Paketwahl beeinflussen, was ja bei Servern eine wichtige Rolle spielt. Um sich nun den Brennvorgang und mit der Zeit die vielen Rohlinge zu sparen und das Zielsystem vom USB-Stick zu booten, ist es möglich das diskimage direkt mit dd auf den Stick zu pressen. Das geht erstens unglaublich schnell und zweitens ist das Download-Volumen für die Erstellung des Sticks wesentlich geringer als das einer Live-CD. Zum Vergleich, eine Live-CD kommt mit einem Volumen von 700 MB, das Diskimage beträgt nur mit 12 MB. Natürlich steigt dann der Traffic bei der Installation.</p>
<h2 id="download-der-images">Download der Images</h2>
<p>Man sucht sich einen Mirror für das Diskimage seiner Wahldistribution und lädt die 12 MB große Datei herunter:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">http://mirrors.kernel.org/centos/5.5/os/i386/images/
</span></span></code></pre></div><h2 id="partition-erzeugen-und-kopieren-auf-den-usb-stick">Partition erzeugen und Kopieren auf den USB-Stick</h2>
<p>Um die Partition zu erzeugen, gibt es wie immer viele Möglichkeiten und es zählt, was  funktioniert. Also gparted, Windows oder fdisk, Hauptsache man hat am Ende eine Partition. Anschließend wird diese noch FAT formatiert, wobei die Größe der Partition die Entscheidungshilfe für FAT16 oder FAT32 gibt. Danach kommt der finale Schritt mit dd, wo kein Weg dran vorbei führt.
Als Beispiel die Prozedur unter Linux in der Shell mit fdisk :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">fdisk -l /dev/sdb
</span></span><span class="line"><span class="cl">mkfs -t vfat /dev/sdb1
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>diskboot.img <span class="nv">of</span><span class="o">=</span>/dev/sdb
</span></span></code></pre></div><h2 id="booten-und-quelle-angeben">Booten und Quelle angeben</h2>
<p>Nun sollte der Stick seinen Weg in die USB-Buchse des Zielsystems finden und als Bootmedium der Stick gewählt werden. Ist man in der Installation bei der Wahl der Paketquellen  angekommen, so gibt man einen Mirror und den Pfad zu den Paketen an.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Git Svn Cheat Sheet</title>
      <link>https://hufschlaeger.net/blog/2011/01/16/git-svn-cheat-sheet/</link>
      <pubDate>Sun, 16 Jan 2011 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2011/01/16/git-svn-cheat-sheet/</guid>
      <description>&lt;p&gt;Alle Anderen nutzen Subversion, aber man selbst nutzt Git und möchte das lokale Repos etc. nicht missen !? Gut das es für so etwas Git-SVN gibt, und man für die Integration eines bestehenden Subversion-Repos allein drei Befehle benötigt um an Projekten zu partizipieren.&lt;/p&gt;
&lt;h3 id=&#34;svn-repository-mit-git-svn-auschecken&#34;&gt;SVN-Repository mit git-svn auschecken&lt;/h3&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;git svn clone --username user http://host/url
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;updates-vom-svn-holen&#34;&gt;Updates vom SVN holen&lt;/h3&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;git svn rebase
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;lokale-änderungen-aus-dem-git-repository-ins-svn-schieben&#34;&gt;Lokale Änderungen aus dem Git-Repository ins SVN schieben&lt;/h3&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;git svn dcommit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Infos kommen natürlich nicht von Irgendwo. Die hatte ich vor einiger Zeit auf &lt;a href=&#34;http://siriux.net/2009/10/git-auf-subversion&#34;&gt;siriux.net&lt;/a&gt; gefunden.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Alle Anderen nutzen Subversion, aber man selbst nutzt Git und möchte das lokale Repos etc. nicht missen !? Gut das es für so etwas Git-SVN gibt, und man für die Integration eines bestehenden Subversion-Repos allein drei Befehle benötigt um an Projekten zu partizipieren.</p>
<h3 id="svn-repository-mit-git-svn-auschecken">SVN-Repository mit git-svn auschecken</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git svn clone --username user http://host/url
</span></span></code></pre></div><h3 id="updates-vom-svn-holen">Updates vom SVN holen</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git svn rebase
</span></span></code></pre></div><h3 id="lokale-änderungen-aus-dem-git-repository-ins-svn-schieben">Lokale Änderungen aus dem Git-Repository ins SVN schieben</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git svn dcommit
</span></span></code></pre></div><p>Die Infos kommen natürlich nicht von Irgendwo. Die hatte ich vor einiger Zeit auf <a href="http://siriux.net/2009/10/git-auf-subversion">siriux.net</a> gefunden.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MAC-Spoofing...</title>
      <link>https://hufschlaeger.net/blog/2010/08/10/mac-spoofing.../</link>
      <pubDate>Tue, 10 Aug 2010 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2010/08/10/mac-spoofing.../</guid>
      <description>&lt;p&gt;&amp;hellip; gehört sicherlich zu den ungewöhnlichsten Aktivitäten/Ereignissen des gewöhnlichen Windows-Nutzers. Ist auch doof, dass man sich bei DHCP nicht auf seine IP verlassen kann. Und dabei ist es doch nur ein Drei-Zeiler, den man unter Linux braucht. Und das eigentlich richtig Böse daran ist ja, das man auch virtuelle Devices erzeugen kann.&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;ifconfig eth0:X down
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ifconfig eth0:X hw ether 00:11:22:33:44:55
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ifconfig eth0:X up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit kann man auch gleich ganze Ranges kapern. Nur mal nebenbei gesagt, ihr alten Seebären. Da fällt mir gerade ein, noch daran zu erinnern, dass durch diese Zeilen ein MAC-Filter im WLAN-Router auch völlig unsinnig ist. Aber wen es beruhigt…&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&hellip; gehört sicherlich zu den ungewöhnlichsten Aktivitäten/Ereignissen des gewöhnlichen Windows-Nutzers. Ist auch doof, dass man sich bei DHCP nicht auf seine IP verlassen kann. Und dabei ist es doch nur ein Drei-Zeiler, den man unter Linux braucht. Und das eigentlich richtig Böse daran ist ja, das man auch virtuelle Devices erzeugen kann.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ifconfig eth0:X down
</span></span><span class="line"><span class="cl">ifconfig eth0:X hw ether 00:11:22:33:44:55
</span></span><span class="line"><span class="cl">ifconfig eth0:X up
</span></span></code></pre></div><p>Damit kann man auch gleich ganze Ranges kapern. Nur mal nebenbei gesagt, ihr alten Seebären. Da fällt mir gerade ein, noch daran zu erinnern, dass durch diese Zeilen ein MAC-Filter im WLAN-Router auch völlig unsinnig ist. Aber wen es beruhigt…</p>
]]></content:encoded>
    </item>
    <item>
      <title>TI Voyage 200 und Windows x64</title>
      <link>https://hufschlaeger.net/blog/2010/03/04/ti-voyage-200-und-windows-x64/</link>
      <pubDate>Thu, 04 Mar 2010 18:23:14 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2010/03/04/ti-voyage-200-und-windows-x64/</guid>
      <description>&lt;p&gt;Vor gut 2 Jahren bekam ich von meinen Eltern einen Voyage 200 von Texas Instruments, für das Studium, geschenkt. Tadelloses Gerät mit reichlich Software und sogar gcc-Port zum Schreiben eigener Programme. Die CAS-Geräte sind zwar in der Uni nicht wirklich gern gesehen, aber was soll es war trotzdem eine gute Hilfe. Leider kam mit Windows Vista die Ära der 64-bit Systeme und ab da an hatte es sich dann auch mit dem TI gegessen. Seitens TI war eine Portierung des Treibers für die x64-Architektur wohl nicht interessant genug und freie Treiber ließen sich bzgl. Treibersignierung nicht installieren/aktivieren. Als ich heute jedoch in den &lt;a href=&#34;http://education.ti.com/educationportal/downloadcenter/SoftwareDetail.do?website=US&amp;amp;tabId=1&amp;amp;paneId=7&amp;amp;appId=183&#34;&gt;Downloadbereich&lt;/a&gt; von TI schaute, musste ich mit Erstaunen feststellen, dass es einen &lt;a href=&#34;http://education.ti.com/downloads/files/computer_software/ticonnect1.6patch1.exe&#34;&gt;Beta-Patch&lt;/a&gt; für TI-Connect gibt, der auch x64-Systeme unterstützt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Vor gut 2 Jahren bekam ich von meinen Eltern einen Voyage 200 von Texas Instruments, für das Studium, geschenkt. Tadelloses Gerät mit reichlich Software und sogar gcc-Port zum Schreiben eigener Programme. Die CAS-Geräte sind zwar in der Uni nicht wirklich gern gesehen, aber was soll es war trotzdem eine gute Hilfe. Leider kam mit Windows Vista die Ära der 64-bit Systeme und ab da an hatte es sich dann auch mit dem TI gegessen. Seitens TI war eine Portierung des Treibers für die x64-Architektur wohl nicht interessant genug und freie Treiber ließen sich bzgl. Treibersignierung nicht installieren/aktivieren. Als ich heute jedoch in den <a href="http://education.ti.com/educationportal/downloadcenter/SoftwareDetail.do?website=US&amp;tabId=1&amp;paneId=7&amp;appId=183">Downloadbereich</a> von TI schaute, musste ich mit Erstaunen feststellen, dass es einen <a href="http://education.ti.com/downloads/files/computer_software/ticonnect1.6patch1.exe">Beta-Patch</a> für TI-Connect gibt, der auch x64-Systeme unterstützt.</p>
<p><img alt="TI Voyage 200 (Wikipedia.de)" loading="lazy" src="/img/Voyage200.jpg"></p>
<p>Installiert und getestet: funktioniert einwandfrei. Nun kann ich den Voyage wieder aus der Versenkung holen und wieder von den Vorzügen eines programmierbaren, graphischen Taschenrechners profitieren.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Midi, Fedora, ALSA-API</title>
      <link>https://hufschlaeger.net/blog/2009/08/24/midi-fedora-alsa-api/</link>
      <pubDate>Mon, 24 Aug 2009 16:07:20 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/08/24/midi-fedora-alsa-api/</guid>
      <description>&lt;p&gt;Sollte man in den Genuss kommen und mit der ALSA-API auf ein MIDI-Interface zugreifen wollen, dann sollte man sich nicht wundern wenn das der Zugriff auf /dev/snd/seq mit&lt;/p&gt;
&lt;p style=&#34;padding-left: 30px;&#34;&gt;
  &lt;strong&gt;ALSA lib seq_hw.c:457:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;verneint wird. Glücklicherweise hilft ein &lt;strong&gt;modprobe snd_seq&lt;/strong&gt; wahre Wunder und es kann weiter gehen mit dem fröhlichen Trällern, oder halt dem Programmieren mit der ALSA-API.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sollte man in den Genuss kommen und mit der ALSA-API auf ein MIDI-Interface zugreifen wollen, dann sollte man sich nicht wundern wenn das der Zugriff auf /dev/snd/seq mit</p>
<p style="padding-left: 30px;">
  <strong>ALSA lib seq_hw.c:457:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory</strong>
</p>
<p>verneint wird. Glücklicherweise hilft ein <strong>modprobe snd_seq</strong> wahre Wunder und es kann weiter gehen mit dem fröhlichen Trällern, oder halt dem Programmieren mit der ALSA-API.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Uptime mit C auslesen</title>
      <link>https://hufschlaeger.net/blog/2009/07/27/uptime-mit-c-auslesen/</link>
      <pubDate>Mon, 27 Jul 2009 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/07/27/uptime-mit-c-auslesen/</guid>
      <description>&lt;p&gt;Brauch man ja ab und an um sich ein Bild über die aktuelle Laufzeit des jeweiligen Systems zu machen oder um sich einzugestehen, dass man einfach zu lange vor der Kiste sitzt.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/sysinfo.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#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;cp&#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;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getTickCount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Zeit seit dem Booten in Sekunden
&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;&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;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sysinfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;si&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;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sysinfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;si&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;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;si&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uptime&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;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1L&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;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&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;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Uptime : %2.0f min&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getTickCount&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;mf&#34;&gt;60.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;k&#34;&gt;return&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;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>Brauch man ja ab und an um sich ein Bild über die aktuelle Laufzeit des jeweiligen Systems zu machen oder um sich einzugestehen, dass man einfach zu lange vor der Kiste sitzt.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-C" data-lang="C"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/sysinfo.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">long</span> <span class="nf">getTickCount</span><span class="p">()</span> <span class="c1">// Zeit seit dem Booten in Sekunden
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="n">sysinfo</span> <span class="n">si</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nf">sysinfo</span><span class="p">(</span><span class="o">&amp;</span><span class="n">si</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">si</span><span class="p">.</span><span class="n">uptime</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1L</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="kt">int</span> <span class="nf">main</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="nf">printf</span><span class="p">(</span><span class="s">&#34;Uptime : %2.0f min&#34;</span><span class="p">,(</span><span class="nf">getTickCount</span><span class="p">()</span><span class="o">/</span><span class="mf">60.0</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Dropbox / Subversion in conky integrieren</title>
      <link>https://hufschlaeger.net/blog/2009/06/01/dropbox-/-subversion-in-conky-integrieren/</link>
      <pubDate>Mon, 01 Jun 2009 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/06/01/dropbox-/-subversion-in-conky-integrieren/</guid>
      <description>&lt;p&gt;Des Öfteren sieht man hier ja Screenshots von meinem Laptop samt Fluxbox und &lt;a href=&#34;http://conky.sourceforge.net/&#34; target=&#34;_blank&#34;&gt;Conky&lt;/a&gt;. Conky ist dabei ein kleines Programm, womit man so ziemlich alles auf den Desktop bringen kann. Standardmäßig werden CPU, RAM und Systeminfos wie Architektur und Distribution angezeigt. Mit ein wenig Investition von Zeit und einer Menge Testläufen, das Auge isst ja bekanntlich mit, kann man conky dann nach Belieben gestalten und alles Erdenkliche anzeigen lassen.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/conky.png&#34; title=&#34;Conky zur Anzeige von Systeminformationen auf dem Desktop&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Des Öfteren sieht man hier ja Screenshots von meinem Laptop samt Fluxbox und <a href="http://conky.sourceforge.net/" target="_blank">Conky</a>. Conky ist dabei ein kleines Programm, womit man so ziemlich alles auf den Desktop bringen kann. Standardmäßig werden CPU, RAM und Systeminfos wie Architektur und Distribution angezeigt. Mit ein wenig Investition von Zeit und einer Menge Testläufen, das Auge isst ja bekanntlich mit, kann man conky dann nach Belieben gestalten und alles Erdenkliche anzeigen lassen.</p>
<p><img alt="image" loading="lazy" src="/img/conky.png" title="Conky zur Anzeige von Systeminformationen auf dem Desktop"></p>
<p>Mit ein wenig Suchen bei Google, findet man für fast alles ein Script oder man lässt sich selber was einfallen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="si">${</span><span class="nv">color</span><span class="p"> lightgray</span><span class="si">}</span>DropBox Status: <span class="si">${</span><span class="nv">color</span><span class="p"> ddaa00</span><span class="si">}</span> <span class="si">${</span><span class="nv">execi</span><span class="p"> 30 dropbox status</span><span class="si">}</span>
</span></span></code></pre></div><p>Zeit den aktuellen DropBox-Status innerhalb von conky an. Sehr schön ist auch die Integration von <a href="http://blog.neofreko.com/index.php/2006/08/07/conky-svn-info-script/">Subversion</a>, welches die aktuelle Revision, den letzten Autor und das Datum der Änderung anzeigt. Wobei ein wenig mit Perl und regulären Ausdrücken nachgeholfen wird.</p>
<p><img alt="image" loading="lazy" src="/img/conky_svn.png" title="Aktuelle commits aus dem SVN repository"></p>
<p>Da Subversion mittlerweile lokalisiert wurde, hab ich das Script oder besser die Suchmuster ans Deutsche angepasst. Außerdem gibt es wie immer Probleme mit Backticks und Anführungsstrichen, was recht lange dauert bis man alle korrigiert hat. Daher der Download ganz unten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="si">${</span><span class="nv">color</span><span class="p"> lightgrey</span><span class="si">}</span>Subversion:
</span></span><span class="line"><span class="cl">Uni <span class="si">${</span><span class="nv">alignr</span><span class="si">}${</span><span class="nv">texeci</span><span class="p"> 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/Uni</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">Arbeit <span class="si">${</span><span class="nv">alignr</span><span class="si">}${</span><span class="nv">texeci</span><span class="p"> 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/VbZeusDll</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">Projekt <span class="si">${</span><span class="nv">alignr</span><span class="si">}${</span><span class="nv">texeci</span><span class="p"> 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/Privat</span><span class="si">}</span>
</span></span></code></pre></div><p>Man erkennt ziemlich schnell das Muster &#x1f604;. Viel Spass beim Tüffteln.</p>
]]></content:encoded>
    </item>
    <item>
      <title>M1330 - Touchpad (de)aktivieren</title>
      <link>https://hufschlaeger.net/blog/2009/05/31/m1330-touchpad-deaktivieren/</link>
      <pubDate>Sun, 31 May 2009 22:09:18 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/05/31/m1330-touchpad-deaktivieren/</guid>
      <description>&lt;p&gt;Vor einiger Zeit hatte ich ja schon über diverse &lt;a href=&#34;https://hufschlaeger.net/gsynaptics-synaptics-touchpad-konfigurieren/&#34; title=&#34;GSynaptics. Synaptics Touchpad konfigurieren&#34;&gt;Vor einiger Zeit hatte ich ja schon über diverse&lt;/a&gt; zur Konfiguration, die das Synaptics-Touchpad betreffen, berichtet. Leider bietet das M1330 keine Tastenkombination um das Touchpad zu (de)aktiveren. Klar könnte man das jedes Mal per GSynaptics machen, aber das wäre verdammt unschön und sehr Windows-Like. Einfacher geht es mit einem kleinem Bash-Script, was beim Aufruf den aktuellen Zustand einfach toggelt und diesen setzt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Vor einiger Zeit hatte ich ja schon über diverse <a href="/gsynaptics-synaptics-touchpad-konfigurieren/" title="GSynaptics. Synaptics Touchpad konfigurieren">Vor einiger Zeit hatte ich ja schon über diverse</a> zur Konfiguration, die das Synaptics-Touchpad betreffen, berichtet. Leider bietet das M1330 keine Tastenkombination um das Touchpad zu (de)aktiveren. Klar könnte man das jedes Mal per GSynaptics machen, aber das wäre verdammt unschön und sehr Windows-Like. Einfacher geht es mit einem kleinem Bash-Script, was beim Aufruf den aktuellen Zustand einfach toggelt und diesen setzt.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">### Little Touchpad toggle script</span>
</span></span><span class="line"><span class="cl"><span class="c1">### author : Daniel Kotschate</span>
</span></span><span class="line"><span class="cl"><span class="c1">### modified : 30.05.2009</span>
</span></span><span class="line"><span class="cl"><span class="c1">### url : http://www.epyx-online.de</span>
</span></span><span class="line"><span class="cl"><span class="c1">###</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### current touchpad state</span>
</span></span><span class="line"><span class="cl"><span class="nv">STATE</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>synclient -l <span class="p">|</span> grep TouchpadOff <span class="p">|</span> cut -d<span class="o">=</span> -f2 <span class="p">|</span> cut -d<span class="s1">&#39; &#39;</span> -f2<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### toggle current state</span>
</span></span><span class="line"><span class="cl"><span class="nv">STATE</span><span class="o">=</span><span class="k">$((</span><span class="nv">$STATE</span><span class="o">^</span><span class="m">1</span><span class="k">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### set new state</span>
</span></span><span class="line"><span class="cl">synclient <span class="nv">touchpadoff</span><span class="o">=</span><span class="nv">$STATE</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### generate some output</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="nv">$STATE</span> -eq <span class="m">1</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Touchpad inactive&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="nv">$STATE</span> -eq <span class="m">0</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Touchpad active&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>Eigentlich war es das schon, einfach in das bin-Verzeichnis des Users packen, ausführbar machen und sich freuen. Eleganter geht es natürlich noch mit einem Keyboard-Shortcut. Also in die „<em>~/.fluxbox/keys</em>„-Datei einfach:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># toggle touchpad</span>
</span></span><span class="line"><span class="cl">Mod4 F9 :Exec ~/bin/touchpad<span class="o">{</span>% endhighlight %<span class="o">}</span>
</span></span></code></pre></div><p>einfügen und mittels Windows/Super-F9 das Touchpad steuern.</p>
<p>Oder unter Gnome:</p>
<p><img alt="image" loading="lazy" src="/img/touchpad.png" title="Conky zur Anzeige von Systeminformationen auf dem DesktopGNOME 2 Touchpad"></p>
<p>Dabei würde ich die Echo-Anweisung allerdings gegen notify-send austauschen, sieht halt schicker aus.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Terratec Cinergy DT USB XS Diversity unter Fedora 10</title>
      <link>https://hufschlaeger.net/blog/2009/02/22/terratec-cinergy-dt-usb-xs-diversity-unter-fedora-10/</link>
      <pubDate>Sun, 22 Feb 2009 11:16:19 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/02/22/terratec-cinergy-dt-usb-xs-diversity-unter-fedora-10/</guid>
      <description>&lt;p&gt;Endlich mal wieder etwas Zeit sich um die trivialen Dinge im Leben zu kümmern. Zwar ist das natürlich bei jedem anders, aber bei mir gehört das Fernsehen nicht gerade zu den wichtigen Dingen meines Lebens. Eigentlich läuft es auch nur beim Essen, wenn man keine Zeit hat sich eine DVD anzusehen und man etwas dümmliches braucht um Abzuschalten. Nun gut, genug zu mir und zurück zum eigentlichen Thema. Wie dem Titel zu entnehmen ist, handelt es sich hier um den Dual-Tuner-Stick der Firma Terratec mit dem Namen „Terratec Cinergy DT USB XS Diversity“. Dieser hat neben dem Diversity-Feature, zusammenschalten von beiden Tuner zur Verbesserung der Signalqualität, auch einen integrierten Infrarot-Empfänger. Also recht praktisch, denn wer will schon zum Umschalten auf stehen.
&lt;img alt=&#34;image&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/cinergydtusbxsdiversity.jpg&#34; title=&#34;cinergydtusbxsdiversity&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Endlich mal wieder etwas Zeit sich um die trivialen Dinge im Leben zu kümmern. Zwar ist das natürlich bei jedem anders, aber bei mir gehört das Fernsehen nicht gerade zu den wichtigen Dingen meines Lebens. Eigentlich läuft es auch nur beim Essen, wenn man keine Zeit hat sich eine DVD anzusehen und man etwas dümmliches braucht um Abzuschalten. Nun gut, genug zu mir und zurück zum eigentlichen Thema. Wie dem Titel zu entnehmen ist, handelt es sich hier um den Dual-Tuner-Stick der Firma Terratec mit dem Namen „Terratec Cinergy DT USB XS Diversity“. Dieser hat neben dem Diversity-Feature, zusammenschalten von beiden Tuner zur Verbesserung der Signalqualität, auch einen integrierten Infrarot-Empfänger. Also recht praktisch, denn wer will schon zum Umschalten auf stehen.
<img alt="image" loading="lazy" src="/img/cinergydtusbxsdiversity.jpg" title="cinergydtusbxsdiversity"></p>
<h2 id="installation-der-treiber--firmware">Installation der Treiber / Firmware</h2>
<p>Die Installation der Treiber verläuft relativ schnell und problemlos und ist mit wenigen Schritten durch gelaufen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: yum -y install mercurial
</span></span><span class="line"><span class="cl"><span class="o">[</span>user<span class="o">]</span>: hg clone http://linuxtv.org/hg/v4l-dvb
</span></span><span class="line"><span class="cl"><span class="o">[</span>user<span class="o">]</span>: <span class="nb">cd</span> v4l-dvb/
</span></span><span class="line"><span class="cl"><span class="o">[</span>user<span class="o">]</span>: make
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: make install
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: <span class="nb">cd</span> /lib/firmware
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: wget http://www.wi-bw.tfh-wildau.de/~pboettch/home/files/dvb-usb-dib0700-1.20.fw
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: ln -s dvb-usb-dib0700-1.20.fw dvb-usb-dib0700-1.10.fw
</span></span><span class="line"><span class="cl"><span class="c1">### Reboot (Ohne gab es bei mir eine Kernelpanic)</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: chmod -R a+rw  /dev/dvb
</span></span></code></pre></div><p>So das war es schon, DVB-T läuft! Kommen wir zum nächsten und zum größeren Knackpunkt.</p>
<h2 id="infrarot-empfänger-in-betrieb-nehmen">Infrarot-Empfänger in Betrieb nehmen</h2>
<p>Als erstes müssen wir dafür sorgen, dass der Empfänger nicht mehr als Tastatur erkannt wird und HAL verbieten ihn automatisch als solche zu konfigurieren. Zwar würde er dann auch funktionieren, jedoch wären nicht alle Tasten der RC verfügbar und das wollen wir ja nun nicht.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: <span class="nb">cd</span> /usr/share/hal/fdi/preprobe/20thirdparty
</span></span><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: vim lirc.fdi
</span></span></code></pre></div><p>und den folgenden Inhalt hinein kopieren oder die Datei aus dem Anhang herunterladen und an die Position kopieren. Ob es letztendlich funktioniert hat, kann man mit folgenden Befehlen überprüfen :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;deviceinfo</span> <span class="na">version=</span><span class="s">&#34;0.2&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;device&gt;</span>
</span></span><span class="line"><span class="cl">     <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&#34;info.product&#34;</span> <span class="na">contains_ncase=</span><span class="s">&#34;IR-receiver inside an USB DVB receiver&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;info.ignore&#34;</span> <span class="na">type=</span><span class="s">&#34;bool&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">     <span class="nt">&lt;/match&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/device&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/deviceinfo&gt;</span>
</span></span></code></pre></div><p>Testen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hal-find-by-capability --capability input <span class="p">|</span> xargs -I <span class="o">{}</span> hal-device <span class="o">{}</span>
</span></span><span class="line"><span class="cl"><span class="c1">## oder</span>
</span></span><span class="line"><span class="cl">xinput --list
</span></span></code></pre></div><p>Bei beiden darf der IR-Empfänger nicht in der Ausgabe nicht mehr auftauchen. Das war eigentlich schon die ganze Magie.</p>
<h2 id="lirc-konfigurieren">Lirc konfigurieren</h2>
<p>Für das Grundgerüst von Lirc reicht folgendes Paket, allerdings sind gerade Bindings zu Prgrammen wie rhythmbox (rhythmbox-lirc), totem (totem-lirc) oder xmms (xmms-lirc) interessant, die dann nachinstalliert werden müssen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>root<span class="o">]</span>: yum -y install lirc
</span></span></code></pre></div><p>Danach benötigen wir noch eine Konfigurationsdatei, die unser RC beschreibt (als Download angehängt) welche wir nach  <strong>/etc/lircd.conf</strong> kopieren. Diese Konfigurationsdatei beschreibt jedoch nur, wie Lirc KeyCodes interpretieren soll, jedoch nicht wie auf diese reagiert wird. also ist eine weitere Konfigurationsdatei pro Benutzer notwendig. Standard ist hier die Datei .lircrc im Home-Dir des Benutzers. Ich habe meine als Beispiel ebenfalls als Download angehangen, gesteuert werden hier totem und kaffeine.
Das größte Problem was ich hatte, war das Lirc meine hardware.conf nicht annehmen wollte und folglich auch weder das device geöffnet noch den richtigen Treiber geladen hat. Daher habe ich das init.d-Skript folgendermaßen verändert. Wer das hier eventuell liest und eine bessere Lösung hat, kann sich ja vielleicht melden.</p>
<p>Zeile 66 geändert zu :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">daemon <span class="nv">$exec</span> -H devinput -d /dev/input/by-path/pci-2-2-event-ir /etc/lircd.conf
</span></span></code></pre></div><p>Wobei</p>
<ul>
<li>H : Driver</li>
<li>D : Device</li>
<li>Config</li>
</ul>
<p>Das event bekommt man durch  <strong>cat /proc/bus/input/devices</strong> heraus,</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">I: <span class="nv">Bus</span><span class="o">=</span><span class="m">0003</span> <span class="nv">Vendor</span><span class="o">=</span>0ccd <span class="nv">Product</span><span class="o">=</span>005a <span class="nv">Version</span><span class="o">=</span><span class="m">0001</span>
</span></span><span class="line"><span class="cl">N: <span class="nv">Name</span><span class="o">=</span><span class="s2">&#34;IR-receiver inside an USB DVB receiver&#34;</span>
</span></span><span class="line"><span class="cl">P: <span class="nv">Phys</span><span class="o">=</span>usb-0000:00:1d.7-2/ir0
</span></span><span class="line"><span class="cl">S: <span class="nv">Sysfs</span><span class="o">=</span>/devices/pci0000:00/0000:00:1d.7/usb2/2-2/input/input8
</span></span><span class="line"><span class="cl">U: <span class="nv">Uniq</span><span class="o">=</span>
</span></span><span class="line"><span class="cl">H: <span class="nv">Handlers</span><span class="o">=</span>kbd event8 
</span></span><span class="line"><span class="cl">B: <span class="nv">EV</span><span class="o">=</span><span class="m">3</span>
</span></span><span class="line"><span class="cl">B: <span class="nv">KEY</span><span class="o">=</span>14afc336 284284d00000000 <span class="m">0</span> <span class="m">480058000</span> <span class="m">219040000801</span> 9e96c000000000 90020000000ffd
</span></span></code></pre></div><p>und mittels <strong>ls -al /dev/input/by-path/</strong> auch das entsprechende device</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-0000:00:1d.0-usb-0:1:1.0-event-kbd -&gt; ../event3
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-0000:00:1d.0-usb-0:1:1.1-event- -&gt; ../event4
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.0-event-mouse -&gt; ../event5
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.0-mouse -&gt; ../mouse1
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.1-event- -&gt; ../event6
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 pci-2-2-event-ir -&gt; ../event8
</span></span><span class="line"><span class="cl">lrwxrwxrwx <span class="m">1</span> root rootÂ Â  <span class="m">9</span> 22. Feb 09:17 platform-pcspkr-event-spkr -&gt; ../event7
</span></span></code></pre></div><p>Damit lautet das einzutragende Device bei mir „<strong>/dev/inpu/by-path/pci-2-2-event-ir</strong>„. Jetzt nur noch lirc (/etc/init.d/lirc start) und irexec (irexec -d ) starten fertig.</p>
<h2 id="probleme">Probleme</h2>
<p>Da es anscheinend auch verschiebende Versionen von Ferndbedienung und Stick gibt können natürlich auch Probleme auftauchen. Bei mir musste ich per Modul-Option das IR-Protokoll von RC5 (Standardeinstellung) auf NEC ändern, da dort Toogle-Bit und Pulsweitenmodulation anders sind.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">options dvb-usb-dib0700 <span class="nv">dvb_usb_dib0700_ir_proto</span><span class="o">=</span><span class="m">0</span>
</span></span></code></pre></div><p>Wer zusätzlich nicht gerade in einem gut mit DVB-T abgedeckten Gebiet wohnhaft ist oder unter schlechtem Empfang leidet solte folgendes versuchen :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">options dvb_usb_dib0700 <span class="nv">force_lna_activation</span><span class="o">=</span><span class="m">1</span>
</span></span></code></pre></div><p>Ich hoffe das hilft denen, die verzweifelt herumprobieren, und nicht weiterkommen. Hab schließlich auch 2 Tage herumwirbelt bis endlich was funktionierte.</p>
<ul>
<li><a title="Wiki von linuxtv.org" href="http://linuxtv.org/wiki/index.php/TerraTec_Cinergy_DT_USB_XS_Diversity" target="_self">linuxtv.org</a></li>
<li><a title="Wiki von ubuntuusers" href="http://wiki.ubuntuusers.de/" target="_self">ubuntuusers.de</a> (Artikel HAL-Eingabegeräte und Lirc)</li>
<li><a title="Terratec-Produktseite" href="http://www.terratec.net/en/products/Cinergy_DT_USB_XS_Diversity_1608.html" target="_self">Terratec</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>M1330 - Funktionstasten</title>
      <link>https://hufschlaeger.net/blog/2009/01/30/m1330-funktionstasten/</link>
      <pubDate>Fri, 30 Jan 2009 22:09:18 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/01/30/m1330-funktionstasten/</guid>
      <description>&lt;p&gt;Um die Hardwaretasten für Batterieanzeige, Helligkeit, Ruhemodus, Monitorwechsel und WLAN sinngemäß nutzen zu können wären entsprechende Einträge in der xorg.conf nötig. Da ja aber gerade Eingabegeräte von HAL automatisch konfiguriert werden sollen, kann man dieses durch entsprechende Regeln definieren. Um alle Funktionstasten nutzen zu können sind folgende Schritte notwendig:&lt;/p&gt;
&lt;p&gt;Im Ordner „&lt;strong&gt;/usr/share/hal/fdi/policy/20thirdparty&lt;/strong&gt;“ die Datei „&lt;strong&gt;30-keymap-dell.fdi&lt;/strong&gt;“ erstellen und mit folgendem Inhalt versehen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; open=&#34;true&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;lt;!--30-keymap-dell.fdi--&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;e005:brightnessdown &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Fn+Down arrow Brightness Down --&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;e006:brightnessup &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Fn+Up arrow Brightness Up --&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;e007:battery &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Fn+F3 battery icon --&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;e00a:suspend &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Fn+F1 hibernate --&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;e00b:displaytoggle &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Fn+F8 CRT/LCD --&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;e008:radio &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- WLAN off --&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;input.keymap
&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;c&#34;&gt;&amp;lt;!-- prefix XPS --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fertig. Nach einem Neustart von HAL oder einem Reboot sollten die Tasten nun funktionieren. Bei mir funktionieren unter Fluxbox, ausnahmslos alle.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Um die Hardwaretasten für Batterieanzeige, Helligkeit, Ruhemodus, Monitorwechsel und WLAN sinngemäß nutzen zu können wären entsprechende Einträge in der xorg.conf nötig. Da ja aber gerade Eingabegeräte von HAL automatisch konfiguriert werden sollen, kann man dieses durch entsprechende Regeln definieren. Um alle Funktionstasten nutzen zu können sind folgende Schritte notwendig:</p>
<p>Im Ordner „<strong>/usr/share/hal/fdi/policy/20thirdparty</strong>“ die Datei „<strong>30-keymap-dell.fdi</strong>“ erstellen und mit folgendem Inhalt versehen.</p>
<div class="highlight" open="true"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="c">&lt;!--30-keymap-dell.fdi--&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">e005:brightnessdown <span class="c">&lt;!-- Fn+Down arrow Brightness Down --&gt;</span>
</span></span><span class="line"><span class="cl">e006:brightnessup <span class="c">&lt;!-- Fn+Up arrow Brightness Up --&gt;</span>
</span></span><span class="line"><span class="cl">e007:battery <span class="c">&lt;!-- Fn+F3 battery icon --&gt;</span>
</span></span><span class="line"><span class="cl">e00a:suspend <span class="c">&lt;!-- Fn+F1 hibernate --&gt;</span>
</span></span><span class="line"><span class="cl">e00b:displaytoggle <span class="c">&lt;!-- Fn+F8 CRT/LCD --&gt;</span>
</span></span><span class="line"><span class="cl">e008:radio <span class="c">&lt;!-- WLAN off --&gt;</span>
</span></span><span class="line"><span class="cl">input.keymap
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- prefix XPS --&gt;</span>
</span></span></code></pre></div><p>Fertig. Nach einem Neustart von HAL oder einem Reboot sollten die Tasten nun funktionieren. Bei mir funktionieren unter Fluxbox, ausnahmslos alle.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FluxBox ontour</title>
      <link>https://hufschlaeger.net/blog/2009/01/30/fluxbox-ontour/</link>
      <pubDate>Fri, 30 Jan 2009 09:27:59 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/01/30/fluxbox-ontour/</guid>
      <description>&lt;p&gt;Nach längerem hin und her, habe ich mich wieder für eine FluxBox auf meinem Laptop entschieden. Mit entsprechenden Einstellungen bzgl.  &lt;a href=&#34;http://conky.sourceforge.net/&#34; title=&#34;Conky&#34;&gt;Conky&lt;/a&gt; und der &lt;a href=&#34;http://fluxbox.org/&#34; title=&#34;Fluxbox&#34;&gt;FluxBox&lt;/a&gt; selbst wird das Gerät dann voll und ganz zum Produktivgerät. Zwar wurden bei &lt;a href=&#34;http://www.gnome.org/&#34; title=&#34;Gnome&#34;&gt;Gnome&lt;/a&gt; und &lt;a href=&#34;http://www.xfce.org/&#34; title=&#34;XFCE&#34;&gt;XFCE&lt;/a&gt; in den letzten Versionssprüngen sehr viele Verbesserungen gemacht, dennoch halte ich die FluxBox immer noch als anpassungsfreudiger als den Rest an Window-Managern. Ach ja, KDE wird wohl nie auf meinem Laptop heimisch werden, auch wenn das Ausprobieren der aktuellen 4.2 sehr viel Spaß gemacht hat.
&lt;img alt=&#34;Fluxbox M1330&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/090129_2544_1280x800.jpg&#34; title=&#34;Fluxbox M1330&#34;&gt;
Werde vielleicht mal ein paar Links und Informationen bzgl. der Konfigurationsmöglichkeiten posten.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nach längerem hin und her, habe ich mich wieder für eine FluxBox auf meinem Laptop entschieden. Mit entsprechenden Einstellungen bzgl.  <a href="http://conky.sourceforge.net/" title="Conky">Conky</a> und der <a href="http://fluxbox.org/" title="Fluxbox">FluxBox</a> selbst wird das Gerät dann voll und ganz zum Produktivgerät. Zwar wurden bei <a href="http://www.gnome.org/" title="Gnome">Gnome</a> und <a href="http://www.xfce.org/" title="XFCE">XFCE</a> in den letzten Versionssprüngen sehr viele Verbesserungen gemacht, dennoch halte ich die FluxBox immer noch als anpassungsfreudiger als den Rest an Window-Managern. Ach ja, KDE wird wohl nie auf meinem Laptop heimisch werden, auch wenn das Ausprobieren der aktuellen 4.2 sehr viel Spaß gemacht hat.
<img alt="Fluxbox M1330" loading="lazy" src="/img/090129_2544_1280x800.jpg" title="Fluxbox M1330">
Werde vielleicht mal ein paar Links und Informationen bzgl. der Konfigurationsmöglichkeiten posten.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Octave - Alternative zu Scilab ist gefunden</title>
      <link>https://hufschlaeger.net/blog/2009/01/29/octave-alternative-zu-scilab-ist-gefunden/</link>
      <pubDate>Thu, 29 Jan 2009 21:12:56 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/01/29/octave-alternative-zu-scilab-ist-gefunden/</guid>
      <description>&lt;p&gt;Nachdem ich ja &lt;a title=&#34;Probleme mit Scilab&#34; href=&#34;https://hufschlaeger.net/blog/2008/11/probleme-mit-scilab.html/&#34; target=&#34;_self&#34;&gt;letzens gemeckert habe,&lt;/a&gt; aber leider nicht ohne Mathe-Software im Studium auskomme, habe ich mich wieder dem Problem Scilab und Open-JDK zu gewandt. Leider ohne eine nennenswerte Verbesserung. Also blieb mir nur die Variante VirtualBox oder eben was anderes. Letzteres hat sich dann diese Woche als sehr komfortabel herausgestellt und trägt den Namen &lt;a title=&#34;GNU Octave&#34; href=&#34;http://www.gnu.org/software/octave/&#34; target=&#34;_self&#34;&gt;Octave&lt;/a&gt;.
&lt;img alt=&#34;image&#34; loading=&#34;lazy&#34; src=&#34;https://hufschlaeger.net/img/power_meas.png&#34; title=&#34;Auswertung einer Leistungsmessung mit Octave&#34;&gt;
In der Grundausstattung kommt octave recht schlicht als Kommandointerpreter und ohne GUI daher.Â  Allerdings gibt es dort auch Projekte wie kOctave oder QtOctave, welche sich diesem Problem annehmen.
Interessanterweise wird standardmäßig &lt;a title=&#34;GNU Plot&#34; href=&#34;http://www.gnuplot.info/&#34; target=&#34;_self&#34;&gt;GNUPlot&lt;/a&gt; für die Ausgabe der Graphen verwendet, womit ich ja schon recht &lt;a title=&#34;Plotten mit GNU Plot&#34; href=&#34;https://hufschlaeger.net/blog/2008/11/messwerte-schnell-mit-gnuplot-und-python-plotten.html/&#34; target=&#34;_self&#34;&gt;gute Erfahrungen&lt;/a&gt; machen konnte. Ein Problem war allerdings noch zu lösen. Bei der Ausgabe in Bildformate wie PNG oder JPEG meckerte octave bzgl. einiger fehlender Schriftarten. Deshalb sollten folgende Werte innerhalb der Shellumgebung gesetzt bzw. die Standardeinstellungen von octave erweitert werden.
In der .bashrc&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nachdem ich ja <a title="Probleme mit Scilab" href="/blog/2008/11/probleme-mit-scilab.html/" target="_self">letzens gemeckert habe,</a> aber leider nicht ohne Mathe-Software im Studium auskomme, habe ich mich wieder dem Problem Scilab und Open-JDK zu gewandt. Leider ohne eine nennenswerte Verbesserung. Also blieb mir nur die Variante VirtualBox oder eben was anderes. Letzteres hat sich dann diese Woche als sehr komfortabel herausgestellt und trägt den Namen <a title="GNU Octave" href="http://www.gnu.org/software/octave/" target="_self">Octave</a>.
<img alt="image" loading="lazy" src="/img/power_meas.png" title="Auswertung einer Leistungsmessung mit Octave">
In der Grundausstattung kommt octave recht schlicht als Kommandointerpreter und ohne GUI daher.Â  Allerdings gibt es dort auch Projekte wie kOctave oder QtOctave, welche sich diesem Problem annehmen.
Interessanterweise wird standardmäßig <a title="GNU Plot" href="http://www.gnuplot.info/" target="_self">GNUPlot</a> für die Ausgabe der Graphen verwendet, womit ich ja schon recht <a title="Plotten mit GNU Plot" href="/blog/2008/11/messwerte-schnell-mit-gnuplot-und-python-plotten.html/" target="_self">gute Erfahrungen</a> machen konnte. Ein Problem war allerdings noch zu lösen. Bei der Ausgabe in Bildformate wie PNG oder JPEG meckerte octave bzgl. einiger fehlender Schriftarten. Deshalb sollten folgende Werte innerhalb der Shellumgebung gesetzt bzw. die Standardeinstellungen von octave erweitert werden.
In der .bashrc</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">export</span> <span class="nv">GDFONTPATH</span><span class="o">=</span><span class="s2">&#34;/usr/share/fonts/msfonts&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">## Achtung Pfad anpassen&lt;/pre&gt;</span>
</span></span></code></pre></div><p>und in der .octaverc :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">set<span class="o">(</span>0,<span class="s1">&#39;defaulttextfontname&#39;</span>,<span class="s1">&#39;verdana&#39;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">%% Schriftnamen anpassen
</span></span></code></pre></div><p>Danach sollte der Export nach PNG/JPEG problemlos funktionieren.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Progswitch für mySmartUSB unter Linux</title>
      <link>https://hufschlaeger.net/blog/2009/01/22/progswitch-f%C3%BCr-mysmartusb-unter-linux/</link>
      <pubDate>Thu, 22 Jan 2009 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/01/22/progswitch-f%C3%BCr-mysmartusb-unter-linux/</guid>
      <description>&lt;p&gt;Vor gut 2 Jahren bekam ich, gemäß meines Wunschzettels, zu Weihnachten eine USB-AVR-Experimentierplatine der Firma &lt;a href=&#34;http://www.myavr.de&#34; title=&#34;myAVR&#34;&gt;myAVR&lt;/a&gt; mitsamt dem kleinen USB-Prommer mySmarUSB. Beides hat mich bisher tatkräftig im Programieren von ATMELs kleinen Mikrocontrollern unterstützt und bisher auch immer fehlerfrei gearbeitet.  Der Prommer wirkt dabei als RS232-zu-USB-Umsetzer und läuft daher auch problemlos unter Windows und Linux. Nachdem Komplettumstieg auf Linux, war eine schnelle Umstellung von &lt;a href=&#34;http://winavr.sourceforge.net/&#34;&gt;WinAVR&lt;/a&gt; zu &lt;a href=&#34;http://sourceforge.net/projects/kontrollerlab&#34;&gt;KontrollerLab&lt;/a&gt; als Entwicklungsumgebung notwendig, was auch kein größeres Problem darstellte.  Da ich natürlich alle Funktionen, Daten-/Programmiermodus und Resetfunktionen, des Prommers nutzen wollte musste ich leider feststellen, dass das Programm myQuickprog leider nicht unter Linux lauffähig war. Sicherlich hätte man mit wine emulieren können, jedoch erscheint mir das eher halbherzig. Im myAVR-Forum fand ich dann ein kleines Python-Skript das einen schnellen Wechsel der Betriesmodi erlaubt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Vor gut 2 Jahren bekam ich, gemäß meines Wunschzettels, zu Weihnachten eine USB-AVR-Experimentierplatine der Firma <a href="http://www.myavr.de" title="myAVR">myAVR</a> mitsamt dem kleinen USB-Prommer mySmarUSB. Beides hat mich bisher tatkräftig im Programieren von ATMELs kleinen Mikrocontrollern unterstützt und bisher auch immer fehlerfrei gearbeitet.  Der Prommer wirkt dabei als RS232-zu-USB-Umsetzer und läuft daher auch problemlos unter Windows und Linux. Nachdem Komplettumstieg auf Linux, war eine schnelle Umstellung von <a href="http://winavr.sourceforge.net/">WinAVR</a> zu <a href="http://sourceforge.net/projects/kontrollerlab">KontrollerLab</a> als Entwicklungsumgebung notwendig, was auch kein größeres Problem darstellte.  Da ich natürlich alle Funktionen, Daten-/Programmiermodus und Resetfunktionen, des Prommers nutzen wollte musste ich leider feststellen, dass das Programm myQuickprog leider nicht unter Linux lauffähig war. Sicherlich hätte man mit wine emulieren können, jedoch erscheint mir das eher halbherzig. Im myAVR-Forum fand ich dann ein kleines Python-Skript das einen schnellen Wechsel der Betriesmodi erlaubt.</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/python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -*- coding: iso-8859-15 -*-</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">serial</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Kotrollsequenz gemäß technischer Beschreibung von mySmartUSB</span>
</span></span><span class="line"><span class="cl"><span class="n">controlseq</span> <span class="o">=</span> <span class="s1">&#39;xe6xb5xbaxb9xb2xb3xa9&#39;</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="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span> <span class="s1">&#39;Usage: progswitch.py mode &#39;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span> <span class="s1">&#39;tp : Programming mode&#39;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span> <span class="s1">&#39;td : Data mode&#39;</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="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="s1">&#39;/dev/ttyUSB0&#39;</span><span class="p">,</span> <span class="mi">19200</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">ser</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">controlseq</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span></code></pre></div><p>Kleines Manko am Rande, es funktioniert bei mir nur auf dem Laptop, beim Desktop regt sich nix. Also blieb nur eines, das Skript auf eine Hochsprache zu portieren!  Gesagt getan, da ich mich so oder so in die Programmierung der seriellen Schnittstelle unter Linux einarbeiten wollte, habe ich das Skript nach C portiert. Das resultierende Programm „progswitch“ verfügt über Argumentswitches für die jeweiligen Modis und erlaubt das angeben eines Interfaces. In etwa sieht das Ganze dann so aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">progswitch -d -i/ttyUSB0
</span></span></code></pre></div><p><span style="line-height: 1.714285714; font-size: 1rem;">Wobei d : Datenmode und :i Interfacedarstellen und i zwangsweise vorhanden sein muss. Sollte jemand auf die Idee kommen zwei Modis anzugeben, so wird immer der letzte ausgewertet und behandelt.</span>
Unter Fedora habe ich zusätzlich eine udev-Policy erstellt, die die Schnittstelle automatisch mit den Rechten 666, also lesen und schreiben für alle erstellt und nur die Sillicon Labs RS232-Konverter behandelt.
„Für etwaigen Schäden übernehme ich keine Gewähr oder Haftung. Sollte etwas an eurem System oder eurer Hardware beschädigt werden, so geschieht das Nutzen des Programms und der hier dargestellten Informationen auf eigene Gefahr!“</p>
<p><a href="/downloads/progswitch.c">Progswitch C-Programm</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Synaptics unter Fedorra 10</title>
      <link>https://hufschlaeger.net/blog/2009/01/11/synaptics-unter-fedorra-10/</link>
      <pubDate>Sun, 11 Jan 2009 21:15:36 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2009/01/11/synaptics-unter-fedorra-10/</guid>
      <description>&lt;p&gt;Wie &lt;a href=&#34;https://hufschlaeger.net/blog/2008/10/gsynaptics-synaptics-touchpad-konfigurieren.html/&#34; title=&#34;GSynaptics&#34;&gt;hier&lt;/a&gt; beschrieben, lässt sich ein Touchpad der Firma Synaptics relativ leicht unter Linux konfigurieren. Dort musste einfach die xorg.conf um den Eintrag erweitert werden. Leider ist das mit der automatischen Konfiguration des XOrg-Servers nicht mehr so einfach. Man hat zwei Möglichkeiten, entweder man erzeugt extra für diese Option eine neue xorg.conf oder aber man aktiviert diese Option in den Richtlinien für die automatische Konfiguration der Eingabegeräte.&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option &amp;#34;SHMConfig&amp;#34; &amp;#34;true&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dies ist durch das Editieren der Datei „&lt;strong&gt;10-synaptics.fdi&lt;/strong&gt;“ welche im Verzeichnis “ &lt;strong&gt;/usr/share/hal/fdi/policy/20thirdparty&lt;/strong&gt;“ zu finden sein sollte. Ändern muss man in diesem Fall nicht sonderlich viel, nur eine einzige Zeile einfügen:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wie <a href="/blog/2008/10/gsynaptics-synaptics-touchpad-konfigurieren.html/" title="GSynaptics">hier</a> beschrieben, lässt sich ein Touchpad der Firma Synaptics relativ leicht unter Linux konfigurieren. Dort musste einfach die xorg.conf um den Eintrag erweitert werden. Leider ist das mit der automatischen Konfiguration des XOrg-Servers nicht mehr so einfach. Man hat zwei Möglichkeiten, entweder man erzeugt extra für diese Option eine neue xorg.conf oder aber man aktiviert diese Option in den Richtlinien für die automatische Konfiguration der Eingabegeräte.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">Option &#34;SHMConfig&#34; &#34;true&#34;
</span></span></code></pre></div><p>Dies ist durch das Editieren der Datei „<strong>10-synaptics.fdi</strong>“ welche im Verzeichnis “ <strong>/usr/share/hal/fdi/policy/20thirdparty</strong>“ zu finden sein sollte. Ändern muss man in diesem Fall nicht sonderlich viel, nur eine einzige Zeile einfügen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.SHMConfig&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/merge&gt;</span>
</span></span></code></pre></div><p>Damit die Datei dann folgendermaßen ausschaut :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;deviceinfo</span> <span class="na">version=</span><span class="s">&#34;0.2&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;device&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&#34;info.capabilities&#34;</span> <span class="na">contains=</span><span class="s">&#34;input.touchpad&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_driver&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>synaptics<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- Switch off shared memory to close a security hole --&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.SHMConfig&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- Enable tap-to-click --&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.TapButton1&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>1<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- Enable double-tap. This seems to be a bug in the synaptics
</span></span></span><span class="line"><span class="cl"><span class="c">           driver. Supplying 0 to MaxDoubleTapTime results in best
</span></span></span><span class="line"><span class="cl"><span class="c">           double-tap experience, rather against the manpage. --&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.MaxDoubleTapTime&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>0<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- Enable vertical / horizental scrolling when dragging along
</span></span></span><span class="line"><span class="cl"><span class="c">           the right / bottom edge --&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.VertEdgeScroll&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.HorizEdgeScroll&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&#34;/org/freedesktop/Hal/devices/computer:system.hardware.vendor&#34;</span> <span class="na">contains=</span><span class="s">&#34;Acer&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&#34;/org/freedesktop/Hal/devices/computer:system.hardware.product&#34;</span> <span class="na">prefix=</span><span class="s">&#34;AOA110&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.FingerLow&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>9<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.FingerHigh&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>12<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&#34;input.x11_options.FingerPress&#34;</span> <span class="na">type=</span><span class="s">&#34;string&#34;</span><span class="nt">&gt;</span>69<span class="nt">&lt;/merge&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/match&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;/match&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- To add custom options for the touchpad, modify the examples below
</span></span></span><span class="line"><span class="cl"><span class="c">           to suit your needs. The available options are listed in the
</span></span></span><span class="line"><span class="cl"><span class="c">           &#34;synaptics&#34; man page. After modifyfing this file, you must
</span></span></span><span class="line"><span class="cl"><span class="c">           restart HAL. Check the output of lshal whether your modifications
</span></span></span><span class="line"><span class="cl"><span class="c">           have been merged successfully.
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">           Note: Options must always be type &#34;string&#34;.
</span></span></span><span class="line"><span class="cl"><span class="c">           The following examples enable left, right, middle clicks on
</span></span></span><span class="line"><span class="cl"><span class="c">           single, double, triple finger tapping, respectively.
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.TapButton1&#34; type=&#34;string&#34;&gt;1&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.TapButton2&#34; type=&#34;string&#34;&gt;3&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.TapButton3&#34; type=&#34;string&#34;&gt;2&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">           Enable vertical scrolling when dragging with two fingers
</span></span></span><span class="line"><span class="cl"><span class="c">           anywhere on the touchpad
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.VertTwoFingerScroll&#34; type=&#34;string&#34;&gt;true&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">           Enable horizontal scrolling when dragging with two fingers
</span></span></span><span class="line"><span class="cl"><span class="c">           anywhere on the touchpad 
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.HorizTwoFingerScroll&#34; type=&#34;string&#34;&gt;true&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">           If on, circular scrolling is used
</span></span></span><span class="line"><span class="cl"><span class="c">           &lt;merge key=&#34;input.x11_options.CircularScrolling&#34; type=&#34;string&#34;&gt;true&lt;/merge&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">      --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/match&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/device&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/deviceinfo&gt;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Probleme mit Scilab</title>
      <link>https://hufschlaeger.net/blog/2008/11/17/probleme-mit-scilab/</link>
      <pubDate>Mon, 17 Nov 2008 21:28:24 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2008/11/17/probleme-mit-scilab/</guid>
      <description>&lt;p&gt;Also eigentlich bin ich ja ein Freund von freier Software und kann mich auch recht schnell damit anfreunden, wenn es Probleme gibt oder es eventuell das ein oder andere Problem gibt, das erst gelöst werden muss bevor man die Software benutzen kann. Aber bei manchen Sachen kapituliere ich dann doch oder starte jetzt einfach mal einen Aufruf zu Hilfe. Die Rede ist von der freien Software &lt;a href=&#34;http://www.scilab.org/&#34; title=&#34;SciLab&#34;&gt;Scilab&lt;/a&gt;, die erst kürzlich in Version 5.0.3 erschienen ist. Das Programm ist eine echt &lt;a href=&#34;http://www.mathworks.de/&#34; title=&#34;Mathworks Matlab&#34;&gt;Matlab&lt;/a&gt;-Alternative, besonders wenn man eh nur an der Oberfläche kratzt und mal eben hier und da Gleichungssysteme lösen will oder schnell einen Graph braucht. Für letzteres hat mir zwar bisher &lt;a title=&#34;GNUPlot + Python : Messwerte plotten&#34; href=&#34;https://hufschlaeger.net/messwerte-schnell-mit-gnuplot-und-python-plotten/&#34; target=&#34;_self&#34;&gt;GnuPlot in Verbindung mit Python&lt;/a&gt; recht gute Dienste geleistet, aber langsam geht es ans Eingemachte.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Also eigentlich bin ich ja ein Freund von freier Software und kann mich auch recht schnell damit anfreunden, wenn es Probleme gibt oder es eventuell das ein oder andere Problem gibt, das erst gelöst werden muss bevor man die Software benutzen kann. Aber bei manchen Sachen kapituliere ich dann doch oder starte jetzt einfach mal einen Aufruf zu Hilfe. Die Rede ist von der freien Software <a href="http://www.scilab.org/" title="SciLab">Scilab</a>, die erst kürzlich in Version 5.0.3 erschienen ist. Das Programm ist eine echt <a href="http://www.mathworks.de/" title="Mathworks Matlab">Matlab</a>-Alternative, besonders wenn man eh nur an der Oberfläche kratzt und mal eben hier und da Gleichungssysteme lösen will oder schnell einen Graph braucht. Für letzteres hat mir zwar bisher <a title="GNUPlot + Python : Messwerte plotten" href="/messwerte-schnell-mit-gnuplot-und-python-plotten/" target="_self">GnuPlot in Verbindung mit Python</a> recht gute Dienste geleistet, aber langsam geht es ans Eingemachte.</p>
<p>Aber kommen wir zum Thema :</p>
<blockquote>
<p>Die Binary für Linux bekomme ich einfach nicht zum Plotten. Im Netz wird oft von leeren Graphen gesprochen, allerdings sind meine komplett schwarz und nicht leer. Versuche mir das Ding selbst zu Übersetzen sind bisher immer gescheitert. Selbst die alte ScilabGTK Variante in version 4.2 kann nur unter Suns JRE plotten, wobei dann aber Funktionslegenden nicht funktionieren.</p>
</blockquote>
<p>Also falls jemand eine Lösung parat hat, dann bitte melden. Momentan benutze ich eine XP Pro (eine Orginal-Lizenz) in einer VM und mache dort meine Plots. Funkioniert zwar, aber ist echt nervig.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Messwerte schnell mit GnuPlot und Python plotten</title>
      <link>https://hufschlaeger.net/blog/2008/11/12/messwerte-schnell-mit-gnuplot-und-python-plotten/</link>
      <pubDate>Wed, 12 Nov 2008 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2008/11/12/messwerte-schnell-mit-gnuplot-und-python-plotten/</guid>
      <description>&lt;p&gt;Des Öfteren kommt es einem während des Studiums unter, dass man Messwerte grafisch darstellen soll/muss. Allerdings nicht nur für Laborprotokolle sondern auch für das allgemeine Verständnis stellen diese Verläufe eine wertvolle Hilfe dar. Wer nicht immer gleich zu den Riesen der mathematischen Programme wie &lt;a href=&#34;http://www.mathworks.de&#34; target=&#34;_blank&#34;&gt;Matlab von Mathworks&lt;/a&gt;, &lt;a href=&#34;http://www.scilab.org&#34; target=&#34;_blank&#34;&gt;Scilab &lt;/a&gt;usw. greifen möchte, kann dafür auch genauso gut &lt;a href=&#34;http://www.gnuplot.info&#34; target=&#34;_blank&#34;&gt;GNUPlot&lt;/a&gt; benutzen. GNUPlot selbst, stellt schon sehr viele Funktionen bereit um allerlei &lt;a href=&#34;http://userpage.fu-berlin.de/~voelker/gnuplotkurs/gnuplotkurs.html&#34; target=&#34;_blank&#34;&gt;GnuPlot Grundkurs FU Berlin&lt;/a&gt; grafisches Zeugs zu erstellen, aber in Verbindung mit einer Skriptsprache wie Python ist es nahezu unschlagbar.
Da ich erst neulich für einen Grundlagenversuch eine Alternative zum Zeichnen einer Diodenkennlinie suchte, hab ich das Skript hier geschrieben. Es ist natürlich sehr rudimentär, aber erlaubt das Beschriften der Achsen und die Angabe einer Datei mit Messwerten die wie folgt aufgebaut ist.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Des Öfteren kommt es einem während des Studiums unter, dass man Messwerte grafisch darstellen soll/muss. Allerdings nicht nur für Laborprotokolle sondern auch für das allgemeine Verständnis stellen diese Verläufe eine wertvolle Hilfe dar. Wer nicht immer gleich zu den Riesen der mathematischen Programme wie <a href="http://www.mathworks.de" target="_blank">Matlab von Mathworks</a>, <a href="http://www.scilab.org" target="_blank">Scilab </a>usw. greifen möchte, kann dafür auch genauso gut <a href="http://www.gnuplot.info" target="_blank">GNUPlot</a> benutzen. GNUPlot selbst, stellt schon sehr viele Funktionen bereit um allerlei <a href="http://userpage.fu-berlin.de/~voelker/gnuplotkurs/gnuplotkurs.html" target="_blank">GnuPlot Grundkurs FU Berlin</a> grafisches Zeugs zu erstellen, aber in Verbindung mit einer Skriptsprache wie Python ist es nahezu unschlagbar.
Da ich erst neulich für einen Grundlagenversuch eine Alternative zum Zeichnen einer Diodenkennlinie suchte, hab ich das Skript hier geschrieben. Es ist natürlich sehr rudimentär, aber erlaubt das Beschriften der Achsen und die Angabe einer Datei mit Messwerten die wie folgt aufgebaut ist.</p>
<table>
  <thead>
      <tr>
          <th>X-Wert</th>
          <th>Y-Wert</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Spannung</td>
          <td>Strom</td>
      </tr>
  </tbody>
</table>
<p>Wobei zwischen den einzelnen Elementen jeweils ein Tabulator als Trennzeichen zu setzen ist. Nach dem Durchlaufen des Skripts, wird der Graph per GnuPlot dargestellt und eine PNG-Datei mit dem Namen der Messwertdatei erstellt.</p>
<p><img alt="image" loading="lazy" src="/img/gnuplot.png" title="GNUPlot Ausgabe"></p>
<p>Prinzipiell war es das schon. Wenn man das Skript ausführbar macht (chmod u+x) und in das bin-Verzeichnis seines Benutzer legt (sollte natürlich auch im $PATH sein), dann brauch man den Pfad der Messwerte nicht jedesmal angeben, aber das weiß bestimmt jeder.</p>
<p><a href="/downloads/python_characteristic_curve.tar.gz">Python Skript zum Plotten von Kennlinien</a></p>
<p>Allgemein ist der Aufruf mit Shell-Argumenten so aufgebaut:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Kennlinie.py Messwertdatei X-Achsen-Bezeichnung Y-Achsen-Bezeichnung
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>GSynaptics Synaptics Touchpad konfigurieren</title>
      <link>https://hufschlaeger.net/blog/2008/10/15/gsynaptics-synaptics-touchpad-konfigurieren/</link>
      <pubDate>Wed, 15 Oct 2008 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2008/10/15/gsynaptics-synaptics-touchpad-konfigurieren/</guid>
      <description>&lt;p&gt;Wie alles im Leben ist manches hilfreich, aber anderes ist gut gemeint und scheinbar auch sinnvoll aber nervt dann doch mehr oder weniger. Beim Laptop ist dies unter anderem ein schlecht konfiguriertes Synaptics Touchpad. Dabei stört mich persönlich eigentlich nur, dass ein schnelles Tippen als Mausklick interpretiert wird, was schon das ein oder andere Mal zu einem ungewollten Seitenbesuch geführt hat. Dabei stieß ich beim „googeln“ mehr oder weniger zufällig auf GSynaptics.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wie alles im Leben ist manches hilfreich, aber anderes ist gut gemeint und scheinbar auch sinnvoll aber nervt dann doch mehr oder weniger. Beim Laptop ist dies unter anderem ein schlecht konfiguriertes Synaptics Touchpad. Dabei stört mich persönlich eigentlich nur, dass ein schnelles Tippen als Mausklick interpretiert wird, was schon das ein oder andere Mal zu einem ungewollten Seitenbesuch geführt hat. Dabei stieß ich beim „googeln“ mehr oder weniger zufällig auf GSynaptics.</p>
<p><img alt="image" loading="lazy" src="/img/gsynaptics.png" title="GSynaptics"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">Option &#34;SHMConfig&#34; &#34;true&#34;
</span></span></code></pre></div><p>Das Einzige was zu beachten, ist die Option, die in der xorg.conf gesetzt sein muss. Damit ist GSynaptics in der Lage, über das kleine Tool synclient, mit dem Treiber zu kommunizieren und jeder Benutzer kann seine eigenen Einstellungen hinterlegen.</p>
<p>Unter Fedora wird das Frontend mit einem:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yum install gsynaptics
</span></span></code></pre></div><p>installiert.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Acer Aspire 3628 ACPI Fix</title>
      <link>https://hufschlaeger.net/blog/2008/06/06/acer-aspire-3628-acpi-fix/</link>
      <pubDate>Fri, 06 Jun 2008 02:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/blog/2008/06/06/acer-aspire-3628-acpi-fix/</guid>
      <description>&lt;p&gt;ACPI ist ja mehr oder weniger eine Windows-Domaine. Fast alle Notebookhersteller setzen auf den ACPI-Compiler von Microsoft, der sich leider, wie so oft, nicht an den ACPI 3.0 Standard hält und daher immense Probleme unter anden Betriebssystemen verursachen kann.Probleme wie zum Beispiel das nicht korrekte Auslesen des Akkukapazität, Setzen der Prozessorstufen oder die temperaturabhängige Steuerung des CPU-Lüfters sind dabei fast schon Alltag.&lt;/p&gt;
&lt;p&gt;Da mir momentan die hohe CPU-Temperatur meines Intel Centrinos sehr auf die Nerven geht und ich schon auf niedrigster Takstufe mit aktiviertem Undervolting (kleiner als 0,7 V geht nicht und durch den FSB gehts auch nur bis 800 MHz runter) arbeite ist das Ganze mehr als ärgerlich. Als ich den Laptop Ende letzen Jahres bezüglich Touchpad und Tastatur einschickte, wurde seitens des Supports kein Fehler festgestellt und auch das „Rück-Rüsten“ auf eine kleiner Festplatte etc. half nichts, Temperatur unverändert.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>ACPI ist ja mehr oder weniger eine Windows-Domaine. Fast alle Notebookhersteller setzen auf den ACPI-Compiler von Microsoft, der sich leider, wie so oft, nicht an den ACPI 3.0 Standard hält und daher immense Probleme unter anden Betriebssystemen verursachen kann.Probleme wie zum Beispiel das nicht korrekte Auslesen des Akkukapazität, Setzen der Prozessorstufen oder die temperaturabhängige Steuerung des CPU-Lüfters sind dabei fast schon Alltag.</p>
<p>Da mir momentan die hohe CPU-Temperatur meines Intel Centrinos sehr auf die Nerven geht und ich schon auf niedrigster Takstufe mit aktiviertem Undervolting (kleiner als 0,7 V geht nicht und durch den FSB gehts auch nur bis 800 MHz runter) arbeite ist das Ganze mehr als ärgerlich. Als ich den Laptop Ende letzen Jahres bezüglich Touchpad und Tastatur einschickte, wurde seitens des Supports kein Fehler festgestellt und auch das „Rück-Rüsten“ auf eine kleiner Festplatte etc. half nichts, Temperatur unverändert.</p>
<p>Nach dem Wiki-Eintrag auf <a title="ubuntuusers.de - Artikel LM-Sensors" href="http://wiki.ubuntuusers.de/Lm_sensors" target="_blank">UbuntuUsers</a> zum Thema Lüftersteuerung probierte ich natürlich LM-Sensors aus und hielt mich an die dort gut beschriebene Anleitung. Leider vergebens. Zwar wurder der Intel ICH6 Controller erkannt, jedoch bringt der leider nicht viel,</p>
<p>denn der Lüfter hängt da garnicht dran. Der Lüfter wird nämlich per ACPI gesteuert !</p>
<p>Funktioniert ja alles ganz gut, unter Windows.</p>
<p>Also wurde kurzerhand recherchiert und es fand sich, ebenfalls bei <a title="ubuntuusers.de - Artikel ACPIFix" href="http://wiki.ubuntuusers.de/acpi-fix" target="_blank">UbuntuUsers</a> eine Anleitung wie man die DSDT des Rechners ausliest und auf Fehler überprüft.</p>
<p>Ergebnis waren dann 3 Standardfehler und 6 Warnings, wobei die Errors schon mit der Anleitung lösbar waren und bei den Warnings handelte es sich einfach nur um die Schusseligkeit des Autors, der hatte nicht alle Zustände innerhalb seiner Abfragen geprüft und daher hatten einige Methoden unter Umständen keine Rückgabewerte.</p>
<p>DSDT üersetzt und an den Kernel weitergegeben und siehe da, der Lüfter lässt sich zwar nicht regeln, aber verrichtet normal seinen Dienst. Sprich er geht an und aus. Zwar soll man via aceracpi, einem bereits integriertem Kernelmodul, noch LEDs usw steuern und diverse Registerwerte wie Temperatur, W-LAN und Bluetoothzustand auslesen können. Aber irgendwie funzt das noch nicht wie es soll, aber wenigstens ist die DSDT fehlerfrei und eine Störgröße ist somit ausgegrenzt.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Akustische Punktquellensynthese</title>
      <link>https://hufschlaeger.net/projects/python/gpss-acoustic-sources/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/projects/python/gpss-acoustic-sources/</guid>
      <description>Simulation von akustischen Quellen. </description>
      <content:encoded><![CDATA[<h2 id="einleitung">Einleitung</h2>
<p>Das vorgestellte Projekt implementiert die verallgemeinerte Punktquellensynthese für akustische Quellen. Der numerische Teil ist in Cython umgesetzt,
parallelisiert und läuft in 2D oder 3D. Der Code wurde zur Berechnung von Schallfeldern beliebiger akustischer Quellen verwendet.</p>
<p>Aktuell werden folgende Geometrien unterstützt:</p>
<ul>
<li>Kreisförmig, eben,</li>
<li>Rechteckig, ebene,</li>
<li>Kugelförmig gekrümmt, kreisförmig,</li>
<li>Kugelförmig gekrümmt, rechteckig.</li>
</ul>
<h2 id="beispiele">Beispiele</h2>
<p>Dieser Beispielabschnitt ist in drei Unterabschnitte unterteilt: &ldquo;Einfach&rdquo;, &ldquo;Phased-Array&rdquo; und &ldquo;Fortgeschritten&rdquo;.</p>
<h3 id="einfach">Einfach</h3>
<p>Der Abschnitt „einfach“ behandelt Einzelwandler mit verschiedenen Geometrien (rechteckig und kreisförmig) sowie gekrümmte Einzelwandler (kugelförmig gekrümmte kreisförmige und rechteckige Quellen), da diese in der Ultraschallprüfung sehr verbreitet sind.</p>
<h4 id="kreisförmige-quellen">Kreisförmige Quellen</h4>
<p>Kreisförmige Quellen sind bei planaren Wandlern und/oder Lautsprechern sehr verbreitet. Der vollständige Beispielcode für beide Ausbreitungsebenen findet sich
m Repository. Da ein Kreis symmetrisch ist, ist auch das resultierende Schallfeld symmetrisch, das heißt die Laufzeit aller Elementarwellen zum aktuellen Punkt der Berechnung ist identisch. Man könnte also aufgrund der Symmetrie auf die Berechnung der zweiten Ebene und auf des dreidimensionalen Schallfelds verzichten da die Ergebnisse für die
XZ- und YZ-Ebene identisch sind.</p>
<h4 id="code-und-erklärung-der-wichtigsten-schritte">Code und Erklärung der wichtigsten Schritte:</h4>
<p>Zuerst müssen wir einige Parameter definieren, wie die Mittenfrequenz $f_m$  und die Schallgeschwindigkeit $c$  des Ausbreitungsmediums.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Mittenfrequenz der Pulsquelle</span>
</span></span><span class="line"><span class="cl"><span class="n">fm</span> <span class="o">=</span> <span class="mf">250e3</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="mi">343</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Räumliche Auflösung (sollte mindestens ein Fünftel der Wellenlänge betragen)</span>
</span></span><span class="line"><span class="cl"><span class="n">ds</span> <span class="o">=</span> <span class="p">(</span><span class="n">c</span> <span class="o">/</span> <span class="n">fm</span><span class="p">)</span> <span class="o">/</span> <span class="mi">5</span>
</span></span></code></pre></div><p>Im nächsten Schritt definieren wir den Berechnungsbereich und erstellen unser zweidimensionales Rechengitter.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mf">20e-3</span><span class="p">,</span> <span class="mf">20e-3</span><span class="p">,</span> <span class="n">ds</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mf">20e-3</span><span class="p">,</span> <span class="mf">20e-3</span><span class="p">,</span> <span class="n">ds</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">200e-3</span><span class="p">,</span> <span class="n">ds</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Gitter erstellen</span>
</span></span><span class="line"><span class="cl"><span class="n">Xmesh</span><span class="p">,</span> <span class="n">Zmesh</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Z</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Ymesh</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">Xmesh</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Resultierendes Druckfeld</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="n">Ymesh</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
</span></span></code></pre></div><p>Da wir eine kreisförmige Quelle modellieren möchten, können wir die integrierte Funktion BuildCircularSource verwenden, die nur den Radius und die räumliche Auflösung benötigt. Der folgende Code definiert einen Radius von 10 mm und gewichtet jedes Berechnungselement.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Akustische Quelle erstellen</span>
</span></span><span class="line"><span class="cl"><span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span> <span class="o">=</span> <span class="n">GPSS</span><span class="o">.</span><span class="n">BuildCircularSource</span><span class="p">(</span><span class="n">ds</span><span class="p">,</span> <span class="mf">10e-3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Amplitudengewichtung</span>
</span></span><span class="line"><span class="cl"><span class="n">I0</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">Xs</span><span class="o">.</span><span class="n">size</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Berechnung des resultierenden zweidimensionalen komplexen Feldes</span>
</span></span><span class="line"><span class="cl"><span class="n">Is</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="n">Xs</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">*</span> <span class="n">I0</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Jedes Berechnungselement hat die gleiche Phasenabhängigkeit, </span>
</span></span><span class="line"><span class="cl"><span class="c1"># was einem Feld aus Nullen entspricht.</span>
</span></span><span class="line"><span class="cl"><span class="n">Phs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">Xs</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Damit</span> <span class="n">sind</span> <span class="n">wir</span> <span class="n">bereit</span><span class="p">,</span> <span class="n">die</span> <span class="n">Berechnung</span> <span class="n">auszuführen</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Berechnung starten</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">GPSS</span><span class="o">.</span><span class="n">run_calc_2d</span><span class="p">(</span><span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span><span class="p">,</span> <span class="n">Phs</span><span class="p">,</span> <span class="n">fm</span><span class="p">,</span> <span class="n">Xmesh</span><span class="p">,</span> <span class="n">Ymesh</span><span class="p">,</span> <span class="n">Zmesh</span><span class="p">,</span> <span class="n">Is</span><span class="p">)</span>
</span></span></code></pre></div><figure>
    <img loading="lazy" src="/img/python-gpss/exam_circular_shaped_XZ.png"
         alt="2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle."/> <figcaption>
            <p>2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle.</p>
        </figcaption>
</figure>

<h4 id="rechteckige-quellen">Rechteckige Quellen</h4>
<p>Rechteckige Quellen unterscheiden sich darin, dass die Laufzeit der Elementarpunkte eines Kreises auf der Wandleroberfläche, bezogen auf einen beliebigen Fixpunkt, nicht mehr gleich sind. Oder anders ausgedrückt es einen Unterschied in der Phase existiert. Das führt wiederum zu Interferenzeffekten, die mit der Kantenlänge korreliert. Die unmittelbare Folge daraus ist die Existenz von zwei akustischen Fokus-/Brennpunkten. Das Ganze kann natürlich simuliert werden.</p>
<figure>
    <img loading="lazy" src="/img/python-gpss/exam_rectangular_shaped_XZ.png"
         alt="2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle."/> <figcaption>
            <p>2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/img/python-gpss/exam_rectangular_shaped_YZ.png"
         alt="2D Schallfeld der YZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle."/> <figcaption>
            <p>2D Schallfeld der YZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle.</p>
        </figcaption>
</figure>

<h4 id="kreisförmige-und-sphärisch-gekrümmte-quellen">Kreisförmige und sphärisch gekrümmte Quellen</h4>
<p>Vergleicht man die Ergebnisse der kreisförmigen  und rechteckigen Quellen und bedient sich der Idee der Laufzeitunterschiede, so ist es möglich die Lage des akustischen Fokus-/Brennpunktes zu beeinflussen. Diese Beeinflussung kann passiv, durch Krümmung der Fläche, oder aktiv durch mehrere Wandler und eine unabhängig Ansteuerung dieser erreicht werden. Bei der passiven Methode werden die Flächen sphärisch oder zylindrisch gekrümmt. Ein Beispiel für die sphärische Krümmung:</p>
<figure>
    <img loading="lazy" src="/img/python-gpss/exam_circular_shaped_spherical_curved_XZ.png"
         alt="2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle."/> <figcaption>
            <p>2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle.</p>
        </figcaption>
</figure>

<h3 id="phased-array">Phased-Array</h3>
<p>„Phased-Array“ führt Wandler ein, die aus mehreren Quellen bestehen. Das Anregungssignal jedes Elements kann phasenverschoben zu seinem Nachbarelement sein.
Dadurch sind Strahlschwenkung, aktive Fokussierung oder beides gleichzeitig möglich.</p>
<h3 id="fortgeschritten">Fortgeschritten</h3>
<p>&ldquo;Fortgeschritten&rdquo; umfasst alle weiteren Anwendungen. Da die Implementierung das Schallfeld in drei Dimensionen berechnen kann,
sind auch dreidimensionale Simulationen für Probleme ohne Symmetrielösungen möglich. Zudem ist der Code in der Lage, thermo-akustische Quellen zu simulieren.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ansible Module für SOAP Requests</title>
      <link>https://hufschlaeger.net/projects/devops/ansible-soap-module/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/projects/devops/ansible-soap-module/</guid>
      <description>Einfaches Einbinden von SOAP-Calls in Ansible.</description>
      <content:encoded><![CDATA[<p>Beruflich muss ich oft eine SOAP-API bedienen, um beispielsweise Testdaten einzupflegen oder Ähnliches.
Das sind natürlich repetitive Aufgaben, die automatisiert gehören. Da ich für viele Systeme
Ansible benutze, habe ich mich entschieden, ein Ansible-Modul zu schreiben, das diese Aufgaben
für mich in Zukunft erledigt.</p>
<blockquote>
<p>Hinweis: Dieses Modul kapselt SOAP-Requests so, dass sie sich wie native Ansible-Tasks anfühlen. Ideal für Testdaten-Setup, Stammdatenpflege oder einfache Integrationen.</p>
</blockquote>
<h2 id="features">Features</h2>
<ul>
<li>🚿 SOAP-Requests mit minimalem YAML</li>
<li>✅ Response-Validierung (Statuscode und Body)</li>
<li>🧾 Header-Unterstützung (z. B. Content-Type, Auth)</li>
<li>🔁 SOAP 1.1 und 1.2</li>
<li>🧭 Namespace- und Prefix-Support</li>
<li>🌳 Frei wählbares Body-Root-Tag</li>
<li>🧩 Body bequem als Dictionary definierbar</li>
<li>🎯 SOAP-Action-Support</li>
<li>⏱️ Timeout-Handling</li>
<li>🔐 SSL/Cert-Validierung</li>
</ul>
<h3 id="voraussetzungen">Voraussetzungen</h3>
<ul>
<li>Ansible installiert (&gt;= 2.12)</li>
<li>Python 3.10+</li>
</ul>
<h3 id="installation">Installation</h3>
<ul>
<li>Repository klonen: <code>git clone https://github.com/dhufe/ansible-soap</code></li>
<li>Das Modul <code>soap_request.py</code> in euren <code>library/</code>-Ordner des Playbooks legen oder als Collections-Module einbinden.</li>
</ul>
<h3 id="minimalbeispiel">Minimalbeispiel</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gather_facts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tasks</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">Einfacher SOAP-Call</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">soap_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">endpoint_url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://example.org/service&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_root_tag</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Ping&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://example.org/ns&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_dict</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Hello&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">result</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">debug</span><span class="p">:</span><span class="w"> </span><span class="l">var=result</span><span class="w">
</span></span></span></code></pre></div><h2 id="weitere-beispiele">Weitere Beispiele</h2>
<p>Den kennen bestimmt alle, die mit SOAP arbeiten und erste Tests machen wollten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</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">Test CountryInfoService</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gather_facts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</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">tasks</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="s2">&#34;Get Country Name by ISO Code&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">soap_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">endpoint_url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_action</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_dict</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">sCountryISOCode</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;DE&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_root_tag</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;CountryName&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://www.oorsprong.org/websamples.countryinfo&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace_prefix</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;web&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">headers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">Content-Type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;text/xml; charset=utf-8&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">validate_certs</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">result</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">Show CountryInfoService Result</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">debug</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">msg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Status: {{ result.status_code }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Response: {{ result.body }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Success: {{ result.success }}&#34;</span><span class="w">
</span></span></span></code></pre></div><p>Der Service konvertiert Zahlen in ausgeschriebene Wörter (also aus 200 wird zweihundert).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</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">Test NumberToDollars</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gather_facts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</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">tasks</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="s2">&#34;Number to Dollars&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">soap_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">endpoint_url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://www.dataaccess.com/webservicesserver/NumberConversion.wso&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_action</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_dict</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">dNum</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1234.56&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_root_tag</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;NumberToDollars&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://www.dataaccess.com/webservicesserver/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace_prefix</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;ns&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">headers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">Content-Type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;text/xml; charset=utf-8&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">validate_certs</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">result</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">Show NumberToDollars Result</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">debug</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">msg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Status: {{ result.status_code }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Response: {{ result.body }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Success: {{ result.success }}&#34;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</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">Test SOAP Module</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gather_facts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</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">tasks</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">Test NumberToWords Service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">soap_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">endpoint_url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://www.dataaccess.com/webservicesserver/NumberConversion.wso&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_action</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_dict</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ubiNum</span><span class="p">:</span><span class="w"> </span><span class="m">500</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">body_root_tag</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;NumberToWords&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://www.dataaccess.com/webservicesserver/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace_prefix</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;ns&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">soap_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">headers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">Content-Type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;text/xml; charset=utf-8&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">validate_certs</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">result</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">Show NumberToWords Result</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">debug</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">msg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Status: {{ result.status_code }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Response: {{ result.body }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s2">&#34;Success: {{ result.success }}&#34;</span><span class="w">
</span></span></span></code></pre></div><h2 id="tipps--hinweise">Tipps &amp; Hinweise</h2>
<ul>
<li>Für viele öffentliche Demoservices ist 1.1 die sichere Wahl.</li>
<li>Bei 1.2 ändert sich oft der Content-Type (z. B. <code>application/soap+xml</code>).</li>
<li><code>validate_certs: yes</code> ist Standard. Bei selbstsignierten Zertifikaten kann das scheitern – nur zu Testzwecken <code>no</code> setzen.</li>
<li>Lange laufende Services mit <code>timeout</code> absichern, damit Playbooks nicht hängen.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Gitlab-Todoist-Exporter</title>
      <link>https://hufschlaeger.net/projects/golang/gitlab-todoist-exporter/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/projects/golang/gitlab-todoist-exporter/</guid>
      <description>Sync Gitlab issues with Todoist.</description>
      <content:encoded><![CDATA[<p>Da ich beruflich wie privat viel mit Gitlab arbeite, verwalte ich damit natürlich auch alle Softwareprojekte. Aber meine
täglichen Aufgaben verwalte ich in der Regel aber mit Todoist und weder möchte ich private Aufgaben im beruflichen
Gitlab haben, noch möchte ich alles von Hand eintragen müssen. Meist habe ich daher in Todoist ein Projekt, wo ich nur
spärlich Aufgaben eintrage. Daher wäre ein Todoist-Exporter wirklich klasse.</p>
<p>Weiterhin ist es gerade in Meetings, die Milestones betreffen, hilfreich, sich vorab und während des Meetings Notizen
zu einzelnen Issues machen zu können. Notizen mache ich in der Regel in einem Markdown-Dokument, insofern wäre auch
ein Markdown-Exporter Klasse.</p>
<p>Gesagt, getan. Das hier vorgestellte Projekt ist genau das und bietet folgende Funktionen ✨:</p>
<ul>
<li>📄 Export der GitLab issues in eine Markdowndatei fürs Reporting oder den vereinfachten Austausch</li>
<li>✅ Direkter Export der GitLab issues nach Todoist über deren API</li>
<li>🎯 Optionales Filtern nach Milestones</li>
<li>⚙️ Flexible Konfiguration: CLI flags oder Umgebungsvariablen oder  einfach eine .env Datei</li>
<li>🐞 Verbose mode fürs Troubleshooting</li>
<li>🧰 Natürlich Cross‑platform builds via Makefile (Linux, macOS, Windows)</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Impressum</title>
      <link>https://hufschlaeger.net/impressum/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/impressum/</guid>
      <description>impressum</description>
      <content:encoded><![CDATA[<h2 id="angaben-bzgl-kontaktimpressum-gemäß--5-tmg">Angaben bzgl. Kontakt/Impressum gemäß § 5 TMG</h2>
<p>Mit folgenden Informationen sollte es möglich sein mich zu erreichen:</p>
<p>Daniel Hufschläger geb. Kotschate<br>
Eidechsenweg 1b<br>
14641 Wustermark OT Elstal<br>
+49 03323 4915123</p>
<p>E-Mail: info &lt; at &gt;hufschlaeger &lt; dot &gt; &lt; net &gt;</p>
<h2 id="haftungsausschluss-disclaimer">Haftungsausschluss (Disclaimer)</h2>
<p>Quelle: <a href="http://www.e-recht24.de">eRecht24</a></p>
<h4 id="haftung-für-inhalte">Haftung für Inhalte</h4>
<p>Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p>
<h3 id="haftung-für-links">Haftung für Links</h3>
<p>Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p>
<h3 id="urheberrecht">Urheberrecht</h3>
<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p>
<p>Quelle: <a href="http://www.e-recht24.de/muster-disclaimer.html">eRecht24</a></p>
<h2 id="datenschutz">Datenschutz</h2>
<p>Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.</p>
<p>Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.</p>
<p>Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.</p>
<p>Quelle: <a href="http://www.e-recht24.de/muster-datenschutzerklaerung.html">eRecht24</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Port expanding HAT for the Raspberry Pi</title>
      <link>https://hufschlaeger.net/projects/electronics/portexpander-hat-for-rpi/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://hufschlaeger.net/projects/electronics/portexpander-hat-for-rpi/</guid>
      <description>Extending the GPIOs of your Raspberry PI</description>
      <content:encoded><![CDATA[<h2 id="einleitung">Einleitung</h2>
<p>Bei der Entwicklung einer neuen Version unserer Heizungssteuerung habe ich mich mit mehreren Ideen auseinandergesetzt,
wie dem Entwurf einer neuen Mikrocontroller-PCB, der Verwendung eines ESPXY-Geräts oder der luxuriösesten Lösung
mit einem Raspberry Pi Board.
Alle drei Lösungen bieten unterschiedliche Grade an Leistung, Aufwand und Möglichkeiten für weitere Ideen.
In der Vergangenheit habe ich mehrere Monate damit verbracht, mit selbst entworfenen AVR-Mikrocontroller-Boards
zu experimentieren. Diese Boards kommunizieren und interagieren über ein selbst konstruiertes ISM<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>-Netzwerk,
und ich kann stolz sagen: „Seit ich sie installiert habe, haben sie die ganze Zeit funktioniert.“</p>
<p>Die Hardware ist sehr einfach: Eine selbst entworfene Stromversorgung, ein Arduino Duemilanove mit einem einfachen
Shield (von Hand gelötet und unter Verwendung herumliegender Teile) und eine Relaiskarte. Für das Frontend verwende
ich <a href="http://fhem.de/fhem.html">FHEM</a><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> und eine Reihe modifizierter und selbst geschriebener Module.</p>
<h2 id="the-reasons-why">The reasons why</h2>
<p>Die Tage werden kürzer und auch kälter. Die Arduino-basierte Lösung funktioniert sehr gut, solange wir den Deckel
nicht auf das Gehäuse setzen. Es gibt kein Problem mit der Steuerung selbst, aber das Gehäuse dämpft das RF-Signal.
Daher habe ich in einigen Fällen Signal- und Paketverluste festgestellt. Übrigens ist die elektrische Installation
nicht besonders gut, es gäbe also reichlich Aufgaben.
Jede Möglichkeit, die bestehende Einrichtung zu ändern, würde denselben Aufwand an Zeit und Geld erfordern wie das
Investieren von etwas Zeit in die Erstellung einer neuen, zuverlässigeren Lösung mit Raum für einige zusätzliche,
aber derzeit unnötige Verbesserungen.</p>
<p>In der letzten Woche habe ich mich mit der Idee beschäftigt, ein UniPi-Board zu kaufen. Leider bin ich stark in Bezug
auf Platz eingeschränkt, sodass das UniPi nicht passen würde, und ich habe mich entschieden,
etwas Freizeit (gesammelte Überstunden) für den Entwurf der neuen Steuerung zu verwenden.</p>
<p>Der Neuentwurf basiert auf einem Raspberry Pi 3 und einem B+ HAT<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.
Das HAT selbst war die Hauptaufgabe, da der hochintegrierte Embedded-PC mit vielen netten Features ausgestattet ist.
Zum Beispiel mit onboard Ethernet- und Wireless-LAN<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>-Controller und muss nur mit etwas Elektronik erweitert werden.
In meinem Fall bedeutet das, dass ich eine Art GPIO<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>-Erweiterung entwerfen muss, wie ein Port-Expanding-Gerät.</p>
<figure>
    <img loading="lazy" src="/img/RPI-Io-Board-Eagle.png"
         alt="Board on E-CAD software"/> <figcaption>
            <p>Board on E-CAD software</p>
        </figcaption>
</figure>

<p>Die PCB wurde am 1. Dezember bestellt und ist derzeit auf dem Versandweg zu mir. Es ist also Zeit,
die benötigten Teile zu sammeln.</p>
<figure>
    <img loading="lazy" src="/img/RPI-Io-Board-OSH.png"
         alt="Bord preview on OSH"/> <figcaption>
            <p>Bord preview on OSH</p>
        </figcaption>
</figure>

<h3 id="bill-of-materials-bom">Bill of Materials (BOM)</h3>
<table>
  <thead>
      <tr>
          <th>Menge</th>
          <th>Referenz(en)</th>
          <th>Beschreibung</th>
          <th>Value / Spezifikation</th>
          <th>Deviceset</th>
          <th>Device</th>
          <th>Technology / MPN (falls angegeben)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>IC1</td>
          <td>Stift- oder Buchsenleiste</td>
          <td>-</td>
          <td>RASPBERRY_PI_B+-HAT</td>
          <td>-WITH-DF</td>
          <td>Official HAT-konform</td>
      </tr>
      <tr>
          <td>1</td>
          <td>IC2</td>
          <td>Port Expander (z.B. für I/O)</td>
          <td>MCP23008P</td>
          <td>-</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>1</td>
          <td>IC3</td>
          <td>EEPROM (I²C, für HAT-Detection)</td>
          <td>24C32A</td>
          <td>24*</td>
          <td>P</td>
          <td>C32A (z.B. 24C32A)</td>
      </tr>
      <tr>
          <td>1</td>
          <td>IC4</td>
          <td>High-Side Driver</td>
          <td>UDN2981A</td>
          <td>UDN298*</td>
          <td>A</td>
          <td>1</td>
      </tr>
      <tr>
          <td>8</td>
          <td>IO1 bis IO8</td>
          <td>LED (Chip-LED)</td>
          <td>-</td>
          <td>LED</td>
          <td>CHIPLED_0805</td>
          <td>-</td>
      </tr>
      <tr>
          <td>3</td>
          <td>24V, 5V, 3V3</td>
          <td>LED (Chip-LED, Status-Anzeige)</td>
          <td>-</td>
          <td>LED</td>
          <td>CHIPLED_0805</td>
          <td>-</td>
      </tr>
      <tr>
          <td>18</td>
          <td>R1 bis R18</td>
          <td>Widerstand</td>
          <td>Versch. (z.B. 220Ω, 1k, 12k)</td>
          <td>R-EU_</td>
          <td>R0805</td>
          <td>-</td>
      </tr>
      <tr>
          <td>1</td>
          <td>RN1</td>
          <td>Widerstandsnetzwerk</td>
          <td>1k</td>
          <td>G08R</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>2</td>
          <td>C1, C2</td>
          <td>Kondensator</td>
          <td>100nF</td>
          <td>C-EU</td>
          <td>C0805</td>
          <td>-</td>
      </tr>
      <tr>
          <td>1</td>
          <td>Q1</td>
          <td>Transistor oder Schalt-Element</td>
          <td>-</td>
          <td>-</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>1</td>
          <td>OUT</td>
          <td>Terminal Block (9-polig)</td>
          <td>-</td>
          <td>AK500/9</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>11</td>
          <td>GND1 bis GND11</td>
          <td>Ground-Symbol (Layout-Element)</td>
          <td>-</td>
          <td>GND</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>3</td>
          <td>P+1, P+2, P+3</td>
          <td>Supply-Symbol (+24V, +5V, +3V3)</td>
          <td>-</td>
          <td>+*V</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>4</td>
          <td>+3V1 bis +3V4</td>
          <td>Supply-Symbol (+3V3)</td>
          <td>-</td>
          <td>+3V3</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>1</td>
          <td>WP</td>
          <td>Jumper (für Write-Protect)</td>
          <td>-</td>
          <td>JP1Q</td>
          <td>-</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<h2 id="raspberry-pi-konfigurieren">Raspberry Pi konfigurieren</h2>
<p>Da es sich um ein HAT handelt, müssen wir die zweiten I2C-Schnittstelle aktivieren. Dazu wird einfach in der config.txt
die folgende Zeile ergänzt oder abgeändert.</p>
<pre tabindex="0"><code>dtparam=i2c_arm=on
</code></pre><p>und nach einem Neustart des Systems sollte das zur Verfügung stehen.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Industrial, Scientific and Medical&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Freundliche Hausautomatisierung und Energie-Messung&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Hardware attached on top&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Local area network&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>General purpose input and output&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
