Gumulkahttps://gummu.de/2021-10-04T23:34:31+02:00ein blogSneak Preview2021-10-04T23:34:31+02:002021-10-04T23:34:31+02:00Fabian Pflugtag:gummu.de,2021-10-04:/sneak-preview.html<p>Ein Besuch der Sneak Preview</p><p>Montags ist im Astor Kino immer englische Sneak Preview mit OV Titlen.
Während der Pandemie waren die Kinos ja zu und auch als sie so langsam wieder
geöffnet haben, hat es lange gedauert bis ich wieder da war.</p>
<p>Letzte Woche wollte ich, aber es gab nur noch Plätze in der ersten Reihe,
wahrscheinlich weil viele auf den neuen Bond gehofft haben. Also habe ich mir
Dune angesehen. Nicht weil ich ihn unbedingt sehen wollte, aber weil es der
prominenteste Film gerade war und in OV Version lief. Also war es quasi auch wie
eine Sneak Preview, nur das ich schon etwas vorher den Filmnamen wusste.</p>
<p>Und wie in so manchen Sneak Previews bin ich bei der Hälfte des Filmes raus gegangen.
Er hat einfach nicht überzeugen können. Logisch voller Ungereimtheiten und
storytechnisch hat es mich auch nicht mitgerissen.</p>
<p>Heute habe ich dann einen Platz in der Sneak bekommen. Mir sogar Loge gegönnt und es hat sich gelohnt.</p>
<p>Am Anfang war ich noch extrem skeptisch. Es began gleich mit einer Szene in dem ein
Mann, der wahrscheinlich eine Frau vergewaltigen wollte von seinem Opfer erstochen
wird. Ich vermutete auf irgendeinen Horrorfilm und wolte schon rausgehen, habe mich
allerdings doch entschieden zu bleiben. Irgendwie war ich auch gespannt was kommt.</p>
<p>Und ich wurde absolut nicht enttäuscht. Es lief
<a href="https://youtu.be/xo4uoI4QBQo">Vicious Fun</a>. Ein Film, den ich normalerweise
nicht gucken würde. Ich versuche Horror/Thriller/Splatter und Co immer zu vermeiden.
Es ist einfach nichts für mich. War es nie, wird es wahrscheinlich auch nicht werden.</p>
<p>Aber dieser Film hat mich irgendwie überzeugt. Ja, die Fremdschämszene am Anfang
in der Bar hätte ich am liebsten übersprungen und wenn ich ihn auf Netflix geguckt
hätte, wäre hier der Zeitpunkt gewesen aus- oder umzuschalten, aber man sitzt
im Kino, man erträgt das gerade und für den Rest des Filmes hat es sich auch
wirklich gelohnt. Ich möchte nicht so viel vorweg nehmen. Gucke euch nicht einmal
den Trailer an, sondern einfach dem Film. Ich habe zwischendurch etliche Male
gelacht, mit dem Protagonisten mitgelitten. Mich über die Szenen gefreut und war
einfach glücklich. Es war wieder einmal genauso ein Film, für den ich in die Sneak
gehe. Ein Film, den ich im normalfall nicht gucken würde, ein Film, der mich
abschreckt und fordert, aber ein Film, der mir auch etwas anderes zeigt, mich
unterhält und der mich dazu veranlasst darüber zu schreiben wie toll ich es finde
in die Sneak zu gehen und abseits des Tellerrandes Filme zu gucken.</p>
<p>In dem Sinne, vielleicht bis zum nächsten Mal im Kino!</p>Using pass under Windows with WSL2020-03-15T00:12:20+01:002020-03-15T21:51:19+01:00Fabian Pflugtag:gummu.de,2020-03-15:/wsl-passwords-en.html<p>How to set up pass and wsl to have a good password manager under windows.</p><p>Today I got my a new SSD for my gaming PC and decided to reinstall everything
and start with a blank canvas.</p>
<p>So of course after installing the most basic tools I wanted to get my mails
working. But the only place where I have my mail password is inside my
<a href="https://www.passwordstore.org/">pass</a> folder.</p>
<p>So I started with
<a href="https://docs.microsoft.com/de-de/windows/wsl/install-win10">activating WSL</a>
and installing Ubuntu. Inside ubuntu I added my GPG key from an encrypted
USB-Stick and copied an old version of my password folder.</p>
<p>After updating the passwords I had a working environment under linux, but this
is still very inconvenient under windows to open wsl, get the password, copy
from there to clipboard and from clipboard to where I needed it to be.</p>
<h2>Copy passwords to Clipboard</h2>
<p>Here comes the power of WSL, fzf and AutoHotKey.</p>
<p>First I installed <a href="https://github.com/junegunn/fzf">fzf</a> under ubuntu, then
<a href="https://www.autohotkey.com/">AutoHotKey</a> under Windows.</p>
<p>Then I created the following Script for AutoHotKey:</p>
<div class="highlight"><pre><span></span>!^p::
Run, ubuntu.exe run pass show <span class="k">$(</span>find /home/pflug/.password-store/ -type f -iname <span class="s2">"*.gpg"</span> <span class="p">|</span> sed <span class="s1">'s/.\{4\}$//'</span> <span class="p">|</span> sed <span class="s1">'s/\(.\{28\}\)//'</span> <span class="p">|</span> /home/pflug/.fzf/bin/fzf<span class="k">)</span> <span class="p">|</span> clip.exe
<span class="k">return</span>
</pre></div>
<p>If you know the basic syntax of Autohotkey, then the first and last line should
be no surprise. My keybinding is Ctrl+Alt+P for copying a password to clipboard.</p>
<p>After <code>pass show</code> I added a little script to first print all gpg files to stdout.
Then remove the last 4 characters per line (.gpg) and after that the first 28
(/home/pflug/.password-store/). If you want to copy the script, you will
probably have to change this number.
This is then piped to fzf, which will make a fuzzy search on the input
and replace the command with the best result.</p>
<p>Now comes the magic of WSL. You can simply call Windows command inside of WSL.
So i piped my wanted password to <code>clip.exe</code>, which will copy it to
clipboard and the WSL window will close after that.</p>
<p>I then added my AutoHotKey Script to
<a href="https://www.autohotkey.com/docs/FAQ.htm#Startup">startup</a>
and the first part was done.</p>
<h2>Firefox integration</h2>
<p>I have the firefox plugin installed and would ideally like to use it with my
wsl pass folder.</p>
<p>This has been a bit trickier. First install the
<a href="https://addons.mozilla.org/de/firefox/addon/passff/">passff addon</a> to firefox.
Then install the <a href="https://github.com/passff/passff-host/releases">host-app</a> both
under linux and windows.</p>
<p>I modified bat install script under windows and removed the check for python3,
as I will not be using the python file under windows and don't have python
installed.</p>
<p>After installing both host scripts, I removed the python file under windows and
replaced the last line in the passff.bat file, which can both be found under
<code>%APPDATA%\Roaming\passff</code>.
The new last line now calls wsl and runs the python file in wsl.</p>
<div class="highlight"><pre><span></span>ubuntu.exe run export DISPLAY=:0; python3 /home/pflug/.mozilla/native-messaging-hosts/passff.py <span class="nv">%*</span>
</pre></div>
<p>Now just restart firefox and see that it partially working.</p>
<p>What is not working at the moment is entering the pin with firefox as pinentry
is done on the console and the firefox plugin does not support console input.</p>
<h3>Fixing Pinentry</h3>
<p>To fix the pinentry some more things have to be done.
First install a gui pinentry-program under linux:</p>
<div class="highlight"><pre><span></span>sudo apt install pinentry-gtk2
</pre></div>
<p>gtk2 was one that worked for me, there are more available. Choose one of your
liking.</p>
<p>After that, install a X11 server for windows like
<a href="https://sourceforge.net/projects/xming/">Xming</a> and start it.
We are already exporting the display value in our bat script. So no need for
change there and everything should now be working.</p>Erste Erweiterung für FreshRSS2020-01-19T18:01:05+01:002020-01-19T18:05:53+01:00Fabian Pflugtag:gummu.de,2020-01-19:/freshrss-blacklist.html<p>Ich habe meinen RSS Reader etwas besser gemacht.</p><p>RSS Feed sind Sammlungen von Artikeln, welche man mit einem entsprechenden
Program abrufen kann.</p>
<p>Es gab vor einigen Jahren mal Google News, welches das gemacht hat und ich viel
genutzt habe. Allerdings hat google es geschlossen und ich bin zu Feedly
gewechselt.
Dort hat mich nach einiger Zeit die ständige Werbung genervt und ich wollte
mehr Hoheit über meine Daten haben, also habe ich irgendwann auf einem meiner
Server FreshRSS installiert und bin ganz glücklich damit.</p>
<p>Ich kann dort meine ganzen Feeds aggregiert lesen und alles ist gut. Bis
<a href="https://www.heise.de/">heise</a> vor einiger Zeit dann angefangen hat ihr Heise+
Abbonement pushen zu wollen und ich jetzt ständig Teaser für teilweise
interessante Artikel in meiner Inbox habe, welche ich aber nicht lesen kann,
da ich kein Heise+ Abbonement habe.</p>
<p>Es ergibt keinen Sinn für mich, die CT und iX haben wir auf Arbeit, die TR
leiste ich mir privat, nur Heise+ ist mir die Kosten nicht Wert.</p>
<p>Bis jetzt habe ich aber keinen Weg gehabt Artikel einfach herauszufiltern aus
meinen Listen.
Klar, ich kann den Heise Feed komplett abbestellen, aber das will ich ja auch
nicht, sondern nur die nicht möglichen Artikel nicht sehen.</p>
<p>Also habe ich angefangen mich mit den Erweiterungen von FreshRSS zu
beschäftigen.
Die offizielle
<a href="https://freshrss.github.io/FreshRSS/en/developers/01_First_steps.html">Dokumentationswebseite</a>
ist eine Github-Page, die leider nicht
sonderlich hilfreich war. Aber da es eine Github Page ist, und ich gesehen habe,
dass der Link mit "01" beginnt habe ich das
<a href="https://github.com/FreshRSS/FreshRSS">Repository</a> durchsucht und die richtige
<a href="https://github.com/FreshRSS/FreshRSS/blob/master/docs/en/developers/03_Backend/05_Extensions.md">Seite</a>
gefunden.</p>
<p>Die <a href="https://github.com/kevinpapst/freshrss-dilbert">Dilbert</a> Erweiterung war
ein sehr guter Punkt zum starten und es generell zu verstehen. Es hat mir sehr
bei der ersten Version geholfen, das Artikel als gelesen markiert, welche
"heise+" im Titel haben.</p>
<p>Mit Hilfe der <a href="https://github.com/FreshRSS/Extensions/tree/master/xExtension-CustomCSS">CustomJS</a> Erweiterung habe ich verstehen können, wie die
Konfiguration von Extensions funktioniert und habe dieses verwenden können um
die Blacklist jetzt individuell gestalten zu können.</p>
<p>Mein Finaler Code ist für jeden verfügbar auf Github unter
<a href="https://github.com/gumulka/freshrss-blacklist">https://github.com/gumulka/freshrss-blacklist</a>
zu finden.</p>
<p>Ich hoffe es findet auch noch jemand anders nützlich.</p>Frohe Weihnachten2019-12-26T10:45:41+01:002019-12-26T12:46:52+01:00Fabian Pflugtag:gummu.de,2019-12-26:/weihnachten_2019.html<p>Ich wünsche allen frohe Weihnachten und ein guten Rutsch ins neues Jahr.</p>
<canvas id='scene' width='500px' height='500px' style='display: block; margin: 0 auto'></canvas>
<script src="https://gummu.de/christmas_tree.js" onload='run()'></script>
<p>Baum kopiert von <a href="https://github.com/anvaka/atree">hier</a></p>Frohe Weihnachten2019-12-26T10:45:41+01:002019-12-26T12:46:52+01:00Fabian Pflugtag:gummu.de,2019-12-26:/weihnachten_2019-en.html<p>Merry Christmas to all of you and a happy new year.</p>
<canvas id='scene' width='500px' height='500px' style='display: block; margin: 0 auto'></canvas>
<script src="https://gummu.de/christmas_tree.js" onload='run()'></script>
<p>Tree copied from <a href="https://github.com/anvaka/atree">here</a></p>Help Target im Makefile2019-12-18T11:05:09+01:002019-12-18T11:05:09+01:00Fabian Pflugtag:gummu.de,2019-12-18:/self-documenting-makefile.html<p>Ein nützliches Target um Makefiles besser zu machen.</p><p>Ich habe vor einiger Zeit angefangen Makefiles wieder verstärkt zu benutzen und
lerne dabei ein paar Sachen.
Man schreibt diese ja immer erst mal für sich selbst, aber teilweise auch im Team.</p>
<p>Gerade sitze ich an einem Projekt, wo genau das nötig ist und bin über einen
<a href="https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html">Blogeintrag</a> gestoßen, den ich äußerst hilfreich fand, aber der ein paar kleine Verbesserungen benötigt.</p>
<p>Sie schlagen dort vor ein Target help zu definieren:</p>
<div class="highlight"><pre><span></span><span class="nf">.PHONY</span><span class="o">:</span> <span class="n">help</span>
<span class="nf">help</span><span class="o">:</span>
@grep -E <span class="s1">'^[a-zA-Z_-]+:.*?## .*$$'</span> <span class="k">$(</span>MAKEFILE_LIST<span class="k">)</span> <span class="p">|</span> sort <span class="p">|</span> awk <span class="s1">'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'</span>
</pre></div>
<p>Das Ganze hat für mich nur ein paar Nachteile. Die Variable MAKEFILE_LIST enhält
eine Liste von allen Makefiles und grep gibt den Dateinamen aus, wenn mehrere
Dateien übergeben werden. Es fehlt hier also der -h Parameter.</p>
<p>Auch fände ich es schön, wenn help an sich schon dokumentiert wäre.</p>
<p>Und wenn es das bevorzugte Target ist, egal wo es steht, da ich das "sort" doch häufiger weg lasse.</p>
<p>Des weiteren arbeite ich mit Dateien, welche "." und Zahlen im Dateinamen haben können.</p>
<p>Meine help Target sieht also folgendermaßen aus:</p>
<div class="highlight"><pre><span></span><span class="c"># Make the Makefile self-documenting with this targets.</span>
<span class="c"># Targets having a comment with double # are printed out.</span>
<span class="nf">.PHONY</span><span class="o">:</span> <span class="n">help</span>
<span class="nf">help</span><span class="o">:</span> <span class="c">## Print this help message</span>
@grep -h -E <span class="s1">'^[0-9a-zA-Z._-]+:.*?## .*$$'</span> <span class="k">$(</span>MAKEFILE_LIST<span class="k">)</span> <span class="p">|</span> awk <span class="s1">'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'</span>
<span class="c"># Make this the default target</span>
<span class="nv">.DEFAULT_GOAL</span> <span class="o">:=</span> <span class="nb">help</span>
</pre></div>
<p>Wenn mein Team jetzt also jetzt make ohne Parameter aufruft bekommt es eine nützliche Nachricht mit allen Parametern, welche dokumentiert sind. Und Dokumentieren tut man ja bekanntlich alles. ;-)</p>Help target for Makefile2019-12-18T11:05:09+01:002019-12-18T11:05:09+01:00Fabian Pflugtag:gummu.de,2019-12-18:/self-documenting-makefile-en.html<p>Useful target for better a Makefile</p><p>I started using Makefiles again some time ago and I am learning a few things.
You always write them first for yourself, but sometimes in a team as well.</p>
<p>Right now I'm working on a project where that's exactly what's needed and I came across a <a href="https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html">blog entry</a> that I found extremely helpful, but that needs some small improvements.</p>
<p>They suggest to define a target help there</p>
<div class="highlight"><pre><span></span><span class="nf">.PHONY</span><span class="o">:</span> <span class="n">help</span>
<span class="nf">help</span><span class="o">:</span>
@grep -E <span class="s1">'^[a-zA-Z_-]+:.*?## .*$$'</span> <span class="k">$(</span>MAKEFILE_LIST<span class="k">)</span> <span class="p">|</span> sort <span class="p">|</span> awk <span class="s1">'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'</span>
</pre></div>
<p>The whole thing only has a few drawbacks for me. The variable MAKEFILE_LIST
contains a list of all Makefiles and grep will output the filename if there
are multiple files to be searched. So the -h parameter is missing here.</p>
<p>I also think it would be nice if help itself was already documented.</p>
<p>Also it should be the preferred target, no matter where it is,
because I often omit the "sort".</p>
<p>Furthermore, I work with files which can have "." and numbers in the file name.</p>
<p>My help target now looks like this:</p>
<div class="highlight"><pre><span></span><span class="c"># Make the Makefile self-documenting with this targets.</span>
<span class="c"># Targets having a comment with double # are printed out.</span>
<span class="nf">.PHONY</span><span class="o">:</span> <span class="n">help</span>
<span class="nf">help</span><span class="o">:</span> <span class="c">## Print this help message</span>
@grep -h -E <span class="s1">'^[0-9a-zA-Z._-]+:.*?## .*$$'</span> <span class="k">$(</span>MAKEFILE_LIST<span class="k">)</span> <span class="p">|</span> awk <span class="s1">'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'</span>
<span class="c"># Make this the default target</span>
<span class="nv">.DEFAULT_GOAL</span> <span class="o">:=</span> <span class="nb">help</span>
</pre></div>
<p>So if my team now calls make without parameters it gets a useful message with all parameters documented. And documenting you do everything. ;-)</p>Meine git-hooks2019-11-22T17:50:00+01:002019-11-22T17:50:00+01:00Fabian Pflugtag:gummu.de,2019-11-22:/git-hooks.html<p>Eine Übersicht über meine installierten git-hooks</p><h2>Generelle Struktur</h2>
<p>Da ich einige Skripte für viele bis fast alle Projekte benötigen
kann, mag ich es einen globalen Ordner für git-hooks zu haben.</p>
<p>Wenn man die <a href="https://git-scm.com/docs/githooks/2.24.0">Dokumentation</a>
anguckt, dann gibt es die Möglichkeit mit</p>
<div class="highlight"><pre><span></span>git config --global core.hooksPath ~/.githooks/
</pre></div>
<p>alle hooks in meinem Homeverzeichnis zu haben. Dieses hat jetzt nur ein Problem.
Ich verliere all hooks, welche ich local haben möchte.</p>
<p>Die beste Alternative, welche ich dazu bis jetzt gefunden habe war:</p>
<blockquote>
<p>Ach, dann mach in dem entsprechendem Repo einfach ein ´git config core.hooksPath .git/hooks/´</p>
</blockquote>
<p>Aber das möchte ich nicht machen. Ich verliere dann meine anderen globalen Hooks, sobald ich ein Skript Lokal haben möchte.</p>
<p>Meine Möglichkeit das zu umgehen sieht also das folgende vor:</p>
<div class="highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="k">for</span> hook in applypatch-msg pre-applypatch post-applypatch pre-commit pre-merge-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-push pre-receive update post-receive post-update push-to-checkout pre-auto-gc post-rewrite sendemail-validate fsmonitor-watchman p4-pre-submit post-index-change
<span class="k">do</span>
<span class="k">if</span> <span class="o">[</span> ! -e <span class="si">${</span><span class="nv">hook</span><span class="si">}</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> > <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">""</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s1">'GIT_BASE_DIR=$(git rev-parse --show-toplevel)'</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">"exitcode=0"</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">""</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">"if [ -x \${GIT_BASE_DIR}/.git/hooks/</span><span class="si">${</span><span class="nv">hook</span><span class="si">}</span><span class="s2"> ]; then"</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">" \$GIT_BASE_DIR/.git/hooks/</span><span class="si">${</span><span class="nv">hook</span><span class="si">}</span><span class="s2"> \$@ || exitcode=\$?"</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">"fi"</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">""</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">"# Please insert your checks here."</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">""</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="nb">echo</span> <span class="s2">"exit \${exitcode}"</span> >> <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
chmod a+x <span class="si">${</span><span class="nv">hook</span><span class="si">}</span>
<span class="k">fi</span>
<span class="k">done</span>
</pre></div>
<p>Dieses Skript erstellt für jeden möglichen hook ein neues Skript, welches
zuerst im lokalen .git/hooks Verzeichnis nachguckt ob ein Skript
existiert und es ausführt.</p>
<p>Ein paar Sachen auf die dabei zu achten sind:</p>
<ol>
<li>Git kann Parameter übergeben (die meisten Skripte)</li>
<li>Git kann Informationen in das Skript reinpipen (pre-push, pre-receive, post-receive)</li>
<li>Git kann eine Ausgabe erwarten (pre-receive, update, post-receive, post-update, fsmonitor-watchman)</li>
</ol>
<p>Meine Lösung dafür ist:</p>
<ol>
<li>$@ übergibt alle Parameter des Skriptes an das Unterskript</li>
<li>Siehe pre-push</li>
<li>Ich benutze sie einfach nicht. Hier sind es hauptsächlich Server-Skripte, welche bei mir nicht eingesetzt werden.</li>
</ol>
<p>Damit habe ich jetzt globale Skripte, welche keinen Unterschied zu localen Skripten darstellen. Nur kann ich sie noch erweitern und genau das habe ich für einige auch gemacht.</p>
<h2>commit-msg</h2>
<h3>Rechtschreibung</h3>
<p>Meinen commit-msg hook habe ich von <a href="http://wadmiraal.net/lore/2014/07/14/how-git-hooks-made-me-a-better-and-more-lovable-developer/">hier</a> übernommen. Ich habe es nur um das grep erweitert um die Kommentare von der Prüfung auszuschließen.</p>
<div class="highlight"><pre><span></span><span class="nv">ASPELL</span><span class="o">=</span><span class="k">$(</span>which aspell<span class="k">)</span>
<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 class="nb">echo</span> <span class="s2">"Aspell not installed - unable to check spelling"</span> ><span class="p">&</span><span class="m">2</span>
<span class="k">else</span>
<span class="nv">WORDS</span><span class="o">=</span><span class="k">$(</span>grep -v -e <span class="s2">"^#"</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="p">|</span> <span class="nv">$ASPELL</span> list <span class="k">)</span>
<span class="k">fi</span>
<span class="k">if</span> <span class="o">[</span> -n <span class="s2">"</span><span class="nv">$WORDS</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\e[1;33mPossible spelling errors found in commit message. Use git commit --amend to change the message.\nPossible mispelled words: "</span> <span class="nv">$WORDS</span> <span class="s2">".\e[0m"</span> ><span class="p">&</span><span class="m">2</span>
<span class="k">fi</span>
</pre></div>
<p>Ein einfaches Skript, welches guckt, ob die Commit Message Rechtschreibfehler enthält, da sich ja doch ab und zu welche einschleichen.</p>
<h2>pre-commit</h2>
<h3>Standartskripte</h3>
<p>Hier benutzte ich das Beispiel-Skript, da es eine vernünftige
Grundfunktionalität besitzt, welche ich eigentlich gerne überall hätte.
Nur den letzten Befehl habe ich etwas überarbeitet indem ich das exec
entfernt habe um danach noch weiter schreiben zu können.</p>
<div class="highlight"><pre><span></span><span class="k">if</span> git rev-parse --verify HEAD >/dev/null <span class="m">2</span>><span class="p">&</span><span class="m">1</span>
<span class="k">then</span>
<span class="nv">against</span><span class="o">=</span>HEAD
<span class="k">else</span>
<span class="c1"># Initial commit: diff against an empty tree object</span>
<span class="nv">against</span><span class="o">=</span><span class="k">$(</span>git hash-object -t tree /dev/null<span class="k">)</span>
<span class="k">fi</span>
<span class="c1"># Cross platform projects tend to avoid non-ASCII filenames; prevent</span>
<span class="c1"># them from being added to the repository. We exploit the fact that the</span>
<span class="c1"># printable range starts at the space character and ends with tilde.</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$(</span>git config --bool hooks.allownonascii<span class="k">)</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">"true"</span> <span class="o">]</span> <span class="o">&&</span>
<span class="c1"># Note that the use of brackets around a tr range is ok here, (it's</span>
<span class="c1"># even required, for portability to Solaris 10's /usr/bin/tr), since</span>
<span class="c1"># the square bracket bytes happen to fall in the designated range.</span>
<span class="nb">test</span> <span class="k">$(</span>git diff --cached --name-only --diff-filter<span class="o">=</span>A -z <span class="nv">$against</span> <span class="p">|</span>
<span class="nv">LC_ALL</span><span class="o">=</span>C tr -d <span class="s1">'[ -~]\0'</span> <span class="p">|</span> wc -c<span class="k">)</span> !<span class="o">=</span> <span class="m">0</span>
<span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\e[1;31mCommiting on master is not allowed!\e[0m"</span>
<span class="nb">echo</span> -e <span class="s2">"To allow commit on master for this repo execute:\n"</span>
<span class="nb">echo</span> -e <span class="s2">"\tgit config --local --add hooks.allownonascii true\n"</span>
<span class="nv">exitcode</span><span class="o">=</span><span class="m">1</span>
<span class="k">fi</span>
<span class="c1"># If there are whitespace errors, print the offending file names and fail.</span>
git diff-index --check --cached <span class="nv">$against</span> -- <span class="o">||</span> <span class="nv">exitcode</span><span class="o">=</span><span class="nv">$?</span>
</pre></div>
<h3>Master schützen</h3>
<p>Es gibt allerdings noch eine kleine Erweiterung. Ich möchte nicht unbedingt
auf master commiten, da ich denke ein jeder kann und sollte mit feature und
development branches arbeiten, also verbiete ich es mir einfach generell.</p>
<div class="highlight"><pre><span></span><span class="c1"># Check where out HEAD is at</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$(</span>git symbolic-ref --short HEAD<span class="k">)</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"master"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$(</span>git config --bool --get hooks.allowcommitonmaster<span class="k">)</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">"true"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\e[1;31mCommiting on master is not allowed!\e[0m"</span>
<span class="nb">echo</span> -e <span class="s2">"To allow commit on master for this repo execute:\n"</span>
<span class="nb">echo</span> -e <span class="s2">"\tgit config --local --add hooks.allowcommitonmaster true\n"</span>
<span class="nv">exitcode</span><span class="o">=</span><span class="m">1</span>
<span class="k">fi</span>
<span class="k">fi</span>
</pre></div>
<p>In manchen Repositories ist es allerdings unerlässlich und damit ich den Befehl
dafür niemals vergesse schreibe ich ihn gleich in die Fehlermeldung mit rein.</p>
<h3>Python linter</h3>
<p>Da ich in letzter Zeit viel in Python programmiere, habe ich zuerst angefangen
für viele Projekte einen Linter im CI-File zu installieren, aber ich würde den
check auch gerne schon vorher haben.
Also filtere ich alle python Dateien raus, welche im Commit vorkommen, und sollte
dieses nicht leer sein, dann werden nur diese durch den linter durchgeschickt:</p>
<div class="highlight"><pre><span></span><span class="c1"># Do a linting for all modified python files.</span>
<span class="nv">pythonfiles</span><span class="o">=</span><span class="k">$(</span>git diff --name-only --cached <span class="p">|</span> grep .py <span class="p">|</span> xargs<span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="si">${</span><span class="nv">pythonfiles</span><span class="si">}</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">""</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c1"># color output, dont print gobal score, and use numcpu threads</span>
pylint --persistent<span class="o">=</span>n --jobs<span class="o">=</span><span class="m">0</span> --score<span class="o">=</span>n --output-format<span class="o">=</span>colorized <span class="si">${</span><span class="nv">pythonfiles</span><span class="si">}</span> <span class="o">||</span> <span class="nv">exitcode</span><span class="o">=</span><span class="nv">$?</span>
<span class="k">fi</span>
</pre></div>
<h2>pre-push</h2>
<h3>Skript-Probleme</h3>
<p>Bash übergibt Standartmäßig alle nicht genutzten Parameter der Standarteingabe
an das aufgerufene Skript. Was für unseren Standartworkflow genau das ist,
was wir benötigen. Sollte man jedoch einmal selbst auch die Eingaben
verarbeiten wollen benötigt man etwas mehr. Ich kann jetzt leider nicht
die Eingaben einfach doppelt verarbeiten, sondern muss sie in einer temporären
Variable speichern. Dieses sieht dann folgendermaßen aus:</p>
<div class="highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="nv">OPERANDS</span><span class="o">=</span><span class="k">$(</span>cat<span class="k">)</span>
<span class="nv">GIT_DIR</span><span class="o">=</span><span class="k">$(</span>git rev-parse --show-toplevel<span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> -x <span class="si">${</span><span class="nv">GIT_DIR</span><span class="si">}</span>/.git/hooks/pre-push <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="si">${</span><span class="nv">OPERANDS</span><span class="si">}</span><span class="s2">"</span> <span class="p">|</span> <span class="nv">$GIT_DIR</span>/.git/hooks/pre-push <span class="o">||</span> <span class="nv">exitcode</span><span class="o">=</span><span class="nv">$?</span>
<span class="k">fi</span>
</pre></div>
<h3>testing</h3>
<p>Was ich nett fand war die Möglichkeit teure pre-commit skripte erst bei <a href="https://github.com/dflourusso/pre-push">pre-push auszuführen</a>. Aber das muss ich erst noch ausbauen und die Programmierumgebung/Sprache entdecken.</p>
<p>Irgendwas in der Richtung wird da aber noch kommen.</p>
<h3>Server abstellen</h3>
<p>Es gibt auf meiner Arbeit einen git Server, welcher obsolet geworden ist, da die meisten Projekte auf einen anderen umgezogen sind.
Eigentlich habe ich alle Repositories umgestellt, aber falls es nicht der
Fall sein sollte, dann wird hier verhindert, auf genau diesen zu puschen. (Beispiel auf den Umzug von github zu gitlab erstellt)</p>
<div class="highlight"><pre><span></span><span class="k">if</span> <span class="o">[[</span> <span class="nv">$2</span> <span class="o">=</span>~ <span class="s2">"github.com:gumulka88"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\e[1;31mThou shall not push to </span><span class="nv">$2</span><span class="s2">!\e[0m"</span>
<span class="nb">echo</span> <span class="s2">"Change url to the new server with:"</span>
<span class="nv">newurl</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$2</span><span class="s2">"</span> <span class="p">|</span> sed <span class="s1">'s/github.com:gumulka88/gitlab.com:gumulka/g'</span><span class="k">)</span>
<span class="nb">echo</span> -e <span class="s2">"\n\tgit remote set-url </span><span class="nv">$1</span><span class="s2"> </span><span class="si">${</span><span class="nv">newurl</span><span class="si">}</span><span class="s2">\n"</span>
<span class="nv">exitcode</span><span class="o">=</span><span class="m">1</span>
<span class="k">fi</span>
</pre></div>
<h3>README und LICENSE</h3>
<p>Ich mache häufiger mal ein ganz kleines Repo um irgendein Skript zu
speichern, welches ich ich erstellt habe, und Monate später komme ich
darauf zurück und denke mir:</p>
<blockquote>
<p>Was wollte ich noch einmal damit genau und wie kann ich es ändern?</p>
</blockquote>
<p>oder aber:</p>
<blockquote>
<p>Was waren noch mal die Vorbedingungen für diesen Code?</p>
</blockquote>
<p>Hier wäre es doch super, wenn ich eine README angelegt hätte. Oder aber
ich finde irgendwo im Netz ein tolles Projekt, welches aber leider nicht
mehr weiter entwickelt wird und keine Lizenz hat und es rechtlich
schwierig ist, das einfach so zu benutzen im Firmenumfeld. Also lass mich
doch dafür sorgen, dass wenigstens ich immer eine Lizenz habe.
Das muss nicht beim ersten Commit passieren, wohl aber, wenn ich es veröffentliche.</p>
<p>Ich habe schon die Variable GIT_BASE_DIR, welche auf mein Stammverzeichnis zeigt. Jetzt muss ich nur noch gucken, ob die Dateien existieren.</p>
<div class="highlight"><pre><span></span><span class="k">for</span> checking in README LICENSE<span class="p">;</span> <span class="k">do</span>
<span class="nv">lower</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="si">${</span><span class="nv">checking</span><span class="si">}</span><span class="s2">"</span> <span class="p">|</span> tr <span class="s1">'[:upper:]'</span> <span class="s1">'[:lower:]'</span><span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$(</span>ls <span class="nv">$GIT_BASE_DIR</span> <span class="p">|</span> grep -i <span class="si">${</span><span class="nv">checking</span><span class="si">}</span><span class="k">)</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">""</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$(</span>git config --bool --get hooks.pushwithout<span class="si">${</span><span class="nv">lower</span><span class="si">}</span><span class="k">)</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">"true"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\e[1;31mYou must have a </span><span class="si">${</span><span class="nv">checking</span><span class="si">}</span><span class="s2">!\e[0m"</span>
<span class="nb">echo</span> -e <span class="s2">"To allow pushing without a </span><span class="si">${</span><span class="nv">checking</span><span class="si">}</span><span class="s2"> for this repo execute:\n"</span>
<span class="nb">echo</span> -e <span class="s2">"\tgit config --local --add hooks.pushwithout</span><span class="si">${</span><span class="nv">lower</span><span class="si">}</span><span class="s2"> true\n"</span>
<span class="nv">exitcode</span><span class="o">=</span><span class="m">1</span>
<span class="k">fi</span>
<span class="k">fi</span>
<span class="k">done</span>
</pre></div>Automatisches Erstellen2019-02-19T13:14:18+01:002019-11-06T11:34:54+01:00Fabian Pflugtag:gummu.de,2019-02-19:/hooks-runner.html<p>Gitlab runner war einfacher als Hooks</p><p>Zuerst habe ich mir überlegt wie ich es wohl schaffen könnte mit Hooks
die Webseite automatisch auszuliefern, aber die Sache, dass Git mir nicht
erlaubt in einem Bare repo Sachen auszuchecken und ich in einem ausgecheckten
Repo nicht puschen kann macht es etwas komplizierter.</p>
<p>Da ich seit Monaten schon verschiedene Runner für Gitlab auf Arbeit betreibe,
war es einfacher einen auf meinem Webserver zu installieren und ihm Schreibrechte
auf dem Ordner mit meinem Blog zu geben.</p>
<p>Dazu musste ich nur das Makefile um ein Target für den Server erweitern, einen Runner
installieren und ein CI Skript schreiben.</p>
<p>Anbei die Ergänzungen am Makefile und mein CI Skript:</p>
<div class="highlight"><pre><span></span><span class="nv">PUBLISHDIR</span><span class="o">=</span>/var/www/blog
<span class="nf">server-publish</span><span class="o">:</span>
<span class="k">$(</span>PELICAN<span class="k">)</span> <span class="k">$(</span>INPUTDIR<span class="k">)</span> -o <span class="k">$(</span>PUBLISHDIR<span class="k">)</span> -s <span class="k">$(</span>PUBLISHCONF<span class="k">)</span> <span class="k">$(</span>PELICANOPTS<span class="k">)</span>
</pre></div>
<div class="highlight"><pre><span></span><span class="nt">publish</span><span class="p">:</span>
<span class="nt">script</span><span class="p">:</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">rm -rf /var/www/blog/drafts/</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">make server-publish</span>
</pre></div>Automatic publishing2019-02-19T13:14:18+01:002019-11-06T11:34:54+01:00Fabian Pflugtag:gummu.de,2019-02-19:/hooks-runner-en.html<p>Gitlab runner was way easier then hooks</p><p>First, I was thinking about how I might make it with Hooks to deliver
a site automatically, but the thing that Git does not allows to me
in a Bare repo to check things out and to a checked out
Repo I can't push, makes it a little more complicated.</p>
<p>Since I have been running several runners for Gitlab for months now,
it was easier to install one on my web server and give it write permissions
on the folder with my blog.</p>
<p>All I had to do was add a target for the server to the Makefile, a Runner
and write a CI script.</p>
<p>Makefile snippet and CI script attached:</p>
<div class="highlight"><pre><span></span><span class="nv">PUBLISHDIR</span><span class="o">=</span>/var/www/blog
<span class="nf">server-publish</span><span class="o">:</span>
<span class="k">$(</span>PELICAN<span class="k">)</span> <span class="k">$(</span>INPUTDIR<span class="k">)</span> -o <span class="k">$(</span>PUBLISHDIR<span class="k">)</span> -s <span class="k">$(</span>PUBLISHCONF<span class="k">)</span> <span class="k">$(</span>PELICANOPTS<span class="k">)</span>
</pre></div>
<div class="highlight"><pre><span></span><span class="nt">publish</span><span class="p">:</span>
<span class="nt">script</span><span class="p">:</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">rm -rf /var/www/blog/drafts/</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">make server-publish</span>
</pre></div>Ein weiterer Blogversuch2019-02-19T10:26:20+01:002019-11-06T11:34:54+01:00Fabian Pflugtag:gummu.de,2019-02-19:/first.html<p>Ich versuche einmal wieder einen Blog zu schreiben.</p><p>Ich versuche einmal wieder einen Blog zu schreiben.</p>
<p>Dieses Mal mit Markdown und <a href="https://blog.getpelican.com/">pelican</a>.
Ich habe mir dazu das Template von <a href="https://github.com/jody-frankowski/blue-penguin">Blue Penguin</a>
etwas angepasst, da mir Grün besser gefällt als Blau, aber ich muss da noch einiges machen.
Wahrscheinlich wird es noch ein paar mal wechseln.</p>
<p>Gerade überlege ich, wie ich die Veröffentlichung mittels git-hooks hinbekomme.
Wenn ich es fertig habe, dann werde ich sicherlich darüber schreiben.</p>Ein weiterer Blogversuch2019-02-19T10:26:20+01:002019-11-06T11:34:54+01:00Fabian Pflugtag:gummu.de,2019-02-19:/first-en.html<p>I'm trying again to write a blog.</p><p>I'm trying again to write a blog.</p>
<p>This time with Markdown and <a href="https://blog.getpelican.com/">pelican</a>.
For this, I've changed a bit the template from <a href="https://github.com/jody-frankowski/blue-penguin">Blue Penguin</a>,
because I like green much better then blue. But there a still a few things left to be done.
Probably I will change a the template a few times, but let's see.</p>
<p>At the moment I'm thinking how to ge the publishing done via git hooks.
I'll be reporting back if I have it done.</p>