Marix.orghttps://marix.org/2024-03-24T00:00:00+01:00Am Linuxrechner Bluetooth per USB nachrüsten2024-03-24T00:00:00+01:002024-03-24T00:00:00+01:00Matthias Bachtag:marix.org,2024-03-24:/am-linuxrechner-bluetooth-per-usb-nachrusten.html<p>Ich brauchte kürzlich an meinem gut abgehangenen Desktop-Rechner dann doch mal die Möglichkeit meine Sony-Kopfhörer per Bluetooth zu verbinden.
Da Bluetooth vor 10 Jahren allerdings für Hauptplatinen von normalen Rechnern noch nicht üblich war, hat mein Rechner kein Bluetooth.
Ich habe deshalb jetzt, ohne große Recherche und nur von der …</p><p>Ich brauchte kürzlich an meinem gut abgehangenen Desktop-Rechner dann doch mal die Möglichkeit meine Sony-Kopfhörer per Bluetooth zu verbinden.
Da Bluetooth vor 10 Jahren allerdings für Hauptplatinen von normalen Rechnern noch nicht üblich war, hat mein Rechner kein Bluetooth.
Ich habe deshalb jetzt, ohne große Recherche und nur von der spontanen Verfügbarkeit getrieben, einen BT-8500 von Edimax gekauft.
In den USB-Port eingesteckt poppte im KDE sofort das Bluetooth-Applet auf und ich könnte die Kopfhörer verbinden.
Die Verbindung zu den Kopfhörer ist auch richtig stabil, mindestens genau so gut wie vom Fairphone.</p>
<p>Wie gut der Adapter für andere Szenarien geeignet ist kann ich nicht sagen.
Aber wer sich fragt ob ein Edimax BT-8500 unter openSUSE Leap 15.5 für Bluetooth-Audio funktioniert: das geht komplett ohne Bastelei.</p>Dynamisches Laden von Kernelmodulen beim Zugriff durch Nutzer2024-03-14T00:00:00+01:002024-03-14T00:00:00+01:00Matthias Bachtag:marix.org,2024-03-14:/dynamisches-laden-von-kernelmodulen-beim-zugriff-durch-nutzer.html<p>Ich stolperte letztens über ein paar alte Image-Dateien welche damals wohl mit CloneCD angefertigt worden waren.
Damit liesen sie sich nicht so einfach über die üblichen Linux-Boardmittel einbinden.
Und extra ein Windows zu booten um Virtual CloneDrive zu nutzen wäre ja auch irgendwie unsportlich.
Zum Glück gibt es die hervorragende …</p><p>Ich stolperte letztens über ein paar alte Image-Dateien welche damals wohl mit CloneCD angefertigt worden waren.
Damit liesen sie sich nicht so einfach über die üblichen Linux-Boardmittel einbinden.
Und extra ein Windows zu booten um Virtual CloneDrive zu nutzen wäre ja auch irgendwie unsportlich.
Zum Glück gibt es die hervorragende Software <a href="http://cdemu.org/">CDEmu</a>, welche diese Abbilder im CUE/BIN-Format als virtuelles Laufwerk einbinden kann.</p>
<p>Damit der, für <a href="http://cdemu.org/">CDEmu</a> nötige, Kerneltreiber nur bei Bedarf geladen wird, das aber transparent und ohne Root-Rechte funktioniert, müssen einige Mechanismen ineinandergreifen welche zwar alle Dokumentiert, aber erstaunlich schwer durch Suchen zu finden sind wenn man die entscheidenden Begriffe noch nicht kennt.</p>
<ul>
<li>Um die Gerätedateien für die nachzuladenden Module beim Start des Systems anzulegen gibt es <a href="https://www.man7.org/linux/man-pages/man8/depmod.8.html"><code>modules.devname</code></a>. Kernelmodule können also angeben, dass sie eine Gerätedatei brauchen und diese wird beim Start angelegt.</li>
<li>Auf Systemen mit Systemd kennt <a href="https://www.man7.org/linux/man-pages/man7/udev.7.html">udev</a> das spezielle Tag <code>uaccess</code>. Wird dieses auf einer Gerätedatei gesetzt, so wird dynamisch die ACL an dieser Datei so gesetzt, dass aktuell angemeldete Nutzer auf diese Zugreifen können.</li>
<li>Die Regeln von <a href="https://www.man7.org/linux/man-pages/man7/udev.7.html">udev</a> werden eigentlich durch das Laden der Kernelmodule, bzw. das Auftauchen von Gerätedateien ausgelöst. Die per <code>modules.devname</code> angelegten Dateien lösen diese Regeln aber nicht aus. <a href="https://www.man7.org/linux/man-pages/man7/udev.7.html">udev</a> kennt aber die Option <code>static_node</code> welche <a href="https://www.man7.org/linux/man-pages/man7/udev.7.html">udev</a> anweist die Regel auch auf die Platzhalterdatei anzuwenden.</li>
</ul>
<p>Erst in der Kombination der drei Mechanismen ist es ohne Root, nur mit Login, möglich ein Modul wie den Treiber für das virtuelle Laufwerk dynamisch nachzuladen. Ein weiteres Beispiel für eine <a href="https://www.man7.org/linux/man-pages/man7/udev.7.html">udev</a>-Regel welche diese Mechanismen nutzt findet sich übrigens <a href="https://github.com/ValveSoftware/steam-for-linux/issues/4794">bei der vom Steam-Controller genutzten Datei <code>/dev/uinput</code></a>:</p>
<pre><code>KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput"
</code></pre>
<p><a href="http://cdemu.org/">CDEmu</a> wirft, wenn die Berechtigungen nicht korrekt gesetzt sind übrigens folgende Fehlermeldung:</p>
<pre><code>FEHLER: Fehler beim Verbunden zum CDEmu Daemon: g-io-error-quark: Error calling StartServiceByName for net.sf.cdemu.CDEmuDaemon: Timeout was reached (24)
</code></pre>
<p>Ein Blick in das Log des Daemons mit dem sich <code>cdemu</code> zu verbinden sucht zeigte dann, dass der Service nicht die Berechtigung hat auf den virtuellen Gerätetreiber zuzugreifen:</p>
<pre><code>cdemu0: Kernel I/O: failed to open control device /dev/vhba_ctl: Keine Berechtigung!
</code></pre>Minecraft auf openSUSE Leap 15.52024-01-06T15:00:00+01:002024-01-06T15:00:00+01:00Matthias Bachtag:marix.org,2024-01-06:/minecraft-auf-opensuse-leap-155.html<p>Während Minecraft auf openSUSE früher auf älteren Version immer einfach so funktioniert hat, endet der Versuch Version 1.20.4 auf openSUSE Leap 15.5 zu starten reproduzierbar mit einem Absturz.</p>
<p><img alt="Bildschirmfoto der Fehlermeldung "Spielabsturz" beim Versuch Minecraft 1.20.4 auf openSUSE Leap 15.5 zu starten" src="https://marix.org/Bilder/Minecraft auf OpenSUSE Leap 15.5/Fehlermeldung.png"></p>
<p>Der in der Fehlermeldung angegebene Exit-Code 6 hiflt leider nicht viel weiter.
Suchen danach führen zu vielen verschiedenen möglichen …</p><p>Während Minecraft auf openSUSE früher auf älteren Version immer einfach so funktioniert hat, endet der Versuch Version 1.20.4 auf openSUSE Leap 15.5 zu starten reproduzierbar mit einem Absturz.</p>
<p><img alt="Bildschirmfoto der Fehlermeldung "Spielabsturz" beim Versuch Minecraft 1.20.4 auf openSUSE Leap 15.5 zu starten" src="https://marix.org/Bilder/Minecraft auf OpenSUSE Leap 15.5/Fehlermeldung.png"></p>
<p>Der in der Fehlermeldung angegebene Exit-Code 6 hiflt leider nicht viel weiter.
Suchen danach führen zu vielen verschiedenen möglichen Problemen.
Einen guten Hinweis liefert aber der über die Fehlermeldung erreichbare Absturzbericht:</p>
<pre><code>#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000000000, pid=22905, tid=22907
#
# JRE version: (17.0.8+7) (build )
# Java VM: OpenJDK 64-Bit Server VM (17.0.8+7-LTS, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C [libjimage.so+0x3ac8] ZipDecompressor::decompress_resource(unsigned char*, unsigned char*, ResourceHeader*, ImageStrings const*)+0x28
#
</code></pre>
<p>Grund für den Absturz ist ein ungültiger Speicherzugriff.
Und dieser scheint nicht im eigentlichen Minecraft-Code sondern in der Java-Laufzeitumgebung (JRE) selbst zu passieren.
Es scheint also eine Inkompatilibität zwischen der von Minecraft verwendeten Java-Laufzeitumgebung und openSUSE Leap 15.5 zu geben.</p>
<p>Glücklicherweise lässt sich die von Minecraft verwendete Java-Laufzeitumgebung konfigurieren.
Diese findet sich im Abschnitt "Mehr Optionen" der Installationseinstellungen.
Tragen wir hier <code>/usr/bin/java</code> ein, so wird das aktuellste auf dem System installierte Java verwendet.</p>
<p><img alt="Bildschirmfoto der Auswahl der Java-Programmdatei in der Konfiguration einer Minecraft-Installation" src="https://marix.org/Bilder/Minecraft auf OpenSUSE Leap 15.5/Konfiguration der Java-Version.png"></p>
<p>Sollten wir später zur mitgelieferten Version zurückkehren wollen, so können wir den Wert über das X neben dem Feld auch wieder löschen.
In diesem Fall benutzt Minecraft dann wieder seine eigene Version.</p>
<p>Die Konfiguration einer Installation von Minecraft finden wir übrigens unter „Bearbeiten“ im erweiterten Menü der Installation im Reiter „Installationen“.</p>
<p><img alt="Bildschirmfoto vom Zugang zur Installationskonfiguration" src="https://marix.org/Bilder/Minecraft auf OpenSUSE Leap 15.5/Zugang zu den Einstellungen einer Installation.png"></p>
<p>Sollte auf unserem System keine aktuelle Laufzeitumgebung für Java installiert sein, so endet der nächste Versuch Minecraft zu starten übrigens wieder mit einer Fehlermeldung.
Die Laufzeitumgebung können wir in diesem Fall schnell per Zypper nachinstallieren.
Da der Absturzbericht uns verraten hat, dass Minecraft normallerwise Version 17 verwendet, installieren wir am besten auch genau diese nach:</p>
<pre><code>sudo zypper in java-17-openjdk
</code></pre>
<p>Danach können wir dann endlich Minecraft auf openSUSE Leap 15.5 genießen.</p>
<p><img alt="Bildschirmfoto eines laufenden Minecraft 1.20.4 auf openSUSE Leap 15.5" src="https://marix.org/Bilder/Minecraft auf OpenSUSE Leap 15.5/Erfolg.png"></p>Minecraft auf der PlayStation mit geteiltem Bildschirm spielen2024-01-02T22:00:00+01:002024-01-02T22:00:00+01:00Matthias Bachtag:marix.org,2024-01-02:/minecraft-auf-der-playstation-mit-geteiltem-bildschirm-spielen.html<p>Ein großer Vorteil der Konsolenversion von Minecraft ist, dass man diese offline auch völlig ohne Onlinekonten spielen kann.
Sucht man allerdings nach online nach einer Anleitung für den lokalen Mehrspielermodus mit geteiltem Bildschirm, so sind die Ergebnisse erstmal voll mit Anleitungen welche die Erstellung eines Kontos für das PSN und …</p><p>Ein großer Vorteil der Konsolenversion von Minecraft ist, dass man diese offline auch völlig ohne Onlinekonten spielen kann.
Sucht man allerdings nach online nach einer Anleitung für den lokalen Mehrspielermodus mit geteiltem Bildschirm, so sind die Ergebnisse erstmal voll mit Anleitungen welche die Erstellung eines Kontos für das PSN und bei Microsoft als essentielle Schritte angeben.
Dies ist aber gar nicht notwendig.
Weitere Spieler können jederzeit dem lokalen Spiel beitreten.
Dafür benötigt weder der startende Spiel noch der noch der beitretende Spieler ein Konto im PSN oder bei Microsoft.</p>
<p><img alt="Bildschirmfoto von Minecraft im lokalen Mehrspielermodus mit vier Spielern" src="https://marix.org/Bilder/Minecraft-lokaler-Multiplayer-ohne-PSN-account.png"></p>
<p>Um einem laufenden Spiel bezutreten ist lediglich folgendes notwendig:</p>
<ol>
<li>Aktivieren eines weiteren DualSense- oder DualShock,</li>
<li>Auswahl einen lokalen Benutzers auf der PlayStation auswählen, und schließlich</li>
<li>Drücken der Optionstaste, das ist die Taste rechts oberhalb vom Touchpad, auf dem beitretenden Controller.</li>
</ol>
<p>Daraufhin wird der Bildschirm geteilt und es erscheint im neuen Bildschirmsegment Frage ob der Beitritt zum Spiel gewünscht ist.
Ein weiter Druck auf die Optionstaste bringt einen dann auch schon in die gerade geladene Welt.</p>
<p>Soweit ich das testen kann funktioniert das ganze auch in allen Kombinationen von Spielern mit und ohne PSN- und Microsoft-Konten.</p>
<p><img alt="Fehler beim Versuch eine Minecaft-Partie im Online-Modus ohne Onlinekonto beizutreten" src="https://marix.org/Bilder/Minecraft-ohne-PSN-ins-Netzwerkspiel.png"></p>
<p>Eine kleine Falle gibt es allerdings noch.
Besitzt der startende Spieler ein vollwertiges PSN-Konto, so werden Welten per Voreinstellung im Online-Modus angelegt.
In diesem Fall scheitert der Beitritt ohne Onlinekonto dann mit einer entsprechenden Fehlermeldung.
Dies lässt sich aber schnell Lösen indem man das Onlinespiel für diese Welt deaktiviert.</p>
<p>Hat der startende Spieler zwar ein PSN-Konto, dies ist aber durch die Kindersicherung bezüglich des Onlinespiels eingeschränkt, so tritt dieses Problem nicht auf.
In diesem Fall werden Welten per Voreinstellung im Offline-Modus gestartet da sie der Spieler sonst ja selbst nicht betreten könnte.</p>Ubisofts kleine Falle für Steam-Spieler und Gamemode-Nutzer2023-07-04T00:00:00+02:002023-08-01T00:00:00+02:00Matthias Bachtag:marix.org,2023-07-04:/ubisofts-kleine-falle-fur-steam-spieler-und-gamemode-nutzer.html<p>Seit einiger Zeit ermöglicht es Ubisoft ja wieder seine Spiele über Steam zu kaufen und zu spielen.
Dank Steams exzellenter Integration von Proton, haben wir eine sehr komfortable Möglichkeit diese unter Linux, und natürlich auch auf dem Steam Deck zu spielen.
Allerdings hat uns Ubisoft hierbei eine kleine Falle gestellt …</p><p>Seit einiger Zeit ermöglicht es Ubisoft ja wieder seine Spiele über Steam zu kaufen und zu spielen.
Dank Steams exzellenter Integration von Proton, haben wir eine sehr komfortable Möglichkeit diese unter Linux, und natürlich auch auf dem Steam Deck zu spielen.
Allerdings hat uns Ubisoft hierbei eine kleine Falle gestellt.
Ubisoft Connect läuft nachdem man ein Spiel beendet hat einfach im Hintergrund weiter.</p>
<p>Startet man Spiele vom Desktop, macht dies eigentlich keinen großen Unterschied.
Nutzt man allerdings Programme welche auf das Ende des Spielprozesses warten, so kann es zu unerwünschtem Verhalten kommen.
So denkt Steam das Spiel laufe weiter, und lässt einen keine anderen Spiele starten.
Ebenso bleibt das System, wenn man <code>gamemoderun</code> nutzt, unerwartet im <a href="https://github.com/FeralInteractive/gamemode">Gamemode</a>, was zu unnötig hoher Energieaufnahme und, vor allem, unnötigem Lärm führt.
Das war tatsächlich auch der Grund weshalb es mir auffiel, denn ich setze über den Gamemode während dem Spielen mein Emailprogramm offline.</p>
<p><img alt="Screenshot des im Hintergrund weiterlaufenden Ubisoft Connect." src="https://marix.org/Bilder/Ubisoft Connect läuft im Hintergrund weiter.png"></p>
<p>Leider gibt es bisher wohl keine gute Lösung für das Problem.
In den Einstellungen gibt es zwar eine Option welche so klingt als würde sie das Problem lösen.
Leider sorgt sie aber nur dafür, dass der Client nicht minimiert wird, nicht dafür, dass er sich beendet.</p>
<p>Meine bisherigen Suchen führten weiterhin zu <a href="https://www.reddit.com/r/uplay/comments/4f4ep4/closing_uplay_on_game_exit/">ein paar abenteuerlichen Skripten für einzelne Ubisoft-Spiele auf Windows</a> und einem Eintrag im Steam-Forum, in dem jemand die baldige Veröffentlichung eines kommerziellen Tools ankündigte.
Aber keine dieser Lösungen funktioniert wirklich.
So bleibt es dabei, dass wir bei Ubisoft-Spielen leider nach dem Beenden daran denken müssen auch Ubisoft Connect zu beenden.</p>Verbindungsprobleme mit Ubisoft Connect unter Linux lösen2023-05-18T00:00:00+02:002023-05-18T00:00:00+02:00Matthias Bachtag:marix.org,2023-05-18:/verbindungsprobleme-mit-ubisoft-connect-unter-linux-losen.html<p>Der Versuch das aktuelle TrackMania zu starten führte auf meinem Rechner unter Linux reproduzierbar zu folgendem Fehler:</p>
<blockquote>
<p>Verbindung Verloren</p>
<p>Ein Ubisoft-Dienst ist im Moment nicht verfügbar. Du kannst es später erneut versuchen oder in den Offline-Modus wechseln.</p>
</blockquote>
<p><img alt="Bildschirmfoto mit der Fehlermeldung, dass die Verbinung zum Ubisoft-Dienst verloren wurde" src="https://marix.org/Bilder/Ubisoft Connect Verbindungsfehler.png"></p>
<p>Zum Glück <a href="https://www.reddit.com/r/SteamDeck/comments/ymqvbz/ubisoft_connect_connection_lost_stuck/">hatte jemand auf Reddit schon sehr viel Zeit darauf verwendet, dass …</a></p><p>Der Versuch das aktuelle TrackMania zu starten führte auf meinem Rechner unter Linux reproduzierbar zu folgendem Fehler:</p>
<blockquote>
<p>Verbindung Verloren</p>
<p>Ein Ubisoft-Dienst ist im Moment nicht verfügbar. Du kannst es später erneut versuchen oder in den Offline-Modus wechseln.</p>
</blockquote>
<p><img alt="Bildschirmfoto mit der Fehlermeldung, dass die Verbinung zum Ubisoft-Dienst verloren wurde" src="https://marix.org/Bilder/Ubisoft Connect Verbindungsfehler.png"></p>
<p>Zum Glück <a href="https://www.reddit.com/r/SteamDeck/comments/ymqvbz/ubisoft_connect_connection_lost_stuck/">hatte jemand auf Reddit schon sehr viel Zeit darauf verwendet, dass Problem zu debuggen.</a>
Das Problem entsteht, wenn IPv4-Pakete auf dem Weg zu den Ubisoft-Servern fragmentiert werden.
Es lässt sich lösen, indem man dem Linux Kernel auf für IPv4 die maximale Paketgröße auf dem Weg zum Empfänger ermitteln lässt, so dass es nicht zu Fragementierung kommt.
Dies geschieht über die Option <code>net.ipv4.tcp_mtu_probing</code>, welche dafür auf den Wert <code>1</code> zu setzen ist.</p>
<p>Zum Testen lässt sich die Option per <code>sudo sysctl net.ipv4.tcp_mtu_probing=1</code> temporär aktivieren.
Mit dem nächsten Reboot, oder einem <code>sudo sysctl net.ipv4.tcp_mtu_probing=0</code> ist das normale Verhalten wiederhergestellt.</p>
<p>Um das Verhalten permanent zu aktivieren muss die Option in die Sysctl-Konfiguration eingetragen werden.
Am besten in eine eigene Datei in <code>/etc/sysctl/conf.d/</code>.
Also, <code>/etc/sysctl.d/50-enable-ipv4-mtu-probing.conf</code> anlegen und folgendes reinschreiben:</p>
<pre><code>sysctl net.ipv4.tcp_mtu_probing=1
</code></pre>
<p>Bei IPv6 gibt es übrigens keine Fragementierung.
Hier ist das zur Problemlösung aktivierte Verhalten der Standard.
Würde Ubisoft also nicht auf einem veralteten Protokoll hängen, so gäbe es das Problem gar nicht.</p>Meine Gedanken zum neuen Sprint-Format der Formel 12023-05-09T00:00:00+02:002023-05-09T00:00:00+02:00Matthias Bachtag:marix.org,2023-05-09:/meine-gedanken-zum-neuen-sprint-format-der-formel-1.html<p>Nachdem die Formel 1 vor zwei Jahre das Sprint-Qualifying eingeführt, und es letztes Jahr in den Sprint umbenannt hat, wurde dieses Jahr das Format noch einmal grundsätzlich überarbeitet.
Und als Fan bin ich zwiegespalten, zwischen der Freude darüber endlich einen richtigen Sprint zu bekommen und dem Gefühl, dass es inzwischein …</p><p>Nachdem die Formel 1 vor zwei Jahre das Sprint-Qualifying eingeführt, und es letztes Jahr in den Sprint umbenannt hat, wurde dieses Jahr das Format noch einmal grundsätzlich überarbeitet.
Und als Fan bin ich zwiegespalten, zwischen der Freude darüber endlich einen richtigen Sprint zu bekommen und dem Gefühl, dass es inzwischein einfach zu viel Formel 1 gibt.</p>
<p>Grundsätzlich finde ich das neue Format gut.
Das alte Format fühlte sich nie wie ein Sprint an.
Eigentlich waren die Sprint-Wochenenden eher Marathon-Grand-Prixs mit einer Unterbrechung nach dem ersten Rennviertel.
Die einzigen Punkte welche das Sprint-Wochenende von einem 400km-Rennen mit Rotphase unterschieden waren, dass ausgeschiedene Fahrzeuge wieder ins Rennen zurück gebracht werden konnten, und dass es eine kleine Menge Punkte für die Position zum Zeitpunkt der Unterbrechung gab.
Letzteres gibt es ja aber in anderen Rennserien, beispielsweise mit den Stages in der NASCAR, durchaus auch.</p>
<p>Mein Problem mit dem neuen Format ist, dass es den Kalender effektiv auf 29 Rennen aufbläst.
Früher war ein Rennen der Formel 1 etwas dass man geradezu gewartet hat.
Heute kann man gefühlt jederzeit ein Rennen sehen.
Möchte man der Meisterschaft folgen, und nicht einzelne Rennen als Event betrachten, so lässt sich das nur noch schwer mit anderen Interessen unter einen Hut bekommen.
Ein Jahr hat nun mal nur 52 Wochenenden.
Davon nimmt die Formel 1 nun schon fast die Hälfte in Anspruch, und sechs davon nun auch noch einen Arbeitstag.</p>
<p>In den 90ern und 2000ern, bei 16 bis 18 Rennen, hätte ich mich über ein paar Rennen mit dem aktuellen Sprint-Format gefreut.
Es wäre etwas besonderes gewesen, auf das man vorher gewartet hätte, und für das auch die Zeit gewesen wäre.
Heute erweitern sie nur einen Kalender der einen sowieso schon erschlägt.</p>Pre-commit auf openSUSE Leap 15.42022-02-07T00:00:00+01:002022-02-07T00:00:00+01:00Matthias Bachtag:marix.org,2022-02-07:/pre-commit-auf-opensuse-leap-154.html<p>Beim Upgrade von openSUSE Leap 15.3 auf openSUSE Leap 15.4 ergibt sich bei <a href="https://pre-commit.com/"><code>pre-commit</code></a> ein interessantes Problem.
Auf älteren Versionen von Leap konnte das Paket aus dem <a href="https://build.opensuse.org/project/show/devel:languages:python">Entwicklungsprojekt <code>devel:languages:python</code></a> installiert werden.
Dort findet sich aber keine Version für Leap 15.4.
Eine solche findet sich jetzt …</p><p>Beim Upgrade von openSUSE Leap 15.3 auf openSUSE Leap 15.4 ergibt sich bei <a href="https://pre-commit.com/"><code>pre-commit</code></a> ein interessantes Problem.
Auf älteren Versionen von Leap konnte das Paket aus dem <a href="https://build.opensuse.org/project/show/devel:languages:python">Entwicklungsprojekt <code>devel:languages:python</code></a> installiert werden.
Dort findet sich aber keine Version für Leap 15.4.
Eine solche findet sich jetzt in meinem Projekt <a href="https://build.opensuse.org/package/show/home%3AtheMarix%3Apy36/python-pre-commit"><code>home:theMarix:py36</code></a> und lässt sich von dort einfach installieren:</p>
<pre><code>zypper addrepo https://download.opensuse.org/repositories/home:theMarix:py36/15.4/home:theMarix:py36.repo
zypper refresh
zypper install python3-pre-commit
</code></pre>
<p>Das Problem entsteht, weil <a href="https://pre-commit.com/"><code>pre-commit</code></a> es bisher nicht in die Distribution geschafft hat.
Das ist normalerweise kein Problem, weil die Pakete in den Entwicklungsprojekten auch für alle aktuellen Versionen von Leap gebaut werden.
Speziell bei Leap 15.4 ist hier aber etwas interessantes passiert.
<a href="https://pre-commit.com/"><code>pre-commit</code></a> hat in Version 2.17.0 verständlicherweise die Unterstützung für Python 3.6 fallengelassen.
Allerdings setzt Leap 15.4 aus Kompatibilitätsgründen noch auf diese Version von Python.
Da jetzt aber das Upgrade auf 2.17.0 in <code>devel:languages:python</code> passierte bevor Leap 15.4 angelegt wurde, wurde die letzte mit Python 3.6 lauffähige Version 2.16.0 nie für Leap 15.4 gebaut.
Anders für Leap 15.3, für das genau diese Version bis zuletzt noch installierbar war.</p>
<p>Im Projekt <a href="https://build.opensuse.org/package/show/home%3AtheMarix%3Apy36/python-pre-commit"><code>home:theMarix:py36</code></a> befindet sich jetzt einfach ein Link auf die letzte Revision des Pakets in <code>devel:languages:python</code> die noch mit Python 3.6 kompatibel war.
So gibt es jetzt zwar leider keine aktuelle Version von <a href="https://pre-commit.com/"><code>pre-commit</code></a> für Leap 15.4, aber immerhin eine ohne Verrenkungen nutzbare, die mit dem Update auf 15.5 wird sich dass dann ganz von alleine wieder auf das aktuelle Paket wechseln wird.
Und auch wenn das jetzt wahnsinnig aufwendig klingt, der Zeitaufwand das Paket anzulegen war geringer als der diesen Artikel zu schreiben.</p>Besser Brille putzen2022-02-05T00:00:00+01:002022-02-05T00:00:00+01:00Matthias Bachtag:marix.org,2022-02-05:/besser-brille-putzen.html<p>Viele Jahre habe ic mich damit, wie man eine Brille eigentlich am besten reinigt, gar nicht groß beschäftigt.
Da echte Gläser ja fast alles abkönnen, hab ich die Brille halt unter Wasser gehalten, und sonst halt an allem abgewischt, was gerade da war.
Als ich dann vor ein paar Jahren …</p><p>Viele Jahre habe ic mich damit, wie man eine Brille eigentlich am besten reinigt, gar nicht groß beschäftigt.
Da echte Gläser ja fast alles abkönnen, hab ich die Brille halt unter Wasser gehalten, und sonst halt an allem abgewischt, was gerade da war.
Als ich dann vor ein paar Jahren relativ kurzfristig eine neue brauchte, gab es beim lokalen Optiker meines Vertrauens unter den Modellen, die an mir erträglich aussahen, keines in das echtes Glas konnte.
So musste ich dann doch auf Plastik wechseln.</p>
<p>Nun ist Plastik weniger kratzfest als Glas.
Ob das einen relevanten Unterschied macht habe ich nie ausprobiert.
So stand ich auf jeden Fall vor der Frage: Wie bekomme ich diese Gläser jetzt gereinigt ohne sie zu beschädigen.
Hier hatte mein Optiker dann einen tollen Tipp für mich: Eine Sprühflasche mit Spüli und Wasser.
Damit ergibt sich dann ein unglaublich einfacher Weg die Brille zu putzen der zu klasse Ergebnissen führt:</p>
<ol>
<li>Gläser einsprühen.</li>
<li>Mit fliesendem Wasser abspülen.</li>
<li>Mit einem normalen Spültuch trocken reiben.</li>
</ol>
<p>Wieso ist diese Methode so toll?
Sie vermeidet das Problem, dass das verwischen von Schmutz auf der Brille Gläser verkratzen kann, denn diese werden in Schritt eins und zwei bereits abgespült.
Durch das Sprühen schafft man es auch gleich das Spülmittel gleichmäßig auf den Gläsern zu verteilen, so dass das Spülen auch bereits zuverlässig allen Dreck mitnimmt.</p>
<p>Was die Sprühflasche angeht, habe ich übrigens festgestellt, dass die Sprühflaschen aus dem Friseurbedarf richtig toll sind.
Sie kosten fast nichts und sind so klein, dass sie keinen Platz wegnehmen.
So kann man diese auch an allen Orten an denen man sich häufiger aufhält Bunkern.</p>KTorrent friert ein2022-01-29T00:00:00+01:002022-01-29T00:00:00+01:00Matthias Bachtag:marix.org,2022-01-29:/ktorrent-friert-ein.html<p>Die Tage musste ich leider Feststellen, dass mein KTorrent beim Download der aktuellen <a href="https://haveibeenpwned.com/Passwords">Pwned-Passwords-List von Have I been Pwned</a> komplett einfror.
<a href="https://www.qwant.com/?q=ktorrent+freezes">Eine Suche nach dem Problem</a> liefert nicht viele Treffer, aber fördert <a href="https://forums.opensuse.org/showthread.php/523076-Ktorrent-freeze-and-Firefox">einen 5 Jahre alten Forenbeitrag zutage, der eine Lösung für das Problem liefert</a>.
Den Firefox einmal kurz zu …</p><p>Die Tage musste ich leider Feststellen, dass mein KTorrent beim Download der aktuellen <a href="https://haveibeenpwned.com/Passwords">Pwned-Passwords-List von Have I been Pwned</a> komplett einfror.
<a href="https://www.qwant.com/?q=ktorrent+freezes">Eine Suche nach dem Problem</a> liefert nicht viele Treffer, aber fördert <a href="https://forums.opensuse.org/showthread.php/523076-Ktorrent-freeze-and-Firefox">einen 5 Jahre alten Forenbeitrag zutage, der eine Lösung für das Problem liefert</a>.
Den Firefox einmal kurz zu schließen taut KTorrent wieder auf.</p>
<p>Das Problem scheint nur aufzutreten, wenn KTorrent aus dem Firefox startet.
Das passiert wenn man Firefox einen Link auf eine Torrent-Datei mit KTorrent öffnen lässt, dieser aber noch nicht lief.
Dadurch gibt zwei einfache Wege das Problem zu umgehen und die obige Lösung dann gar nicht erst zu brauchen:</p>
<ol>
<li>Ist KTorrent bereits gestartet bevor Firefox die Datei übergibt, so scheint das Problem nicht aufzutreten.</li>
<li>Kopiert man die URL der Torrent-Datei in die Zwischenablage, kann man diese auch aus KTorrent direkt mit <em>Datei - Adresse öffnen</em> bzw. <code>Strg+P</code> öffnen und umgeht die Interaktion zwischen Firefox und KTorrent komplett.</li>
</ol>Bootprobleme mit Leap 15.3 und Radeon-Grafik2022-01-28T00:00:00+01:002022-02-07T00:00:00+01:00Matthias Bachtag:marix.org,2022-01-28:/bootprobleme-mit-leap-153-und-radeon-grafik.html<p>Mit dem am Mittwoch durch den Patch <code>openSUSE-SLE-15.3-2022-198</code> gelieferten Kernel mit Version <code>5.3.18-150300.59.43.1</code> startet Leap 15.3 auf vielen Systemen mit Radeon-Grafik nicht mehr.
Gleich nach dem Laden des Kernels friert das System ein und schaltet die Bildschirmausgabe ab.
Glücklicherweise gibt es aber gleich …</p><p>Mit dem am Mittwoch durch den Patch <code>openSUSE-SLE-15.3-2022-198</code> gelieferten Kernel mit Version <code>5.3.18-150300.59.43.1</code> startet Leap 15.3 auf vielen Systemen mit Radeon-Grafik nicht mehr.
Gleich nach dem Laden des Kernels friert das System ein und schaltet die Bildschirmausgabe ab.
Glücklicherweise gibt es aber gleich zwei einfache Wege betroffene Systeme wieder zum laufen zu bekommen.
Die Systeme können entweder mit der vorherigen Kernelversion oder dem Kernelparameter <code>nomodeset</code> gestartet werden.</p>
<p>Die schnellste Variante ist sicher einfach den vorherigen Kernel zu starten.
Dieser lässt sich im Bootmenü von Grub über die erweiterten Optionen einfach auswählen.
Standardmäßig hebt openSUSE übrigens immer den genutzten und die zwei neuesten Kernel auf.
Es sollte also immer ein funktionsfähiger Kernel zur Verfügung stehen.
Mehr zu diesem Feature findet sich in <a href="https://marix.org/alte-kernelversionen-installiert-behalten.html">einem älteren Artikel von mir</a>.</p>
<p>Stört es, wie beispielsweise bei einem sowieso ohne Monitor betriebenen System, nicht, wenn das Modesetting nicht funktioniert, so lässt sich auch der neue Kernel booten.
Der Bug lässt sich durch Nutzung des Kernelparameters <code>nomodeset</code> umgehen.
Am einfachsten lässt sich dieser über das Modul <em>Bootloader</em> im Abschnitt <em>System</em> von YaST konfigurieren.
Dafür muss das System aber erst mal laufen.
Dafür kann entweder, wie oben beschrieben der alte Kernel genutzt werden, oder der Parameter einmal beim Start manuell gesetzt werden.</p>
<p>Um den Bootparameter beim Start manuell zu setzen muss im Bootmenü die Taste <code>E</code> gedrückt werden.
Dies öffnet den gerade ausgewählten Startmenüeintrag in einem einfachen Editor.
Hier ist die mit <code>linux</code> beginnende Zeile zu suchen und an deren Ende der Parameter <code>nomodeset</code> hinzuzufügen.
Durch einen Druck auf <code>F10</code> startet das System dann mit dem modifizierten Eintrag.
Der Eintrag wird allerdings nicht permanent übernommen.
Man muss ihn anschließend noch per YaST persistieren, kann sich dafür aber auch erst mal nichts kaputt machen.</p>
<p>Mehr Informationen zu diesem Problem finden sich <a href="https://bugzilla.opensuse.org/show_bug.cgi?id=1195168">im Bugzilla</a>.
Dort gibt es auch schon eine verifizierte richtige Lösung des Problems, welche im nächsten Kernel-Patch dann enthalten sein dürfte.</p>
<p><strong>Aktualisierung vom 7.2.2022</strong>: Mit dem Update <code>openSUSE-SLE-15.3-2022-340</code>, welches den Kernel auf Version <code>5.3.18-150300.59.46</code> hebt, ist das Problem behoben.
Die betroffenen Systeme starten auch ohne den Workaround <code>nomodeset</code> zu nutzen wieder.
Solltet Ihr vorsichtshalber den letzten Kernel, mit dem euer System noch gestartet hat, zur dauerhaften Aufbewahrung markiert haben, so solltet ihr nicht vergessen auch dies wieder rückgängig zu machen.
Sonst liegt der alte Kernel unnötig dauerhaft rum.</p>American und Euro Truck Simulator 2 1.402021-03-26T00:00:00+01:002021-03-26T00:00:00+01:00Matthias Bachtag:marix.org,2021-03-26:/american-und-euro-truck-simulator-2-140.html<p>Diese Woche erschien Version 1.40 der beiden Geschwisterspiele <a href="https://worldoftrucks.com/">American und Euro Truck Simulator 2</a>.
Und ich bin begeistert, sowohl vom neuen Lichtsystem als auch von der Überarbeitung des deutschen Teils der Karte.</p>
<p><img alt="Ein Screenshot aus dem Führerhaus, dem Sonnengang entgegen auf Amsterdam zufahrend." src="https://marix.org/Bilder/Sonnenuntergang-bei-Amsterdam.jpg"></p>
<p>Tatsächlich immer noch etwas erstaunt es mich immer noch ein wenig, dass ich von diesem Spiel so …</p><p>Diese Woche erschien Version 1.40 der beiden Geschwisterspiele <a href="https://worldoftrucks.com/">American und Euro Truck Simulator 2</a>.
Und ich bin begeistert, sowohl vom neuen Lichtsystem als auch von der Überarbeitung des deutschen Teils der Karte.</p>
<p><img alt="Ein Screenshot aus dem Führerhaus, dem Sonnengang entgegen auf Amsterdam zufahrend." src="https://marix.org/Bilder/Sonnenuntergang-bei-Amsterdam.jpg"></p>
<p>Tatsächlich immer noch etwas erstaunt es mich immer noch ein wenig, dass ich von diesem Spiel so begeistert sein kann.
Früher hab ich mich immer gefragt wer so etwas eigentlich spielt, aber dank eine Humble Bundles hab ich dann irgendwann doch mal den Euro Truck Simulator ausprobiert.
Dabei habe ich festgestellt, es ist einfach das perfekte Spiel, wenn man nach einem stressigen Tag einfach gar nicht mehr die Energie für ein stressiges Actionspiel, wie Descent oder Gran Turismo, oder ein anstrengendes Strategiespiel, wie Civilisation, hat.
Man kann einfach einen Podcast hören, die Landschaft genießen, und hat trotzdem noch genug Beschäftigung um nicht noch etwas anders anzufangen das einem vom Podcast und der Landschaft ablenken würde.</p>
<p>Das neue Lichtsystem und die Überarbeitung des deutschen Teils der Karte werten in Version 1.40 den Genuss der Landschaft noch einmal deutlich auf.
Straßenlaternen tauchen jetzt Landschaft und Führerhaus in stimmiges Licht, und Sonnenuntergänge sind so wunderbar wie auf dem obigen Bild.
Und dank mehr Details ist Deutschland zu durchfahren jetzt genau so schön wie es zuvor schon die Länder aus der Erweiterung <em>Going East</em> waren, ein großer Vorteil wenn man zu Begin des Spiels Mannheim als seinen Unternehmensstandort ausgewählt hat.
Der einzige Wermutstropfen ist, dass mir jetzt ein Flackern bei horizontalen Linien auffällt.</p>Die Beta von openSUSE Leap 15.3 ist da2021-03-06T00:00:00+01:002021-03-06T00:00:00+01:00Matthias Bachtag:marix.org,2021-03-06:/die-beta-von-opensuse-leap-153-ist-da.html<p>Diese Woche <a href="https://news.opensuse.org/2021/03/03/opensuse-leap-153-reaches-beta-build-phase/">erschien die Beta von openSUSE Leap 15.3</a>, der nächsten Version von openSUSE Leap.
Ich habe meinen primären privaten Rechner bereits darauf aktualisiert und es war völlig unspektakulär.
Was auf den ersten Blick enttäuschend klingt ist aber etwas wirklich gutes, denn es heißt, dass ich keinerlei Probleme hatte …</p><p>Diese Woche <a href="https://news.opensuse.org/2021/03/03/opensuse-leap-153-reaches-beta-build-phase/">erschien die Beta von openSUSE Leap 15.3</a>, der nächsten Version von openSUSE Leap.
Ich habe meinen primären privaten Rechner bereits darauf aktualisiert und es war völlig unspektakulär.
Was auf den ersten Blick enttäuschend klingt ist aber etwas wirklich gutes, denn es heißt, dass ich keinerlei Probleme hatte und weiterhin alles funktioniert.</p>
<p>Das die Aktualisierung auf die nächste Version so unspektakulär ist war gar nicht so selbstverständlich, denn technisch gab es unter der Haube größere Umwälzungen.
OpenSUSE verwendet für alles, dass es auch in SUSE Linux Enterprise gibt, direkt das Paket von dort.
Eine gute Nachricht, für alle, die auf ein grundsolides System bauen wollen.
Durch die direkte Nutzung der Pakete von SLE gibt es auch nicht nur maximale Kompatibilität, sondern Patches werden auch direkt verfügbar sein, ohne die Zeitverzögerung durch die Portierung von SLE auf openSUSE.</p>
<p>Auch <a href="https://marix.org/opensuse-leap-151-mit-usb-stick-als-schlussel-fur-die-festplattenverschlusselung.html">meine Methode zum Booten mit Keystick</a> funktioniert mit der Beta von Leap 15.3 wunderbar.</p>
<p>Einen kleinen Stolperer gibt es momentan noch beim <a href="https://en.opensuse.org/SDB:System_upgrade#Running_the_Upgrade">Onlineupgrade</a> auf die Beta, zumindest wenn man bereits den Weg mit der Variablen <code>releasever</code> in den Quellen für die Paketpfade nimmt.
Nach dem Update <a href="https://bugzilla.opensuse.org/show_bug.cgi?id=1182951">zeigt <code>/etc/products.d/baseproduct</code> ins Leere</a>.
Das hat zur Folge, dass Zypper die Paketquellen nicht mehr findet:</p>
<pre><code>Warnung: Der Symlink /etc/products.d/baseproduct ist defekt oder fehlt!
Der Link muss auf die .prod-Datei Ihrer Kernprodukte in /etc/products.d verweisen.
</code></pre>
<p>Zum Glück lässt sich dies sehr leicht reparieren und bis zum finalen Release von 15.3 wird diese Problem auch gelöst sein.</p>
<pre><code>sudo rm /etc/products.d/baseproduct && sudo ln /etc/products.d/Leap.prod /etc/products.d/baseproduct
</code></pre>
<p>Auch wenn es momentan in 15.3 aus Nutzersicht keine Features gibt für die es dringend ein Update bräuchte, sollte, wer ein in irgendeiner Form ein ungewöhnliches Set-Up hat, der Beta also auf jeden Mal einen Versuch gönnen.
Denn so können Probleme idealerweise noch vor dem Release gefunden und behoben werden.
Dazu bietet sich natürlich eine Zweitinstallation an, auch wenn die Beta sogar schon stabil genug für die tägliche Nutzung erscheint.</p>openSUSE Leap 15.1 mit USB-Stick als Schlüssel für die Festplattenverschlüsselung2021-03-06T00:00:00+01:002023-06-10T00:00:00+02:00Matthias Bachtag:marix.org,2021-03-06:/opensuse-leap-151-mit-usb-stick-als-schlussel-fur-die-festplattenverschlusselung.html<p>Ich nutzte schon seit 2011 einen USB-Stick um bei meinem mit openSUSE laufenden Heimserver beim Start das Passwort für die Festplattenverschlüsselung „eingeben“ zu können ohne eine Tastatur oder einen Monitor am System angeschlossen zu haben.
Den dafür genutzten Mechanismus habe ich auch <a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html">schon damals hier im Blog dokumentiert</a>.
Leider funktionierte …</p><p>Ich nutzte schon seit 2011 einen USB-Stick um bei meinem mit openSUSE laufenden Heimserver beim Start das Passwort für die Festplattenverschlüsselung „eingeben“ zu können ohne eine Tastatur oder einen Monitor am System angeschlossen zu haben.
Den dafür genutzten Mechanismus habe ich auch <a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html">schon damals hier im Blog dokumentiert</a>.
Leider funktionierte der dort beschriebene Mechanismus aber seit openSUSE Leap 42.2 nicht mehr.
Auf den nachfolgenden Versionen gibt es aber einen neuen Mechanismus, der sogar noch besser funktioniert.
Dieser wird hier beschreiben und wurd auf allen Versionen von openSUSE Leap 42.2 bis 15.5 erfolgreich getestet.</p>
<h2 id="festplattenverschlusselung">Festplattenverschlüsselung</h2>
<p>Für die Festplattenverschlüsselung wird ganz klassisch LUKS genutzt, so wie auch openSUSE ein System mit Festplattenverschlüsselung aufsetzen würde.
Da der Schlüssel vom USB-Stick während des initialen Boots aus der Initrd gelesen wird muss <code>/boot</code> allerdings unverschlüsselt sein.
Moderne Versionen von openSUSE erlauben auch einen Boot mit verschlüsselter Boot-Partition.
In diesem Fall wird der Schlüssel aber bereits von Grub abgefragt.
Diese Variante wird vom hier beschriebenen Mechanismus nicht unterstützt.</p>
<p>Da LUKS die Nutzung mehrerer alternativer Schüssel unterstützt empfiehlt es sich das System zunächst mit einer klassischen Passphrase einzurichten.
Dies erleichtert Offline-Upgrades des Systems und das Einbinden der Festplatten zu Wiederherstellungs- und Wartungszwecken.</p>
<h2 id="usb-stick-als-schlussel">USB-Stick als Schlüssel</h2>
<p>Da der USB-Stick später aus der Initramfs gelesen werden soll, empfiehlt es sich ein dort sowieso eingebundenes Dateisystem zu nutzen.
Ich nutze hierfür immer noch Ext2.
Ist der Stick als <code>/dev/sdb</code> im System zu sehen, kann er wie folgt passend formatiert werden.</p>
<pre><code>mkfs.ext2 -L keystick /dev/sdb
</code></pre>
<p>Das Label <code>keystick</code> ist wichtig um den Schüssel später leicht referenzieren zu können.
Außerdem ist es beim Mount mit Label möglich eine zweite Kopie des Sticks zu erstellen falls das Original mal zerstört wird.</p>
<p>Anschließend sollte ein Schlüssel generiert und auf dem USB-Stick hinterlegen werden. Dies kann mit <code>pwgen</code> gemacht werden:</p>
<pre><code>pwgen -s 1024 1 > /media/keystick/keyfile
</code></pre>
<p>Und schließlich muss der Schlüssel der verschlüsselten Partition hinzugefügt werden.</p>
<pre><code>cryptsetup luksAddKey /dev/sda2 /media/keystick/keyfile
</code></pre>
<p>In diesem Beispiel befindet sich die verschlüsselte Partition auf <code>/dev/sda2</code>.</p>
<h2 id="usb-stick-beim-booten-nutzen">USB-Stick beim Booten nutzen</h2>
<p>Um den Schlüssel beim Booten vom USB-Stick zu lesen muss der Kernelparameter <code>rd.luks.key</code> auf die Schlüsseldatei zeigen.</p>
<pre><code>rd.luks.key=/keyfile:LABEL=keystick
</code></pre>
<p>Hier wird wieder das, bei der Formatierung des Sticks vergebene, Label für das Dateisystem genutzt.
Der Pfad ist relativ zum per Label referenzierten Dateisystem.
Konfigurieren lässt sich der Kernelparameter am einfachsten über die Bootloaderkonfiguration in Yast.</p>
<p>Damit der Parameter <code>rd.luks.key</code> funktioniert benötigt es allerdings noch eine Änderung.
In der Standardkonfiguration nutzt die Initrd bei openSUSE Systemd.
Dann hat der Parameter allerdings keinen Effekt.
Deshalb muss Dracut, welches in openSUSE die Initrd baut, so konfiguriert werden, dass es eine Initrd ohne Systemd baut.
Dazu ist eine neue Datei <code>/etc/dracut.conf.d/50-keystick.conf</code> mit folgendem Inhalt anzulegen:</p>
<pre><code>omit_dracutmodules+=" systemd "
</code></pre>
<p>Die Leerzeichen im Wert sind hier Absicht.
Ohne diese wirft Dracut eine Warnung:</p>
<pre><code>dracut: WARNING: <key>+=" <values> ": <values> should have surrounding white spaces!
dracut: WARNING: This will lead to unwanted side effects! Please fix the configuration file.
</code></pre>
<p>Ein anschließendes <code>mkinitrd</code> erzeugt eine Initrd ohne Systemd und das System kann zukünftig bei eingestecktem USB-Stick ohne Passworteingabe gestartet werden.</p>
<h2 id="vorteile-gegenuber-der-alten-methode">Vorteile gegenüber der alten Methode</h2>
<p><a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html">Bei der alten Methode</a> blieb das System in einer Schleife hängen wenn der USB-Stick beim Boot nicht gesteckt war.
Ohne Stick konnte das System gar nicht mehr gebootet werden.
Bei der hier beschriebenen Methode versucht das System zunächst die Schüsseldatei vom USB-Stick zu lesen.
Kann es diese aber nicht finden, so fällt es auf die klassische Passworteingabe zurück.
Wurde der USB-Stick also nicht als einziges Passwort eingerichtet lässt sich das System im Notfall auch noch so starten.</p>CD-ROMs von Klett unter Linux nutzen2021-01-04T00:00:00+01:002021-01-04T00:00:00+01:00Matthias Bachtag:marix.org,2021-01-04:/cd-roms-von-klett-unter-linux-nutzen.html<p>Der <a href="https://www.klett.de">Klett Verlag</a> bietet zu vielen seiner Lehrwerke auch Begleitmaterialien auf CD ROM an.
Die Anwendung auf diesen CDs öffnet tatsächlich nur HTML-Datei, so dass sich die CDs durch direktes Öffnen der Datei <code>index.html</code> Datei auch wunderbar auf nicht-Windows-Systemen nutzen ließen.
Häufig wird dann aber eine kaputte Seite dargestellt …</p><p>Der <a href="https://www.klett.de">Klett Verlag</a> bietet zu vielen seiner Lehrwerke auch Begleitmaterialien auf CD ROM an.
Die Anwendung auf diesen CDs öffnet tatsächlich nur HTML-Datei, so dass sich die CDs durch direktes Öffnen der Datei <code>index.html</code> Datei auch wunderbar auf nicht-Windows-Systemen nutzen ließen.
Häufig wird dann aber eine kaputte Seite dargestellt, und die Fehlerkonsole des Browsers beschwert sich über fehlende Dateien, z.B. für die Schriftarten.
Des Rätsels Lösung ist, dass diese Dateien auf der Ebene des Joliet-Dateisystems als versteckt markiert sind und für Anwendungen so normalerweise nicht sichtbar sind.
Unter Windows kümmert sich die Klett-Anwendung darum diese vor dem Öffnen der <code>index.hml</code> sichtbar zu schalten.</p>
<p>Mit dem Wissen darum, dass die Dateien auf Dateisystemebene versteckt sind, kann man die CDs auch unter Linux wunderbar nutzen.
Die Lösung findet sich dann beispielsweise <a href="https://askubuntu.com/questions/370906/unable-to-see-files-in-dvd-hidden-using-windows-7">auf askubuntu.com</a>: Die CD muss mit der Option <code>unhide</code> eingebunden werden.</p>
<p>Während normalerweise auch Nutzer CDs mounten können, muss dies in diesem Fall allerdings durch Root gemacht werden, da Nutzer keine Optionen beim Mounten angeben dürfen.
Auf meinem openSUSE-System führe ich also folgende Schritte aus:</p>
<pre><code>mkdir /tmp/klett
sudo mount -o unhide -t iso9660 /dev/sr0 /tmp/klett
</code></pre>
<p>Danach ist die CD mit allen Dateien in <code>/tmp/klett</code> verfügbar und ich kann z.B. mit einem <code>xdg-open /tmp/klett/index.html</code> den Inhalt öffnen.</p>
<p>Zur Erklärung der obigen Kommandozeile:</p>
<ul>
<li>Mit <code>mkdir /tmp/klett</code> lege ich ein temporäres Verzeichnis an. Es in <code>/tmp</code> anzulegen erspart es mir hinterher aufräumen zu müssen.</li>
<li><code>sudo</code> ist Notwendig, da ein normaler Nutzer keine Optionen angeben kann.</li>
<li><code>-o unhide</code> macht die normalerweise versteckten Dateien sichtbar.</li>
<li><code>-t iso9660</code> gibt explizit an welches Dateisystem verwendet wird. <code>mount</code> kann dies normalerweise auch automatisch erkennen.</li>
<li><code>/dev/sr0</code> ist mein optisches Laufwerk.</li>
</ul>Mein bisher kleinster Pull-Request2020-10-25T00:00:00+02:002020-10-25T00:00:00+02:00Matthias Bachtag:marix.org,2020-10-25:/mein-bisher-kleinster-pull-request.html<p>Kürzlich <a href="https://chaos.social/@maralorn/104921191938830488">berichtete @maralorn@chaos.social über seinen bisher kleinsten Pull Request</a>.
Dies lies mich kurz darüber nachdenken, was wohl mein kleinster Pull Request bisher war.
Tatsächlich habe ich kürzlich <a href="https://github.com/ceph/ceph/pull/36932">einen Pull Request bei Ceph gemacht um einen Tippfehler in der Beschreibung des RPM Paketes für den Prometheus-Exporter zu fixen</a>.
Jetzt …</p><p>Kürzlich <a href="https://chaos.social/@maralorn/104921191938830488">berichtete @maralorn@chaos.social über seinen bisher kleinsten Pull Request</a>.
Dies lies mich kurz darüber nachdenken, was wohl mein kleinster Pull Request bisher war.
Tatsächlich habe ich kürzlich <a href="https://github.com/ceph/ceph/pull/36932">einen Pull Request bei Ceph gemacht um einen Tippfehler in der Beschreibung des RPM Paketes für den Prometheus-Exporter zu fixen</a>.
Jetzt mag man sich drüber streiten was der Wert eines solchen Pull Requests ist, aber für mich waren es keine fünf Minuten Arbeit und in Zukunft muss sich keiner mehr über den Tippfehler wundern.</p>
<p>Wer sich nun fragt was ich mit Ceph mache: schon lange gar nichts mehr.
Der Tippfehler war mir tatsächlich nur aufgefallen weil ich ein <code>zypper search prometheus</code> gemacht habe als ich, nach dem Update auf openSUSE Leap 15.2, welches jetzt alle Prometheus-Pakete jetzt auch ARM zur Verfügung stellt, mein Monitoring komplett auf diese umgestellt habe.</p>Catherine2020-10-23T00:00:00+02:002020-10-23T00:00:00+02:00Matthias Bachtag:marix.org,2020-10-23:/catherine.html<p>Ach Catherine, ich würde dich ja eigentlich gerne mögen.
Aber genau wie dein Hauptcharakter kann ich dass nicht so uneingeschränkt.
Dabei klingt die Idee philosophische Fragen rund um Verantwortung, Beziehung, dem Wunsch nach Ordnung und dem nach individueller Freiheit an sich so reizvoll.
In der Umsetzung ist Catherine dann aber …</p><p>Ach Catherine, ich würde dich ja eigentlich gerne mögen.
Aber genau wie dein Hauptcharakter kann ich dass nicht so uneingeschränkt.
Dabei klingt die Idee philosophische Fragen rund um Verantwortung, Beziehung, dem Wunsch nach Ordnung und dem nach individueller Freiheit an sich so reizvoll.
In der Umsetzung ist Catherine dann aber vor allem lang, lang, und nochmal lang.</p>
<p>Als Spiel ist Catherine eine Kombination aus Visual Novel und einem Jump and Run.
Die Visual Novel besteht aus langen Cutscenes, kombiniert mit zwei Dialoghubs in denen man zwischen den Leveln landet.
Alleine in den Dialogszenen ist das Pacing schon wahnsinning langsam, und die langen Ladezeiten auf der PS3 helfen dann auch nicht gerade.
Auch den Kletterpassagen merkt man die länge des Spiels deutlich an.
Dass die Ladeanimation, welche einem einem den Fortschritt im Spiel anzuzeigen scheint, bei entsprechendem Fortschritt einen zweiten Teil bekommt, könnte man noch als zur Geschichte passendes Stilmittel einordnen.
Aber, dass die Passagen ab diesem Punkt dann, zumindest auf der niedrigsten Schwierigkeitsstufe, auch wieder deutlich einfacher werden spricht dann doch eine deutliche Sprache.</p>
<p>Dabei hätte ich es ja eigentlich vorher wissen können.
Ein Spiel das seiner Bewerbung derart auf Erotik setzt ahnt wohl schon, dass seine sonstigen Qualitäten nicht als Kaufimpuls reichen werden.
Zumal im Spiel dann weniger Erotik vorhanden ist als in jedem Need for Speed.
Wer das Spiel also deshalb gekauft haben sollte schaut gleich doppelt doof aus der Wäsche.</p>
<h2 id="_1">★★☆☆☆</h2>
<p>In einer Sternewertung kann ich Catherine nur zwei von fünf geben.
Was schade ist, denn in deutlich kürzerer Form hätte das Spiel durchaus spannend sein können.
Wer ein großer Fan von Spielen mit philosophischen Gedanken ist, der kann Catherine durchaus mal eine Chance geben.
Zumindest wenn, wie in meinem Fall, Catherine über Playstation Plus oder auf anderem Weg ohne zusätzliche Kosten ins Haus kommt.
Jeder Andere verbringt seine Zeit lieber mit einem anderen Spiel.</p>Den Aktualisierungsstand von openSUSE mit Prometheus überwachen2020-06-21T00:00:00+02:002020-06-21T00:00:00+02:00Matthias Bachtag:marix.org,2020-06-21:/den-aktualisierungsstand-von-opensuse-mit-prometheus-uberwachen.html<p>Letzte Woche habe ich Version 0.2.1 des <a href="https://gitlab.com/Marix/zypper-patch-status-collector">Zypper-Patch-Status-Collectors</a> veröffentlicht.
Mit diesem kleinen, in Python geschriebenen, Helfer lässt sich der Aktualisierungsstand eines openSUSE-Systems durch Prometheus überwachen.
Prometheus kann so nicht nur Alarme generieren wenn Sicherheitsaktualisierungen noch nicht angewandt sind, sondern auch wenn einzelne Dienste nach Aktualisierungen noch nicht neu …</p><p>Letzte Woche habe ich Version 0.2.1 des <a href="https://gitlab.com/Marix/zypper-patch-status-collector">Zypper-Patch-Status-Collectors</a> veröffentlicht.
Mit diesem kleinen, in Python geschriebenen, Helfer lässt sich der Aktualisierungsstand eines openSUSE-Systems durch Prometheus überwachen.
Prometheus kann so nicht nur Alarme generieren wenn Sicherheitsaktualisierungen noch nicht angewandt sind, sondern auch wenn einzelne Dienste nach Aktualisierungen noch nicht neu gestartet wurden oder das System neu gestartet werden müsste.</p>
<p>Der Collector nutzt Zypper um nach ausstehen Patches und Service- oder Systemneustartbedarf zu schauen und gibt diese Information im Format von Prometheus-Metriken aus.
Dies sieht dann so aus wie in der README beschrieben:</p>
<pre><code># HELP zypper_applicable_patches The current count of applicable patches
# TYPE zypper_applicable_patches gauge
zypper_applicable_patches{category="security",severity="critical"} 0
zypper_applicable_patches{category="security",severity="important"} 2
zypper_applicable_patches{category="security",severity="moderate"} 0
zypper_applicable_patches{category="security",severity="low"} 0
zypper_applicable_patches{category="security",severity="unspecified"} 0
zypper_applicable_patches{category="recommended",severity="critical"} 0
zypper_applicable_patches{category="recommended",severity="important"} 0
zypper_applicable_patches{category="recommended",severity="moderate"} 0
zypper_applicable_patches{category="recommended",severity="low"} 0
zypper_applicable_patches{category="recommended",severity="unspecified"} 0
zypper_applicable_patches{category="optional",severity="critical"} 0
zypper_applicable_patches{category="optional",severity="important"} 0
zypper_applicable_patches{category="optional",severity="moderate"} 0
zypper_applicable_patches{category="optional",severity="low"} 0
zypper_applicable_patches{category="optional",severity="unspecified"} 0
zypper_applicable_patches{category="feature",severity="critical"} 0
zypper_applicable_patches{category="feature",severity="important"} 0
zypper_applicable_patches{category="feature",severity="moderate"} 0
zypper_applicable_patches{category="feature",severity="low"} 0
zypper_applicable_patches{category="feature",severity="unspecified"} 0
zypper_applicable_patches{category="document",severity="critical"} 0
zypper_applicable_patches{category="document",severity="important"} 0
zypper_applicable_patches{category="document",severity="moderate"} 0
zypper_applicable_patches{category="document",severity="low"} 0
zypper_applicable_patches{category="document",severity="unspecified"} 0
zypper_applicable_patches{category="yast",severity="critical"} 0
zypper_applicable_patches{category="yast",severity="important"} 0
zypper_applicable_patches{category="yast",severity="moderate"} 0
zypper_applicable_patches{category="yast",severity="low"} 0
zypper_applicable_patches{category="yast",severity="unspecified"} 0
# HELP zypper_service_needs_restart Set to 1 if service requires a restart due to using no-longer-existing libraries.
# TYPE zypper_service_needs_restart gauge
zypper_service_needs_restart{service="nscd"} 1
zypper_service_needs_restart{service="dbus"} 1
zypper_service_needs_restart{service="cups"} 1
zypper_service_needs_restart{service="sshd"} 1
zypper_service_needs_restart{service="cron"} 1
# HELP zypper_product_end_of_life Unix timestamp on when support for the product will end.
# TYPE zypper_product_end_of_life gauge
zypper_product_end_of_life{product="openSUSE"} 1606694400
zypper_product_end_of_life{product="openSUSE_Addon_NonOss"} 1000000000000001
# HELP zypper_needs_rebooting Whether the system requires a reboot as core libraries or services have been updated.
# TYPE zypper_needs_rebooting gauge
zypper_needs_rebooting 0
# HELP zypper_scrape_success Whether the last scrape for zypper data was successful.
# TYPE zypper_scrape_success gauge
zypper_scrape_success 1
</code></pre>
<p>In diesem Beispiel stehen zwei Sicherheitspatches aus und mehrere Services, unter anderem der SSH Daemon, bräuchten einen Neustart weil sie noch mit bereits gelöschten, also durch ein Update ersetzten, Bibliotheken arbeiten.</p>
<p>Durch Umleiten der Ausgabe in eine <code>prom</code> Datei ins Textfile-Collector-Verzeichnis des Node-Exporters von Prometheus kommen die Metriken dann ins Monitoring.
Wurde der Node-Exporter wie folgt aufgerufen:</p>
<pre><code>node_exporter --collector.textfile.directory /var/lib/node_exporter/collector
</code></pre>
<p>Dann lassen sie die Metriken wie folgt in Prometheus abladen:</p>
<pre><code>zypper-patch-status-collector > /var/lib/node_exporter/collector/zypper.prom
</code></pre>
<p>Stündlich per Systemd Timer aufgerufen hat Prometheus dann eine gute Übersicht über den Aktualisierungszustand der beobachteten openSUSE-Systeme.</p>
<p>Sind alle Metriken in Prometheus lassen sich dann auch verschiedene nützliche Alarme definieren.
Das folgende ist die Liste der auf dem Collector basierenden Alarme die ich momentan in meinem Alertmanager definiert habe:</p>
<pre><code>- alert: 'ZypperPatchesPending'
expr: 'sum(zypper_applicable_patches) by (instance) > 0'
for: '5m'
labels:
alert_severity: 'warning'
annotations:
summary: 'There are new patches available for {{ $labels.instance }}.'
description: 'Run `zypper patch --with-update` on {{ $labels.instance }}.'
- alert: 'ZypperCriticalPatchesPending'
expr: 'sum(zypper_applicable_patches{category="security"}) by (instance) + sum(zypper_applicable_patches{severity="critical"}) by (instance) > 0'
for: '5m'
labels:
alert_severity: 'page'
annotations:
summary: 'There are security patches pending on {{ $labels.instance }}.'
description: 'Run `zypper patch --with-update` on {{ $labels.instance }}.'
- alert: 'ZypperSuggestsServiceRestart'
expr: 'zypper_service_needs_restart'
for: '5m'
labels:
alert_severity: 'warning'
annotations:
summary: 'Zypper suggest to restart {{ $labels.service }} on {{ $labels.instance }}.'
description: 'Run `systemctl restart {{ $labels.service }}` on {{ $labels.instance }}.'
- alert: 'ZypperSuggestsReboot'
expr: 'zypper_needs_rebooting != 0'
for: '5m'
labels:
alert_severity: 'warning'
annotations:
summary: 'Zypper suggest to reboot {{ $labels.instance }}.'
description: 'Run `systemctl reboot` on {{ $labels.instance }}.'
- alert: 'ProductEndOfLifeNear'
expr: 'zypper_product_end_of_life < time() + 4 * 7 * 24 * 3600'
for: '5m'
labels:
alert_severity: 'warning'
annotations:
summary: '{{ $labels.product }} on {{ $labels.instance }} reaches end of life within four weeks.'
description: 'Upgrade {{ $labels.product }} on {{ $labels.instance }} to the next version.'
- alert: 'ProductEndOfLifeReached'
expr: 'zypper_product_end_of_life < time()'
for: '5m'
labels:
alert_severity: 'page'
annotations:
summary: '{{ $labels.product }} on {{ $labels.instance }} reached end of life.'
description: 'Upgrade {{ $labels.product }} on {{ $labels.instance }} to the next version.'
- alert: 'ZypperPatchDataOutdated'
expr: 'time() - node_textfile_mtime{file="zypper.prom"} > 24 * 3600'
for: '5m'
labels:
alert_severity: 'page'
annotations:
summary: 'Patch status has not been updated for 24 hours.'
description: |
The patch status of {{ $labels.instance }} has not been updated for 24 hours. Check the status of the timer and the service:
systemctl status zypper-patch-status-collector.timer
systemctl status zypper-patch-status-collector.service
- alert: 'ZypperScrapeFailed'
expr: 'zypper_scrape_success == 0'
for: '24h'
labels:
alert_severity: 'page'
annotations:
summary: 'Failed to successfully query patch status for 24 hours now.'
description: |
Querying zypper for the current patch status has not been successful for 24 hours. Check the status of the service:
systemctl status zypper-patch-status-collector.service
</code></pre>
<p>Die Installation des Collectors erfolgt am einfachsten über <a href="https://software.opensuse.org/package/python3-zypper-patch-status-collector">mein Community-Paket auf software.opensuse.org</a>.
Ich veröffentliche das Paket zwar auch <a href="https://pypi.org/project/zypper-patch-status-collector/">auf pypi.org</a>, aber ein Werkzeug mit Bezug zu Zypper am System vorbei zu installieren wäre dann doch etwas sehr verquer.</p>Der schusselige WLAN-Client2020-05-11T00:00:00+02:002020-05-11T00:00:00+02:00Matthias Bachtag:marix.org,2020-05-11:/der-schusselige-wlan-client.html<p>Das Lenovo Thinkpad E470 ist ein wunderbarer Laptop und openSUSE Leap funktioniert darauf hervorragend, wäre da nicht ein kleines Problem mit dem WLAN:
Der Laptop ist etwas schusselig was das Passwort für das WLAN angeht.
Immer wieder scheint er es zu vergessen und fragt per Dialog nach.
Scheinbar scheint er …</p><p>Das Lenovo Thinkpad E470 ist ein wunderbarer Laptop und openSUSE Leap funktioniert darauf hervorragend, wäre da nicht ein kleines Problem mit dem WLAN:
Der Laptop ist etwas schusselig was das Passwort für das WLAN angeht.
Immer wieder scheint er es zu vergessen und fragt per Dialog nach.
Scheinbar scheint er einen dann aber nicht zu verstehen, und fragt immer wieder.
Gibt man aber erst einmal auf, bricht den Verbindungsversuch ab und bittet ihn kurz darauf nochmal die Verbindung aufzubauen, so erinnert er sich plötzlich und verbindet sich ohne weitere Nachfragen.</p>
<p><img alt="KDE fragt per Dialog nach einem Passwort fürs WLAN" src="https://marix.org/Bilder/WLAN-Passwortabfrage.png"></p>
<p>Beim Versuch dem Problem auf den Grund zu gehen stellte ich schnell fest, dass es offensichtlich nicht am seit vielen Jahren immer wieder migrierten Nutzer liegt, denn das Problem tritt auch für einen neuen Nutzer auf.
Es ist aber auch nie zu hundert Prozent zuverlässig reproduzierbar, was die Fehlersuche zusätzlich erschwert.
So dachte ich zunächst, dass es eventuell mit der Initialisierung der Hardware zu hat, da es sehr häufig nach einem Neustart des Rechners auftauchte.
Auch trat das Problem eigentlich immer nur bei einem automatischen Verbindungsaufbau auf, also z.B. wenn das Netzwerk komplett deaktiviert wurde.
War die WLAN-Hardware hingegen ohne aufgebaute Verbindung aktiv und ich wählte das Netzwerk über das Netzwerkapplet von KDE aus, so verband sich der Rechner zuverlässig.
Allerdings habe ich das Problem aber nie nach einem Suspend beobachtet, was diese Theorie zumindest unwahrscheinlicher machte.</p>
<p><a href="https://lists.opensuse.org/opensuse/2020-04/msg00581.html">Eine Nachfrage auf der Mailingliste von openSUSE</a> brachte mich dann mit einem Verweis auf <a href="https://lists.opensuse.org/opensuse-de/2019-10/msg00099.html">eine Diskussion auf der deutschsprachigen Liste</a> auf die Lösung des Problems:
Anscheinend verursacht die <em>MAC address randomization</em> das Problem.
Seit jene abgeschaltet ist trat das Problem nicht mehr auf.</p>
<p>Ein einfacher weg die <em>MAC address randomization</em> abzuschalten findet sich auf <a href="https://blog.muench-johannes.de/networkmanager-disable-mac-randomization-314">https://blog.muench-johannes.de/networkmanager-disable-mac-randomization-314</a>.
Es ist lediglich die Datei <code>/etc/NetworkManager/conf.d/100-disable-wifi-mac-randomization.conf</code> mit folgendem Inhalt anzulegen:</p>
<pre><code>[connection]
wifi.mac-address-randomization=1
[device]
wifi.scan-rand-mac-address=no
</code></pre>
<p>Wieso dieses Vorgehen in einem Netzwerk ohne MAC-Adressen-Filter notwendig sein sollte ist mir zwar schleierhaft, aber solange es hilft…</p>
<p>Die randomisierten MAC-Adressen zu deaktivieren hat natürlich eine Auswirkung auf die Privatsphäre.
Da dieser Rechner aber ausschließlich zuhause oder bei öffentlichen Auftritten genutzt wird ist dies in diesem Fall verschmerzbar.</p>Alte Kernelversionen installiert behalten2019-08-16T00:00:00+02:002019-08-16T00:00:00+02:00Matthias Bachtag:marix.org,2019-08-16:/alte-kernelversionen-installiert-behalten.html<p>OpenSUSE behält in seiner Standardkonfiguration bei einer Aktualisierung des Kernels stets die letzte zuvor installierte Version.
Diese kann beim Systemstart über die erweiterten Startmodi ausgewählt werden.
Das hat den großen Vorteil, dass sollte der neue Kernel einen Fehler haben, man noch zu einem funktionierenden System zurückkehren kann.
Man kann also …</p><p>OpenSUSE behält in seiner Standardkonfiguration bei einer Aktualisierung des Kernels stets die letzte zuvor installierte Version.
Diese kann beim Systemstart über die erweiterten Startmodi ausgewählt werden.
Das hat den großen Vorteil, dass sollte der neue Kernel einen Fehler haben, man noch zu einem funktionierenden System zurückkehren kann.
Man kann also einfach mit dem alten Kernel weiterarbeiten und auf eine Behebung des Fehlers warten.</p>
<p>Doch was passiert bei der nächsten Aktualisierung?
Hier gibt es mehrere Optionen.
Löst die nächste Aktualisierung das Problem, kann man wieder auf den aktuellen Kernel wechseln und die alten Versionen können einem egal sein.
Ist das Problem mit der nächsten Aktualisierung nicht behoben gibt es zwei mögliche Fälle.
Im einfachen Fall startet das System mit dem neuen Kernel gar nicht.
In diesem Fall kann man weiterhin mit dem alten Kernel weiterarbeiten, denn das System behält stets den aktuell laufenden Kernel installiert
Solange neuere Kernel gar nicht starten können die alten Versionen somit auch nicht entfernt werden.
Spannender wird es, wenn der neue Kernel zwar startet, aber trotzdem nicht korrekt funktioniert.
So läuft womöglich der proprietäre Treiber von NVIDIA nicht oder ein Fehler im Kernel tritt nur in bestimmten Situationen auf.
In diesem Fall würde das System in der Standardkonfiguration nach dem, aus seiner Sicht erfolgreichen, Start den alten Kernel entfernen und nur die zwei defekten Kernel behalten.</p>
<p>Zum Glück lässt sich die Menge der aufbewahrten Kernel sehr flexibel Konfigurieren.
Die Konfiguration findet sich in der Datei <code>/etc/zypp/zypp.conf</code>
Entscheiden ist der Wert der Option <code>multiversion.kernels</code>.
Diese wird standardmäßig wie folgt gesetzt:</p>
<pre><code>multiversion.kernels = latest,latest-1,running
</code></pre>
<p>Damit werden die neuesten beiden und der aktuell laufende Kernel behalten.
Hier lassen sich aber auch explizite Versionen eintragen.
Damit sieht die Zeile dann wie folgt aus:</p>
<pre><code>multiversion.kernels = latest,latest-1,running,4.12.14-lp151.28.10.1
</code></pre>
<p>Wichtig ist, dass hier die Paketversion benötigt wird, nicht die vom Kernel bei einem <code>uname -a</code> ausgegebene Version.
Letzteres würde lautet für den im Beispiel benutzen Kernel folgendes ausgeben.</p>
<pre><code>Linux test 4.12.14-lp151.28.10-default #1 SMP Sat Jul 13 17:59:31 UTC 2019 (0ab03b7) x86_64 x86_64 x86_64 GNU/Linux
</code></pre>
<p>Die dazugehörige Paketversion lässt sich per <code>rpm</code> oder <code>zypper</code> abfragen:</p>
<pre><code>> rpm -qa kernel-default
kernel-default-4.12.14-lp151.28.10.1.x86_64
kernel-default-4.12.14-lp151.28.13.1.x86_64
> zypper search -s kernel-default
Repository-Daten werden geladen...
Installierte Pakete werden gelesen...
S | Name | Typ | Version | Arch | Repository
---+----------------------+------------+-----------------------+--------+--------------------------------
i+ | kernel-default | Paket | 4.12.14-lp151.28.13.1 | x86_64 | Hauptaktualisierungs-Repository
i+ | kernel-default | Paket | 4.12.14-lp151.28.10.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default | Paket | 4.12.14-lp151.28.7.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default | Paket | 4.12.14-lp151.28.4.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default | Paket | 4.12.14-lp151.27.3 | x86_64 | Haupt-Repository (OSS)
| kernel-default | Quellpaket | 4.12.14-lp151.28.13.1 | noarch | Hauptaktualisierungs-Repository
| kernel-default | Quellpaket | 4.12.14-lp151.28.10.1 | noarch | Hauptaktualisierungs-Repository
| kernel-default | Quellpaket | 4.12.14-lp151.28.7.1 | noarch | Hauptaktualisierungs-Repository
| kernel-default | Quellpaket | 4.12.14-lp151.28.4.1 | noarch | Hauptaktualisierungs-Repository
| kernel-default-base | Paket | 4.12.14-lp151.28.13.1 | x86_64 | Hauptaktualisierungs-Repository
| kernel-default-base | Paket | 4.12.14-lp151.28.10.1 | x86_64 | Hauptaktualisierungs-Repository
| kernel-default-base | Paket | 4.12.14-lp151.28.7.1 | x86_64 | Hauptaktualisierungs-Repository
| kernel-default-base | Paket | 4.12.14-lp151.28.4.1 | x86_64 | Hauptaktualisierungs-Repository
| kernel-default-base | Paket | 4.12.14-lp151.27.3 | x86_64 | Haupt-Repository (OSS)
i+ | kernel-default-devel | Paket | 4.12.14-lp151.28.13.1 | x86_64 | Hauptaktualisierungs-Repository
i+ | kernel-default-devel | Paket | 4.12.14-lp151.28.10.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default-devel | Paket | 4.12.14-lp151.28.7.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default-devel | Paket | 4.12.14-lp151.28.4.1 | x86_64 | Hauptaktualisierungs-Repository
v | kernel-default-devel | Paket | 4.12.14-lp151.27.3 | x86_64 | Haupt-Repository (OSS)
</code></pre>
<p>Wie im Beispiel zu sehen ist, liefert <code>zypper</code> die einfacher zu lesende Ausgabe, <code>rpm</code> aber eine deutlich kompaktere.</p>
<p>Hat man so den funktionierenden Kernel vor dem automatischen Aufräumen geschützt, lässt es sich ganz entspannt auf eine reparierte Version warten.
Wurde der Fehler behoben, und spätestens nach dem nächsten Distributionsupgrade, sollte man allerdings die Konfiguration wieder zurücksetzen um nicht unnötig alte Kernel mit sich herumzuschleppen.
Denn diese benötigen nicht nur Platz, sie verlängern auch die Installationszeit mancher Updates.</p>
<p>Weitere Informationen zur Installation mehrerer Kernelversionen finden sich <a href="https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha.tuning.multikernel.html#sec.tuning.multikernel.enable.keep">in der englischen Referenzdokumentation von openSUSE Leap</a>.</p>Automatisiertes Tippen von Passwörtern auf openSUSE2019-08-11T00:00:00+02:002019-08-11T00:00:00+02:00Matthias Bachtag:marix.org,2019-08-11:/automatisiertes-tippen-von-passwortern-auf-opensuse.html<p>Die Passwortverwaltung <a href="https://keepass.info/">KeePass</a> hat das äußerst praktische Feature <em>Auto-Type</em> um Anmeldeformulare in jeglicher Software, also nicht nur im Browser, per Knopfdruck ausfüllen zu können.
Damit spart man sich das manuelle Kopieren und Einfügen, was nicht nur komfortabler ist, sondern auch verhindert, dass das Passwort auf diesem Weg doch an einer …</p><p>Die Passwortverwaltung <a href="https://keepass.info/">KeePass</a> hat das äußerst praktische Feature <em>Auto-Type</em> um Anmeldeformulare in jeglicher Software, also nicht nur im Browser, per Knopfdruck ausfüllen zu können.
Damit spart man sich das manuelle Kopieren und Einfügen, was nicht nur komfortabler ist, sondern auch verhindert, dass das Passwort auf diesem Weg doch an einer falschen Stelle landet.
Leider funktionierte dies in openSUSE bisher nur, wenn man manuell das Paket <code>xdotool</code> nachinstalliert.
Ansonsten begrüßt folgende Fehlermeldung:</p>
<p><img alt="The 'xdotool' utility package is required for auto-type. Install this package and try again." src="https://marix.org/Bilder/KeePass-braucht-xdotool.png"></p>
<p>Die Fehlermeldung sagt dem Nutzer zwar bereits wie das Problem zu beheben ist, aber ich als Nutzer bevorzuge es eigentlich, wenn Dinge einfach funktionieren.
Von daher sollte die Installation des Paketes <code>keepass</code> eigentlich dafür sorgen, dass auch <code>xdotool</code> installiert wird.</p>
<p>Zum Glück hat openSUSE <a href="https://en.opensuse.org/openSUSE:How_to_contribute_to_Factory">einen gut Dokumentierten Prozess um Korrekturen zu Paketen beizutragen</a>.
Das Paket zu reparieren ist also fast genau so schnell erledigt wie die fehlende Abhängigkeit zu installieren. Und als Bonus muss ich es auf dem nächsten System dann nicht wiederholen.</p>
<p><a href="https://build.opensuse.org/request/show/690171">Wie man an meinem Request sehen kann</a> habe ich <code>xdotool</code> übrigens nicht einfach als Abhängigkeit zu <code>keepass</code> hinzugefügt, denn KeePass funktioniert ja auch ohne <code>xdotool</code> fehlerfrei.
Stattdessen nutze ich den <a href="https://en.opensuse.org/openSUSE:Package_dependencies#Recommends">Vorschlagsmechanismus</a>, also <code>Recommends</code> statt <code>Depends</code>.
So bekommt ein normaler Nutzer das empfohlene Paket automatisch mitinstalliert.
Wer aber <code>--no-recommends</code> nutzt, um beispielsweise aus Sicherheitsgründen oder wegen beschränktem Platz auf der Systemfestplatte, nur die absolut notwendigen Pakete installieren möchte, bekommt weiterhin die gleiche minimale Installation wie bisher.</p>
<p>Leider habe ich meine Korrektur minimal zu spät beigetragen, als dass sie es noch in openSUSE Leap 15.1 geschafft hätte.
Von daher profitiert man bisher in in Tumbleweed davon.
Mit der nächsten Leap-Version können dann aber auch Leap-Nutzer ohne manuelle Nacharbeit <em>Auto-Type</em> nutzen.</p>openSUSE-Pakete für den Client und das Dateisystem von Keybase2018-11-12T00:00:00+01:002018-11-12T00:00:00+01:00Matthias Bachtag:marix.org,2018-11-12:/opensuse-pakete-fur-den-client-und-das-dateisystem-von-keybase.html<p><a href="https://keybase.io/">Keybase</a> gehört zu den Diensten, die zwar irgendwie wahnsinnig nützlich sind, denen der breite Erfolg bisher aber leider verwehrt wurde.
Das Kernfeature besteht darin, dass es einen Weg bietet eine verschlüsselte Kommunikation mit Personen aufzubauen von denen man nur einen Social-Media-Account kennt.
Durch das Verfahren, einen Beweis über die Eigentümerschaft …</p><p><a href="https://keybase.io/">Keybase</a> gehört zu den Diensten, die zwar irgendwie wahnsinnig nützlich sind, denen der breite Erfolg bisher aber leider verwehrt wurde.
Das Kernfeature besteht darin, dass es einen Weg bietet eine verschlüsselte Kommunikation mit Personen aufzubauen von denen man nur einen Social-Media-Account kennt.
Durch das Verfahren, einen Beweis über die Eigentümerschaft des Schlüssels im Social-Media-Account zu hinterlegen, kann man diesen, anders als Schlüsseln welche man von einem PGP-Keyserver erhalten hat, recht gut Vertrauen.
Leider bietet allerdings Keybase kein Installationspaket seiner Software für openSUSE an, so dass ich nun selber Pakete erstellt habe.</p>
<p>Die grundlegenden Funktionen von Keybase sind über <a href="https://keybase.io/docs/command_line">das Kommandozeilenwerkzeug <code>keybase</code></a> verfügbar.
Dieses wird vom Paket <code>keybase-client</code> bereitgestellt und lässt sich in Tumbleweed durch ein einfaches <code>sudo zypper install keybase-client</code> installieren.
Für Leap 15.0 ist das Paket leider nur als Versuchspaket verfügbar, welches sich am besten <a href="https://software.opensuse.org/package/keybase-client">per 1-Klick-Installation von software.opensuse.org installieren</a> lässt.</p>
<p>Außerdem bietet Keybase noch zwei weitere nützliche Funktionen.
Mit <a href="https://keybase.io/docs/kbfs">dem dazugehörigen Dateisystem</a> lassen sich Daten verschlüsselt und signiert mit anderen Nutzer tauschen.
Auch öffentlich lassen sich darüber Dateien anbieten.
Diese erscheinen dann unter <code>https://<nutzername>.keybase.pub</code>, und sind natürlich nicht verschlüsselt sondern nur signiert.
Hierfür wird das Paket <code>kbfs</code> benötigt.
Ist diese installiert, kann man per <code>systemctl --user start kbfs</code> das Dateisystem starten, welches dann unter <code>${XDG_RUNTIME_DIR}/keybase/kbfs</code> erscheint.</p>
<p>Die zweite nützliche Funktion ist es <a href="https://keybase.io/blog/encrypted-git-for-everyone">Git-Repositories verschlüsselt in Keybase abzulegen</a>.
Hierzu wird das Paket <code>kbfs-git</code> benötigt.
Sobald diese installiert ist, und das Dateisystem aktiv, kann Git auf Repositories welche das Protokoll <code>keybase</code> nutzen zugreifen.
Die Verwaltung erfolgt hierbei über das Kommando <code>keybase git</code>.</p>Dieser Rattenfänger befreit Mäuse2018-10-31T00:00:00+01:002018-10-31T00:00:00+01:00Matthias Bachtag:marix.org,2018-10-31:/dieser-rattenfanger-befreit-mause.html<p>Seit letzter Woche ist <a href="https://github.com/libratbag/piper">Piper</a> in <a href="https://www.opensuse.org/#Tumbleweed">openSUSE Tumbleweed</a> als Paket enthalten.
<a href="https://github.com/libratbag/piper">Piper</a> erlaubt es für eine ganze Reihe Spielermäuse diese auch unter Linux ganz genau so zu konfigurieren, wie es sonst die nur unter Windows verfügbaren Programme der Hersteller tun.</p>
<p><img alt="Ein Screenshot von Piper" src="https://marix.org/Bilder/Piper.png"></p>
<p>Bei meiner Logitech G502 kann ich mit Piper nicht nur …</p><p>Seit letzter Woche ist <a href="https://github.com/libratbag/piper">Piper</a> in <a href="https://www.opensuse.org/#Tumbleweed">openSUSE Tumbleweed</a> als Paket enthalten.
<a href="https://github.com/libratbag/piper">Piper</a> erlaubt es für eine ganze Reihe Spielermäuse diese auch unter Linux ganz genau so zu konfigurieren, wie es sonst die nur unter Windows verfügbaren Programme der Hersteller tun.</p>
<p><img alt="Ein Screenshot von Piper" src="https://marix.org/Bilder/Piper.png"></p>
<p>Bei meiner Logitech G502 kann ich mit Piper nicht nur grafisch zwischen den einzelnen Profilen wechseln, sonder ich kann auch für jedes Profil die Auflösungsstufen, die Tastenbelegung und die LEDs konfigurieren.</p>
<p>Zur Installation muss das Paket <code>piper</code> ausgewählt werden, entweder in der grafischen Paketverwaltung, per <a href="https://software.opensuse.org/package/piper">1-Klick-Installation auf software.opensuse.org</a> oder auf der Kommandozeile:</p>
<pre><code>sudo zypper install piper
</code></pre>
<p>In openSUSE Leap ist Piper aktuell leider nicht nutzbar.
Der darunterliegende Service Ratbagd hatte seine Sicherheitsbegutachtung beim Release von Leap 15.0 leider noch nicht abgeschlossen.
Mit der kommenden Version 15.1 sollte der Nutzung von Piper auf Leap dann aber auch nichts mehr im Wege stehen.</p>HTTP/2 im Apache auf openSUSE2018-10-23T00:00:00+02:002018-10-23T00:00:00+02:00Matthias Bachtag:marix.org,2018-10-23:/http2-im-apache-auf-opensuse.html<p>Nachdem es inzwischen keine Version von openSUSE mehr gibt in welcher der Apache zu alt ist um HTTP/2 zu unterstützen, gibt es eigentlich keine Ausrede mehr um dieses nicht einzusetzen.
Tatsächlich ist die Installation auf openSUSE auch schon hervorragend vorbereitet, man muss lediglich berücksichtigen, dass HTTP/2 nicht mit …</p><p>Nachdem es inzwischen keine Version von openSUSE mehr gibt in welcher der Apache zu alt ist um HTTP/2 zu unterstützen, gibt es eigentlich keine Ausrede mehr um dieses nicht einzusetzen.
Tatsächlich ist die Installation auf openSUSE auch schon hervorragend vorbereitet, man muss lediglich berücksichtigen, dass HTTP/2 nicht mit dem Multi-Processing-Module (MPM) <em>Worker</em> kompatibel ist, welches immer noch der Standard ist.</p>
<p>Um HTTP/2 zu aktivieren ist zunächst ein kompatibles MPM zu installieren.
Eine gute Wahl ist hierbei das MPM <em>Event</em>, welches unter openSUSE durch das Paket <code>apache2-event</code> bereitgestellt wird.</p>
<pre><code>sudo zypper install apache2-event
</code></pre>
<p>Alle notwendige Konfiguration kann anschließend in der Datei <code>/etc/sysconfig/apache2</code> vorgenommen werden:</p>
<ol>
<li>Das korrekte MPM auswählen: <code>APACHE_MPM=event</code>.</li>
<li>Das HTTP2-Module durch hinzufügen von <code>http2</code> zum Wert von <code>APACHE_MODULES</code> aktivieren.</li>
<li>Den Wert <code>HTTP2</code> zu <code>APACHE_SERVER_FLAGS</code> um die von openSUSE mitgelieferte Konfiguration für HTTP/2 zu aktivieren.</li>
</ol>
<p>Ab dem nächsten, per <code>systemctl restart apache2</code> durchführbaren, Neustart ist der Server dann per HTTP/2 zu erreichen.</p>
<p>Um für Browser per HTTP/2 nutzbar zu sein muss der Server übrigens TLS reden, da Firefox und Chrome HTTP/2 nur für sichere Verbindungen unterstützen.
Das sollte heutzutage aber sowieso der Standard sein.</p>GameMode2018-06-22T00:00:00+02:002018-10-14T00:00:00+02:00Matthias Bachtag:marix.org,2018-06-22:/gamemode.html<p>Beim Spielen möchte man am liebsten ungestört sein.
Deshalb bietet es sich häufig an so manches Program beim Starten eines Spieles zu schließen.
Auch weisen viele Spiele von Feral Interactive, z.B. F1 2017, weisen einen beim Start recht deutlich darauf hin, dass sie für die CPU eigentlich gerne den …</p><p>Beim Spielen möchte man am liebsten ungestört sein.
Deshalb bietet es sich häufig an so manches Program beim Starten eines Spieles zu schließen.
Auch weisen viele Spiele von Feral Interactive, z.B. F1 2017, weisen einen beim Start recht deutlich darauf hin, dass sie für die CPU eigentlich gerne den Performance-Modus aktiviert hätten.
Programme zu beenden und den Energiesparmodus zu wechseln, vor allem aber dies nach Ende der Spielesitzung alles wieder rückgängig zu machen, ist mühselig und steht dem spontanen Spielegenuß im Weg.
Hier hilft der von <a href="https://www.feralinteractive.com/de/">Feral Interactive</a> entwickelte <a href="https://github.com/FeralInteractive/gamemode">GameMode</a>.</p>
<p><a href="https://github.com/FeralInteractive/gamemode">GameMode</a> läuft als Prozess im Hintergrund und bietet eine einfache Funktion:
Über die dazugehörige Bibliothek können Spiele den Rechner in einen Spielemodus schalten.
Im Spielemodus wird die CPU in den Performance-Modus geschaltet.
Außerdem lassen sich beliebige weitere beim Start des Spielemodus auszuführende Aktionen definieren um beispielsweiße den Mail-Client für die dauer der Spielesitzung zu beenden.
Am Ende der Spielesitzung schaltet GameMode die CPU dann von alleine wieder in den balancierten Modus, so dass nicht weiter unnötig viel Energie verbraucht wird.</p>
<p>Da selbst Spiele von Feral Interactive noch nicht durchgängig GameMode unterstützen gibt es außerdem <em>libgamemodeauto</em>.
<em>Libgamemodeauto</em> kann per <code>LD_PRELOAD</code> mit einer Anwendung mitgeladen werden und sorgt dann automatisch für den Wechsel in den Spielemodus.
Installiert man <em>libgamemodeauto</em> über das openSUSE-Paket <code>libgamemodeauto0</code>, so findet es sich in <code>/usr/lib64/libgamemodeauto.so.0</code>.
Um es im Spiel <code>game</code> zu nutzen ist diese dann wie folgt zu starten:</p>
<pre><code>LD_PRELOAD=/usr/lib64/libgamemodeauto.so.0 game
</code></pre>
<p>Um Spiele per Steam mit <em>libgamemodeauto</em> zu starten ist in den Startoptionen des Spieles folgendes einzutragen:</p>
<pre><code>LD_PRELOAD=$LD_PRELOAD:/usr/lib64/libgamemodeauto.so.0 %command%
</code></pre>
<p>Diese Kommandozeilen finden sich auch in der Paketbeschreibung von <code>libgamemodeauto0</code>, welche sich per <code>zypper info libgamemodeauto0</code> anzeigen lässt.</p>
<p>Der einfachste Weg GameMode zu installieren ist <a href="https://software.opensuse.org/download.html?project=games%3Atools&package=libgamemodeauto">den Download oder die Anleitung von software.opensuse.org</a> zu nutzen.
In Tumbleweed reicht ein einfaches <code>zypper install ligbamemodeauto0</code>.
In Leap ist <em>libgameodeauto</em> leider noch nicht eingezogen, so dass zuvor das Repository <em>games:tools</em> hinzugefügt werden muss.</p>
<p>Zusätzliche Aktionen für den Start und das Ende des Spielemodus lassen sich in der Datei <code>~/.config/gamemode.ini</code> definieren.
Bei mir sieht diese so aus:</p>
<pre><code>[custom]
start=
cd && boinccmd --set_run_mode never
akonadictl stop
balooctl suspend
notify-send "GameMode started"
end=
notify-send "GameMode ended"
akonadictl start
balooctl resume
cd && boinccmd --set_run_mode auto
</code></pre>
<p>Mit <code>boinccmd</code> wird Boinc für die dauer der Spielesitzung angehalten.
Mit <code>akonadictl</code> halte ich effektiv mein Emailprogram an und mit <code>balooctl</code> schalte ich für die Dauer der Spielesitzung die Indizierung der Desktopsuche aus.
Nach Änderungen an der Konfigurationsdatei muss GameMode einmal beendet werden, am einfachsten über <code>killall gamemoded</code>.
Durch die nächste Anwendung, welche den GameMode nutzen möchte, wird der Prozess automatisch wieder gestartet, dann mit der neuen Konfiguration.</p>
<p>Für einfache Tests gibt es außerdem noch die Möglichkeit den Spielemodus mittels <code>gamemode -r</code> explizit zu aktivieren.
Beenden des Programmes per <code>Strg+C</code> deaktiviert den Spielemodus dann wieder.</p>Ein paar Tipps zum Aktualisieren von openSUSE2018-06-10T00:00:00+02:002018-06-10T00:00:00+02:00Matthias Bachtag:marix.org,2018-06-10:/ein-paar-tipps-zum-aktualisieren-von-opensuse.html<p>Seit dem 25. Mai 2018 ist <a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0">openSUSE Leap 15.0</a> verfügbar.
Ein guter Grund mal ein paar Tipps zur Aktualiserung von openSUSE auf eine neue Version zu geben.
Da ich für gewöhnlich mithilfe des Installationsmediums aktualisiere beziehen sich meine Tipps primär auf diese Methode.
Aber gerade der Hinweis wie man …</p><p>Seit dem 25. Mai 2018 ist <a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0">openSUSE Leap 15.0</a> verfügbar.
Ein guter Grund mal ein paar Tipps zur Aktualiserung von openSUSE auf eine neue Version zu geben.
Da ich für gewöhnlich mithilfe des Installationsmediums aktualisiere beziehen sich meine Tipps primär auf diese Methode.
Aber gerade der Hinweis wie man verwaiste Pakete findet ist natürlich auch nach einem sogenannten Live-Upgrade hilfreich.</p>
<p><a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0"><img alt="openSUSE Leap 15.0 ist jetzt verfügbar" src="https://marix.org/Bilder/openSUSE-Leap-15.0-verfügbar.png"></a></p>
<h2 id="der-nvidia-treiber">Der NVIDIA-Treiber</h2>
<p>Meiner Erfahrung nach empfiehlt es sich den NVIDIA-Treiber vor dem Update zu deinstallieren.
Bei früheren Versionen von openSUSE habe ich es ansonsten schon erlebt, dass auch nach hinzufügen des NVIDIA-Repositories für die neue Version noch der alte Treiber installiert bleibt.
Dieser funktioniert dann allerdings nicht.
Linux, bzw. X.org, ist an dieser Stelle zwar hart im Nehmen und nutzt dann automatisch Nouveau, aber dieser kann dem proprietären Treiber von NVIDIA leider nicht annähernd das Wasser reichen.</p>
<p>Sollte das System bereits aktualisiert und Nouveau aktiv sein, so empfiehlt es sich den alten NVIDIA-Treiber mittels <code>zypper remove nvidia*</code> komplett zu deinstallieren und anschließen neu zu installieren.
Eine Neuinstallation mittels <code>zypper install --force</code> hat bei mir in der Vergangenheit meißtens nicht den gewünschten Erfolg gebracht.</p>
<h2 id="uefi">UEFI</h2>
<p>Bei einem System welches sowohl im EFI-Modus als auch im Bios-Kompatibilitätsmodus starten kann ist es wichtig das Upgrade im selben Modus zu starten welchen das alte System nutzt.
Bei openSUSE 42.2 endete ich dadurch, dass ich dies nicht getan habe, mit einem nicht bootfähigen System.
Allerdings gibt es im Zweifelsfall einen einfachen Ausweg.
Einfach auf dem bereits aktualisieren System das Update nochmal im richtigen Modus ausführen.
Da alle Pakete schon aktualisiert sind und nur noch der Bootcode korrekt installiert werden muss, geht dies dann auch recht schnell.</p>
<h2 id="repositories">Repositories</h2>
<p>Bei einem Update mithilfe des Installationsmediums werden alle zusätzlichen Repositories aus dem System entfernt.
Dies führt zu einem sauberen Update, kann aber zur Folge haben, dass man anschließend mühsam zusammensuchen muss woher man eine bestimmte Anwendung hatte.
Hierzu empfiehlt es sich vor der Aktualisierung einen Überblick zu verschaffen welche Pakete man aus dritten Quellen installiert hat.</p>
<h3 id="die-konfigurierten-repositories">Die konfigurierten Repositories</h3>
<p>Zypper kann einem mit <code>repos -u</code> die Liste der aktuell konfigurierten Repositories mit ihren URLs ausgeben.
So ist es, falls das Repository auch nach dem Update noch benötigt wird, möglich, durch einfaches Ersetzen der Versionsnummer in der URL, an das passende Repository der neuen Version zu kommen.
Auf meinem großen Rechner sieht dies dann zum Beispiel so aus:</p>
<pre><code>> zypper repos -u
Die Repository-Prioritäten sind ohne Effekt. Alle aktivierten Repositorys teilen sich die gleiche Priorität.
# | Alias | Name | Aktiviert | GPG-Überprüfung | Aktualisierung | URI
---+---------------------------------+---------------------------------------------------------+-----------+-----------------+----------------+-------------------------------------------------------------------------------------
1 | code | Visual Studio Code | Ja | (r ) Ja | Ja | https://packages.microsoft.com/yumrepos/vscode
2 | download.nvidia.com-leap | nVidia Graphics Drivers | Ja | (r ) Ja | Ja | http://download.nvidia.com/opensuse/leap/42.3
3 | download.opensuse.org-non-oss | Haupt-Repository (NON-OSS) | Ja | (r ) Ja | Ja | http://download.opensuse.org/distribution/leap/42.3/repo/non-oss/
4 | download.opensuse.org-non-oss_1 | Aktualisierungs-Repository (Nicht-Open-Source-Software) | Ja | (r ) Ja | Ja | http://download.opensuse.org/update/leap/42.3/non-oss/
5 | download.opensuse.org-oss | Haupt-Repository (OSS) | Ja | (r ) Ja | Ja | http://download.opensuse.org/distribution/leap/42.3/repo/oss/
6 | download.opensuse.org-oss_1 | Hauptaktualisierungs-Repository | Ja | (r ) Ja | Ja | http://download.opensuse.org/update/leap/42.3/oss
7 | isv_ownCloud_desktop | The ownCloud Desktop Client (openSUSE_Leap_42.3) | Ja | (r ) Ja | Ja | http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/openSUSE_Leap_42.3/
8 | opensuse-guide.org-repo | Libdvdcss Repository | Ja | (r ) Ja | Ja | http://opensuse-guide.org/repo/openSUSE_Leap_42.3/
9 | packman.inode.at-suse | Packman Repository | Ja | (r ) Ja | Ja | http://packman.inode.at/suse/openSUSE_Leap_42.3/
10 | repo-debug | openSUSE-Leap-42.3-Debug | Nein | ---- | ---- | http://download.opensuse.org/debug/distribution/leap/42.3/repo/oss/
11 | repo-debug-non-oss | openSUSE-Leap-42.3-Debug-Non-Oss | Nein | ---- | ---- | http://download.opensuse.org/debug/distribution/leap/42.3/repo/non-oss/
12 | repo-debug-update | openSUSE-Leap-42.3-Update-Debug | Nein | ---- | ---- | http://download.opensuse.org/debug/update/leap/42.3/oss/
13 | repo-debug-update-non-oss | openSUSE-Leap-42.3-Update-Debug-Non-Oss | Nein | ---- | ---- | http://download.opensuse.org/debug/update/leap/42.3/non-oss/
14 | repo-source | openSUSE-Leap-42.3-Source | Nein | ---- | ---- | http://download.opensuse.org/source/distribution/leap/42.3/repo/oss/
15 | repo-source-non-oss | openSUSE-Leap-42.3-Source-Non-Oss | Nein | ---- | ---- | http://download.opensuse.org/source/distribution/leap/42.3/repo/non-oss/
</code></pre>
<h3 id="installierte-pakete-eines-repositories-anzeigen">Installierte Pakete eines Repositories anzeigen</h3>
<p>Fragt man sich wozu ein bestimmtes Repository im System ist kann man sich mit <code>zypper search --repo <repository-id> --installed-only</code> die aus einem bestimmten Repository installierten Pakete anzeigen lassen.
Am Beispiel des NVIDIA-Repositories sieht das bei mir dann so aus:</p>
<pre><code>> zypper search -r download.nvidia.com-leap -i
Repository-Daten werden geladen...
Installierte Pakete werden gelesen...
S | Name | Zusammenfassung | Typ
---+---------------------------+-----------------------------------------------------------------------+------
i+ | nvidia-computeG04 | NVIDIA driver for computing with GPGPU | Paket
i+ | nvidia-gfxG04-kmp-default | NVIDIA graphics driver kernel module for GeForce 400 series and newer | Paket
i+ | nvidia-glG04 | NVIDIA OpenGL libraries for OpenGL acceleration | Paket
i+ | x11-video-nvidiaG04 | NVIDIA graphics driver for GeForce 400 series and newer | Paket
</code></pre>
<h2 id="verwaiste-pakete-aufraumen">Verwaiste Pakete aufräumen</h2>
<p>Nach dem Update lohnt es sich häufig verwaiste Pakete zu entfernen.
Solche kann man mit einer Kombination von <code>zypper search</code> und <code>grep</code> leicht auffinden:</p>
<pre><code>> zypper search --details --installed-only --type package | grep Systempakete
i+ | Desurium | Paket | 0.8.0_rc10-3.1 | x86_64 | (Systempakete)
</code></pre>
<p>Möchte man ein Paket gerne behalten lohnt es sich mit <code>zypper search --details <Paketname></code> zu schauen ob es eine andere Version des Paketes in einem der konfigurierten Repsitories gibt.
Findet sich dort keine Version, so lohnt meißtens ein Besuch auf <a href="https://software.opensuse.org">https://software.opensuse.org</a>.</p>Grid Autosport auf openSUSE 42.32018-05-10T00:00:00+02:002018-05-10T00:00:00+02:00Matthias Bachtag:marix.org,2018-05-10:/grid-autosport-auf-opensuse-423.html<p><a href="http://www.gridgame.com">Grid Autosport</a> ist ein zwar älteres, aber immer noch exzellentes Rennspiel das zwar kein definitiv Arcaderacer ist, einen aber auch nicht mit einem Hardcoresimulationsanspruch erschlägt.
Ähnlich wie <a href="https://www.gran-turismo.com">Gran Tourismo</a> findet es einen exzellenten Mittelweg und ist, im Gegensatz zu diesem, auch auf Linux spielbar.
Es eignet sich somit also auch …</p><p><a href="http://www.gridgame.com">Grid Autosport</a> ist ein zwar älteres, aber immer noch exzellentes Rennspiel das zwar kein definitiv Arcaderacer ist, einen aber auch nicht mit einem Hardcoresimulationsanspruch erschlägt.
Ähnlich wie <a href="https://www.gran-turismo.com">Gran Tourismo</a> findet es einen exzellenten Mittelweg und ist, im Gegensatz zu diesem, auch auf Linux spielbar.
Es eignet sich somit also auch für ein kurzes Rennen in der Mittagspause, was nicht heißt, dass man keine Stunden darin versenken kann.
Leider lässt es sich unter openSUSE 42.3 aber nachdem man es per Steam heruntergeladen hat nicht direkt starten.</p>
<p><img alt="Der Startbildschirm von Grid Autosport auf openSUSE" src="https://marix.org/Bilder/Grid-Autosport-auf-openSUSE.png"></p>
<h2 id="das-problem">Das Problem</h2>
<p>Nach dem Start rödelt der rechner kurz, es kommt aber kein Spielfenster hoch.
Startet man Steam aus einer Konsole, so erscheint dort beim Versuch das Spiel zu starten folgendes:</p>
<pre><code>>>> Adding process 17089 for game ID 255220
>>> Adding process 17089 for game ID 255220Installing breakpad exception handler for appid(steam)/version(1506500000)
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: /home/marix/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport)
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: /home/marix/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport)
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: /home/marix/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/../lib/x86_64/libcurl.so.4)
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: /home/marix/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/../lib/x86_64/libcurl.so.4)
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: /home/marix/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/../lib/x86_64/libcurl.so.4)
>>> Adding process 17090 for game ID 255220
/ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/GridAutosport: relocation error: /ephemeral/steam/marix/steamapps/common/GRID Autosport/bin/../lib/x86_64/libcurl.so.4: symbol ENGINE_load_builtin_engines, version OPENSSL_1.0.0 not defined in file libcrypto.so.1.0.0 with link time reference
Game removed: AppID 255220 "GRID Autosport", ProcID 17086
</code></pre>
<p>Hier liegt also eine Inkompatibilität zwischen der vom Spiel mitgebrachten Curl-Bibliothek und den von Steam mitgebrachten Bibliotheken SSL und Crypto vor.</p>
<h2 id="die-losung-aus-dem-netz">Die Lösung aus dem Netz</h2>
<p>Beim Googeln findet sich schnell <a href="https://forums.opensuse.org/showthread.php/520922-Steam-libcrypto-error">eine Lösung welche vorschlägt <code>libcrypto.so.1.0.0</code> aus der Steam-Runtime entfernen</a>.
Dies löst auch das Problem mit Grid Autosport.
Allerdings hat diese Lösung auch Nachteile.
Da die Steam-Runtime modifiziert wird ist damit zu rechnen, dass das nächste Steam-Update die Dateien wiederherstellt und man die Datei erneut entfernen muss.
Außerdem kann es damit zu Problemen in anderen Spielen kommen welche sich auf die von Steam mitgelieferte Version verlasen.</p>
<h2 id="die-bessere-losung">Die bessere Lösung</h2>
<p>Die obige Lösung weißt aber bereits den Weg zu einer besseren Lösung, denn sie funktioniert deshalb, weil openSUSE bereits kompatible Versionen der beiden Bibliotheken enthält.
Tatsächlich betrifft dieses Problem einige Spiele welche von <a href="https://www.feralinteractive.com">Feral Interactive</a> portiert wurden.
So ist auch <a href="https://www.dirtgame.com">Dirt Rally</a> von diesem Problem betroffen.
Für dieses Spiel findet sich <a href="https://forums.opensuse.org/showthread.php/524557-Can-t-run-Dirt-Rally-on-Steam">eine Lösung</a> welche sich Analog auch auf Grid Autosport anwenden lässt:</p>
<ol>
<li>Ins Spielverzeichnis wechseln: <code>cd <steam library>/steamapps/common/Grid\ Autosport/lib/x86_64</code>.</li>
<li>Dort auf die libcrypto des Systems linken:<pre><code>> ln -s /lib64/libcrypto.so.1.0.0
> ln -s /lib64/libssl.so.1.0.0
</code></pre>
</li>
</ol>
<p>Diese Lösung ist besser, weil sie nur das einzelne Spiel betrifft und nicht global die Steam-Runtime beschädigt.
Sie hat allerdings den Nachteil, dass sie kaputt gehen kann falls Steam mal die Dateien anfasst, z.B. bei einem Update.
Updates von Grid Autosport sind aber deutlich seltener als solche von Steam selbst, und auf meinem System hat der Fix auch schon einige Patches überlebt.</p>Zwei neue Pakete für openSUSE2018-04-25T00:00:00+02:002018-04-25T00:00:00+02:00Matthias Bachtag:marix.org,2018-04-25:/zwei-neue-pakete-fur-opensuse.html<p><a href="https://www.opensuse.org/#Tumbleweed">openSUSE Tumbleweed</a> enthält jetzt zwei neue Pakete welche ich erstellt habe: <a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python">python-emoji</a> und <a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole">python-ntfy</a>.
Ersteres hat es sogar noch in <a href="https://www.opensuse.org/#Leap">openSUSE Leap 15.0</a> geschafft.</p>
<p>Die Funktionalität von <a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python">python-emoji</a> ist schnell erklärt und trotzdem unglaublich nützlich, wie diese leichte Abwandlung des Beispiels aus <a href="https://pypi.org/project/emoji/">der Paketbeschreibung auf PyPI</a> zeigt:</p>
<pre><code>>> import emoji …</code></pre><p><a href="https://www.opensuse.org/#Tumbleweed">openSUSE Tumbleweed</a> enthält jetzt zwei neue Pakete welche ich erstellt habe: <a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python">python-emoji</a> und <a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole">python-ntfy</a>.
Ersteres hat es sogar noch in <a href="https://www.opensuse.org/#Leap">openSUSE Leap 15.0</a> geschafft.</p>
<p>Die Funktionalität von <a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python">python-emoji</a> ist schnell erklärt und trotzdem unglaublich nützlich, wie diese leichte Abwandlung des Beispiels aus <a href="https://pypi.org/project/emoji/">der Paketbeschreibung auf PyPI</a> zeigt:</p>
<pre><code>>> import emoji
>> print(emoji.emojize('Python ist :thumbs_up:'))
Python ist 👍
</code></pre>
<p>Natürlich funktioniert dies sowohl in <a href="https://docs.python.org/3/">modernem Python</a> als auch in <a href="https://docs.python.org/2/">klassischem Python</a>.</p>
<p>Eines der Pakete welche von <a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python">python-emoji</a> profitieren ist <a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole">python-ntfy</a>.
<a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole">python-ntfy</a> ermöglichte es aus der Konsole Benachritigungen zu verschicken.
Diese können entweder auf der Arbeitsfläche angezeigt werden, oder über verschiedene Backends an ein Smartphone weitergeleitet werden.
Allerdings sind momentan noch nicht Backends auch für openSUSE paketiert.
Besonders praktisch ist der Befehl <code>ntfy done</code>.
Nutzt man diesen um einen lange laufenden Prozess zu starten, so bekommt man, sobald dieser fertig ist, eine Nachricht welche auch über Erfolg oder Misserfolg und die Laufzeit des Prozesses informiert.
Man kann sich also ganz gemütlich in die Hängematte legen während der Rechner ackert. 😉</p>Mastodon2018-04-22T00:00:00+02:002018-04-22T00:00:00+02:00Matthias Bachtag:marix.org,2018-04-22:/mastadon.html<p>So toll Twitter ist, so unnatürlich fühlen sich derartig zentralisierte Plattformen im Ineternet auch immer an.
Bisher konnte sich allerdings auch noch keine verteiltere Alternative durchsetzen.
Dabei gibt es eigentlich keinen Grund wieso kurze öffentliche Beitrage nicht wie Email mithilfe vieler vernetzter Anbieter verteilt werden sollten.
An dieser Herausforderung versucht …</p><p>So toll Twitter ist, so unnatürlich fühlen sich derartig zentralisierte Plattformen im Ineternet auch immer an.
Bisher konnte sich allerdings auch noch keine verteiltere Alternative durchsetzen.
Dabei gibt es eigentlich keinen Grund wieso kurze öffentliche Beitrage nicht wie Email mithilfe vieler vernetzter Anbieter verteilt werden sollten.
An dieser Herausforderung versucht sich <a href="https://joinmastodon.org/">Mastodon</a>.
Nachdem ich davon jetzt schon ein paar mal gehört habe gebe ich diesem jetzt auch mal eine Chance.
Ihr findet mich dort als <a href="https://chaos.social/@marix">@marix@chaos.social</a>.</p>Bash-Completion for OSC in Verzeichnissen mit Leerzeichen2018-03-21T00:00:00+01:002018-03-21T00:00:00+01:00Matthias Bachtag:marix.org,2018-03-21:/bash-completion-for-osc-in-verzeichnissen-mit-leerzeichen.html<p>Mit diesem Artikel führe ich <a href="https://marix.org/category/beitrage-zu-freier-software.html">meine Serie zu kleinen Beträgen zu freier Software</a> fort.
Diesmal nahm ich mich dem Problem an, dass die Bash-Completion des Kommandozeilenprogrammes für den <a href="http://openbuildservice.org/">Open Build Service</a> – <code>osc</code> – in Verzeichnissen mit Leerzeichen im Pfad nicht richtig funktioniert.</p>
<p>Ich gehöre zu dieser, anscheinend raren, Spezies Mensch die …</p><p>Mit diesem Artikel führe ich <a href="https://marix.org/category/beitrage-zu-freier-software.html">meine Serie zu kleinen Beträgen zu freier Software</a> fort.
Diesmal nahm ich mich dem Problem an, dass die Bash-Completion des Kommandozeilenprogrammes für den <a href="http://openbuildservice.org/">Open Build Service</a> – <code>osc</code> – in Verzeichnissen mit Leerzeichen im Pfad nicht richtig funktioniert.</p>
<p>Ich gehöre zu dieser, anscheinend raren, Spezies Mensch die ihren Ordnern gerne sprechenden Namen gibt.
Deshalb Nutze ich in diesen auch häufiger mal Leerzeichen.
Dabei stoße ich regelmäßig auf das Problem, dass Anwendungen mit solchen Ordnern nicht korrekt umgehen können.
So auch die Bash-Completion von <code>osc</code>, welche statt der gewünschten Vorschläge Fehlermeldungen produzierte:</p>
<pre><code>> osc add /usr/lib/osc/complete: Zeile 90: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 91: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 92: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 96: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 90: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 91: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 92: test: Zu viele Argumente.
/usr/lib/osc/complete: Zeile 96: test: Zu viele Argumente.
</code></pre>
<p><a href="https://github.com/openSUSE/osc/pull/392">Der Fix</a> ist trivial und war schnell implementiert und ändert nur sieben Zeilen Code.
Einfach in den betroffenen Zeilen doppelte Anführungszeichen um die Variable <code>${PWD}</code> eingefügt und schon wurde der Verzeichnisname korrekt im ganzen, statt als mehrere Argument, an <code>test</code> übergeben.
Wenige Stunden später wurde <a href="https://github.com/openSUSE/osc/pull/392">der Pull-Request auf Github</a> dann auch schon in den Hauptzweig gemerged.
In Zukunft stolpert man also über ein WTF weniger. 😃</p>
<p>Insgesamt hat der Pull-Request in diesem Fall weniger Zeit gekostet als diesen Artikel zu schreiben.
Vermutlich hat mich der Ärger den ich früher mit diesem Bug hatte mehr Zeit gekostet als der Fix.
Es lohnt sich also immer <em>gleich</em> mal auf den Code zu schauen.
Viele Probleme lassen sich viel leichter abstellen als man denkt.</p>Tests für openSUSE's Paket des Prometheus-Node-Exporters2018-03-12T00:00:00+01:002018-03-12T00:00:00+01:00Matthias Bachtag:marix.org,2018-03-12:/tests-fur-opensuses-paket-des-prometheus-node-exporters.html<p>Dies ist mein erster Testballon für eine neue Serie von Artikeln auf meiner Webseite.
Mit diesen Artikeln möchte ich eine Reiher kleiner Open-Source-Beiträge, welche ich von Zeit zu Zeit en passant vornehme, Dokumentiere.
Das schöne an freier Software ist ja gerade, dass man nicht auf einen Hersteller angewiesen ist um …</p><p>Dies ist mein erster Testballon für eine neue Serie von Artikeln auf meiner Webseite.
Mit diesen Artikeln möchte ich eine Reiher kleiner Open-Source-Beiträge, welche ich von Zeit zu Zeit en passant vornehme, Dokumentiere.
Das schöne an freier Software ist ja gerade, dass man nicht auf einen Hersteller angewiesen ist um Fehler zu beheben oder die Software für den eigenen Bedarf zu ertüchtigen.
Auf den ersten Blick können andere Projekte aber durchaus erstmal einschüchtern wirken.
Dabei lässt sich häufig schon mit sehr kleinen, einfachen Beiträgen „die Welt“ verbessern.
Vielleicht lässt sich ja die eine oder andere Hemmschwelle abbauen, wenn welche Bandbreite an kleinen und größen Beiträgen man vornehmen kann.</p>
<p>Letzten Monat habe ich mir mal openSUSEs Paket des <a href="https://github.com/prometheus/node_exporter">Node-Exporters für Prometheus</a> angesehen, da ich diesen auch für mein eigenes, privates Monitoring einsetze.
Hierbei fiel mir auf, dass beim Paketieren die Tests nicht ausgeführt wurden.
Eigentlich sollten die Tests einer Software beim paketieren immer ausgeührt werden.
Nur so ist sichergestellt, dass die Software mit den in der Distribution genutzten Versionen von Compilern und genutzten Bibliotheken sauber funktioniert.</p>
<p><a href="https://en.opensuse.org/openSUSE:Packaging_Go#Example_template">Das Beispiel im Wiki von openSUSE</a> beinhaltet das Ausführen der Tests.
Somit ist der Fehler schnell behoben.</p>
<pre><code>%check
%gotest github.com/prometheus/node_exporter...
</code></pre>
<p>Eine kleine Besonderheit gab es allerdings noch zu beachten:
Der Node-Exporter nutzt Testdaten welche im Repository nur gepackt vorliegen.
Diese sind vor Ausführung der eigentlichen Tests noch zu entpacken.
Ein kurzer Blick auf <a href="https://github.com/prometheus/node_exporter/blob/v0.15.2/Makefile">das Makefile</a> verrät, dass hierfür das Target <code>collector/fixtures/sys/.unpacked</code> zuständig ist.
Also schnell noch ein <code>make collector/fixtures/sys/.unpacked</code> in den Abschnitt <code>%build</code> eingefügt und schon funktioniert alles.</p>
<p>Damit war <a href="https://build.opensuse.org/request/show/577884">der Submitrequest</a> dann auch schon bereit und ist inzwischen auch angenommen worden.</p>Steam vergisst ständig die Anmeldung2018-02-26T00:00:00+01:002018-02-27T00:00:00+01:00Matthias Bachtag:marix.org,2018-02-26:/steam-vergisst-standig-die-anmeldung.html<p>Seit einiger Zeit fragte mich mein Steam bei fast jedem Start nach der Anmeldung, obwohl die Option die Anmeldung zu speichern gesetzt war.
Immer wenn die Anmeldung verloren ging war die Oberfläche außerdem wieder auf Englisch eingestellt.
Das Problem lässt sich lösen indem man Steam das Recht nimmt die Datei …</p><p>Seit einiger Zeit fragte mich mein Steam bei fast jedem Start nach der Anmeldung, obwohl die Option die Anmeldung zu speichern gesetzt war.
Immer wenn die Anmeldung verloren ging war die Oberfläche außerdem wieder auf Englisch eingestellt.
Das Problem lässt sich lösen indem man Steam das Recht nimmt die Datei <code>~/.steam/registry.vdf</code> zu schreiben.</p>
<p><img alt="Steams Anmeldefenster" src="https://marix.org/Bilder/Steam-Login-Dialog.png"></p>
<p>Lange Zeit war es für mich einfach nur nervig mich bei Steam immer wieder neu anmelden und die Sprache zurückstellen zu müssen.
Als jetzt aber die <a href="https://www.vex-mania.de/lans/VEX-LAN-18-2018">VEX-LAN 18</a> vor der Tür stand wurde es ein echtes Problem, denn ohne gespeicherten Login funktioniert der Offlinemodus nicht.
Dieser ist auf LANs aber wichtig, da dort üblicherweise kein Internet zur Verfügung steht.</p>
<p><img alt="Die Tasse der VEX-LAN 18" src="https://marix.org/Bilder/VEX-LAN-18-Tasse.JPG"></p>
<p>Zum Glück bin ich nicht der erste der dem Problem begegnet ist.
Neben <a href="https://github.com/ValveSoftware/steam-for-linux/issues/5030">der Fehlerbermeldung auf Github</a> gibt es auch <a href="https://wiki.archlinux.org/index.php/Steam/Troubleshooting#Steam_forgets_password">einen Eintrag in der Steam-FAQ von Arch-Linux</a> in dem sich eine Möglichkeit findet das Problem zu vermeiden:</p>
<pre><code>chmod -w ~/.steam/registry.vdf
</code></pre>
<p>Dieser Befehl unterbindet schreibenden Zugriff auf diese Datei des Steam-Clients.
Letzter scheint diese zur Laufzeit immer wieder zu schreiben und dabei häufiger mal zu korrumpieren, so dass er sie beim nächsten Start neu initialiseren muss.</p>
<p>Das gute an diesem Workaround ist, dass weiterhin ein Wechsel zwischen Offline- und Onlinemodus möglich ist.
Dieser scheint an andere Stelle gespeichert zu werden.
Dennoch sollte man sich natürlich bewusst sein, dass es nun natürlich vorkommen kann, dass der Client eine gewünschte Einstellung nicht persistieren kann.
Sollte es also zu merkwürdigem Verhalten kommen, sollte man Steam eventuell mal wieder erlauben die Datei zu schreiben.
Bisher hat Steam mit diese Workaround aber wunderbar funktioniert.</p>openSUSE Leap 42.3 auf dem Raspberry Pi 2 ohne Monitor nutzen2018-01-02T00:00:00+01:002018-01-02T00:00:00+01:00Matthias Bachtag:marix.org,2018-01-02:/opensuse-leap-423-ohne-monitor-auf-dem-raspberry-pi-2.html<p>Der Raspberry Pi 2 ist ein praktischer kleiner Rechner, und das dafür vorgesehene Raspbian auch eine gut gemachte Linux-Distribution.
Hat man allerdings schon auf mehreren Rechner openSUSE im Einsatz ist es viel attraktiver dieses auch dort zu verwenden, zumal dies völlig problemlos möglich ist.
Der Einsatz von Tumbleweed auf dem …</p><p>Der Raspberry Pi 2 ist ein praktischer kleiner Rechner, und das dafür vorgesehene Raspbian auch eine gut gemachte Linux-Distribution.
Hat man allerdings schon auf mehreren Rechner openSUSE im Einsatz ist es viel attraktiver dieses auch dort zu verwenden, zumal dies völlig problemlos möglich ist.
Der Einsatz von Tumbleweed auf dem Raspberry Pi 2 ist <a href="https://en.opensuse.org/HCL:Raspberry_Pi2" title="Raspbarry PI2 documentation on the openSUSE Wiki">im Wiki von openSUSE</a> detailliert dokumentiert.
Mit wenigen kleinen Änderungen lässt sich so auch <a href="https://www.opensuse.org/#Leap">openSUSE Leap</a> auf dem Raspberry Pi 2 nutzen, und zwar ohne an diesen Monitor oder Maus anschließen zu müssen.</p>
<p>Die Installation eines Betriebssystem auf dem Raspberry PI erfolgt stets dadurch den passenden Installer auf seine SD-Karte zu kopieren.
Beim ersten Start wird diese dann passend eingerichtet.
Die passende Datei für openSUSE Leap 42.3 findet sich auf <a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/">http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/</a>.
Für den Betrieb ohne Tastatur und Monitor bietet sich die Variante <em>Just enough OS (JeOS)</em> an.
Damit findet man die passende Datei indem man <a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/">die Downloadseite</a> nach <code>JeOS-raspberrypi2</code> durchsucht.
Aktuell ist dies <a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz">http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz</a>.
Es empfiehlt sich auch <a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz.sha256">die Prüfsumme</a> zu checken.</p>
<pre><code>> sha256sum -c openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l-2017.07.26-Build1.1.raw.xz.sha256
openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l-2017.07.26-Build1.1.raw.xz: OK
sha256sum: WARNUNG: 14 Zeilen sind nicht korrekt formatiert
</code></pre>
<p>Die Warnung zu den nicht formatierten Zeilen liegt daran, dass der Inhalt mit PGP signiert ist.
Die Signatur lässt sich mit <a href="https://gnupg.org/">GPG</a> prüfen.</p>
<pre><code>> gpg --verify openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l-2017.07.26-Build1.1.raw.xz.sha256
gpg: Signatur vom Mi 26 Jul 2017 19:39:17 CEST mittels RSA-Schlüssel ID 3DBDC284
gpg: Korrekte Signatur von "openSUSE Project Signing Key <opensuse@opensuse.org>" [vollständig]
note: random_seed file not updated
</code></pre>
<p>Jetzt wo klar ist, dass das Image nicht beschädigt ist, kann man <a href="https://en.opensuse.org/HCL:Raspberry_Pi2" title="Raspbarry PI2 documentation on the openSUSE Wiki">der Anleitung für Tumbleweed im openSUSE-Wiki</a> folgen.</p>
<p>Achtung! Das Schreiben auf die SD-Karte kann, wenn man den falschen Gerätebezeichner erwischt, Daten auf einer anderen Platte zerstören.
Wenn man sich nicht 100% sicher ist welchen Gerätebezeichner die SD-Karte hat, dann kann man direkt nach dem Einstecken in <code>dmesg</code> nachsehen, welchen Bezeichner die Karte bekommen hat.
In meinem Beispiel hat der Kartenleser mehrere Einschübe, so dass gleich mehrere Geräte auftauchen, aber nur für das Gerät mit der SD-Karte wird die Kapazität (<code>sd 8:0:0:3: [sdi] 15677440 512-byte logical blocks: (8.03 GB/7.48 GiB)</code>) und die Partitionsliste (<code>sdi: sdi1 sdi2 < sdi5 sdi6 > sdi3</code>) ausgegeben.</p>
<pre><code>> dmesg | tail -n 30
[13801.698740] EXT4-fs error (device sdi6): htree_dirblock_to_tree:986: inode #2: block 8582: comm dolphin: bad entry in directory: directory entry across range - offset=0(0), inode=4489218, rec_len=32780, name_len=129
[13814.445903] sdi: detected capacity change from 8026849280 to 0
[13897.279227] sd 8:0:0:3: [sdi] 15677440 512-byte logical blocks: (8.03 GB/7.48 GiB)
[13897.285959] sdi: sdi1 sdi2 < sdi5 sdi6 > sdi3
[14939.444590] usb 2-6: USB disconnect, device number 2
[37767.485975] usb 2-6: new SuperSpeed USB device number 3 using xhci_hcd
[37767.532474] usb 2-6: New USB device found, idVendor=8564, idProduct=4000
[37767.532478] usb 2-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[37767.532479] usb 2-6: Product: USB3.0 Card Reader
[37767.532479] usb 2-6: Manufacturer: Realtek
[37767.532480] usb 2-6: SerialNumber: 201412031053
[37767.539943] usb-storage 2-6:1.0: USB Mass Storage device detected
[37767.546235] scsi host8: usb-storage 2-6:1.0
[37768.558079] scsi 8:0:0:0: Direct-Access Generic- USB3.0 CRW -0 1.00 PQ: 0 ANSI: 6
[37768.558355] sd 8:0:0:0: Attached scsi generic sg6 type 0
[37768.569622] scsi 8:0:0:1: Direct-Access Generic- USB3.0 CRW -1 1.00 PQ: 0 ANSI: 6
[37768.569862] sd 8:0:0:1: Attached scsi generic sg7 type 0
[37768.582535] scsi 8:0:0:2: Direct-Access Generic- USB3.0 CRW -2 1.00 PQ: 0 ANSI: 6
[37768.582758] sd 8:0:0:2: Attached scsi generic sg8 type 0
[37768.601427] scsi 8:0:0:3: Direct-Access Generic- USB3.0 CRW -3 1.00 PQ: 0 ANSI: 6
[37768.601678] sd 8:0:0:3: Attached scsi generic sg9 type 0
[37769.473299] sd 8:0:0:3: [sdi] 15677440 512-byte logical blocks: (8.03 GB/7.48 GiB)
[37769.473958] sd 8:0:0:0: [sdf] Attached SCSI removable disk
[37769.475113] sd 8:0:0:3: [sdi] Write Protect is off
[37769.475116] sd 8:0:0:3: [sdi] Mode Sense: 2f 00 00 00
[37769.475608] sd 8:0:0:1: [sdg] Attached SCSI removable disk
[37769.477768] sd 8:0:0:3: [sdi] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[37769.478227] sd 8:0:0:2: [sdh] Attached SCSI removable disk
[37769.484922] sdi: sdi1 sdi2 < sdi5 sdi6 > sdi3
[37769.488248] sd 8:0:0:3: [sdi] Attached SCSI removable disk
</code></pre>
<p>Um das Image auf die Karte zu schreiben benötigt man Root-Rechte.
Das Gerät muss von <code>/dev/sdX</code> auf den korrekten Bezeichner angepasst werden.
Für obiges Beispiel <code>/dev/sdi</code>.</p>
<pre><code>> sudo -s
# xzcat openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l-2017.07.26-Build1.1.raw.xz | dd bs=4M of=/dev/sdX iflag=fullblock oflag=direct
328+1 records in
328+1 records out
1377828864 bytes (1.4 GB, 1.3 GiB) copied, 147.571 s, 9.3 MB/s
# sync
</code></pre>
<p>Hierbei passiert folgendes:</p>
<ol>
<li><code>xzcat</code> entpackt das Image auf die Standardausgabe.</li>
<li><code>dd</code> übernimmt über die Standardeingabe das entpackte Image und schreibt es 1:1 auf das angegebene Gerät, und zwar ohne zu Puffern.</li>
<li><code>sync</code> stellt sicher, dass alle Daten auch wirklich geschrieben wurden und die Karte sicher entnommen werden kann.</li>
</ol>
<p>Anschließend kann man den Raspberry Pi 2 mit den üblichen Schritten in Betrieb nehmen:</p>
<ol>
<li>Karte herausnehmen und in den Pi stecken,</li>
<li>Netzwerk an den Raspberry Pi 2 anschließen,</li>
<li>und dann Strom auf Pi geben.</li>
</ol>
<p>Der initiale Start kann einige Zeit dauern.
Bei mir waren dies gut anderthalb Stunden, mit einer schnelleren SD-Karte kann man hier aber Zeit sparen.</p>
<p>Hat man keinen Monitor am Raspberry Pi 2, so steht man nun vor der Herausforderung dessen Netzwerkadresse herauszufinden um sich mit dem zu verbinden.
Prinzipiell kann man diese herausfinden indem man nach dem letzten Gerät schaut, dass sich am Router angemeldet hat.
Löst der Router auch die von den Rechnern selbst gewählten Namen auf, so ist es sogar noch einfacher, da sich ein frisches openSUSE immer mit dem Rechnernamen <code>linux</code> meldet.
An einer Fritz!Box ist er deshalb als <code>linux.fritz.box</code> erreichbar.</p>
<p>Nun kann man sich also das erste mal anmelden. Der Nutzer ist <code>root</code> und das Passwort <code>linux</code>.
Hat man eine Fritz!Box also: <code>ssh root@linux.fritz.box</code>.
Beim ersten Anmelden sollte man gleich noch die Inbetriebnahme das Basissystems abschließen:</p>
<ul>
<li>Das Passwort ändern,</li>
<li>dem eigenen SSH-Key per <code>ssh-copy-id</code> auf dem Raspberry Pi Berechtigung zum Anmelden geben,</li>
<li>Updates einspielen,</li>
<li>und den Hostnamen ändern.</li>
</ul>
<p>Letzterer Schritt ist wichtig, da es sonst bei Inbetriebnahme eines weiteren Raspberry Pi zu kollisionen kommen kann und man sich unnötig die Auflösung der Netzwerkadresse des neuen Systems erschwert.</p>
<p>Das <em>Just enough</em> in <em>JeOS</em> ist übrigens durchaus ernst gemeint.
Wer sein System anschließend mit Ansible weiter einrichten möchte sollte dort noch Python komplett installieren: <code>zypper in python3</code>.
Ohne diesen Schritt kann es zu kuriosen Fehlermeldungen kommen, da Teile der Standardbibliothek in der minimalen Installation von Python fehlen.</p>Wieso ich pytest in PyCharm immer mit --no-cov ausführe2017-12-12T00:00:00+01:002017-12-12T00:00:00+01:00Matthias Bachtag:marix.org,2017-12-12:/wieso-ich-pytest-in-pycharm-immer-mit-no-cov-ausfuhre.html<p>Immer wieder habe ich mich, beim Versuch einen fehlgeschlagenen Test in <a href="https://www.jetbrains.com/pycharm/">PyCharm</a> zu debuggen, gewundert wieso meine Haltepunkte misachtet werden.
Um dies zu vermeiden führe ich <a href="https://docs.pytest.org"><code>pytest</code></a> in PyCharm inzwischen immer mit der Option <code>--no-cov</code> aus.</p>
<p><img alt="PyCharm-Konfiguration für pytest mit --no-cov" src="https://marix.org/Bilder/PyCharm-pytest-nocov.png"></p>
<p>Das Plugin <a href="https://github.com/pytest-dev/pytest-cov"><code>pytest-cov</code></a> hilft einem wunderbar dabei einen Überblick über die Testabdeckung zu behalten …</p><p>Immer wieder habe ich mich, beim Versuch einen fehlgeschlagenen Test in <a href="https://www.jetbrains.com/pycharm/">PyCharm</a> zu debuggen, gewundert wieso meine Haltepunkte misachtet werden.
Um dies zu vermeiden führe ich <a href="https://docs.pytest.org"><code>pytest</code></a> in PyCharm inzwischen immer mit der Option <code>--no-cov</code> aus.</p>
<p><img alt="PyCharm-Konfiguration für pytest mit --no-cov" src="https://marix.org/Bilder/PyCharm-pytest-nocov.png"></p>
<p>Das Plugin <a href="https://github.com/pytest-dev/pytest-cov"><code>pytest-cov</code></a> hilft einem wunderbar dabei einen Überblick über die Testabdeckung zu behalten. Um es nicht immer explizit aktivieren zu müssen bietet es sich an dieses über einen passenden Eintrag in der <code>pytest.ini</code> zu tun.</p>
<pre><code>[pytest]
addopts = --cov=example
</code></pre>
<p>In PyCharm hat das Plugin allerdings nur einen geringen Mehrwert, denn dort achte ich eigentlich weniger auf Ausgabe von PyTest, denn ich bekomme ich ja grafisch angezeigt wenn Tests fehlschlagen.
Möchte ich mir die Testabdeckung ansehen, so bietet mir PyCharm eine eigene Möglichkeit diese einzusammeln, samt passender Visualisierung.</p>
<p>Dafür kollidiert <code>pytest-cov</code> aber mit dem Debugger von PyCharm.
Denn beide registrieren sich per <a href="https://docs.python.org/3/library/sys.html#sys.settrace"><code>sys.settrace</code></a> um allen ausgeführten Code inspizieren zu können.
Nutzt man <code>pytest-cov</code> innerhalb des Debuggers, überschreibt es dessen dort hinterlegte Funktion. Damit hat der Debugger dann nicht mehr die Möglichkeit in die Ausührung einzugreifen.
Um dies zu vermeiden muss man <code>pytest-cov</code> durch die Option <code>--no-cov</code> deaktiveren.
Damit fehlt dann zwar auch die Information zur Testabdeckung, aber dafür hat PyCharm ja, wie gesagt, seine eigene Funktionalität.</p>Wie man Python-Module in PyCharm ausführt2017-12-02T00:00:00+01:002017-12-02T00:00:00+01:00Matthias Bachtag:marix.org,2017-12-02:/wie-man-python-module-in-pycharm-ausfuhrt.html<p>Beim Lesen <a href="https://blog.jetbrains.com/pycharm/2017/11/pycharm-2017-3-is-out-now/">der Veröffentlichungsankündigung von PyCharm 2017.3</a> stellte ich amüsiert fest, dass PyCharm 2017.3 es jetzt unterstützt Python-Module auszuführen. Tatsächlich ging dies in PyCharm schon immer, wenn man verstanden hatte wie PyCharm die Parameter mit denen es Python aufruft zusammensetzt.</p>
<p>Enthält ein Modul in der aktuellen Pythonumgebung ein …</p><p>Beim Lesen <a href="https://blog.jetbrains.com/pycharm/2017/11/pycharm-2017-3-is-out-now/">der Veröffentlichungsankündigung von PyCharm 2017.3</a> stellte ich amüsiert fest, dass PyCharm 2017.3 es jetzt unterstützt Python-Module auszuführen. Tatsächlich ging dies in PyCharm schon immer, wenn man verstanden hatte wie PyCharm die Parameter mit denen es Python aufruft zusammensetzt.</p>
<p>Enthält ein Modul in der aktuellen Pythonumgebung ein Paket <code>__main__.py</code>, so kann man dieses durch den Aufruf <code>python -m <modulename></code> direkt ausführen. Ein beliebtes Bespiel dafür ist der in der Standardbibliothek enthaltene einfache HTTP-Server, der mit <code>python -m http.server <port></code> ausgeführt werden kann.</p>
<p>PyCharm 2017.3 erlaubt einem jetzt über ein Dropdown auszuwählen ob man eine Datei oder ein Modul ausführen will. Tatsächlich funktioniert dies aber auch in älteren Versionen. Hierzu muss lediglich als letzte Option für den Pythoninterpreter – nicht das Skript – <code>-m</code> angegeben werden. PyCharm ruft nämlich am Ende immer <code><ausgewählter Pythoninterpreter> <Interpreteroptionen> <Skriptname> <Skriptparameter></code> auf. Enden die Interpreteroptionen mit <code>-m</code> interpretiert Python den „Skriptnamen“ als Modulnamen. In älteren Versionen von PyCharm muss man für obiges Beispiel also lediglich als Skript <code>http.server</code> und bei den Interpreteroptionen <code>-m</code> eintragen.</p>Öffentliche PSN-Profile2017-10-05T22:15:00+02:002017-10-05T22:15:00+02:00Matthias Bachtag:marix.org,2017-10-05:/offentliche-psn-profile.html<p>Durch <a href="https://blog.de.playstation.com/2017/10/03/ps4-systemsoftware-update-5-00-ab-heute-erhltlich/">das PS4-Systemsoftware-Update 5.00</a> wurde ich auf eine Änderung im Playstation Network aufmerksam auf welche ich lange gewartet hatte: Es gibt jetzt öffentliche Profile.</p><p>Durch <a href="https://blog.de.playstation.com/2017/10/03/ps4-systemsoftware-update-5-00-ab-heute-erhltlich/">das PS4-Systemsoftware-Update 5.00</a> wurde ich auf eine Änderung im Playstation Network aufmerksam auf welche ich lange gewartet hatte: Es gibt jetzt öffentliche Profile.</p>
<p><a href="https://my.playstation.com/theMarix">Meins</a> habe ich natürlich gleich mal zur Liste meiner Profile hinzugefügt.
Damit könnt ihr jetzt sehen, was ich auf der Playstation so treibe.
Auch könnte ihr mir so deutlich einfacher eine Freundschaftsanfrage schicken.
Wie bei Steam nehme ich die aber auch im PSN nur an wenn aus der Anfrage hervorgeht wer ihr seid, beziehungsweise woher wir uns kennen.
Denn so schön Nicknames oft sind, sie helfen nicht immer dabei euch wiederzuerkennen.</p>Wenn das System zu gut aufräumt2017-09-04T22:30:00+02:002017-09-06T21:00:00+02:00Matthias Bachtag:marix.org,2017-09-04:/wenn-das-system-zu-gut-aufraumt.html<p>Eigentlich ist es ja gewünscht wenn das System einem regelmäßig die temporären Dateien wegräumt. Löscht es einem dabei aber auch Dateien welche man gerade erst dort abgelegt hatte, dann steht wohl irgendwas in der Konfiguration schief.</p><p>Eigentlich ist es ja gewünscht wenn das System einem regelmäßig die temporären Dateien wegräumt.
Löscht es einem dabei aber auch Dateien welche man gerade erst dort abgelegt hatte, dann steht wohl irgendwas in der Konfiguration schief.</p>
<p>Ich nutze tatsächlich häufig das Verzeichnis <code>/tmp</code>.
Gerade beim Schreiben kleiner Skripte ist es ganz angenehm sich im Fehlerfall einfach darauf zu verlassen, dass übrig gebliebene temporäre Dateien schon wieder verschwinden werden.
Auch meine <a href="https://docs.python.org/3/library/venv.html">virtuellen Python-Umgebungen</a> lege ich, seit mich <a href="https://www.holger-peters.de/">Holger Peters</a> mal auf diese Idee gebracht hat, stets dort ab.
Seit einiger Zeit löschte mir meine <a href="https://www.opensuse.org/">openSUSE</a> meine gerade angelegten Dateien aber immer kurz nach dem Systemstart unter der Nase weg.</p>
<p>Da das Problem immer kurz nach dem Systemstart auftrat war schnell klar, dass da wohl der Aufräumcronjob schuld sein muss.
Auch wenn dies natürlich inzwischen gar kein Cronjob mehr ist sondern ein <a href="https://www.freedesktop.org/software/systemd/man/systemd.timer.html">Systemd-Timer</a>.</p>
<pre><code>marix@eddie:~> systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Di 2017-09-05 21:10:12 CEST 22h left Mo 2017-09-04 21:10:12 CEST 1h 9min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.serv
Mo 2017-09-11 00:00:00 CEST 6 days left Mo 2017-09-04 20:55:51 CEST 1h 23min ago fstrim.timer fstrim.service
</code></pre>
<p>Der alte Cronjob hatte eine Konfigurationsdatei in <code>/etc/sysconfig</code> in der man die Schonzeit für Dateien in <code>/tmp</code> und <code>/var/tmp</code> konfigurieren konnte.
Beim Systemd-Job übernehmen die Konfigurationsdateien von <code>systemd-tmpfiles</code> diesen Job.
Die dazugehörige Manpage ist <a href="https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html"><code>tmpfiles.d (5)</code></a>.</p>
<p>Die Standardatei <code>/usr/lib/tmpfiles.d/tmp.conf</code> erklärt auch ganz brav diese Verzeichnisse in Ruhe zu lassen.
Das ist zwar nicht ganz was ich möchte, aber auch nicht Grund meines Problemes.</p>
<pre><code># Clear tmp directories separately, to make them easier to override
# SUSE policy: we don't clean those directories
q /tmp 1777 root root -
q /var/tmp 1777 root root -
</code></pre>
<p>Die schuldige Konfiguration fand sich in <code>/etc/tmpfiles.d/tmp.conf</code>.
Hier muss, bei einem der vielen Versionsupgrades welche mein System hinter sich hat, ein kleiner Übertragungsfehler passiert sein.</p>
<pre><code>d /tmp 1777 root root 0d
d /var/tmp 1777 root root -
x /tmp/* - - - - root
</code></pre>
<p>Mit dem Alter Null Tage wird <code>systemd-tmpfiles</code> angewiesen alle Dateien zu löschen, egal wann sie zuletzt modifiziert wurden.
Auch wenn dies die meißten Anwendungen in meinem System klaglos hinnahmen sorgte es natürlich für einiges WTF was meine eigenen Skripte und die die virtuellen Python-Umgebungen anging.
Die korrektur des Wertes auf einen Tag hat mein Problem erfolgreich gelöst.</p>
<pre><code>d /tmp 1777 root root 1d
d /var/tmp 1777 root root -
x /tmp/* - - - - root
</code></pre>
<p>Und das schöne an Systemd ist, dass man so eine Änderung dann auch gleich sehr leicht testen kann.</p>
<pre><code>sudo systemctl start systemd-tmpfiles-clean.service
</code></pre>
<p>Eine Anwendung welche mit dem agressiven Aufräumen der temporären Dateien gar nicht klar kommt ist übrigens meine früher so geliebter Browser <a href="https://www.opera.com/de">Opera</a>.
Nachdem die temporären Dateien weggräumt wurden findet dieser seine bereits laufende Instanz nicht mehr und fliegt dann beim Versuch ein zweites mal das gleiche Profil zu öffnen ordendlich auf die Fresse.
Dies hat mich hinreichend genervt, so dass ich kürzlich zum <a href="https://www.mozilla.org/de/firefox/new/">Firefox</a> gewechselt bin.
Seit ich kurz darauf die hier beschriebene Fehlkonfiguration behoben habe funktioniert aber auch der, inzwischen von mir nicht mehr wirklich genutzte, Opera wieder tadellos.</p>Umgebaut2017-08-27T21:30:00+02:002017-08-27T21:30:00+02:00Matthias Bachtag:marix.org,2017-08-27:/umgebaut.html<p>Ich habe meine Webseite ein wenig umgebaut.
Damit sollte Marix.org jetzt auch auf mobilen Geräten besser lesbar sein.
Allerdings sind sicherlich einige Links kaputt gegangen.
Alle alten Blogposts sowie der RSS-Feed werden zwar verübergehend umgeleitet, solltet ihr letzteren nutzen empfehle ich auch allerdings zeitnah auf die neue URL <a href="https://marix.org/feeds/all.atom.xml">https …</a></p><p>Ich habe meine Webseite ein wenig umgebaut.
Damit sollte Marix.org jetzt auch auf mobilen Geräten besser lesbar sein.
Allerdings sind sicherlich einige Links kaputt gegangen.
Alle alten Blogposts sowie der RSS-Feed werden zwar verübergehend umgeleitet, solltet ihr letzteren nutzen empfehle ich auch allerdings zeitnah auf die neue URL <a href="https://marix.org/feeds/all.atom.xml">https://marix.org/feeds/all.atom.xml</a> umzustellen.</p>
<p>Gründe für den Umbau gab es gleich mehrere.
So war Marix.org auf mobilen Geräten ziemlich unbrauchbar und ein Wechsel von <a href="https://www.drupal.org/">Drupal 7</a> auf <a href="https://www.drupal.org/">Drupal 8</a> war auch überfällig.
Meine Performanceprobleme mit Drupal hatten sich zwar bereits durch einen Wechsel von <a href="https://www.strato.de/">Strato</a> zu <a href="https://www.netcup.de/">Netcup</a> gelöst, aber die häufig notwendigen Sicherheitsupdates, welche bei <a href="https://www.drupal.org/">Drupal</a> leider auch nicht mit einem <code>zypper up</code> schnell eingespielt sind, blieben ein Ärgernis.
So habe ich jetzt auf eine komplett statische Seite umgestellt welche mithilfe das <a href="https://www.python.org/">Python</a>-basierte <a href="https://blog.getpelican.com/">Pelican</a> generiert wird.</p>
<p>Optisch lässt sich auf dieser Seite sicherlich noch einige herausholen.
Die Vergängerin war allerdings auch keine Schönheit und letztendlich sollte es ja auf die Inhalte ankommen.
Jetzt, wo ich nicht mehr jeden Mittwoch Zeit auf Sicherheitsupdates verschwende komme ich dann ja vielleicht endlich mal dazu die eine oder andere Idee, welche ich noch für diese Seite habe, umzusetzen.
Der Entwürfeordner ist auf jeden Fall zum bersten voll.</p>openSUSE Leap 42.2 auf antiker Hardware2016-12-19T21:24:15+01:002016-12-19T21:24:15+01:00Matthias Bachtag:marix.org,2016-12-19:/opensuse-leap-422-auf-antiker-hardware.html
<p>Bei uns ist immer noch ein, inzwischen vermutlich als antik geltender, ASUS-Laptop mit einem Core2 Duo und 3 GiB RAM im Einsatz, bisher mit openSUSE 13.1. Angesichts <a href="https://en.opensuse.org/Lifetime">dessen Supportendes,</a> war aber ein update nötig. Und da auch das damals vorinstallierte Windows Vista sein Lebensende erreicht hatte, und seit mehreren …</p>
<p>Bei uns ist immer noch ein, inzwischen vermutlich als antik geltender, ASUS-Laptop mit einem Core2 Duo und 3 GiB RAM im Einsatz, bisher mit openSUSE 13.1. Angesichts <a href="https://en.opensuse.org/Lifetime">dessen Supportendes,</a> war aber ein update nötig. Und da auch das damals vorinstallierte Windows Vista sein Lebensende erreicht hatte, und seit mehreren Jahren nicht mehr genutzt war, führte ich eine Neuinstallation mit <a href="https://en.opensuse.org/Portal:42.2">openSUSE Leap 42.2</a> durch. Wie bei jeder Rechnerneuinstallation stolperte ich dabei über ein paar Eigenarten, aber insgesamt läuft das System wunderbar.</p>
<p>Insgesamt fühlt sich das System flotter an als vorher. Der Hauptgrund dafür ist wohl, dass das System recht sparsam mit dem Hauptspeicher umgeht. So nutzt es wenn man die üblichen Anwendungen, wie KMail und ownCloud, im Hintegrund hat und dann noch DM Fotowelt, ein mittelgroßes Open-Office-Dokument mit Fotos und Firefox mit einer zweistelligen Anzahl Tabs offen hat nur run 2 GiB seines Hauptspeichers. So kommt das System dann trotz vollverschüsselter Festplatte und ohne SSD auf nutzbare Geschwindigkeit.</p>
<p>Ein Wermutstropfen ist, dass ich die in KDE eingebaute Volltextsuche abschalten musste. Obwohl das System bei Installation und während des Zurückkopierens aller Dateien auch über Nacht stabil lief, war damit Schluss sobald die Volltextsuche anfing die Dateien zu indizieren. Nach fünf bis zehn Minuten war der Rechner komplett eingefroren. Auch ein SSH auf den Rechner war nicht mehr möglich.</p>
<p>Ein weiterer interessanter Bug ist, dass die Plugins von Parley nicht funktionieren. Diese haben in der Shebang kf5kross als Interpreter angegeben, allerdings wird dieses nicht installiert.</p>
PyCharm 2016.32016-12-05T20:44:46+01:002016-12-05T20:44:46+01:00Matthias Bachtag:marix.org,2016-12-05:/pycharm-20163.html
<p>Letzte Woche erschien <a href="https://www.jetbrains.com/pycharm/whatsnew/">PyCharm 2016.3</a> und brachte ein paar Feature auf die ich schon lange gewartet habe. Vor allem ist es endlich möglich, dem Django-Testrunner beliebige Argumente zu übergeben. Damit lässt sich endlich <code>--keepdb</code> und <code>--parallel</code> nutzen. Ersteres beschleunigt die Testausführung ungemein, wenn man immer wieder wenige kurze Tests …</p>
<p>Letzte Woche erschien <a href="https://www.jetbrains.com/pycharm/whatsnew/">PyCharm 2016.3</a> und brachte ein paar Feature auf die ich schon lange gewartet habe. Vor allem ist es endlich möglich, dem Django-Testrunner beliebige Argumente zu übergeben. Damit lässt sich endlich <code>--keepdb</code> und <code>--parallel</code> nutzen. Ersteres beschleunigt die Testausführung ungemein, wenn man immer wieder wenige kurze Tests ausführen möchte, letzteres macht große Testsuiten erträglich.</p>
<p>Außerdem wird jetzt, wenn man eine Virtualenv konfiguriert hat, diese in der eingebauten Konsole automatisch aktiviert. Auch Git remotes lassen sich endlich über PyCharm hinzufügen, ohne, dass man extra eine Konsole öffnen muss. Tatsächlich sind beides keine Feature, für die es keine einfachen Workarounds gab. Wieso es in einer ansonsten so auf flüssige Workflows getrimmten IDE aber so lange gedauert hat diese Kleinigkeiten einzubauen ist mir etwas unverständlich.</p>
<p>Das neue Python 3.6 wird jetzt auch unterstützt. Allerdings werde ich, auch wenn diese aus verschiedenen Gründen sehr spannend ist, wohl noch eine Weile warten müssen, bis ich diese richtig einsetzen kann. Das gleiche gilt für den neuen Numpy-Array- und Dataframe-Viewer im Debugger. Als ich noch regelmäßig mit OpenCL gearbeitet habe musste ich mir die entsprechende Funktionalität immer selber bauen. Schön, dass jetzt einfach an Bord zu haben, wenn man es mal benötigt. Gerade bei Gelegenheitsnutzung, wie es bei mir gerade mit Numpy ist, ist es besonders ärgerlich sich notwendige Werkzeuge selbst bauen zu müssen.</p>
<p>Insgesamt lohnt das Update auf PyCharm 2016.3 also. Für mich vor allem wegen der deutlich verbesserten Django-Unterstützung.</p>
Devpi-Builder 2.2.02016-07-05T23:58:40+02:002016-07-05T23:59:15+02:00Matthias Bachtag:marix.org,2016-07-05:/devpi-builder-220.html
<p>Eine der coolen Sachen an Open-Source ist, dass einem immer wieder mal andere Nutzer Verbesserungen implementieren zu denen man selber lange nicht gekommen ist. Dies ist auch bei <a href="https://pypi.python.org/pypi/devpi-builder/2.2.0">Version 2.2.0 von Brandon, dem Devpi-Builder,</a> so. Dank eines <a href="https://github.com/blue-yonder/devpi-builder/pull/97">Pull-Requests von Travis Mehlinger</a> bekommt man nun, wenn eine Build fehlschlägt …</p>
<p>Eine der coolen Sachen an Open-Source ist, dass einem immer wieder mal andere Nutzer Verbesserungen implementieren zu denen man selber lange nicht gekommen ist. Dies ist auch bei <a href="https://pypi.python.org/pypi/devpi-builder/2.2.0">Version 2.2.0 von Brandon, dem Devpi-Builder,</a> so. Dank eines <a href="https://github.com/blue-yonder/devpi-builder/pull/97">Pull-Requests von Travis Mehlinger</a> bekommt man nun, wenn eine Build fehlschlägt, die Fehlermeldung sauber mit der restlichen Ausgabe präsentiert, und muss sich diese nicht mühsam aus der Konsole herausklauben. Diese Problem <a href="https://github.com/blue-yonder/devpi-builder/issues/49">hatte mich schon länger gestört.</a></p>
Devpi-Builder 2.1.02016-04-24T12:56:19+02:002016-04-24T12:56:19+02:00Matthias Bachtag:marix.org,2016-04-24:/devpi-builder-210.html
<p>Es ist ja cool, wenn es einem <a href="http://www.blue-yonder.com">der Arbeitgeber</a> ermöglicht nützliche Software als Open Source zu veröffentlichen. Noch cooler ist aber, wenn diese Software auch wirklich außerhalb der eigenen Firma verwendet wird. Und besonders schön ist es, wenn man dies daran merkt, dass von externen Nutzern Verbesserungen beigetragen werden. So …</p>
<p>Es ist ja cool, wenn es einem <a href="http://www.blue-yonder.com">der Arbeitgeber</a> ermöglicht nützliche Software als Open Source zu veröffentlichen. Noch cooler ist aber, wenn diese Software auch wirklich außerhalb der eigenen Firma verwendet wird. Und besonders schön ist es, wenn man dies daran merkt, dass von externen Nutzern Verbesserungen beigetragen werden. So durfte ich diese Woche <a href="https://pypi.python.org/pypi/devpi-builder/2.1.0">Version 2.1.0 von Brandon, dem Devpi-Builder,</a> veröffentlichen nachdem <a href="https://github.com/hlawrenz">Hans Lawrenz</a> Unterstützung für zertifikatsbasierte Authentifizierung beigetragen hat.</p>
Devpi-Cleaner 0.2.02016-04-17T21:46:37+02:002016-04-18T08:29:58+02:00Matthias Bachtag:marix.org,2016-04-17:/devpi-cleaner-020.html
<p>Wer einen größeren <a href="http://doc.devpi.net">Devpi-Server</a> betreibt kommt immer wieder mal in die Situation Pakete von diesem löschen zu müssen. Für einzelne Pakete lässt sich dies mit dem normalen <a href="http://doc.devpi.net">Devpi-Client</a> noch leidlich komfortabel lösen, aber schon nichtvolatile Indices machen daraus ein aufwendiges Unterfangen mit mehreren manuellen Schritten, bei dem leicht Fehler unterlaufen …</p>
<p>Wer einen größeren <a href="http://doc.devpi.net">Devpi-Server</a> betreibt kommt immer wieder mal in die Situation Pakete von diesem löschen zu müssen. Für einzelne Pakete lässt sich dies mit dem normalen <a href="http://doc.devpi.net">Devpi-Client</a> noch leidlich komfortabel lösen, aber schon nichtvolatile Indices machen daraus ein aufwendiges Unterfangen mit mehreren manuellen Schritten, bei dem leicht Fehler unterlaufen. Um diese Problem zu lösen gibt es <a href="https://pypi.python.org/pypi/devpi-cleaner">Léon, den Devpi-Cleaner</a>, der es beispielsweise ermöglichte alle alten Enwicklungsversionen zu entfernen oder den Index nur für die Dauer der Löschoperation volatil zu schalten.<!--break--></p>
<p>Die Notwendigkeit auf dem Devpi aufzuräumen ergibt sich nicht nur, wenn mal ein Paket falsch hochgeladen wurde. Auch Änderungen der Indexstruktur können eine Aufräumaktion sinnvoll machen. Und wer Continuous Integration ernst nimmt und zu jedem erfolgreichen Build ein Paket hochlädt, dem blähen alte, nicht mehr benötigte Entwicklungsversionen die Backupgröße, und damit auch die Erstellungsdauer auf.</p>
<p>Bei meinem Arbeitgeber <a href="http://www.blue-yonder.com">Blue Yonder</a> ist es glücklicherweise gerne gesehen allgemein nutzbare Software als Open Source zu veröffentlichen. So konnte ich letzte Woche Version 0.2.0 von <a href="https://pypi.python.org/pypi/devpi-cleaner">Léon, dem Devpi-Cleaner</a> veröffentlichen. Nicht nur sind jetzt komplexere Auswahlkriterien möglich, sondern das Löschen geht jetzt auch deutlich schneller und dank Fortschrittsbalken mit Restzeitabschätzung hat man eine Chance seine Kaffeepausen zeitoptimiert einzulegen. Eine komplette Liste der Änderungen findet sich im <a href="https://github.com/blue-yonder/devpi-cleaner/blob/master/CHANGELOG.rst">Changelog</a>.</p>
Kein CUDA nach dem Update auf openSUSE Leap 42.12016-04-15T22:41:40+02:002017-08-05T21:31:00+02:00Matthias Bachtag:marix.org,2016-04-15:/kein-cuda-nach-dem-update-auf-opensuse-leap-421.html
<p>Nachdem ich meine Workstation <a href="https://marix.org/Blog/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html">von openSUSE 13.1 auf openSUSE Leap 42.1 migriert</a> hatte funktionierten lies sich die Grafikkarte nicht mehr zum Rechnen nutzen. Irgendwie hatte es einen Fehler bei der Installation des neuen Grafiktreibers gegeben. Seine Neuinstallation löste das Problem.</p>
<p><h2>Das Problem</h2></p>
<p>Nach dem Update fanden CUDA nutzende …</p>
<p>Nachdem ich meine Workstation <a href="https://marix.org/Blog/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html">von openSUSE 13.1 auf openSUSE Leap 42.1 migriert</a> hatte funktionierten lies sich die Grafikkarte nicht mehr zum Rechnen nutzen. Irgendwie hatte es einen Fehler bei der Installation des neuen Grafiktreibers gegeben. Seine Neuinstallation löste das Problem.</p>
<p><h2>Das Problem</h2></p>
<p>Nach dem Update fanden CUDA nutzende Anwendungen keine Grafikkarte. So meldete <a href="https://boinc.berkeley.edu">Boinc</a> <code>No usable GPUs found</code>. Prinzipiell funktionierte die Grafikkarte aber. So hatte ich volle 3D-Beschleunigung, und auch <a href="https://developer.nvidia.com/nvidia-system-management-interface"><code>nvidia-smi</code></a> meldete die erwarteten Daten:</p>
<p><pre><code>+------------------------------------------------------+
| NVIDIA-SMI 340.93 Driver Version: 340.93 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 580 Off | 0000:01:00.0 N/A | N/A |
| 43% 49C P12 N/A / N/A | 494MiB / 1535MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Compute processes: GPU Memory |
| GPU PID Process name Usage |
|=============================================================================|
| 0 Not Supported |
+-----------------------------------------------------------------------------+
</code></pre></p>
<p><h2>Die Analyse</h2></p>
<p><a href="https://developer.nvidia.com/cuda-downloads">NVIDIA bietet CUDA zwar für einige SUSE-Varianten zum Download</a>, aber leider nicht für Leap 42.1. Es gibt zwar Pakete für das unterliegende SLE 12, aber diese verlangen einen Grafikttreiber welcher nicht zum Kernel von Leap 42.1 passt. Deshalb habe ich mich für die Analyse auf OpenCL-Beispiel-Code zurückgezogen. Denn für <a href="https://www.khronos.org/opencl/">OpenCL</a> benötigt man nur die <a href="https://github.com/KhronosGroup/OpenCL-Headers/">Header</a>, welche man einfach direkt zum Code legen kann, und einen C-Compiler.</p>
<p>Schon der erste Versuch mit einem Beispielprogramm welches nur die OpenCL-Runtime initialisiert zeigt das Problem:</p>
<p><pre><code>> sudo ./platform
modprobe: FATAL: Module nvidia-uvm not found.
Failed to get platforms: -1001
</code></pre></p>
<p>Das <code>sudo</code> ist hier übrigens nur vorangestellt um es zu ermöglichen Kernel-Module nachzuladen. Ohne <code>sudo</code> erhält man den gleichen Fehler, aber ohne die essentielle Information zum Kernelmodul.</p>
<p>Schnell konnte ich herausfinden, dass eigentlich alle Kernelmodule installiert sind:</p>
<p><pre><code>> rpm -ql nvidia-gfxG03-kmp-default-340.93_k4.1.12_1-36.7.x86_64 | grep \.ko
/lib/modules/4.1.12-1-default/updates/nvidia.ko
> rpm -ql nvidia-uvm-gfxG03-kmp-default-340.93_k4.1.12_1-36.7.x86_64 | grep \.ko
/lib/modules/4.1.12-1-default/updates/nvidia-uvm.ko
> ls /lib/modules/4.1.12-1-default/updates/
nvidia.ko nvidia-uvm.ko
</code></pre></p>
<p>Allerdings war das nicht das Modulverzeichnis des aktuell laufenden Kernels:</p>
<p><pre><code>> uname -a
Linux eddie 4.1.13-5-default #1 SMP PREEMPT Thu Nov 26 16:35:17 UTC 2015 (49475c3) x86_64 x86_64 x86_64 GNU/Linux
</code></pre></p>
<p>Wo liegen also dessen Module? <code>/lib/modules/4.1.13-5-default/updates</code> existiert nicht. Das NVIDIA-Modul ist aber schnell gefunden:</p>
<p><pre><code>> ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko
</code></pre></p>
<p>Nur fehlt in diesem Verzeichnis das <code>nvidia-uvm.ko</code>.</p>
<p><h2>Die Lösung</h2></p>
<p>Eine Neuinstallation des dazugehörigen Paketes lässt dann endlich auch OpenCL wieder richtig initialisieren:</p>
<p><pre><code>> zypper in in -f nvidia-uvm-gfxG03-kmp-default
> ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko nvidia-uvm.ko
> modprobe nvidia-uvm
> ./platform
Failed to get platforms: -1001
> sudo ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE
> ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE
</code></pre></p>
<p>Um die Grafikkarte tatsächlich zu verwenden war dann allerdings noch ein Neustart notwendig.</p>
openSUSE 13.1 mit UEFI und Vollverschlüsselung auf openSUSE Leap 42.1 migrieren2016-01-03T22:38:05+01:002016-03-12T21:41:53+01:00Matthias Bachtag:marix.org,2016-01-03:/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html
<p>Da <a href="http://lists.opensuse.org/opensuse-announce/2015-11/msg00003.html">der offizielle Support für openSUSE 13.1 am 5.1.2015 endet</a> war es höchste Zeit meine Workstation mal auf <a href="https://en.opensuse.org/Portal:42.1">openSUSE Leap 42.1</a> zu migrieren. Solche Migrationen mache ich mit SUSE schon seit es noch einstellige Versionsnummern hatte. Diesmal war die Migration allerdings ungewohnt holprig.</p>
<p>Meine Workstation nutzt …</p>
<p>Da <a href="http://lists.opensuse.org/opensuse-announce/2015-11/msg00003.html">der offizielle Support für openSUSE 13.1 am 5.1.2015 endet</a> war es höchste Zeit meine Workstation mal auf <a href="https://en.opensuse.org/Portal:42.1">openSUSE Leap 42.1</a> zu migrieren. Solche Migrationen mache ich mit SUSE schon seit es noch einstellige Versionsnummern hatte. Diesmal war die Migration allerdings ungewohnt holprig.</p>
<p>Meine Workstation nutzt ein vermutlich nicht ganz gewöhnliches Set-Up. OpenSUSE ist parallel zu Windows 10 installiert, und beides wird per <a href="https://docs.fedoraproject.org/en-US/Fedora/18/html/UEFI_Secure_Boot_Guide/chap-UEFI_Secure_Boot_Guide-What_is_Secure_Boot.html">UEFI Secure Boot</a> gestartet. Den UEFI-Boot habe ich dann auch gleich mal genutzt um mir mit Anlauf selbst in den Fuß zu schießen: OpenSUSE unterstützt es zwar schon seit Ewigkeiten eine Upgrade aus dem laufenden System durchzuführen, da es mir aber immer als der sauberere Ansatz vorkam – und sicher auch aus Nostalgie – mache ich solche Updates immer noch ganz altmodisch per DVD. Allerdings bietet mein ASUS-EFI in der Bootmedienauswahl das Blu-Ray-Laufwerk immer zwei mal an. Einmal ganz oben in der Liste als <a href="https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#CSM_booting">BIOS-Boot</a>, und einmal ganz unten als echten UEFI-Boot. Natürlich habe ich – wollte ja nur schnell mal das Update starten – den oberen Eintrag genommen und mein EFI-System dann mal schön im BIOS-Modus aktualisiert. Leider fängt openSUSE diesen <a href="https://en.wikipedia.org/w/index.php?title=PEBKAC">PEBKAC</a> aktuell nicht ab und hat mir dann mal schön die Bootloaderkonfiguration kaputtgeschrieben. Zum Glück ist der Fehler – wenn man erst mal verstanden hat, was man falsch gemacht hat – trivial zu korrigieren. Einfach nochmal das Upgrade im UEFI-Modus starten, von Leap 42.1 auf Leap 42.1 aktualisieren (ja, das geht). Danach ist der Bootloader korrekt geschrieben.</p>
<p>Leider tritt einem beim Versuch die DVD mit openSUSE Leap 42.1 per UEFI zu booten <a href="https://bugzilla.opensuse.org/show_bug.cgi?id=950569">Bug 950569</a> in den Weg. Der Bootcode auf der DVD ist nicht korrekt signiert, was auf meinem System zufolge hat, dass der Bildschirm einfach schwarz bleibt. <a href="https://nwrickert2.wordpress.com/2015/11/02/preparing-for-a-leap-42-1-install/">Das Problem lässt sich lösen, indem man Secure Boot im BIOS temporär deaktiviert</a>. Zum Glück installiert openSUSE Leap 42.1 bei der Installation bzw. dem Upgrade bereits die aktuellsten Version aller Pakete. So bleibt Nachzüglern wie mir nicht nur die Updateorgie nach der Installation erspart, sondern es landet auch korrekt signierter Code auf der Platte, so dass Secure Boot nach dem Update gleich wieder aktiviert werden kann.</p>
<p>Ein weiteres <a href="https://bugzilla.opensuse.org/show_bug.cgi?id=904987">Problem bei openSUSE Leap 42.1 ist, dass es zumindest bei Upgrades nicht korrekt mit verschlüsselten Root-Partitionen umgehen kann</a>. Beim Boot „vergisst“ das System nach der Passphrase zu fragen. Wechselt man durch die Konsolen findet zeigt sich folgende Fehlermeldung: <code>Failed to start systemd-cryptsetup@luks<codierte ID>.service:</code>. Ich habe die ID in der Fehlermeldung mal gekürzt ;). Wie in <a href="https://bugzilla.opensuse.org/show_bug.cgi?id=904987">Bug 904987</a> lässt sich das Problem lösen, indem man dem Kernel explizit sagt, dass er die entsprechende Partition entschlüsseln soll, indem man ihm die ID des LUKS-Containers per Kernelparameter <code>rd.luks.uuid</code> mitgibt.</p>
<p>Die ID des LUKS-Containers lässt sich mit <a href="https://gitlab.com/cryptsetup/cryptsetup">Cryptsetup</a> herausfinden. Liegt die Root-Partition z.B. auf <code>/dev/sda2</code>, so lässt sich die ID wie folgt herausfinden.
<pre><code>> cryptsetup luksUUID /dev/sda2
07246af2-915a-bd54-6a5s-6a5c35d15f45
</code></pre>
Der Bootparameter muss dann in <code>/etc/sysconfig/bootloader</code> zum Wert <code>DEFAULT_APPEND</code> hinzugefügt werden. Dieser sollte dann z.B. wie folgt aussehen:
<pre><code>DEFAULT_APPEND="splash=silent quiet showopts rd.luks.uuid=07246af2-915a-bd54-6a5s-6a5c35d15f45"
</code></pre>
Anschließend einmal den Bootloader neu schreiben lassen und das System fragt wieder nach dem Passwort. Idealerweise wird dieser Workaround schon <i>vor</i> dem Update implementiert. Nicht, weil dann der Bootloader sowieso neu geschrieben wird, sondern weil man sich dann das Herumgewurschtel mit einem Recovery-System spart.
</p>
Projekte von Gitorious zu Gitlab.com umgezogen2015-04-24T22:06:08+02:002015-04-24T22:06:08+02:00Matthias Bachtag:marix.org,2015-04-24:/projekte-von-gitorious-zu-gitlabcom-umgezogen.html
<p>Da <a href="https://gitorious.org">Gitorious</a> nach der <a href="https://about.gitlab.com/2015/03/03/gitlab-acquires-gitorious/">Akquise durch Gitlab</a> Ende Mai die Pforten schließen wird, beziehungsweise nur noch Archivcharakter haben wird, habe ich alle meine dortigen Projekte zu <a href="https://gitlab.com">Gitlab</a> umgezogen. <a href="https://gitlab.com/Marix/Einhard">Einhard</a>, <a href="https://gitlab.com/Marix/FindOpenCL">FindOpenCL</a>, <a href="https://gitlab.com/Marix/CLU">CLU</a>, <a href="https://gitlab.com/Marix/QuickClusterOverview">Quick Cluster Overview</a> und <a href="https://gitlab.com/Marix/Klepsydra">Klepsydra</a> sind dort nun unter <a href="https://gitlab.com/u/Marix">meinem Account</a> zu finden.</p>
Quick Cluster Overview jetzt auf Gitlab.com gehostet2015-04-24T21:57:27+02:002017-07-10T17:13:00+02:00Matthias Bachtag:marix.org,2015-04-24:/quick-cluster-overview-jetzt-auf-gitlabcom-gehostet.html
<p>Aufgrund der baldigen Abschaltung von gitorious.org ist das Repository von Quick Cluster Overview umgezogen. Es befindet sich nur auf Gitlab.com. Die neue URL lautet <a href="https://gitlab.com/Marix/QuickClusterOverview">https://gitlab.com/Marix/QuickClusterOverview</a>.</p>
Kalibrieren von Joysticks in Windows 82014-11-25T23:25:48+01:002014-11-25T23:25:48+01:00Matthias Bachtag:marix.org,2014-11-25:/kalibrieren-von-joysticks-windows-8.html
<p>Öffnet man in Windows 8 die Gamecontrollereinstellungen, z.B. durch Rechtsklick auf den zu Kalibrierenden Joystick im Dialog „Geräte und Drucker“, so fehlt der seit vielen Windowsversionen gewohnte Dialog zum Kalibrieren des Joysticks. <a href="http://answers.microsoft.com/en-us/windows/forum/windows_8-gaming/can-i-calibrate-a-logitech-extreme-3d-pro-in/741a6172-de54-4268-bb7a-0292e16cdf33">In Microsofts Foren</a> findet sich zum Glück eine Lösung für das Problem. Hält man im Dialog „Gamecontroller …</p>
<p>Öffnet man in Windows 8 die Gamecontrollereinstellungen, z.B. durch Rechtsklick auf den zu Kalibrierenden Joystick im Dialog „Geräte und Drucker“, so fehlt der seit vielen Windowsversionen gewohnte Dialog zum Kalibrieren des Joysticks. <a href="http://answers.microsoft.com/en-us/windows/forum/windows_8-gaming/can-i-calibrate-a-logitech-extreme-3d-pro-in/741a6172-de54-4268-bb7a-0292e16cdf33">In Microsofts Foren</a> findet sich zum Glück eine Lösung für das Problem. Hält man im Dialog „Gamecontroller“ die Umschalt- und die Steuerungstaste gedrückt während man den Knopf „Eigenschaften“ drückt, so kommt der alte Eigenschaftsdialog hoch, inklusive der Option den Joystick zu kalibrieren.</p>
<p>Ich habe die Lösung nur mit einem Logitech Extreme 3D getestet. Ich kann mir aber nicht vorstellen, dass Windows sich bei anderen Joysticks hier anders verhält.</p>
„Indie Game: The Movie“ auf openSUSE2014-11-23T21:56:37+01:002014-11-23T22:02:16+01:00Matthias Bachtag:marix.org,2014-11-23:/„indie-game-movie“-auf-opensuse.html
<p>Startet man unter openSUSE, bzw. mit einem KDE-Desktop, von <a href="http://store.steampowered.com/">Steam</a> aus <a href="http://www.indiegamethemovie.com/">„Indie Game: The Movie“</a>, so kommt zwar ein archaisch wirkendes Xterm hoch, welches behauptet einem <a href="http://www.adobe.com/products/air.html">Adobe AIR</a> zu installieren, allerdings passiert danach nichts mehr. Hat man Adobe AIR bereits installiert startet „Indie Game: The Movie“ ohne Probleme.</p>
<p>Hier kommen …</p>
<p>Startet man unter openSUSE, bzw. mit einem KDE-Desktop, von <a href="http://store.steampowered.com/">Steam</a> aus <a href="http://www.indiegamethemovie.com/">„Indie Game: The Movie“</a>, so kommt zwar ein archaisch wirkendes Xterm hoch, welches behauptet einem <a href="http://www.adobe.com/products/air.html">Adobe AIR</a> zu installieren, allerdings passiert danach nichts mehr. Hat man Adobe AIR bereits installiert startet „Indie Game: The Movie“ ohne Probleme.</p>
<p>Hier kommen gleich mehrere Probleme zusammen:
<ul><li>Adobe AIR unterstützt schon seit mehreren Jahren Linux offiziell nicht mehr. Es muss also eine alte Version installiert werden, welche dann natürlich nicht die modernsten Annahmen macht was die Linuxumgebung angeht</li>
<li>Die Standardinstallation von Adobe AIR benötigt root-Rechte. Steam führt man allerdings normalerweise nicht als root aus, und das Skript welches die Installation durchführt fordert auch offensichtlich keine an.</li>
<li>Adobe AIR will bei der Installation auf KWallet, oder alternativ den Gnome Keyring zugreifen. Auf openSUSE 13.1 mit KDE findet es aber, obwohl natürlich KWallet installiert ist, keinen von beiden.</li>
</ul>
Woran genau die Installation scheitert habe ich nicht herausgefunden.</p>
<p>Zur manuellen Installation ist zunächst Adobe AIR von der Archivseite http://helpx.adobe.com/air/kb/archived-air-sdk-version.html herunterzuladen. Es empfiehlt sich die letzte Version mit Linuxunterstützung, also die 2.6 Runtime, zun nutzen. Diese muss mit root-Rechten und Zugriff auf X ausgeführt werden. Hierbei ergibt sich dann das Problem, dass KWallet nicht gefunden wird. Adobe AIR ist eine 32-bit Anwendung, auf den inzwischen üblichen 64-bit-Systemen prüft es offensichtlich im falschen Verzeichnis auf die Existenz der Bibliothek. <a href="http://askubuntu.com/questions/87447/how-can-i-install-adobe-air">Legt man, an sich redundant, das korrekte Verzeichnis in die Umgebungsvariable <code>LD_LIBRARY_PATH</code>, so läuft der Installer erfolgreich durch.</a> Nach dem Download ist also folgendes in einer Konsole auszuführen.</p>
<p><pre><code>chmod +x AdobeAIRInstaller.bin
su # sudo gibt per default keinen Zugriff auf den laufenden X-Server
LD_LIBRARY_PATH=/usr/lib64 ./AdobeAIRInstaller.bin
</code></pre></p>
Android-Apps ohne Benachrichtigungen2014-10-28T11:25:44+01:002014-10-28T11:25:44+01:00Matthias Bachtag:marix.org,2014-10-28:/android-apps-ohne-benachrichtigungen.html
<p>Auf einem Samsung Galaxy S3 Mini musste ich feststellen, dass TextSecure keine Benachrichtigungen anzeigte. Nachrichten wurden zwar zugestellt, aber nur durch Öffnen der App lies sich feststellen, ob neue Nachrichten vorlagen. In der App selbst war allerdings alles korrekt eingestellt. Schuld an den fehlenden Benachrichtigungen war vielmehr Android, welches es …</p>
<p>Auf einem Samsung Galaxy S3 Mini musste ich feststellen, dass TextSecure keine Benachrichtigungen anzeigte. Nachrichten wurden zwar zugestellt, aber nur durch Öffnen der App lies sich feststellen, ob neue Nachrichten vorlagen. In der App selbst war allerdings alles korrekt eingestellt. Schuld an den fehlenden Benachrichtigungen war vielmehr Android, welches es auf Systemebene noch einmal erlaubt Benachrichtigungen für einzelne Apps ein- und auszuschalten.</p>
<p>Um die entsprechende Einstellung vorzunehmen muss man in den Systemeinstellungen von Android den Abschnitt „Apps“, der bei Samsung „Anwendungsveraltung“ heißt wählen. Wählt man dort eine App aus, so gibt es dort ein Feld „Benachrichtigungen anzeigen“. Ist dort kein Haken gesetzt, so filtert Android alle Benachrichtigungen der App aus.</p>
Einhard 0.42014-10-27T18:19:35+01:002017-08-05T21:28:00+02:00Matthias Bachtag:marix.org,2014-10-27:/einhard-04.html
<p>Ab sofort ist Version 0.4 von <a href="https://marix.org/Projekte/einhard.md">Einhard</a> verfügbar.</p>
<p>Diese Version bietet folgende neuen Fähigkeiten:
<ul>
<li>Mehrzeilige Lognachrichten werden jetzt besser dargestellt.</li>
<li>Das Zeichen zum Separieren der Bestandteile des Zeitstempels kann frei gewählt werden. Normalerweise wird weiter der Doppelpunkt verwendet.</li>
<li>Ein Großteil des Codes wurde von den Headern in eine Bibliothek …</li></ul></p>
<p>Ab sofort ist Version 0.4 von <a href="https://marix.org/Projekte/einhard.md">Einhard</a> verfügbar.</p>
<p>Diese Version bietet folgende neuen Fähigkeiten:
<ul>
<li>Mehrzeilige Lognachrichten werden jetzt besser dargestellt.</li>
<li>Das Zeichen zum Separieren der Bestandteile des Zeitstempels kann frei gewählt werden. Normalerweise wird weiter der Doppelpunkt verwendet.</li>
<li>Ein Großteil des Codes wurde von den Headern in eine Bibliothek verschoben um Code der Einhard verwendet schneller kompilieren zu lassen.</li>
<li>Einhard kann jetzt aus mehreren Threads heraus verwendet werden.</li>
<li>Einhard kann auch mit Clang genutzt und übersetzt werden.</li>
</ul></p>
<p>Der Code findet sich auf Gitlab unter dem Tag <cite>v0.4</cite>: <a href="https://gitlab.com/Marix/Einhard/tree/v0.4">https://gitlab.com/Marix/Einhard/tree/v0.4</a>:. Von dort lässt er sich auch <a href="https://gitlab.com/Marix/Einhard/repository/archive.tar.bz2?ref=v0.4">als Tarball herunterladen.</a>
</p>
Civilization 5, V-Sync und KDE2014-09-11T00:31:21+02:002014-09-11T00:31:21+02:00Matthias Bachtag:marix.org,2014-09-11:/civilization-5-v-sync-und-kde.html
<p>In Civilization 5 gibt es zwar eine V-Sync-Option, allerdings ist im Spiel dann bei mir doch das hässliche Tearing zu sehen gewesen. Die Lösung: Die Arbeitsflächeneffekte für Vollbildfenster deaktivieren. Diese, bzw. deren V-Sync-Einstellung scheint mit der von Civilization 5 zu kollidieren. Die Einstellung findet sich in den Systemeinstellungen unter „Arbeitsflächen-Effekte …</p>
<p>In Civilization 5 gibt es zwar eine V-Sync-Option, allerdings ist im Spiel dann bei mir doch das hässliche Tearing zu sehen gewesen. Die Lösung: Die Arbeitsflächeneffekte für Vollbildfenster deaktivieren. Diese, bzw. deren V-Sync-Einstellung scheint mit der von Civilization 5 zu kollidieren. Die Einstellung findet sich in den Systemeinstellungen unter „Arbeitsflächen-Effekte“->„Erweitert“.</p>
Threema2014-01-04T18:06:01+01:002014-07-14T21:17:47+02:00Matthias Bachtag:marix.org,2014-01-04:/threema.html
<p>Nach dem NSA-Skandal scheint sich jetzt mit <a href="https://threema.ch">Threema</a> endlich mal ein Messanger fürs Handy zu implementieren, welcher aus Datenschutzsicht nicht eine komplette Katastrophe ist. Anders als WhatsApp, Google Hangouts, Facebook und SMS läuft hier die Kommunikation nicht unverschlüsselt durchs Netz, sondern wird für den Empfänger verschlüsselt. Da Threema auch nur …</p>
<p>Nach dem NSA-Skandal scheint sich jetzt mit <a href="https://threema.ch">Threema</a> endlich mal ein Messanger fürs Handy zu implementieren, welcher aus Datenschutzsicht nicht eine komplette Katastrophe ist. Anders als WhatsApp, Google Hangouts, Facebook und SMS läuft hier die Kommunikation nicht unverschlüsselt durchs Netz, sondern wird für den Empfänger verschlüsselt. Da Threema auch nur dann ein beruhigendes Grün für den Kontakt anzeigt, wenn der Schlüssel des Kommunikationspartners einmal per QR-Code-Scan verifiziert wurde, trägt die App auch anders als solche welche die Schlüssel zentral verteilen nicht in trügerischer Sicherheit.</p>
<p>Dennoch hat natürlich auch Threema Probleme. Da der Quellcode nicht offen liegt ist es unmöglich sicherzustellen, dass der geheime Schlüssel nicht doch irgendwie nach außen geleaked wird. Wichtiger ist aber, dass die Verkehrsdaten, oft auch Metadaten genannt, weiterhin an einer zentralen Stelle anfallen. Es reicht also immer noch eine Stelle anzugreifen um an diese Daten zu kommen.</p>
<p>Als Alternative zu Whatsapp, Google Hangouts und Konsorten ist Threema definitiv ein Schritt in die richtige Richtung. Langfristig benötigt es aber eine ähnlich komfortable Lösung welche auf offenen Standards beruht, so dass eine komplett vertrauenswürdige Kette aufgebaut werden kann. Eine freie Implementierung würde es erlauben nach Hintertüren zu suchen. Insbesondere muss aber die Serverstruktur dezentralisiert werden, so dass nicht alle Verkehrsdaten an einem Punkt anfallen. Betreibt man einen eigenen Server, so müssen Nachrichten zu anderen Nutzen desselben die eigene Infrastruktur nie verlassen, und ein aufgemachter Server würde nur Verkehrsdaten von Nachrichten welche über diesen liefen betreffen, aber nicht die dritter. Im Prinzip gibt es Jabber und PGP ja auch schon die zugrundeliegende Infrastruktur für eine solche Lösung. Allerdings muss hier noch am Bedienkomfort gearbeitet werden. So bin ich beispielsweise mit den bisherigen Möglichkeiten Jabber-Nachrichten aufs Handy zu schieben unzufrieden, und auch die einfache Validierung des Kommunkationsschlüssels via QR-Code habe ich in einem solchen Setup bisher noch nicht gesehen.</p>
<p>Ich bin natürlich auch per Threema zu erreichen. Fragt mich einfach nach meiner ID. Meine alte ID <cite>YYYZBANM</cite> solltet ihr bitte nicht mehr verwenden. Nach einem kuriosen Androidfehler habe ich diese verloren und hatte leider auch kein Backup. Selbst mit letzterem würde ich ihr allerdings auch nicht mehr trauen.</p>
<p></p>
Chiliproject-Tickets aus Commits heraus schließen2013-09-25T15:31:22+02:002013-09-25T15:31:22+02:00Matthias Bachtag:marix.org,2013-09-25:/chiliproject-tickets-aus-commits-heraus-schließen.html
<p>In <a href="https://www.chiliproject.org/">ChiliProject</a> – und natürlich auch in <a href="http://www.redmine.org/">Redmine</a> – können Tickets aus Commits heraus referenziert und Geschlossen werden. Da ich immer wieder neu heraussuchen muss, wie das geht, hier die Kurzanleitung:
<pre><code>refs #123</code></pre>
Referenziert das Ticket 123. Alternativ ist auch <code>references</code> oder <code>IssueID</code> möglich.
Um ein Ticket zu schließen ist folgendes in …</p>
<p>In <a href="https://www.chiliproject.org/">ChiliProject</a> – und natürlich auch in <a href="http://www.redmine.org/">Redmine</a> – können Tickets aus Commits heraus referenziert und Geschlossen werden. Da ich immer wieder neu heraussuchen muss, wie das geht, hier die Kurzanleitung:
<pre><code>refs #123</code></pre>
Referenziert das Ticket 123. Alternativ ist auch <code>references</code> oder <code>IssueID</code> möglich.
Um ein Ticket zu schließen ist folgendes in den Commit einzufügen:
<pre><code>fixes #123</code></pre>
Alternativ kann <code>closes</code> verwendet werden.</p>
<p>Referenziert oder schließt man Ticket aus einem Commit, so wird der Commit automatisch auch vom Ticket aus verlinkt. Dies erlaubt es leicht nachzuvollziehen, wie ein Problem gelöst wurde.</p>
<p>Das ganze lässt sich auch anpassen. Die Einstellungen finden sich unter <code>Administration->Konfiguration->Projektarchive</code>.</p>
Die Trailer der letzten Wochen: Meine Highlights2013-07-05T16:46:13+02:002013-07-05T17:25:27+02:00Matthias Bachtag:marix.org,2013-07-05:/gametrailer.htmlIn den letzten Wochen gab es einige coole Trailer zu neuen Spielen. Hier sind meine persönlichen Highlights.
<p>In den letzten Wochen gab es einige coole Trailer zu neuen Spielen. Hier sind meine persönlichen Highlights.</p>
<p>Der Trailer der neuesten Erweiterung zu Civilization V klotzt statt zu klettern. „Brave new World“ werde ich definitiv spielen müssen. Zumindest sobald ich mal zur letzten Erweiterung „Gods and Kings“ gekommen bin.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/JRwDa5OSHtE?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Nadeo hat gleich zum Doppelschlag ausgeholt. Mit „TrackMania 2: Stadium“ holen sie Nations auf den aktuellen technischen Stand. Aber auch wenn ich sicherlich wieder genug Zeit im Stadion verlieren werde, so fasziniert mich „TrackMania 2: Valley“ doch deutlich mehr. Lob gebührt Nadeo auch für die Musik, die sie für beide Trailer sehr gut ausgesucht haben.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/Ub9CtV524yI?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/9hfCcQG5n5M?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Außerdem gibt es neues vom Hexer. „The Witcher 3“ verspricht ein wahrhaft episches Abenteuer zu werden.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/TZ_G6XiHoUA?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Der Trailer zu „Borderlands 2: Tiny Tina“ verspricht die klassischen Action-RPGs jetzt mal dem für Borderlands typischen Humor auszusetzen.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/SCGXss3plDc?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Der Trailer zum neuen Need for Speed hat mich auch wieder gepackt. Allerdings scheint „Rivals“ mal wieder ein Aufguß zu werden. Aber solange es mit Supersportwagen ist...</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/Vb62WFsNkCo?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Zu guter Letzt gibt es mal wieder eine Erweiterung zu Eve Online. Der Trailer ist mal wieder episch. Ich werde um das Spiel trotzdem vorsichtshalber mal weiter einen großen Bogen machen.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/9kmUf3fflrA?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
Aktive Reservierungen in SLURM verlängern2013-06-25T11:09:17+02:002013-06-25T11:17:41+02:00Matthias Bachtag:marix.org,2013-06-25:/aktive-reservierungen-slurm-verlängern.html
<p><a href="http://slurm.schedmd.com/">SLURM</a> quittiert den Versuch eine bereits in Nutzung befindliche Reservierung zu verlängern normalerweise mit der Fehlermeldung, die Knoten seien bereits in Benutzung. Dies ist in diesem Fall natürlich richtig, allerdings ist dies kein echter Konflikt, so die Jobs bereits die Reservierung nutzen. In diesem Fall macht es Sinn SLURM anzuweisen …</p>
<p><a href="http://slurm.schedmd.com/">SLURM</a> quittiert den Versuch eine bereits in Nutzung befindliche Reservierung zu verlängern normalerweise mit der Fehlermeldung, die Knoten seien bereits in Benutzung. Dies ist in diesem Fall natürlich richtig, allerdings ist dies kein echter Konflikt, so die Jobs bereits die Reservierung nutzen. In diesem Fall macht es Sinn SLURM anzuweisen den Fehler zu ignorieren.</p>
<p><!--break--></p>
<p>Als kleines Beispiel soll folgende Reservierung verlängert werden:
<pre><code>bach@login:~> scontrol show reservation bach_2
ReservationName=bach_2 StartTime=2013-06-10T00:00:00 EndTime=2013-07-01T23:59:59 Duration=21-23:59:59</code></pre></p>
<p>Der naive Versuch die Reservierung zu verlängern scheitert:
<pre><code>bach@login:~> sudo scontrol update reservationname=bach_2 endtime=2013-07-29
Error updating the reservation: Requested nodes are busy
slurm_update error: Requested nodes are busy</code></pre></p>
<p>Weist man die Reservierung an etwaige Nutzungkonflikte zu ignorieren, so kann sie problemlos verlängert werden:
<pre><code>sudo scontrol update reservationname=bach_2 endtime=2013-07-29 flags=IGNORE_JOBS
Reservation updated. </code></pre></p>
<p>Das Flag <code>IGNORE_JOBS</code> bleibt für die Reservierung aktiv, es muss für weitere Änderungen nicht erneut angegeben werden. Beim Hinzufügen von Knoten kann es dadurch allerdings passieren, dass Knoten welche bereits durch lange Jobs blockiert sind in die Reservierung aufgenommen werden.</p>
Glossareinträge in TikZ-UML-Diagrammen verwenden2013-05-09T10:54:29+02:002013-05-09T10:54:29+02:00Matthias Bachtag:marix.org,2013-05-09:/glossareinträge-tikz-uml-diagrammen-verwenden.html
<p><a href="http://www.ensta-paristech.fr/~kielbasi/tikzuml/index.php?lang=en">TikZ-UML</a> und <a href="http://dante.ctan.org/tex-archive/help/Catalogue/entries/glossaries.html">Glossaries</a> sind äußerst nützliche Pakete für <a href="http://www.latex-project.org/">LaTeX</a>. Leider scheiterte mein erster Versuch einen Eintrag meines Glossars als Klassenname zu verwenden mit folgender Fehlermeldung:</p>
<p><pre><code>! Missing \endcsname inserted.
<to be read again>
\let
l.95 \umlemptyclass[y=0, x=0]{\glstext{prng}}
</code></pre></p>
<p>Die Lösung ist auf den Link zum Glossar zu verzichten. Da TikZ-UML …</p>
<p><a href="http://www.ensta-paristech.fr/~kielbasi/tikzuml/index.php?lang=en">TikZ-UML</a> und <a href="http://dante.ctan.org/tex-archive/help/Catalogue/entries/glossaries.html">Glossaries</a> sind äußerst nützliche Pakete für <a href="http://www.latex-project.org/">LaTeX</a>. Leider scheiterte mein erster Versuch einen Eintrag meines Glossars als Klassenname zu verwenden mit folgender Fehlermeldung:</p>
<p><pre><code>! Missing \endcsname inserted.
<to be read again>
\let
l.95 \umlemptyclass[y=0, x=0]{\glstext{prng}}
</code></pre></p>
<p>Die Lösung ist auf den Link zum Glossar zu verzichten. Da TikZ-UML den Klassennamen als zur Identifikation nutzt darf er keine Links erhalten. Nutzt man beispielsweise <code>\glsentrytext</code> anstelle von <code>\glstext</code> wird der Glossareintrag zum Klassennamen. Nur draufklicken um in das Glossar zu kommen kann man leider nicht.</p>
Makros als OpenCL-Kommandozeilenparameter2013-02-04T17:16:00+01:002017-07-10T17:16:00+02:00Matthias Bachtag:marix.org,2013-02-04:/makros-als-opencl-kommandozeilenparameter.html
<p><a href="http://www.khronos.org/registry/cl/">Die OpenCL-Specifikation</a> enthält bei der Übergabe von Makros als Kommandozeilenparameter eine Falle für alle welche die Syntax des gcc gewohnt sind. Während bei GCC <code>-DMACRO[=WERT]</code> angesagt ist, ist der Parameter in OpenCL mit einem Leerzeichen spezifiziert, also <code>-D MACRO[=WERT]</code>.</p>
<p>Die AMD und NVIDIA-Platformen kommen wunderbar mit der vom …</p>
<p><a href="http://www.khronos.org/registry/cl/">Die OpenCL-Specifikation</a> enthält bei der Übergabe von Makros als Kommandozeilenparameter eine Falle für alle welche die Syntax des gcc gewohnt sind. Während bei GCC <code>-DMACRO[=WERT]</code> angesagt ist, ist der Parameter in OpenCL mit einem Leerzeichen spezifiziert, also <code>-D MACRO[=WERT]</code>.</p>
<p>Die AMD und NVIDIA-Platformen kommen wunderbar mit der vom GCC gewohnten, allerdings nicht standardkonformen, Syntax zurecht. Apple ist hier wählerischer, und so bekommt man bei Verwendung der von GCC gewohnten Variante mitunter den Fehlercode <code>CL_INVALID_BUILD_OPTIONS</code>. In <a href="
http://mathema.tician.de/software/pyopencl">PyOpenCL</a> wird daraus dann folgende Fehlermeldung:
<code>pyopencl.RuntimeError: clBuildProgram failed: invalid build options -</code>
Leider geht aus der Fehlermeldung nicht so exakt hervor, was den Compiler genau stört. Tatsächlich ist dies auch gar nicht so einfach zu beantworten, denn der Compiler scheint tatsächlich nur ein Problem zu haben, wenn die Kommandozeile nach einen <code>-DFOO</code> endet. Ein <code>-DFOO -DBLA</code> verarbeitet er völlig erwartungsgemäß.</p>
<p>Natürlich liegt der Fehler hier aber beim Anwender, eine standardkonforme Spezifikation der Macros funktioniert immer. Ungeschickt ist natürlich das etwas inkonsistente Handling der Parameter, welches es mitunter schwierig macht den Fehler zu finden.</p>
Steam einfach auf openSUSE installieren2013-02-02T15:56:08+01:002013-02-02T16:00:29+01:00Matthias Bachtag:marix.org,2013-02-02:/create-blogeintrag-0.html
<p>Es ist jetzt wieder möglich <a href="http://steampowered.com">Steam</a> per <a href="http://de.opensuse.org/1-Klick-Installation">1-Klick-Installation</a> auf <a href="http://www.opensuse.org">openSUSE</a> zu installieren. Die passenden Links findet man über <a href="http://software.opensuse.org/package/steam">die SUSE Software Suche</a>.</p>
<p>Steam war bereits kurz nach Start der offenen Beta im OpenSUSE Build Service verfügbar, dort aber <a href="http://lists.opensuse.org/opensuse-buildservice/2013-01/msg00023.html">im Januar aufgrund rechtlicher Problem wieder herausgeflogen.</a> Im Endeffekt lief es darauf …</p>
<p>Es ist jetzt wieder möglich <a href="http://steampowered.com">Steam</a> per <a href="http://de.opensuse.org/1-Klick-Installation">1-Klick-Installation</a> auf <a href="http://www.opensuse.org">openSUSE</a> zu installieren. Die passenden Links findet man über <a href="http://software.opensuse.org/package/steam">die SUSE Software Suche</a>.</p>
<p>Steam war bereits kurz nach Start der offenen Beta im OpenSUSE Build Service verfügbar, dort aber <a href="http://lists.opensuse.org/opensuse-buildservice/2013-01/msg00023.html">im Januar aufgrund rechtlicher Problem wieder herausgeflogen.</a> Im Endeffekt lief es darauf hinaus, dass es von Valve keine offizielle Genehmigung für das openSUSE-Projekt gab Steam zu verbreiten. <a href="http://lists.opensuse.org/opensuse-buildservice/2013-02/msg00001.html">Jetzt hat Steam seine Lizens so geändert, dass jeder Steam-Pakete weiterverbreiten darf</a>, und prompt ist Steam auch wieder für openSUSE verfügbar. Es ist sind zwar mit SUSE wohl noch nicht alle Formalitäten für die Verbreitung von kommerzieller Software über die SUSE-Infrastruktur geklärt, aber da jetzt klar ist, dass Valve die Verbreitung in dieser Form erlaubt gehe ich davon aus, dass Steam weiterhin offiziell für SUSE verfügbar sein wird. Wer weiß, vielleicht ist es dann ja bei openSUSE 12.3 von Anfang an ganz offiziell dabei.</p>
<p></p>
Cyberpunk 20772013-02-01T11:20:16+01:002013-02-02T15:59:47+01:00Matthias Bachtag:marix.org,2013-02-01:/create-blogeintrag.html
<p>Diesen Januar gab es ja einige imposante Rendertrailer zu sehen. Am meisten beeindruckt hat mich allerdings der Trailer für <a href="http://cyberpunk.net/">Cyberpunk 2077</a>. Nicht nur finde ich ihn optisch beeindruckend, auch freue ich mich auf ein erwachsenes Rollenspiel abseits des Fantasy-Settings. Ich konnte mich schon immer mehr für Science-Fiction begeistern. Die Bioshock-Spiele …</p>
<p>Diesen Januar gab es ja einige imposante Rendertrailer zu sehen. Am meisten beeindruckt hat mich allerdings der Trailer für <a href="http://cyberpunk.net/">Cyberpunk 2077</a>. Nicht nur finde ich ihn optisch beeindruckend, auch freue ich mich auf ein erwachsenes Rollenspiel abseits des Fantasy-Settings. Ich konnte mich schon immer mehr für Science-Fiction begeistern. Die Bioshock-Spiele waren zwar sehr cool, aber nach den Witcher-Spielen erwarte ich von CD Project, dass Cyberpunk 2077 noch eine ganze Ecke erwachsener und düsterer rüberkommt.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/P99qJGrPNLs?autoplay=0`" frameborder="0" allowfullscreen></iframe></p>
<p>Spannend ist natürlich auch, was CD Project am 5. Februar verkünden wird. Witcher 3? Falls ja wäre es für mich höchste Zeit mal den ersten Teil durchzuspielen.</p>
MIDI-Eingabe in openSUSE 12.12012-03-10T14:13:15+01:002013-01-27T18:48:09+01:00Matthias Bachtag:marix.org,2012-03-10:/midi-eingabe-opensuse-121.html
<p>Da kommt man nach langer Zeit endlich mal wieder dazu seine <a href="http://www.hercules.com/de/DJ-Musik/bdd/p/12/dj-console-mk2-virtualdj-djc-ed/">Hercules DJ Console MK2</a> anzuschließen, und dann findet <href="http: mixxx.org ">Mixxx</a> kein MIDI-Gerät. Die Lösung ist einfach. In aktuellen Versionen von openSUSE sind die Geräte unter <code>/dev/snd</code> nur noch für den Nutzer <code>root</code> und die Gruppe <code>audio</code> verfügbar. Die Lösung …</href="http:></p>
<p>Da kommt man nach langer Zeit endlich mal wieder dazu seine <a href="http://www.hercules.com/de/DJ-Musik/bdd/p/12/dj-console-mk2-virtualdj-djc-ed/">Hercules DJ Console MK2</a> anzuschließen, und dann findet <href="http: mixxx.org ">Mixxx</a> kein MIDI-Gerät. Die Lösung ist einfach. In aktuellen Versionen von openSUSE sind die Geräte unter <code>/dev/snd</code> nur noch für den Nutzer <code>root</code> und die Gruppe <code>audio</code> verfügbar. Die Lösung: Den eigenen Nutzer der Gruppe <code>audio</code> hinzufügen, neu anmelden und schon geht es wieder. :)</p>
OpenCL-Tracing mit Tau2012-01-24T18:24:32+01:002013-01-27T18:49:23+01:00Matthias Bachtag:marix.org,2012-01-24:/opencl-tracing-mit-tau.html
<p>Um <a href="http://www.khronos.org/opencl/">OpenCL</a>-Anwendungen auf der NVIDIA Platform zu tracen gibt es den <a href="http://developer.nvidia.com/nvidia-visual-profiler">NVIDIA Visual Profiler</a>. Um sie auf der AMD Platform zu tracen gibt es den <a href="http://developer.amd.com/tools/AMDAPPProfiler/Pages/default.aspx">AMD APP Profiler</a>. Problem gelöst – oder? Leider gibt es ein paar spezielle Situationen in denen das nicht reicht. Der AMD APP Debugger kann zwar …</p>
<p>Um <a href="http://www.khronos.org/opencl/">OpenCL</a>-Anwendungen auf der NVIDIA Platform zu tracen gibt es den <a href="http://developer.nvidia.com/nvidia-visual-profiler">NVIDIA Visual Profiler</a>. Um sie auf der AMD Platform zu tracen gibt es den <a href="http://developer.amd.com/tools/AMDAPPProfiler/Pages/default.aspx">AMD APP Profiler</a>. Problem gelöst – oder? Leider gibt es ein paar spezielle Situationen in denen das nicht reicht. Der AMD APP Debugger kann zwar auf der Kommandozeile tracen und funktioniert unter Linux, seine Visualisierung ist allerdings als Plugin für Visual Studio implementiert. Die Express-Versionen von Visual Studio unterstützen leider keine Plugins, und Visual Studio kaufen nur um ein Plugin auszuführen? Der inzwischen kostenlose <a href="http://www.gremedy.com/">gDEBugger</a> kann zwar unter Linux visualisieren, kann aber nicht auf der Kommandozeile messen. <a href="http://www.cs.uoregon.edu/Research/tau/home.php">Tau</a>, eigentlich zum Profilen und Tracen von großen Clusteranwendungen gedacht, löst das Problem. Aufgrund seines eigentlichen Anwendungszieles ist es zwar etwas komplexer zu verwenden, aber weniger Aufwand als die Visualisierung der Tracingdaten komplett selbst zu schreiben, wie es <a href="https://github.com/theMarix/APP-Profiler-Visualization-Tool">mein erster Versuch</a> war.</p>
<p><strong>Tau installieren</strong></p>
<p>Tau ist für eine Anwendung ihrer Größe recht leicht zu installieren. Zunächst sind die Quellen von http://www.cs.uoregon.edu/Research/tau/downloads.php herunterzuladen. Trotz des Formulars ist hierzu keine Anmeldung notwendig. Anschließend lässt sich Tau mit dem üblichen Zweisatz installieren. Wenn es nur um OpenCL geht ist hierbei keine große Konfiguration notwendig.</p>
<p><pre><code>./configure -opencl=<pfad zu opencl>
make install</code></pre></p>
<p>Tau installiert sich übrigens in ein nach der Architektur benanntes Unterverzeichnis des Build-Verzeichnisses…. Soll es woanders lassen müsste man <code>configure</code> den passenden Pfad via <code>-prefix</code> mitgeben. Man beachte, das es hier nur einen Minus gibt….</p>
<p>Anschließend müssen noch <code>PATH</code> und <code>LD_LIBRARY_PATH</code> angepasst werden, also z.B.:</p>
<p><pre><code>export PATH=$HOME/tau-2.21.1/x86_64/bin/:$PATH
export LD_LIBRARY_PATH=$HOME/tau-2.21.1/x86_64/lib/:$LD_LIBRARY_PATH</code></pre></p>
<p><strong>Trace erstellen</strong></p>
<p>Um ein Trace zu erstellen verwendet man <code>tau_exec</code> wie folgt:</p>
<p><pre><code>TAU_TRACE=1 tau_exec -T PROFILE,SERIAL -opencl <anwendung> <argumente der anwendung>
</code></pre></p>
<p><code>TAU_TRACE=1</code> ist notwendig damit Tau auch Tracing und nicht nur Profiling betreibt. <code>SERIAL</code> ist notwendig damit <code>tau_exec</code> die Anwendung direkt und nicht via <code>mpirun</code> startet.</p>
<p>Anschließend existieren mehrere <code>tautrace.0.0.?.trc</code>-Dateien. Da Jumpshot mit slog2-Dateien arbeitet müssen diese noch konvertiert werden:</p>
<p><pre><code>tau_treemerge.pl
tau2slog2 tau.trc tau.edf -o <egal>.slog2</code></pre></p>
<p><strong>Trace analysieren</strong></p>
<p>Die slog2-Datei kann anschließend mit <a href="http://www.mcs.anl.gov/research/projects/perfvis/software/viewers/index.htm#Jumpshot">Jumpshot</a> analysiert werden. Jumpshot ist in Tau enthalten, muss also nicht extra installiert werden. Die slog2-Datei enthält alle Trace-Informationen, kann also problemlos zur analyse auf andere Rechner verschoben werden.</p>
<p>Für eine sinnvolle Analyse in Jumpshot empfiehlt es sich die Node aufzuklappen um die einzelnen OpenCL devices und den Host-Thread als einzelne Lanes zu sehen. Leider ist Jumpshot kein besonders nutzerfreundliches Programm, sondern versucht sämtliche Java-Vorurteile zu erfüllen. Deshalb sollte man nach jeder Einstellungsändern – ob ausklappen der Lanes oder An- bzw. Abwahl von einzelnen Ereignissen – den Refresh-Knopf nutzen.
</p>
Philosophisches von zypper2012-01-15T11:39:26+01:002013-01-27T18:57:39+01:00Matthias Bachtag:marix.org,2012-01-15:/philosophisches-von-zypper.html
<p>Beim Versuch den <a href="http://www.simfy.de/downloads/player">Simfy Desktop Player</a> zu installieren überraschte <a href="http://en.opensuse.org/Zypper">zypper</a> gerade mit folgender Meldung:</p>
<p><pre><code>2 neue Pakete zu installieren.
Gesamtgröße des Downloads: 22,4 MiB. Nach der Operation werden zusätzlich 47,5 MiB belegt.
Fortfahren? [j/n/?] (j): j
Ungültige Antwort 'j'. [j/n/?] (j): j</code></pre></p>
<p>Bleibt die Frage, was …</p>
<p>Beim Versuch den <a href="http://www.simfy.de/downloads/player">Simfy Desktop Player</a> zu installieren überraschte <a href="http://en.opensuse.org/Zypper">zypper</a> gerade mit folgender Meldung:</p>
<p><pre><code>2 neue Pakete zu installieren.
Gesamtgröße des Downloads: 22,4 MiB. Nach der Operation werden zusätzlich 47,5 MiB belegt.
Fortfahren? [j/n/?] (j): j
Ungültige Antwort 'j'. [j/n/?] (j): j</code></pre></p>
<p>Bleibt die Frage, was er damit sagen wollte:
<ul>
<li>Diese Software willst du eigentlich gar nicht verwenden?</li>
<li>Heißt ja, wirklich immer ja?</li>
<li>…</li>
</ul></p>
ACLs – Dann klappt auch das Inotify bei Mediatomb2012-01-07T19:54:02+01:002013-01-27T19:01:23+01:00Matthias Bachtag:marix.org,2012-01-07:/acls-–-dann-klappt-auch-das-inotify-bei-mediatomb.html<p>Die traditionellen Unix-Dateiberechtigungen stoßen öfter mal an ihre Grenzen. Zum Beispiel bei meinem Versuch <a href=
<p>Die traditionellen Unix-Dateiberechtigungen stoßen öfter mal an ihre Grenzen. Zum Beispiel bei meinem Versuch <a href="http://mediatomb.cc/">Mediatomb</a> auf meinem Homeserver Inotify verwenden zu lassen. Die Lösung für diese Limitierung sind ACLs. Hier zeige ich, wie man diese für Mediatomb sinnvoll setzen kann.</p>
<p>Den Inotify-Modus möchte ich in Mediatomb aus zwei Gründen verwenden. Ersten muss man dann nicht warten bis der nächste Scan nach neuen Dateien abgeschlossen ist, denn meistens möchte man die Datei ja sofort anschauen. Zweitens muss Mediatomb dann nicht immer wieder den Verzeichnisbaum ablaufen wenn sich gar nichts geändert hat. Im Idealfall können die Festplatten also deutlich länger schlafen.</p>
<p>Das Problem mit dem Inotify-Modus besteht darin, dass Mediatomb hierfür Schreibberechtigung auf den Verzeichnissen benötigt, welche es auf Änderungen überwachen soll. Klassisch kann man aber ja nur die drei Berechtigungen – Eigentümer, Gruppe und den Rest – setzen. Prinzipiell kann man natürlich immer wenn man ein Verzeichnis anlegt anschließend Eigentümer oder Gruppe passend umsetzen, dann ist Mediatomb aber schon gescheitert. Eine bessere Lösung sind ACLs, mit denen man beliebig viele Berechtigungen vergeben kann. Außerdem ist es mit ACLs auch einfach Default-Werte zu setzen welche anschließend für alle im Verzeichnis angelegten Dateien und Unterverzeichnisse übernommen werden.</p>
<p>Meine ACL für das oberste Verzeichnis sieht aus wie folgt:
<pre><code>user::rwx
user:mediatomb:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:mediatomb:rwx
default:group::rwx
default:mask::rwx
default:other::r-x</code></pre></p>
<p>Der Nutzer und die Gruppe können im Verzeichnis lesen und schreiben, dadurch kann zum Beispiel meine Frau auch die Fotos umsortieren. Alle anderen können das Verzeichnis lesen. Dies könnte man auch restriktiver handhaben, aber da Mediatomb den Inhalt dieser Verzeichnisse aller Welt verfügbar macht hat eine weitere Einschränkung wenig Sinn. Der Benutzer <code>mediatomb</code> bekommt explizit Lese- und Schreibberechtigung für dieses Verzeichnis. Dadurch kann Mediatomb dann Inotify verwenden um das Verzeichnis auf Veränderungen zu überwachen.</p>
<p>Besonders wichtig sind die mit <code>default:</code> beginnenden Einträge. Diese legen wiederum die ACL fest welche in diesem Verzeichnis neu angelegte Dateien und Unterverzeichnisse bekommen. Bei Unterverzeichnissen werden diese außerdem wieder als Default übernommen. Das hier ein x in den Berechtigungen steht macht übrigens nicht jeden Datei ausführbar. Diese Berechtigungen werden immer mit dem vom anlegenden Programm angegebenen Berechtigungen kombiniert. So sind Verzeichnissen dann automatisch ausführbar (sonst könnte man ihre Inhalte nicht sehen), und normale Dateien nicht – es sei denn sie werden explizit als ausführbar angelegt.</p>
<p>Um diese ACL auf einen bestehenden Dateibaum anzuwenden packt man sie am besten in eine Datei, in meinem Fall habe ich sie einfach <code>acl</code> genannt, und wendet sie mit <code>setfacl</code> rekursiv an.</p>
<p><pre><code>setfacl -R --set-file acl /OberstesVerzeichnis/</code></pre></p>
<p>Hierbei gibt es noch einen kleinen Trick. Die Berechtigung <code>X</code>, anstelle von <code>x</code> macht eine Datei nur ausführbar wenn sie Verzeichnis oder bereits ausführbar ist. So verhindert man mit folgender ACL, dass alle Dateien ausführbar werden, stellt aber sicher, dass Verzeichnisse angezeigt werden können.</p>
<p><pre><code>user::rwX
group::rwX
other::r-X
mask::rwX
user:mediatomb:rwX
default:user::rwx
default:group::rwx
default:other::r-x
default:mask::rwx
default:user:mediatomb:rwx</code></pre></p>
Bessere D3-Startlinks für http://d3.descent.cx/2011-09-24T20:13:16+02:002013-01-28T11:14:31+01:00Matthias Bachtag:marix.org,2011-09-24:/bessere-d3-startlinks-für-httpd3descentcx.html
<p><a href="https://marix.org/Publikationen/d3.descent.cx.user.js">Das hier vorgestellte Skript</a> baut die Seite http://d3.descent.cx/ so um, dass die Links zu den Spielen durch Links mit dem Protokoll d3 ersetzt werden. Hat man z.B. <a href="http://slyclan.de/">Vortex</a> installiert, so kann man durch den Klick auf den Link direkt Descent 3 starten, welches dann mit dem …</p>
<p><a href="https://marix.org/Publikationen/d3.descent.cx.user.js">Das hier vorgestellte Skript</a> baut die Seite http://d3.descent.cx/ so um, dass die Links zu den Spielen durch Links mit dem Protokoll d3 ersetzt werden. Hat man z.B. <a href="http://slyclan.de/">Vortex</a> installiert, so kann man durch den Klick auf den Link direkt Descent 3 starten, welches dann mit dem korrekten Server verbindet. Getestet habe ich das Skript mit <a href="http://www.opera.com/">Opera</a> sowie mit <a href="http://www.mozilla.org/de/firefox/">Firefox</a>, wobei letzterer die <a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/">Greasemonkey-Erweiterung</a> benötigt.</p>
<p>In <a href="http://www.opera.com/">Opera</a> müss man zunächst sicherstellen, dass User-JavaScript aktiviert ist. Hierzu geht man im Menü auf Extras->Einstellungen->Erweitert->Inhalte->JavaScript-Optionen. Hier muss ein User-JavaScript-Verzeichnis eingetragen sein. In dieses Verzeichnis wird die Datei <a href="https://marix.org/Publikationen/d3.descent.cx.user.js">d3.descent.cx.user.js</a> abgespeichert, und beim nächsten Aufruf von http://d3.descent.cx/ werden die Links schon ersetzt.</p>
<p>In <a href="http://www.mozilla.org/de/firefox/">Firefox</a> muss zunächst die Erweiterung <a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/">Greasemonkey</a> installiert werden. Nach dem nötigen Neustart ist die Datei <a href="https://marix.org/Publikationen/d3.descent.cx.user.js">d3.descent.cx.user.js</a> zu öffnen. Man kann die Datei direkt mit dem Firefox auswählen, ein herunterladen ist im Prinzip nicht notwendig, wenn auch möglich. Nachdem der Installationsdialog bestätigt wurde, werden anschließend bei jedem Aufruf von http://d3.descent.cx/ die Links ersetzt.</p>
<p>Hier nochmal der Link zum herunterladen bzw. zur Installation: <a href="https://marix.org/Publikationen/d3.descent.cx.user.js">d3.descent.cx.user.js</a></p>
OpenCL: Buffer vs. mehrere Devices2011-09-19T18:24:56+02:002013-01-28T11:15:23+01:00Matthias Bachtag:marix.org,2011-09-19:/opencl-buffer-vs-mehrere-devices.html<p>Da OpenCL sowohl auf CPUs als auch auf GPUs funktioniert kommt man recht schnell in die Situation in der mehr als ein OpenCL-Device verwendet werden will. Doch was passiert in diesem Fall mit dem kostbaren, weil wenigem, Grafikkartenspeicher? Die Funktion <code>clCreateBuffer</code> bietet ja leider keine Möglichkeit anzugeben auf welchem Device der Speicher allokiert werden soll.</p>
<p></p>
<p>Da OpenCL sowohl auf CPUs als auch auf GPUs funktioniert kommt man recht schnell in die Situation in der mehr als ein OpenCL-Device verwendet werden will. Doch was passiert in diesem Fall mit dem kostbaren, weil wenigem, Grafikkartenspeicher? Die Funktion <code>clCreateBuffer</code> bietet ja leider keine Möglichkeit anzugeben auf welchem Device der Speicher allokiert werden soll.</p>
<p>Die einfachste Variante mit mehreren OpenCL-Devices zu arbeiten ist alle in einem Context zu verwalten. In diesem Fall wird ein Buffer aber immer für alle Devices angelegt. Wird ein Speicher also nur auf einem Device benötigt muss man befürchten, dass dieser auch auf anderen Devices kostbaren Speicher verbraucht.</p>
<p>Glücklicherweise sollte dies sowohl auf AMD, als auch auf NVIDIA-Hardware kein Problem darstellen. Beide teilen einem Buffer immer erst dann Speicher auf der Grafikkarte zu wenn dieser dort das erste mal verwendet wird. AMD dokumentiert dies explizit in seinem <a href="http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf">AMD APP Programming Guide</a>. NVIDIA geht in seiner <a href="http://developer.nvidia.com/nvidia-gpu-computing-documentation">GPU Computing Documentation</a> zwar nicht explizit auf diese Problematik ein, Beiträge in den <a href="http://forums.nvidia.com/index.php?showtopic=192398&st=0&gopid=1192390&#entry1192390">Foren von NVIDIA</a> und <a href="http://www.khronos.org/message_boards/viewtopic.php?f=28&t=3724">Khronos</a> dokumentieren aber dieses Verhalten. Bedenken sollte man allerdings, dass man, um von diesem Verhalten zu profitieren, <code>CL_MEM_COPY_HOST_PTR</code> nicht verwenden darf.</p>
<p><a href="http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf">AMDs Programming Guide</a> empfiehlt explizit einen gemeinsamen Context für alle Devices zu verwenden, da dies programmiertechnisch die einfacherere Lösung ist. Es wird aber auch eingestanden, dass ein Context pro Device deutlich flexibler ist. Dies ist beispielsweise die einzige Möglichkeit CPUs mit NVIDIA-Grafikkarten zu kombinieren.</p>
<p>Die Flexibilität mehrere Contexte hat allerdings ihren Preis. So ist es nicht möglich die Ausführung zwischen mehreren Contexten über Events zu synchronisieren. <a href="http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf">Die OpenCL-Spezifikation</a> weist explizit darauf hin, dass ein Befehl in einer Workqueue immer nur auf Events welche zum gleichen Context gehören warten kann. Prinzipiel kann diese Beschränkung mithilfe von Event Callbacks und User Events umgangen werden, dies ist aber auch mit einem höheren Aufwand verbunden.</p>
<p>Außerdem sollte man auch immer bedenken, dass Buffer welche ausschließlich auf der CPU verwendet werden mit <code>CL_MEM_ALLOC_HOST_PTR</code> oder <code>CL_MEM_USE_HOST_PTR</code> initialisiert werden sollten um unnötiges kopieren der Daten zu vermeiden.</p>
Liebe Berliner, geht Wählen!2011-09-18T11:33:12+02:002011-09-18T11:33:12+02:00Matthias Bachtag:marix.org,2011-09-18:/liebe-berliner-geht-wählen.html
<p>Heute sind Wahlen in Berlin. Und da nichts besser wird wenn man seine Stimmer nicht erhebt, möchte ich hier noch einmal alle zum Gang zur Wahlurne aufrufen. Ihr müsst ja gar nicht gut finden was SDP/CDU/FDP und Grüne machen. Im Zweifelsfall gibt es immer noch genug „Einthemenparteien“ welche …</p>
<p>Heute sind Wahlen in Berlin. Und da nichts besser wird wenn man seine Stimmer nicht erhebt, möchte ich hier noch einmal alle zum Gang zur Wahlurne aufrufen. Ihr müsst ja gar nicht gut finden was SDP/CDU/FDP und Grüne machen. Im Zweifelsfall gibt es immer noch genug „Einthemenparteien“ welche einen Standpunkt vertreten den ihr für wichtig haltet. Die mögen zwar mit eurer Stimme nicht ins Parlament einziehen, aber ihr gebt damit dem vertretenen Thema Gewicht, denn jede Partei, für die es nicht zur Mehrheit gereicht hat, hätte diese Stimme natürlich gerne gehabt. Außerdem gibt es dieses Jahr in Berlin, wie unter anderem <a href="http://blog.fefe.de/?ts=b08d858b">bei Fefe berichtet</a>, auch noch eine recht kuriose Möglichkeit das Parlament zu verkleinern und damit Steuergelder zu sparen. Also, auch wenn Blumentop eigentlich zur Bundestagswahl 2009 sang, gültig ist immer noch: „Beweg dein Arsch!“;</p>
<p><object type="application/x-shockwave-flash" data="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="lfmEmbed_50_34358831_234428566" width="340" height="289"> <param name="movie" value="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" /> <param name="flashvars" value="title=Blumentopf_Wahlwerbespot&uniqueName=34358831&albumArt=http%3A%2F%2Fcdn.last.fm%2Fdepth%2Fcatalogue%2Fnoimage%2Fnocover_flashplayer.png&duration=124&image=http%3A%2F%2Fuserserve-ak.last.fm%2Fserve%2Fimage%3A320%2F34358831.jpg&FSSupport=true&creator=Blumentopf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> <param name="allowFullScreen" value="true" /> <param name="quality" value="high" /> <param name="bgcolor" value="000000" /> <param name="wmode" value="opaque" /> <param name="menu" value="false" /> </object></p>
<p><!--break--></p>
Spaß mit gcc und geschützten Leerzeichen2011-09-14T21:16:03+02:002013-01-28T11:16:11+01:00Matthias Bachtag:marix.org,2011-09-14:/spaß-mit-gcc-und-geschützten-leerzeichen.html<p>Wenn ich von meinem Mac aus in einem <a href=
<p>Wenn ich von meinem Mac aus in einem <a href="http://www.vim.org/">Vim</a> auf einem anderen Rechner programmiere beschwert sich <a href="http://gcc.gnu.org/">gcc</a> öfter mal über folgendes und weigert sich die Datei zu kompilieren:
<pre><code>some_source.cpp:519:2: error: stray ‘\302’ in program
some_source.cpp:519:2: error: stray ‘\240’ in program
</code></pre></p>
<p>Nachdem ich mir lange Zeit immer damit behalf die Zeile zu löschen und neu zu schrieben, war das auf die Dauer doch etwas unbefriedigend. Bei <a href="http://stackoverflow.com/questions/5167656/error-stray-302-in-program">Stackoverflow</a> fand ich dann den Hinweis in die richtige Richtung. Das Problem ergibt sich durch versehentlich eingegebene <a href="http://de.wikipedia.org/wiki/Geschütztes_Leerzeichen">geschützte Leerzeichen</a>.</p>
<p>Mit diesem Wissen ist es möglich Vim zu sagen, dass er diese im Code markieren soll, so dass man sie gezielt löschen kann.
<pre><code>set listchars=nbsp:_
set list
</code></pre>
Der <code>listchars</code>-Befehl legt fest wodurch welches Zeichen ersetzt werden soll, der <code>list</code>-Befehl aktiviert die Ersetzung. Ich lasse mir die geschützten Leerzeichen durch einen Unterstrich anzeigen, prinzipiell ist hier fast jedes Zeichen möglich. Da die ersetzten Zeichen in einer anderen Farbe dargestellt werden kann man sie auch nicht mit regulären Unterstrichen verwechseln. Außerdem lasse ich mir prinzipiell auch Tabulatoren und überschüssige Leerzeichen am Zeilenende anzeigen, so dass diese Zeile in meiner <code>.vimrc</code> jetzt so aussieht:
<pre><code>set listchars=tab:»·,trail:·,nbsp:_
</code></pre></p>
Wie man in node.js URLs auf Funktionen abbildet2011-09-04T12:56:40+02:002017-08-05T14:44:01+02:00Matthias Bachtag:marix.org,2011-09-04:/wie-man-nodejs-urls-auf-funktionen-abbildet.html<p>Das „Hallo, Welt!“ in node.js ist es einen kleinen Webserver zu bauen der eben diesen Text zurück gibt. Doch was, wenn man nicht nur eine Seite zurückgeben möchte? Eine kleine Funktion hilft abhängig von der eingegebenen URL verschiedenen JavaScript-Funktionen aufzurufen.</p>
<p>Das „Hallo, Welt!“ in node.js ist es einen kleinen Webserver zu bauen der eben diesen Text zurück gibt. Doch was, wenn man nicht nur eine Seite zurückgeben möchte? Eine kleine Funktion hilft abhängig von der eingegebenen URL verschiedenen JavaScript-Funktionen aufzurufen.</p>
<p>In der <a href="http://nodejs.org/docs/v0.4.11/api/http.html#request.url">Doku zu node.js</a> geht hervor, dass das Request-Objekt die URL im Attribut <code>url</code> enthält. Der einfachste Weg URLs auf Funktionen abzubilden ist ein Objekt zu erstellen welches einfach die Pfade als Attributsname und die dazugehörigen Funktionen als Attributswerte verwendet. Dann können wir einfach direkt am Objekt die URL aufrufen. Das abbildende Objekt könnte so aussehen:</p>
<p><pre><code>var url_mapping = {
'/': printIndex,
'/index.html': printIndex
}</code></pre></p>
<p>Die Funktion <code>printIndex</code> kann so aussehen:</p>
<p><pre><code>// Ok, not really an index, but works.
var printIndex = function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, World!\n');
}</code></pre></p>
<p>Die Abbildung wird dann wie folgt implementiert:</p>
<p><pre><code>mapped = url_mappings[req.url];
if (mapped) {
mapped(req, res);
} else {
console.log(req.url + ' has not been mapped');
invalidURL(req, res);
}</code></pre></p>
<p>Der Code nutzt aus, dass wir in JavaScript dynamisch auf Werte eines Objektes zugreifen können und <code>undefined</code> zurückbekommen wenn der Wert im Objekt nicht gesetzt ist. Theoretisch könnte es hier ein Problem geben da JavaScript Objekte immer ein paar eigene Attribute besitzen, wie z.B. die Funktion <code>hasOwnProperty</code>, aber da die URL immer mit einem Schrägstrich beginnt, kann man mit keinem dieser Werte kollidieren, es sei denn irgendeine JavaScript-Bibliothek beginnt irgendwann wahnsinnigerweise Objekte mit solchen Werten anzureichern.</p>
<p>Mit der einfachen Funktion können wir zwar schon URLs auf Funktionen abbilden, oft möchte man aber eine ganze Klasse von URLs auf eine Funktion abbilden. Mithilfe des URL-Moduls könnte man zwar die URL noch um den Query-Teil bereinigen, aber wenn man alle URLs die mit einem bestimmten String anfangen, oder gar die einem bestimmten regulären Ausdruck entsprechen, abgebildet werden sollen kommen wir mit dem bisherigen Ansatz nicht weiter.</p>
<p>Um auch diesen Fall abzuhandeln können wir einen Array nutzen der Objekte enthält die jeweils ein Muster auf eine Funktion abbildet:</p>
<p><pre><code>var pattern_mapping = [
{ pattern: '/echo/', mapped: echo },
{ pattern: /^\/regexp/, mapped: printMatch }
];</code></pre></p>
<p>Möchten wir die richtige Funktion für eine URL finden so müssen alle Muster im Array durchprobieren. Da JavaScripts typeof-Operator leider reguläre Ausdrücke nicht eindeutig identifiziert akzeptieren wir alles welches die für unseren Test benötigte Methode aufweist:</p>
<p><pre><code>for (i = 0; !mapped && i < pattern_mappings.length; i = i + 1) {
pattern = pattern_mappings[i].pattern;
console.log('Testing pattern ' + i + ': ' + pattern + ' [' + typeof(pattern) + ']');
if( typeof(pattern) === 'string' && req.url.slice(0, pattern.length) === pattern ) {
mapped = pattern_mappings[i].mapped;
} else if ( pattern.test && typeof(pattern.test) === 'function' && pattern.test(req.url) ) {
// we can only assume it's a regexp, as typeof is not clear on it,
// but if it has a test function...
mapped = pattern_mappings[i].mapped;
}
}</code></pre></p>
<p>Das ganze kann man natürlich noch beliebig aufbohren. Eine naheliegende Verbesserung wäre der aufgerufenen Funktion noch als dritten Parameter das abgebildete Muster zu übergeben. Ohne weitere Verbesserungen sieht die komplette Funktion so aus:</p>
<p><pre><code>function(req, res, url_mappings, pattern_mappings) {
// Forward decleration of variables as recommended by Crockford
var i;
var mapped;
console.log('Request url: ' + req.url);
// check whether the url has a direct mapping
mapped = url_mappings[req.url];
if (mapped) {
mapped(req, res);
} else {
// url did not match any of the direct mappingss
// check whether it matches anny of the patterns
for (i = 0; !mapped && i < pattern_mappings.length; i = i + 1) {
pattern = pattern_mappings[i].pattern;
console.log('Testing pattern ' + i + ': ' + pattern + ' [' + typeof(pattern) + ']');
if( typeof(pattern) === 'string' && req.url.slice(0, pattern.length) === pattern ) {
mapped = pattern_mappings[i].mapped;
} else if ( pattern.test && typeof(pattern.test) === 'function' && pattern.test(req.url) ) {
// we can only assume it's a regexp, as typeof is not clear on it,
// but if it has a test function...
mapped = pattern_mappings[i].mapped;
}
}
if (mapped) {
mapped(req, res);
} else {
console.log(req.url + ' has not been mapped');
invalidURL(req, res);
}
}
}</code></pre></p>
<p>Zum einfacheren rumspielen mit dem Code gibt es das Beispiel als Datei: <a href="https://marix.org/Anhänge/path.js">path.js</a></p>
Mediatomb vs. PS3 vs. Opera2011-04-16T12:16:31+02:002013-01-28T12:49:25+01:00Matthias Bachtag:marix.org,2011-04-16:/mediatomb-vs-ps3-vs-opera.html<p>Seit ich meine PS3 von meinem Heimserver aus mit Videos, Musik und Bildern versorge hatte ich immer wieder das Problem, dass die PS3 scheinbar zufällig das dafür genutzte <a href=
<p>Seit ich meine PS3 von meinem Heimserver aus mit Videos, Musik und Bildern versorge hatte ich immer wieder das Problem, dass die PS3 scheinbar zufällig das dafür genutzte <a href="http://mediatomb.cc">Mediatomb</a> mal sah, und mal nicht sah. Inzwischen konnte ich das Problem auf eine Wechselwirkung mit <a href="http://unite.opera.com/overview/">Opera Unite</a> zurückführen. Schaltet man diese Funktionalität auf allen Rechnern im LAN aus verschwindet das Problem.</p>
<p>Schnell hatte ich festgestellt, dass das Problem unabhängig vom von mir verwendeten Betriebssystem ist. Verwirrend war, dass andere Nutzer im gleichen Netz das Problem aber nicht hervorriefen. Das Problem musste also durch eine Anwendung hervorgerufen werden welche nur ich nutze, und zwar auf jedem Betriebssystem. Da diese Menge nur aus <a href="http://quassel-irc.org/">Quassel-IRC</a> und <a href="http://opera.com">Opera</a> besteht, ersteres aber keinerlei UPnP-Funktionalität besitzt, war das Problem schnell eingegrenzt.</p>
<p>Sucht man nach UPnP und Opera findet man auch schnell heraus, <a href="http://forum.soft32.com/linux/disable-UPnP-ftopict500480.html">dass dieses nur vom Opera Unite genutzt wird</a>. Schaltet man dies ab, indem man auf der Seite <code>opera:config</code> in den User Prefs den Haken vor <code>Enable Unite</code> entfernt, verschwindet auch die Störung.</p>
<p>Da ich für Opera Unite sowieso keinerlei Nutzen sehe ist dies eine für mich funktionierende Lösung des Problems. Unbefriedigend ist allerdings, dass das Problem überhaupt existiert. Schließlich ist die Idee von UPnP ja gerade, dass die Dinge funktionieren ohne, dass man von Hand eingreift, und die PS3 sollte im Zweifelsfall halt mehrere Medienserver anzeigen.
</p>
Zwei Hinweise zum IPv6-Routing mit openSUSE2011-04-02T11:09:57+02:002013-01-28T12:50:13+01:00Matthias Bachtag:marix.org,2011-04-02:/zwei-hinweise-zum-ipv6-routing-mit-opensuse.html
<p>Den Artikel <a href="http://www.heise.de/ct/inhalt/2011/08/190/"><quote>Doppelmoppel – IPv6-Zugang fürs LAN nachrüsten</quote></a> in der aktuellen c't möchte ich nutzen um auf zwei Punkte hinzuweisen welche in den meisten Dokumentationen zum Thema leider fehlen, ohne die es unter openSUSE aber nicht funktioniert.</p>
<p><!--break--></p>
<p><ul>
<li>Das mit dem LAN verbundene Netzwerkinterface benötigt eine gültige IPv6-Adresse aus dem LAN-Subnetz. Diese …</li></ul></p>
<p>Den Artikel <a href="http://www.heise.de/ct/inhalt/2011/08/190/"><quote>Doppelmoppel – IPv6-Zugang fürs LAN nachrüsten</quote></a> in der aktuellen c't möchte ich nutzen um auf zwei Punkte hinzuweisen welche in den meisten Dokumentationen zum Thema leider fehlen, ohne die es unter openSUSE aber nicht funktioniert.</p>
<p><!--break--></p>
<p><ul>
<li>Das mit dem LAN verbundene Netzwerkinterface benötigt eine gültige IPv6-Adresse aus dem LAN-Subnetz. Diese muss von Hand vergeben werden, da die Zuweisung per <a href="http://www.litech.org/radvd/">radvd</a> am lokalen Interface nicht funktioniert.</p>
<p>Diese Adresse kann man via <code>ifconfig add <in radvd eingetragenes prefix>:<mac addresse>/64</code> vergeben. Ist die Link-lokale Addresse z.B. fe80::442b:39ff:f231:95cd/64 und das Prefix 2a01:498:4c8::/64 so wäre die Addresse 2a01:498:4c8:0:4a5b:39ff:feed:95cd/64.</p>
<p>Hat das lokale Interface keine gültige IPv6 im LAN-Subnetz werden die aus dem LAN kommenden Pakete vom Router verworfen.</li></p>
<p><li>Nutzt man die SuSEfirewall2 muss man diese so konfigurieren, dass sie Verbindungen vom LAN ins IPv6 zulässt. Per Default blockt die SuSEfirewall2 nämlich alle durchzuleitenden IPv6-Pakete.</p>
<p>Hierzu editiert man die Datei <code>/etc/sysconfig/SuSEfirewall2</code> und ändert den Wert <code>FW_FORWARD</code> auf <code>"<lokales IPv6-Netz>,2000::/3"</code>. 2000::/3 bezeichnet alle gültigen IPv6-Adressen. Im obigen Beispiel wäre der Eintrag dann <code>FW_FORWARD="2a01:498:4c8::/64,2000::/3"</code>. Wichtig bei diesem Eintrag ist die Reihenfolge, denn Verbindungen sind immer vom ersten zum zweiten möglich. Wer die Einträge vertauscht erlaubt also dem ganzen Internet Zugriff aufs LAN, kommt aber nicht raus.</li>
</ul></p>
<p>Zum Abschluss möchte ich noch auf ein allgemeines Problem bei IPv6 hinweisen. Ein Teil der eigenen IPv6-Adresse wird aus der MAC-Adresse des eigenen Rechners abgeleitet. Dadurch ist man natürlich dauerhaft im Netz identifizierbar. Um das dadurch entstehende Datenschutzproblem zu entschärfen gibt es die IPv6 Privacy Extension, deren Aktivierung ich jedem ans Herz legen möchte. Wie das geht beschreibt ein <a href="http://www.heise.de/netze/artikel/IPv6-Privacy-Extensions-einschalten-1204783.html">ausführlicher Artikel bei Heise-Netze</a> für alle Betriebssysteme. Ob die Aktivierung der Privacy Extensions erfolgreich war kann man z.B. durch den Aufruf von <a href="http://www.sixxs.net/">sixxs.net</a> prüfen, welches oben rechts die aufrufende IPv6-Adresse anzeigt.</p>
USB-Stick als Schlüssel für die Festplattenverschlüsselung2011-03-05T01:57:05+01:002017-01-08T14:50:33+01:00Matthias Bachtag:marix.org,2011-03-05:/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html
<p><a href="http://www.opensuse.org">OpenSUSE</a> bietet seit einigen Versionen die Möglichkeit bei der Installation die Festplatte komplett zu Verschlüsseln. In Anbetracht der großen Menge an Daten macht dies heutzutage nicht nur bei Laptops, sondern auch bei stationären Rechnern Sinn. Wird der Rechner aber als Server — ohne Tastatur und Monitor — betrieben stört hierbei allerdings die …</p>
<p><a href="http://www.opensuse.org">OpenSUSE</a> bietet seit einigen Versionen die Möglichkeit bei der Installation die Festplatte komplett zu Verschlüsseln. In Anbetracht der großen Menge an Daten macht dies heutzutage nicht nur bei Laptops, sondern auch bei stationären Rechnern Sinn. Wird der Rechner aber als Server — ohne Tastatur und Monitor — betrieben stört hierbei allerdings die notwendige Passworteingabe beim Starten des Rechners. Glücklicherweise bietet LUKS aber die Möglichkeit diese auf einem USB-Stick zu speichern, womit auch bei solchen Maschinen ein komfortabler Start möglich ist. </p>
<p><blockquote><strong>Achtung:</strong> Diese für openSUSE 11.3 erstellte Anleitung funktioniert bis einschließlich openSUSE 13.1. Auf openSUSE 13.2 und openSUSE Leap 42.1 habe ich sie nicht getestet. Auf openSUSE Leap 42.2 funktioniert sie <em>nicht</em> mehr. Es gibt einen neuen Mechanismus, welchen ich, sobald ich ihn ausführlich getestet habe, verbloggen und hier verlinken werde.</blockquote></p>
<p><h3>Ist ein USB-Stick als Schlüssel sicher?</h3></p>
<p>Sicherheit ist immer relativ zur Bedrohung zu sehen. Auch beim USB-Stick stellt sich also die Frage wovor er schützen soll. Beim stationär zuhause stehenden Rechner hat die Verschlüsselung vor allem eine Funktion, sie schützt die Daten wenn die betroffen Festplatten mal das eigene Haus verlassen. Hierbei gibt es im Prinzip nur zwei Fälle. Stellt sich eine Platte während der Garantiezeit als defekt heraus so erspart einem die Verschlüsselung das heutzutage sehr zeitaufwendige Löschen der Platte. Wird die Festplatte entwendet, so ist sie ohne den USB-Stick, der natürlich in diesem Fall nicht im Rechner gesteckt haben darf, auch nicht auszulesen.</p>
<p>Ein großer Vorteil des USB-Sticks besteht hier darin, dass er sehr lange Passwörter ermöglicht. Möchte man lange Passwörten auf klassischem Weg verwenden kommt man um ein Aufschreiben des Passworts oft auch nicht herum. Außerdem gewinnt man eine Möglichkeit die Herausgabe des Passworts zu verweigern, sollte man je dazu aufgefordert werden. Bei einem langen Passwort welches man nie getippt hat ist die Chance sich zu erinnern nicht existieren. Auch hier gilt natürlich, der USB-Stick darf dann nicht trivial dem Rechner zuzuordnen sein. </p>
<p><h3>Die Anleitung</h3></p>
<p><h4>Backup</h4>
Wie bei allen Operationen an der Basis eines Systems ist auch hier das Backup zu beginn wichtig. In diesem Fall ist es wichtig den Kernel und die Initramdisk zu sichern, da es sonst, sollte man sich bei der Konfiguration der Entsperrung via USB-Stick vertun, schwer ist wieder in das verschlüsselte System zu booten.</p>
<p>Unter openSUSE ist es hierbei wichtig den Anfang des initrd und kernel-Namens zu ändern, da diese vom Befehl <code>mkinitrd</code> sonst dennoch aktualisiert werden.
<pre><code>cp /boot/initrd-2.6.34-12 /boot/safe-initrd-2.6.34-12
cp /boot/vmlinuz-2.6.34-12 /boot/safe-enable-vmlinuz-2.6.34-12</code></pre>
Außerdem sollte man sich der Einfachheit halber gleich einen passenden Eintrag im Grub anlegen, wozu man in der Datei <code>/boot/grub/menu.lst</code> die passenden Zeilen einfügt:
<pre><code>title SafetyNet -- openSUSE 11.3 - 2.6.34-12
root (hd0,0)
kernel /safe-vmlinuz-2.6.34-12 root=/dev/system/root resume=/dev/system/swap splash=silent quiet showopts vga=0x317
initrd /safe-enable-initrd-2.6.34-12</code></pre>
Dadurch kann man anschließend jederzeit auch noch mit dem bei der Installation vergebenen Passwort das System starten.</p>
<p><h4>Anlegen des Schlüssels</h4>
Als nächstes muss ein Schlüssel erzeugt werden. Um nicht zu viele zusätzliche Module in die Initramdisk packen zu müssen empfiehlt es sich einen Ext2-formatierten Stick zu verwenden. Dieser kann mit
<pre><code>mkfs.ext2 -L keystick /dev/sdb</code></pre>
erzeugt werden. <code>keystick</code> gibt hierbei das Label des erzeugten Dateisystems an, <code>/dev/sdb</code> muss an den tatsächlichen Gerätenamen des USB-Sticks angepasst werden. Sollte der Stick bereits mit ext2 formatiert sein sollte dennoch ein Label gesetzt werden.
<pre><code>tune2fs -L keystick /dev/sdb</code></pre></p>
<p>Das Label kann natürlich frei gewählt werden. Es dient später zur Identifizierung des Sticks. Dies hat zwei Vorteile:
<ul>
<li>Der USB-Stick unabhängig von hinzugekommenen oder entfernten Datenträgern gefunden</li>
<li>Anders als bei der Identifizierung über die ID des Sticks kann man einen zweiten Stick mit gleichem Label als Backup verwenden. Ich recycle gerne nutzlose Werbegeschenke für diese Aufgabe. Sollte mal eines kaputt gehen spare ich mir das Zeitaufwendige zurückspielen des Backups der ganzen platte, da ich den Schlüssel ja noch von einem zweiten USB-Stick laden kann.</li>
</ul></p>
<p>Anschließend sollte ein Passwort generieren und auf dem USB-Stick hinterlegen. Meine bevorzugte Methode ist diese:
<pre><code>pwgen -s 1024 1 > /media/keystick/keyfile</code></pre></p>
<p>Nun kann man den erzeugten Schlüssel der verschlüsselten Partition hinzufügen. Leider verhält sich LUKS leicht unterschiedlich was interaktiv eingegebene Schlüssel und Schlüsseldateien angeht. Deshalb müssen wir unseren Schlüssel "interaktiv" eingeben. Hierzu erzeugt man zunächst eine Datei welche eine Zeile mit dem bei der Installation gewählten Schlüssel und eine mit dem neuen enthält.
<pre><code>cat oldkey /media/keystick/keyfile > tmp</code></pre>
Damit kann man nun die passenden Tastatureingaben simulieren:
<pre><code>cryptsetup luksAddKey /dev/sda2 < tmp</code></pre>
Anschließend wird die temporäre Datei nicht mehr benötigt:
<pre><code>rm tmp</code></pre></p>
<p>Um zu testen ob der Schlüssel korrekt hinzugefügt wurde kann man probehalber einen leeren Schlüssel hinzufügen. LUKS ist schlau genug diesen Schlüssel nicht wirklich aufzunehmen:
<pre><code>cryptsetup luksAddKey /dev/sda2 < /media/keystick/keyfile</code></pre></p>
<p><h4>Erstellen der neuen Initramdisk</h4>
Damit der Kernel bevor das Root-Verzeichnis eingebunden ist auf den USB-Stick zugreifen kann muss man sicherstellen, dass die USB-Module in der Initrandisk ist. Hierzu sollte man in openSUSE sicherstellen, dass die Variable <code>INITRD_MODULES</code> in <code>/etc/sysconfig/kernel</code> folgende Werte enthält:
<pre><code>usb_storage scsi_mod</code></pre></p>
<p>Um LUKS den Schlüssel zu übergeben benötigt man ein Skript welches ihn vom USB-Stick liest. Dies kann an einer beliebigen Stelle im Dateisystem liegen, es wird beim erstellen der Initramdisk in diese gepackt:
<pre><code>#!/bin/sh
STICK=/dev/disk/by-label/keystick
FSTYPE=ext2
slumber=150
modprobe usb-storage 1>&2
modprobe scsi_mod 1>&2
mkdir /keystick 1>2&
sleep 5 1>2&
while [ $slumber -gt 0 ] && [ ! -e "$STICK" ]; do
sleep 1
slumber=$(( $slumber - 1 ))
done
if ! mount -t $FSTYPE -r $STICK /keystick ; then
$( echo 'FAILED!!!' ) 1>2&
echo ''
exit 1
fi
cat /keystick/keyfile</p>
umount /keystick 1>2&</code></pre></p>
<p>Damit LUKS weiß, dass es den Wert von einem Skript erhält muss die Datei <code>/etc/crypttab</code> angepasst werden:
<pre><code>cr_sda2 /dev/sda2 none initrd,luks,keyscript=/root/keyscript.sh</code></pre>
Hierbei sind zwei Dinge zu beachten:
<ul>
<li>Ist <code>keyscript</code> gesetzt ist <strong>keine</strong> interaktive Eingabe mehr möglich. Deshalb sollte man die alte Initramdisk (welche die alte Konfiguration enthält) vorher sichern.</li>
<li>Der Wert <code>initrd</code> ist notwendig, da openSUSE bei der Generierung der Initramdisk sonst nicht merkt, dass es das Keyscript mit einpacken muss.</li>
</ul></p>
<p>Zu guter letzt kann durch den Aufruf von <code>mkinitrd</code> die neue Initramdisk erstellt werden. Ein Neustart sollte den Schlüssel dann vom USB-Stick lesen anstatt diesen interaktiv zu erwarten.</p>
<p>Hat man die neue Konfiguration hinreichen getestet kann man den bei der Installation vergebenen Schlüssel aus LUKS entfernen und die gesicherte Initramdisk löschen.</p>
<p><h3>Eine Anmerkung zur Distributionsaktualisierung</h3></p>
<p>Diese Anleitung habe ich ursprünglich anhand von openSUSE 11.3 erstellt. Sie gilt aber auch für aktuellere Versionen bis 13.1. Auf openSUSE Leap 42.2 funktionierte diese methode aber <em>nicht</em>! Auf neuere Versionen kann man über das normale DVD-Update aktualisieren. Hierbei muss man allerdings die verschlüsselte Partition über einen eingetippten Schlüssel öffnen. Hierzu hilft es den bei der initialien Installation verwendeten Schlüssel nicht deaktiviert zu haben, oder aber temporär per <code>cryptsetup luksAddKey</code> einen kürzeren Schlüssel hinzuzufügen. Getestet habe ich auf diese Weise das Update von 11.3 auf 11.4 und von 11.4 auf 12.1. Der Installer warnt einen zwar, dass es Probleme geben kann, wenn man Partitionen per Kernel Device Name mountet, dies hat sich aber bisher nicht als Problem herausgestellt.</p>
<p><h3>Quellen</h3></p>
<p>Da die Literatur — was openSUSE angeht — zu diesem Thema leider noch sehr dürftig ist habe ich mich vieler Quellen bedient, von denen ich hier nur die wichtigsten nennen möchte:</p>
<p><ul>
<li><a href="http://forum.ubuntuusers.de/topic/luks-root-partition-mit-schluessel-auf-usb-st/#post-1928847">http://forum.ubuntuusers.de/topic/luks-root-partition-mit-schluessel-auf-usb-st/#post-1928847</a> lieferte die Vorlage für mein Keyscript.</li>
<li><a href="http://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions">http://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions</a> hilft enorm beim Verständnis.</li>
<li><a href="http://forums.fedoraforum.org/showthread.php?t=241942">http://forums.fedoraforum.org/showthread.php?t=241942</a> zeigt im Prinzip den ganzen Vorgang, funktioniert leider nicht 1:1 für openSUSE.</li>
<li><a href="http://wejn.org/how-to-make-passwordless-cryptsetup.html">http://wejn.org/how-to-make-passwordless-cryptsetup.html</a> zeigt mehrere Variationen des Themas, aber passt auch nicht direkt auf openSUSE.</li>
<li><a href="http://raftaman.net/?p=300">http://raftaman.net/?p=300</a> ist inspirierend, löst aber nicht ganz das gleiche Problem (der verwendete USB-Stick ist cool).</li>
<li><a href="https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Remote_unlocking_of_the_root_.28or_other.29_partition">https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Remote_unlocking_of_the_root_.28or_other.29_partition</a> liefert Grundlagen, wenn man dies möchte.</li>
</p>
Civilization V im LAN2010-12-19T17:25:20+01:002017-07-10T17:19:00+02:00Matthias Bachtag:marix.org,2010-12-19:/civilization-v-im-lan.html<p>Nachdem <a href=
<p>Nachdem <a href="http://www.civilization5.com/">Civilization V</a> ja an <a href="http://store.steampowered.com/">Steam</a> gebunden, und damit mit einem gewissen Online-Zwang aber auch <a href="http://support.steampowered.com/kb_article.php?ref=9439-QHKN-1308">SteamPlay</a>, herauskam stellte sich die Frage wie es sich mit dem LAN-Modus verhält. Glücklicherweise bietet Steam ja auch einen Offline-Modus, so dass die LAN nicht unbedingt mit einem Internetanschluss versehen sein muss.</p>
<p>Ich habe den LAN-Modus bis jetzt übrigens nur in technischer Hinsicht einige Runden, alleine an zwei Rechnern, getestet. Die Startpositionen wirkten überaus fair, aber zum langfristigen Mehrspieler-Spielspaß kann ich so natürlich keine Aussage machen.</p>
<p><strong>Fair-Use im LAN</strong></p>
<p>Erfreulicherweise ist es möglich Civ V im LAN mit nur einer Lizens auf mehreren Rechnern zu spielen, so wie wir das früher ja eigentlich alle mit Spielen gemacht haben die noch nicht jeder hatte. Die Macher von Steam, die ja als Kopierschutzanbieter vermutlich hinter der entsprechenden Designentscheidung stehen, haben hier wohl den viralen Marketing-Faktor dieser Form von Fair-Use erkannt. Um das Spiel mit einem Steam-Account zu spielen ist wie folgt vorzugehen:</p>
<p><ol>
<li>Steam auf jedem Rechner mit einem Account der Civ V besitzt starten und in den Offline-Modus versetzen.
Es ist wichtig diesen Schritt auf jedem Rechner nacheinander durchzuführen, da ein Steam-Account nur auf einem Rechner gleichzeitig Online sein kann. Hierdurch ist auch sichergestellt, dass die Gäste keine Achievements erreichen können.</li>
<li>Den Profilnamen auf den Gästerechnern ändern.
Dies ist nicht nur wichtig damit die Spieler im Spiel nicht alle gleich heißen, sondern weil sie sonst auch gar nicht auf den Server kommen.</li>
<li>Spiel starten und Spaß haben</li>
<li>Am Schluß darf man natürlich nicht vergessen auf den Gästerechnern im Steam wieder den Benutzer zu ändern.</li>
</ol></p>
<p><strong>Speichern</strong></p>
<p>Ein manuelles Speichern ist im LAN nicht vorgesehen. Stattdessen wird das Spiel, anscheinend unabhängig von der Einstellung im Optionsmenü, jede Runde automatisch gespeichert.</p>
<p>Man kann zwar mit <code>Strg+S</code> den Speichern-Dialog aufrufen, welcher im Menü fehlt, diese Speicherstände werden aber im Laden-Dialog der beim Spielstart sichtbar ist nicht angezeigt.</p>
<p>Da die automatischen Speicherstände nur nach Runde benannt werden empfiehlt es sich bei jeder Spielunterbrechung die aktuelle Runde zu notieren und</p>
<p><strong>SteamPlay</strong></p>
<p>Auch wenn es dank SteamPlay möglich ist das Spiel, einmal gekauft, sowohl unter Windows als auch auf Mac OS X zu spielen, so klaffen die Versionen doch ein ganzes Stück auseinander. Deshalb ist es leider nicht möglich mit Windows und Mac OS X am gleichen Spiel teilzunehmen. Versucht ein Windows-Rechner auf einen Mac OS X-Server zu verbinden so erscheint eine Meldung, welche auf die abweichenden Versionsnummer hinweist.</p>
<p>Ich hoffe hier wird noch einmal darüber nachgedacht den Quelltext der beiden Versionen wieder zusammenzuführen, so dass in Zukunft beide Version synchron sind. Denn auch, dass die zusätzlich herunterladbaren Spielinhalte momentan nur für Windows verfügbar sind finde ich, bedenkt man, dass es sich nur um Völker und Szenarios handelt, unverständlich.
</p>
Wenn Apps im Android Market in "Authorizing purchase…" hängen…2010-12-18T18:03:25+01:002013-01-28T12:51:05+01:00Matthias Bachtag:marix.org,2010-12-18:/wenn-apps-im-android-market-authorizing-purchase-hängen.html
<p>scheint dies, kann man Google glauben, ein weit verbreitetes und von Google ignoriertes Problem zu sein. Das Problem ist aber eigentlich leicht, wenn auch mit leichtem Komfortverlust zu lösen.</p><ol><li>Den Download der betroffenen Anwendung im Market abbrechen.<br />
In meinem Fall ging dies nicht im Dialog der Anwendung, sondern nur durch …</li></ol>
<p>scheint dies, kann man Google glauben, ein weit verbreitetes und von Google ignoriertes Problem zu sein. Das Problem ist aber eigentlich leicht, wenn auch mit leichtem Komfortverlust zu lösen.</p><ol><li>Den Download der betroffenen Anwendung im Market abbrechen.<br />
In meinem Fall ging dies nicht im Dialog der Anwendung, sondern nur durch "Rechtsklick", also lange halten, in der Download-Übersicht.</li><li>Die Anwendung deinstallieren. Hierzu die Einstellungen starten, dort Anwendungen auswählen und die entsprechende Anwendung auswählen. Dort gibt es dann einen "Deinstallieren"-Knopf.</li><li>Den Cache des Markets löschen.<br />
Ich bin mir nicht sicher ob dieser Schritt wirklich notwendig ist, er schadet aber auch nicht. Erneut in den Einstellungen die Anwendungen auswählen, dort den Market auswählen und den Knopf "Cache leeren" wählen.</li><li>Handy neustarten.<br />
Erneut nicht umbedingt notwendig, aber sicher ist sicher.</li><li>Die Anwendung im Market erneut auswählen und installieren. Da der Kaufstatus am Account hängt kann man die Anwendungen ja so oft neu installieren wie man möchte.</li></ol><p>Mit dieser Methode konnte ich das Problem bis jetzt immer beheben. Einziger Nachteil ist, dass man im Fall von <a href="http://twidroyd.com/">Twidroy</a><a href="http://twidroyd.com/">d</a> anschließend die Accounts neu einrichten muss. Das Google zu dem Thema nicht viel sagt ist, meiner Meinung nach, auch weniger verwunderlich. Es scheint eigentlich nur bei Android-Updates aufzutreten, und die treten ja eigentlich nur bei Drittherstellern auf, z.B. beim mir durch den <a href="http://www.cyanogenmod.com/">CyanogenMod</a> auftreten.</p>
c't offline update auf dem Mac2010-11-03T18:12:38+01:002013-01-28T12:51:28+01:00Matthias Bachtag:marix.org,2010-11-03:/ct-offline-update-auf-dem-mac.html
<p>Die <a href="http://www.heise.de/software/download/wsus_offline_update_ehemals_ct_offline_update/38170">c't Offline Update</a>, mit dem sich Windows PCs ohne Netzwerkverbindung auf den neuesten Stand bringen lassen, kann seit Version 6.0 auf unter Linux die CD mit den Aktualisierungen erstellen. Dank gemeinsamen unixoiden Kultur funktioniert es damit auch auf dem Mac. Es müssen lediglich die notwendigen Kommandozeilenwerkzeuge, z.B …</p>
<p>Die <a href="http://www.heise.de/software/download/wsus_offline_update_ehemals_ct_offline_update/38170">c't Offline Update</a>, mit dem sich Windows PCs ohne Netzwerkverbindung auf den neuesten Stand bringen lassen, kann seit Version 6.0 auf unter Linux die CD mit den Aktualisierungen erstellen. Dank gemeinsamen unixoiden Kultur funktioniert es damit auch auf dem Mac. Es müssen lediglich die notwendigen Kommandozeilenwerkzeuge, z.B. via MacPorts installiert werden. Auf jeden Fall notwendig sind: cdrtools, wget, dos2unix, cabextract und xmlstarlet. Anschließend reicht est Offline Update zu entpacken, in das Verzeichnis sh zu wechseln und das Skript DownloadUpdates.sh auszuführen. Das ISO findet sich anschließend im Verzeichnis iso.</p>
Quick Cluster Overview jetzt auf Gitorious2010-09-27T14:16:27+02:002017-07-10T17:13:00+02:00Matthias Bachtag:marix.org,2010-09-27:/quick-cluster-overview-jetzt-auf-gitorious.html
<p>Da ich Quick Cluster Overview (QCO) die Tage für ein Projekt meiner universitären Arbeitsgruppe wieder rauskramen musste habe ich genutzt um den Quellcode gleich mal auf Gitourious zu schieben. Die URL der Projektseite lautet <a href="https://gitorious.org/qco">https://gitorious.org/qco</a>.</p>
<p>Ich habe lokal noch einige Aktualisierungen und Ideen herumliegen. Ich hoffe ich …</p>
<p>Da ich Quick Cluster Overview (QCO) die Tage für ein Projekt meiner universitären Arbeitsgruppe wieder rauskramen musste habe ich genutzt um den Quellcode gleich mal auf Gitourious zu schieben. Die URL der Projektseite lautet <a href="https://gitorious.org/qco">https://gitorious.org/qco</a>.</p>
<p>Ich habe lokal noch einige Aktualisierungen und Ideen herumliegen. Ich hoffe ich finde die nächsten Tage mal die Zeit diese auch einzupflegen.</p>
OpenCL und #include2010-02-11T00:06:10+01:002017-07-10T17:21:00+02:00Matthias Bachtag:marix.org,2010-02-11:/opencl-und-include.html<p>Jeder der das erste mal versucht in einem <a href=
<p>Jeder der das erste mal versucht in einem <a href="http://de.wikipedia.org/wiki/OpenCL">OpenCL</a>-Kernel eine Headerdatei mit <code>#include "header.h"</code> einzubinden scheitert für gewöhnlich mit einer Fehlermeldung im Stiele von <code> catastrophic error: cannot open source file "header.h"</code>. Grund ist, dass der Compiler normalerweise nicht im Quellverzeichnis nach der Headerdatei sucht. Man muss dem Befehl <code>clBuildProgram</code> explizit den Pfad per Compileroption <code>-I /pfad/zu/den/headern/</code> übergeben.</p>
<p>Beim Implementieren der Parameterübergabe an <code>clBuildProgram</code> fällt schnell auf, wieso er den Pfad nicht von alleine kennt. Ein "<code>-I .</code>" funktioniert nämlich spätestens dann nicht mehr, wenn man das Programm nicht im Quellverzeichnis ausführt. Man benötigt also eine Konstante mit welcher man sich den korrekten Parameter zusammenbauen kann. Dies sieht dann zum Beispiel so aus:
<pre><code>char compiler_options[256];
sprintf( compiler_options, "-I \"%s\"", SOURCE_DIRECTORY );
err = clBuildProgram( program, 0, NULL, compiler_options, NULL, NULL);</code></pre>
Hier ist es wichtig, dass <code>compiler_options</code> groß genug ist um mit jedem möglicherweise übergebenen Pfad zu funktionieren!</p>
<p>Um den Code in unterschiedlichen Verzeichnissen übersetzen zu können definiert man diese Konstante am besten außerhalb und übergibt sie zur Compilezeit:
<pre><code>gcc -DSOURCE_DIRECTORY="$(pwd)" -o headerTest headerTest.c</code></pre>
Nutzt man <a href="http://cmake.org">CMake</a> so reicht es in der <code>CMakeList.txt</code> die folgende Zeile hinzuzufügen:
<pre><code>add_definitions( -DSOURCE_DIRECTORY="${CMAKE_SOURCE_DIR}" )</code></pre></p>
<p>So weit, so schön die Theorie. Leider scheitern die Implementierungen von Apple und NVIDIA an Leerzeichen im Pfad. Da sie die Gänsefüßchen als normale Zeichen interpretieren scheitern sie mit dem angegebenen Aufruf also auch an Pfaden ohne Leerzeichen. Ein korrekter Aufruf verzichtet also auf sie, kann dann aber nicht mehr mit Leerzeichen umgehen.
<pre><code>char compiler_options[256];
sprintf( compiler_options, "-I %s", SOURCE_DIRECTORY );
err = clBuildProgram( program, 0, NULL, compiler_options, NULL, NULL);</code></pre></p>
Zusätzliche Modulverzeichnisse für CMake2010-02-09T01:43:49+01:002013-01-28T12:52:40+01:00Matthias Bachtag:marix.org,2010-02-09:/zusätzliche-modulverzeichnisse-für-cmake.html<p>Ein großer Nachteil von CMake ist, dass Standardordner im Benutzerverzeichnis kennt aus dem es zusätzliche Skripte ziehen kann. Gerade noch in der Entwicklung befindliche Skripte, wie mein <a href=
<p>Ein großer Nachteil von CMake ist, dass Standardordner im Benutzerverzeichnis kennt aus dem es zusätzliche Skripte ziehen kann. Gerade noch in der Entwicklung befindliche Skripte, wie mein <a href="http://gitorious.org/findopencl">FindOpenCL</a> möchte man aber nicht gleich global im System verankern. Die Lösung liegt in der Variable <code>CMAKE_MODULE_PATH</code>. Die in dieser Variablen Verzeichnisse werden von <code>find_package(<package>)</code> vor den Verzeichnissen der CMake-Installation durchsucht.</p>
<p>Soll der Pfad zu den zusätzlichen Modulen nicht in jedem <code>CMakeList.txt</code> codiert werden, so muss er CMake aufgrund der mangelnden Konfigurierbarkeit bei jedem Aufruf übergeben werden. Da es sich um eine echte CMake-Variable handelt, welche nicht automatisch aus einer Umgebunsvariablen gleichen Namens gefüllt wird, ist es am einfachsten dies durch ein passendes Alias bei jedem Aufruf automatisch mitzugeben. Hierzu fügt man am Ende der <code>~/.bashrc</code> folgende Zeile an:
<pre><code># Have CMake also search for modules in ~/.cmake/modules
alias cmake="cmake -DCMAKE_MODULE_PATH=~/.cmake/modules"</code></pre></p>
Patch für die Hercules DJ Console-Treiber für Linux 2.6.30 und neuer2010-02-06T16:48:20+01:002013-01-28T12:53:09+01:00Matthias Bachtag:marix.org,2010-02-06:/patch-für-die-hercules-dj-console-treiber-für-linux-2630-und-neuer.html<p>Die Treiber für die DJ Controller von Hercules gibt es zwar in Paketen für so ziemlich alle Distributionsarten, aber leider nicht für die aktuellsten Version. Unter openSUSE 11.2 funktioniert der Treiber zunächst nicht, da dieses Kernel 2.6.31 verwendet, der Treiber aber eine ALSA-Funktion nutzen möchte welche in dieser Version aus dem Kernel flog. Ein <a href=
<p>Die Treiber für die DJ Controller von Hercules gibt es zwar in Paketen für so ziemlich alle Distributionsarten, aber leider nicht für die aktuellsten Version. Unter openSUSE 11.2 funktioniert der Treiber zunächst nicht, da dieses Kernel 2.6.31 verwendet, der Treiber aber eine ALSA-Funktion nutzen möchte welche in dieser Version aus dem Kernel flog. Ein <a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch">kleiner Patch</a> behebt das Problem indem er den entscheidenden Aufruf auf die neue Funktion ändert.</p>
<p>Hat man den Treiber nach der <a href="http://ts.hercules.com/eng/index.php?pg=view_files&gid=2&fid=28&pid=177&cid=1">Anleitung auf der Webseite</a> installiert, so kann man mit <code>dkms status</code> prüfen ob dieser im System erfolgreich installiert wurde. Auf System mit Kernel 2.6.30 aufwärt bekommt man hier nur die enttäuschende Meldung: <code>hdjmod, 1.28: added</code>. Wäre die installation erfolgreich gewesen müsste hier <code>installed</code> stehen.</p>
<p>Der nächste Schritt nach dem add ist der build. Ein Blick in das Logdatei <code>/var/lib/dkms/hdjmod/1.28/build/make.log</code> zeigt das Problem: <pre><code>/var/lib/dkms/hdjmod/1.28/build/device.c:1663: error: implicit declaration of function ‘snd_card_new’</code></pre></p>
<p> <a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch">Der Patch</a> behebt das Problem indem er für neuere Kernel den Funktionsaufruf durch auf die neue Funktion snd_card_create ändert. Um ihn anzuwenden wechselt man in das Verzeichnis <code>/usr/src/hdjmod-1.28</code> und ruft dort <code>sudo patch -p1 < /path/to/hdjmod_kernel_2.6.30.patch</code> auf. Anschließen baut man mit <code>sudo dkms build -m hdjmod -v 1.28</code> das Modul und installiert es mit <code>sudo dkms install -m hdjmod -v 1.28</code>.</p>
<p>Anschließend kann man im DJ Control Panel sehen, dass der Treiber beim Anschließen der Konsole erfolgreich geladen wird. Insgesamt ein gutes Beispiel dafür, wieso man Treiber Open Source halten sollte, aber leider auch ein gute Beispiel, wieso man Treiber nicht außerhalb des Kernels pflegen sollte.</p>
<p><a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch">>Hier kann man den Patch herunterladen<<a /></p>
MacPorts hinter Proxies verwenden2010-01-20T16:51:35+01:002013-01-28T12:53:36+01:00Matthias Bachtag:marix.org,2010-01-20:/macports-hinter-proxies-verwenden.html<p>Sitzt man mit seinem Mac in einem Netzwerk ohne direkten Zugang zum Internet funktioniert <a href=
<p>Sitzt man mit seinem Mac in einem Netzwerk ohne direkten Zugang zum Internet funktioniert <a href="http://www.macports.org/">MacPorts</a> leider nicht automatisch mit den im System eingepflegten Proxies. Durch manuelles Setzen der Umgebungsvariablen http_proxy und RSYNC_PROXY lässt sich <a href="http://www.macports.org/">MacPorts</a> aber ohne Einschränkungen nutzen.</p>
<p>Das erste Problem entsteht dadurch, dass der Befehl sudo den ausgeführten Befehl von in der Shell gesetzten Umgebungsvariablen abschirmt. Dadurch sieht der port-Befehl in der Benutzershell gesetzte Proxy-Variablen nicht und kann sich nicht mit seinen Servern verbinden.</p>
<p><pre><code>eccentrica:~ marix$ sudo port selfupdate
---> Updating the ports tree
Error: Synchronization of the local ports tree failed doing rsync
Error: /opt/local/bin/port: port selfupdate failed: Couldn't sync the ports tree: Synchronization of 1 source(s) failed</code></pre></p>
<p>Die Lösung dieses Problems ist mit sudo eine neue Shell zu starten in der die Umgebungsvariablen gesetzt werden können. Wichtig ist hierbei, dass <a href="http://www.macports.org/">MacPorts</a> auch <a href="http://rsync.samba.org/">rsync</a> verwendet, welches nicht die http_proxy-Variable interpretiert. Deshalb muss auch die Variable RSYNC_PROXY gesetzt werden.</p>
<p><pre><code>eccentrica:~ marix$ sudo -s
Password:
bash-3.2# export http_proxy=http://proxy:8080
bash-3.2# export HTTPS_PROXY=http://proxy:8080
bash-3.2# export FTP_PROXY=http://proxy:8080
bash-3.2# export RSYNC_PROXY=proxy:8080
bash-3.2# port selfupgrade</code></pre></p>
<p>An Stelle des port selfupgrade kann natürlich eine beliebige Anzahl anderer Befehle stehen.</p>
<p>Ein weiteres Problem entsteht, wenn <a href="http://www.macports.org/">MacPorts</a> <a href="http://subversion.tigris.org/">Subversion</a> verwendet um an den Quelltext des zu installierenden Programmes zu kommen.</p>
<p><pre><code>ash-3.2# port install iterm
---> Computing dependencies for iTerm
---> Fetching iTerm
Error: Target org.macports.fetch returned: Subversion check out failed
Error: Status 1 encountered during processing.
Before reporting a bug, first run the command again with the -d flag to get complete output.</code></pre></p>
<p><a href="http://subversion.tigris.org/">Subversion</a> lässt sich leider nicht über Umgebungsvariablen zur Verwendung des Proxies überreden. Stattdessen muss man die Datei ~/.subversion/servers entsprechend anpassen.
</p>
Mystic Mine unter openSUSE 11.22009-12-04T19:58:49+01:002013-01-28T12:54:12+01:00Matthias Bachtag:marix.org,2009-12-04:/mystic-mine-unter-opensuse-112.html
<p><a href="http://www.koonsolo.com/mysticmine/">Mystic Mine</a> ist ein lustiges Independent-Spiel das man ähnlich wie Frozen Bubble mal schnell zwischendurch spielen kann. Und das beste daran, es gibt eine native Linuxversion.</p>
<p><!--break--></p>
<p>Leider scheiterte mein Versuch diese Linuxversion zu nutzen mit folgender Meldung:
<pre><code>Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/cx_Freeze/initscripts …</code></pre></p>
<p><a href="http://www.koonsolo.com/mysticmine/">Mystic Mine</a> ist ein lustiges Independent-Spiel das man ähnlich wie Frozen Bubble mal schnell zwischendurch spielen kann. Und das beste daran, es gibt eine native Linuxversion.</p>
<p><!--break--></p>
<p>Leider scheiterte mein Versuch diese Linuxversion zu nutzen mit folgender Meldung:
<pre><code>Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/cx_Freeze/initscripts/Console.py", line 29, in <module>
File "monorail.py", line 34, in <module>
File "koon/app.py", line 10, in <module>
File "koon/snd.py", line 4, in <module>
File "ExtensionLoader_pygame_mixer.py", line 12, in <module>
ImportError: libSDL_mixer-1.2.so.0: cannot open shared object file: No such file or directory</code></pre></p>
<p>Das ist mal ein schönes Beispiel für eine zielführende Fehlermeldung. SDL_mixer ist nicht installiert, die Installation der passenden Bibliothek hilft.
<code>sudo zypper in SDL_mixer</code>
</p>
Serverupdate2009-10-24T11:41:15+02:002009-10-26T00:18:42+01:00Matthias Bachtag:marix.org,2009-10-24:/serverupdate.html
<p>Ich werde im Laufe des Wochenendes den Server aktualisieren, dadurch wird die Seite, sowie Email, Subversion und einiges andere immer wieder mal nicht erreichbar sein.</p>
<p>Update: Der Server wurde inzwischen aktualisiert. Damit sollten die größten Störungen vom Tisch sein. Jetzt muss nur noch bei Gelegenheit Drupal einen Versionssprung machen, der …</p>
<p>Ich werde im Laufe des Wochenendes den Server aktualisieren, dadurch wird die Seite, sowie Email, Subversion und einiges andere immer wieder mal nicht erreichbar sein.</p>
<p>Update: Der Server wurde inzwischen aktualisiert. Damit sollten die größten Störungen vom Tisch sein. Jetzt muss nur noch bei Gelegenheit Drupal einen Versionssprung machen, der Quasselcore wieder aufgesetzt werden, die Greylist getuned ...</p>
<p>2. Update: Die Greylist läuft auch wieder => Spam gegen 0. Genau so der Quasselcore und endlich kann mein Dovecot auch Sieve. :)</p>
Nutzung von Grafikprozessoren in Anwendungen der Hochenergiephysik2009-09-07T11:36:51+02:002009-09-07T12:35:55+02:00Matthias Bachtag:marix.org,2009-09-07:/diplomarbeit.html<p>... ist der Titel meiner Diplomarbeit, mit welcher ich das Studium der Physik erfolgreich abschloss.
</p>
<p>... ist der Titel meiner Diplomarbeit, mit welcher ich das Studium der Physik erfolgreich abschloss.</p>
<p>Die Menge an Daten die Experimente in der Hochenergiephysik erzeugen steigt immer weiter an. Klassische skalare Programme können aber nicht mehr davon profitieren, dass Prozessoren immer höher getaktet werden. Um größere Datenmengen verarbeiten zu können sind Anwendungen notwendig, die parallele Architekturen nutzen. Diese Diplomarbeit zeigt auf NVIDIA CUDA basierende Implementierungen und Optimierungen von drei Anwendungen verschiedenen Typs auf Grafikprozessoren. Zelluläre Automaten, welche für die Spurrekonstruktion verwendet werden können, werden durch eine Implementierung des Game of Life repräsentiert die 20 mal schneller als eine SSE nutzende Implementierung auf dem Hauptprozessor ist. Die Laufzeit eines Kalman-Filters, mit dem Spurparameter geschätzt werden, wird auf ein Siebtel gegenüber der auf SSE basierenden Implementierung beschleunigt. Auch der Linpack-Benchmark, als Anwendung zur Lösung von Gleichungssystemen, wird analysiert und so optimiert, dass er auf einer Grafikkarte 67.2 Gflops erreicht und auf mehrere Karten skaliert.</p>
<p><a href="https://marix.org/Publikationen/diplomarbeit.pdf">Die komplette englischsprachige Arbeit</a> kann als PDF <a href="https://marix.org/Publikationen/diplomarbeit.pdf">heruntergeladen</a> werden.</p>
Blumentopfs Wahlwerbespot2009-08-27T12:03:09+02:002009-08-27T12:03:09+02:00Matthias Bachtag:marix.org,2009-08-27:/blumentop-wahlwerbespot.htmlNormallerweise versuche ich diese Seite, obwohl ich engagierter <a href=http://www.piratenpartei.de>Pirat</a> bin, unpolitisch zu halten und bin auch kein großer Fan von Hip-Hop. Den Wahlaufruf der Band <a href=http://www.lastfm.de/music/Blumentopf>Blumentopf</a> zur <a href=http://de.wikipedia.org/wiki/Bundestagswahl_2009>Bundestagswahl 2009</a> finde ich aber so gut, dass er trotzdem hierher kommt.
<p>
Normallerweise versuche ich diese Seite, obwohl ich engagierter <a href="http://www.piratenpartei.de">Pirat</a> bin, unpolitisch zu halten und bin auch kein großer Fan von Hip-Hop. Den Wahlaufruf der Band <a href="http://www.lastfm.de/music/Blumentopf">Blumentopf</a> zur <a href="http://de.wikipedia.org/wiki/Bundestagswahl_2009">Bundestagswahl 2009</a> finde ich aber so gut, dass er trotzdem hierher kommt.
</p>
<object type="application/x-shockwave-flash" data="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="lfmEmbed_50_34358831_234428566" width="340" height="289"> <param name="movie" value="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" /> <param name="flashvars" value="title=Blumentopf_Wahlwerbespot&uniqueName=34358831&albumArt=http%3A%2F%2Fcdn.last.fm%2Fdepth%2Fcatalogue%2Fnoimage%2Fnocover_flashplayer.png&duration=124&image=http%3A%2F%2Fuserserve-ak.last.fm%2Fserve%2Fimage%3A320%2F34358831.jpg&FSSupport=true&creator=Blumentopf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> <param name="allowFullScreen" value="true" /> <param name="quality" value="high" /> <param name="bgcolor" value="000000" /> <param name="wmode" value="opaque" /> <param name="menu" value="false" /> </object>
Cuda ohne graphische Oberfläche profilen2009-01-20T12:26:28+01:002010-08-17T00:19:55+02:00Matthias Bachtag:marix.org,2009-01-20:/cuda-ohne-graphische-oberfläche-profilen.html
<p>Mit CUDA ist es nicht mehr notwendig eine graphische Oberfläche auf dem GPGPU Knoten zu haben. Doch was, wenn man den GPU-Teil einer Anwendung profilen möchte? Der CUDA-Profiler basiert auf QT und läuft auf einem nackten Knoten ohne X nicht.</p>
<p>Zum Glück ist die Profilingfunktionalität von CUDA auf niedrigerer Ebene …</p>
<p>Mit CUDA ist es nicht mehr notwendig eine graphische Oberfläche auf dem GPGPU Knoten zu haben. Doch was, wenn man den GPU-Teil einer Anwendung profilen möchte? Der CUDA-Profiler basiert auf QT und läuft auf einem nackten Knoten ohne X nicht.</p>
<p>Zum Glück ist die Profilingfunktionalität von CUDA auf niedrigerer Ebene realisiert und lässt sich durch Umgebungsvariablen steuern. Der graphische Profiler nimmt einem diese Arbeit lediglich ab und lässt einen intuitiver die zu messenden Metriken bestimmen.</p>
<p><!--break--></p>
<p>Die für die Konfiguration zuständigen Umgebungsvariablen sind:
<ul>
<li><em>CUDA_PROFILE</em> – Dies ist die einzige zwingend erforderliche Variable. Hat sie den Wert 1 werden Profiler-Daten geschrieben.</li>
<li><em>CUDA_PROFILE_CSV</em> – Ist diese Variable auf 1 gesetzt werden die Daten als CSV geschrieben. Dieses kann dan später vom Visual Profiler importiert werden.</li>
<li><em>CUDA_PROFILE_LOG</em> – Hier kann der Name der Log-Datei vorgegeben werden. Ansonsten wird profile.log verwendet.</li>
<li><em>CUDA_PROFILE_CONFIG</em> – Hier kann eine Konfigurationsdatei angegeben werden in welcher spezifiziert wird welche Zähler mitprotokoliert werden sollen.</li>
</ul></p>
<p>In der durch CUDA_PROFILE_CONFIG angegebenen Datei können bis zu vier Zähler angegeben sein. Jeder Zähler muss hierbei in einer eigenen Zeile stehen. Die möglichen Werte sind:
<ul>
<li><em>gld_incoherent</em> – Anzahl der nicht zusammengefügten lesenden Zugriffe auf den globalen Speicher, funktioniert nicht auf GT200-basierten Karten.</li>
<li><em>gst_incoherent</em> – Anzahl der nicht zusammengefügten schreibenden Zugriffe auf den globalen Speicher, funktioniert nicht auf GT200-basierten Karten.</li>
<li><em>gld_coherent</em> – Anzahl der zusammengefügten lesenden Speicherzugriffe.</li>
<li><em>gst_coherent</em> – Anzahl der zusammengefügten schreibenden Speicherzugriffe.</li>
<li><em>local_load</em> – Anzahl der lesenden Zugriffe auf den lokalen Speicher.</li>
<li><em>local_store</em> – Anzahl der schreibenden Zugriffe auf den lokalen Speicher.</li>
<li><em>branch</em> – Gesamte Anzahl der Verzweigungen</li>
<li><em>divergent_branch</em> – Gesamte Anzahl der Verzweigungen welche zu serialisierter Ausführung führten</li>
<li><em>instructions</em> – Befehlszähler</li>
<li><em>warp_serialize</em> – Anzahl von Threads in Warps die aufgrund von Adresskonflikten beim Zugfriff auf den gemeinsamen oder den konstanten Speicher.</li>
<li><em>cta_launched</em> – Anzahl der ausgeführten Blöcke.</li></p>
<p>So ist es dann durchaus auch möglich die Graphikkartennutzung in MPI-Programmen zu profilen. Hierbei muss man lediglich beachten, dass jeder Prozess seine eigene Ausgabedatei verwendet. Bei OpenMPI 1.3 kann man z.B. die Umgebungsvariable OMPI_COMM_WORLD_RANK nutzen und den Aufruf des eigenen, hier beispielsweise meinCudaProgramm genannten Programmes durch ein kleiens Skript ersetzen.</p>
<p><pre><code>#!/bin/bash
export CUDA_PROFILE=1
export CUDA_PROFILE_CSV=1
export CUDA_PROFILE_LOG=meinCudaProgramm.profile.csv
./meinCudaProgramm</code></pre></p>
Projektpraktikumsbericht zu Quick Cluster Overview2009-01-17T20:36:16+01:002010-08-17T00:18:43+02:00Matthias Bachtag:marix.org,2009-01-17:/projektpraktikumsbericht-zu-quick-cluster-overview.html
<p>Dieser Bericht beschreibt die Funktionsweise, Installation und Konfiguration der von mir als Projektpraktikum geschriebenen Anwendung Quick Cluster Overview.</p>
<p>PDF des Berichtes: <a href="https://marix.org/Anhänge/bericht.pdf">bericht.pdf</a></p>
Projektpraktikumsvortrag über Quick Cluster Overview2009-01-17T20:33:31+01:002010-08-17T00:18:09+02:00Matthias Bachtag:marix.org,2009-01-17:/projektpraktikumsvortrag-über-quick-cluster-overview.html
<p>Dieser Projektpraktikumsvortrag stellt Quick Cluster Overview mit seinen wichtigsten Features vor und beschreibt seine Architektur.</p>
<p>PDF des Vortrags: <a href="https://marix.org/Anhänge/vortrag.pdf">vortrag.pdf</a></p>
Ein paar Hinweise zur Migration eine openSUSE auf ein RAID52009-01-17T20:17:44+01:002009-01-17T20:17:44+01:00Matthias Bachtag:marix.org,2009-01-17:/ein-paar-hinweise-zur-migration-eine-opensuse-auf-ein-raid5.htmlMöchte man ein System auf ein RAID5 migrieren reichen dafür die drei Festplatten. Für Ubuntu ist dies auf <a href=http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/>Netzpiraten.ch</a> schön beschreiben. Hier findet ihr die entsprechende Anleitung für openSUSE.
<p>
Möchte man ein System auf ein RAID5 migrieren reichen dafür die drei Festplatten. Für Ubuntu ist dies auf <a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/">Netzpiraten.ch</a> schön beschreiben.
</p>
<p>
Ist der Grund für die Migration ein Hardwarefehler, so dass man die Ausgangsfestplatte anschließend tauschen möchte, kann man, statt wie auf <a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/">Netzpiraten.ch</a> beschreiben, auch erst einmal ein RAID5 mit nur zwei Platten anlegen. Dies entspricht zwar eigentlich einem RAID1 mit unnötig umständlicher Paritätsberechnung, lässt sich aber später problemlos zu einem echten RAID5 erweitern und bietet bereits während der Wartezeit auf den Austausch die gewünschte Fehlertoleranz.
</p>
<p>
Ein solches, einem RAID1 entsprechendes RAID5, weigert sich YaST allerdings anzulegen. Nutzt man allerdings die auf <a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/">Netzpiraten.ch</a> oder im <a href="http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO.html">The Software-RAID HOWTO</a> beschreibenen Befehle gelingt dies problemlos.
</p>
<p>
<pre><code>mdadm --create /dev/md0 -n2 -l5 /dev/sdb3 /dev/sdc3</code></pre>
</p>
<p>
Die hierfür zuvor notwendige Partitionierung lässt sich am besten aus dem laufenden openSUSE-System mit YaST machen. Um die Dateien zu kopieren lässt sich das <a href="/node/99">RAID unter Knoppix einbinden</a>. Dort kann man die Dateien mit <code>cp --archive</code> kopieren.
</p>
<p>
Möchte man das RAID5 später um eine Festplatte, zum Beispiel die zuvor eingesparte Dritte, erweitern, hilft die <a href="http://isomerica.net/archives/2007/07/12/growing-a-linux-software-raid-5-completely-online/">Beschreibung auf isomerica.net</a>. Wer ext3 verwendet muss nur statt <code>xfs_growfs</code> <code>resize2fs</code> verwenden. Der komplette Vergrößerungsvorgang kann komplett aus dem laufenden System erfolgen. Hierbei hilft <code>watch</code> den Fortschritt zu beobachten.
</p>
<p>
Da man bei diesen Aktionen auch durchaus mal die falsche Partition zerstören kann empfiehlt sich generell ein vorheriges Backup. Auch etwas Training in VirtualBox kann nicht schaden bevor man sich auf sein Live-System stürzt, dort können viele Unklarheiten beseitigt werden solange man noch ein komplett laufendes System hat.
</p>
Quick Cluster Overview Version 0.12009-01-17T20:17:44+01:002009-01-17T20:17:44+01:00Matthias Bachtag:marix.org,2009-01-17:/quick-cluster-overview-version-01.htmlVersion 0.1 von Quick Cluster Overview enthält die folgenden wichtigen Features:
<ul>
<li>Kann Daten aus Ganglia extrahieren.</li>
<li>Kann Daten aus Lemon extrahieren.</li>
<li>Generiert Übersichtsgraphen mit Gnuplot.</li>
<li>Enthält eine modifizierte Version von <a href=http://sourceforge.net/projects/php-gnuplot/>PHP-GNUPlot</a> die eine höhere Geschwindigkeit aufweißt.</li>
<li>Zieht Daten maximal einmal pro konfiguriertem Zeitintervall aus dem Cluster und nutzt anschließend die bereits generierten Graphen.</li>
<p>
Version 0.1 von Quick Cluster Overview enthält die folgenden wichtigen Features:
<ul>
<li>Kann Daten aus Ganglia extrahieren.</li>
<li>Kann Daten aus Lemon extrahieren.</li>
<li>Generiert Übersichtsgraphen mit Gnuplot.</li>
<li>Enthält eine modifizierte Version von <a href="http://sourceforge.net/projects/php-gnuplot/">PHP-GNUPlot</a> die eine höhere Geschwindigkeit aufweißt.</li>
<li>Zieht Daten maximal einmal pro konfiguriertem Zeitintervall aus dem Cluster und nutzt anschließend die bereits generierten Graphen.</li>
<li>Modularer Aufbau, dadurch leichte Erweiterbarkeit auf andere Monitoringsysteme und Plot-Anwendungen.</li>
<li>Leichte Modifizierbarkeit der Seitendarstellung durch den Einsatz der <a href="http://www.smarty.net/">Smarty Template Engine</a>.</li>
</ul>
</p>
<p>
Dokumentation welche die Installation und Konfiguration beschreibt findet sich im Download und im <a href="https://marix.org/Blog/projektpraktikumsbericht-zu-quick-cluster-overview.html">Projektpraktikumsbericht</a>. Genauere Darstellungen der Funktionsweise im auf dieser Version basierenden <a href="https://marix.org/Blog/projektpraktikumsbericht-zu-quick-cluster-overview.html">Projektpraktikumsbericht</a> und dem ebenfalls auf dieser Version basierenden <a href="https://marix.org/Blog/projektpraktikumsvortrag-über-quick-cluster-overview.html">Projektpraktikumsvortrag</a>.
</p>
<p>
Benötigte Software:
<ul>
<li>Webserver</li>
<li>PHP 5 oder neuer</li>
<li>Gnuplot</li>
<li>Ganglia oder Lemon</li>
</ul>
</p>
<p>
Lizens: GPLv2, der Download enthält aber im Verzeichnis <i>contrib</i> einige Fremdanwendungen deren Lizens abweichen kann. Die entsprechenden Lizensen sind den einzelnen Anwendungen in diesem Verzeichnis zu entnehmen.
</p>
<p>
Datei: <a href="https://marix.org/Publikationen/qco.0.1.tar.bz2">qco.0.1.tar.bz2</a>
</p>
Import von Amarok 1.4-MySQL-Datenbank in Amarok 22008-12-23T20:04:17+01:002013-01-28T12:54:57+01:00Matthias Bachtag:marix.org,2008-12-23:/import-von-amarok-14-mysql-datenbank-amarok-2.html
<p>Der Import meiner in MySQL abgelegten Amarok 1.4-Datenbank in Amarok 2 wollte zunächst nicht klappen. Ich scheiterte immer mit <code>QMYSQL: Verbindungsaufbau nicht möglich</code>. Zum Glück war vorher schon jemand über den Fehler gestolpert und hat eine Lösung gefunden, nämlich anstatt des Hostnamens die IP des Servers anzugeben. Nachlesen kann …</p>
<p>Der Import meiner in MySQL abgelegten Amarok 1.4-Datenbank in Amarok 2 wollte zunächst nicht klappen. Ich scheiterte immer mit <code>QMYSQL: Verbindungsaufbau nicht möglich</code>. Zum Glück war vorher schon jemand über den Fehler gestolpert und hat eine Lösung gefunden, nämlich anstatt des Hostnamens die IP des Servers anzugeben. Nachlesen kann man dies alles unter <a href="http://bugs.kde.org/show_bug.cgi?id=174269">KDE Bug 174269</a>. Kaum war die Voreinstellung <code>localhost</code> in <code>127.0.0.1</code> geändert schon rödelte die Kiste los.</p>
Abhilfe für den "The specified URL cannot be found"-Fehler auf Planet Descent2008-11-24T00:02:16+01:002013-01-28T12:55:47+01:00Matthias Bachtag:marix.org,2008-11-24:/abhilfe-für-den-specified-url-cannot-be-found-fehler-auf-planet-descent.html
<p><p>Seit einiger Zeit bekommt man auf <a href="http://www.planetdescent.com">Planet Descent</a> beim Versuch einen Beitrag einzustellen den Fehler "The specified URL cannot be found". Provoziert wird er durch bestimmte Zeichen wenn diese im Beitrag enthalten sind, unter anderem auch durch den doch recht nützlichen Zeilenumbruch. Abhilfe schafft User-JavaScript. Dieses Skript für <a href="http://www.opera.com">Opera</a> ersetzt …</p></p>
<p><p>Seit einiger Zeit bekommt man auf <a href="http://www.planetdescent.com">Planet Descent</a> beim Versuch einen Beitrag einzustellen den Fehler "The specified URL cannot be found". Provoziert wird er durch bestimmte Zeichen wenn diese im Beitrag enthalten sind, unter anderem auch durch den doch recht nützlichen Zeilenumbruch. Abhilfe schafft User-JavaScript. Dieses Skript für <a href="http://www.opera.com">Opera</a> ersetzt die gefährlichen Zeichen durch ihre Escape-Sequenz und verhindert so den Fehler. Um das Skript zu verwenden muss es in den User-JavaScript-Ordner von Opera gelegt werden. Wo dieser sich befindet ist unter Extras->Einstellungen->Inhalte->JavaScript-Optionen im Feld User-JavaScript-Dateien zu sehen. Wird es nicht mehr benötigt kann es einfach aus diesem Ordner gelöscht werden. Prinzipiell sollte sich das Skript auch leicht an andere Browser wie zum Beispiel Firefox mit dem Greasemonkey-Plugin anpassen lassen. Da ich dieses aber nicht benutze habe ich es nicht getestet.</p><h3>Aktuelle Version:</h3><p><a href="https://marix.org/Anhänge/planetdescent.com.0.4.js">0.4 für Opera</a></p><h3>Vorherige Version:</h3><p><a href="https://marix.org/Anhänge/planetdescent.com.0.3.js">0.3 für Opera</a> <a href="https://marix.org/Anhänge/planetdescent.com.0.2.js">0.2 für Opera</a> <a href="https://marix.org/Anhänge/planetdescent.com.0.1.js">0.1 für Opera</a></p></p>
Zu welchem Paket gehörte die Datei nochmal2008-10-31T14:59:05+01:002013-01-28T12:56:35+01:00Matthias Bachtag:marix.org,2008-10-31:/zu-welchem-paket-gehörte-die-datei-nochmal.html<p>Will man unter openSUSE wissen zu welchem Paket eine Datei gehört lässt sich dies ganz leicht herausfinden. Leider gibt es in RPM oder Zypper keine expliziete Funktion um dies Abzufragen, aber sie lässt sich ganz leicht bauen aus vorhandenen Komponenten zusammenbauen.</p>
<p>Will man unter openSUSE wissen zu welchem Paket eine Datei gehört lässt sich dies ganz leicht herausfinden. Leider gibt es in RPM oder Zypper keine expliziete Funktion um dies Abzufragen, aber sie lässt sich ganz leicht bauen aus vorhandenen Komponenten zusammenbauen.</p>
<p>RPM zeigt im Abfrage-Modus (-q) mit -l alle Dateien einem Pakets an. Mit -a arbeitet der Abfrage-Modus auf allen Paketen. Es liegt also nahe alle Dateien aller Pakete anzuzeigen und alle unbenötigten Informationen mit grep auszufiltern. In meinem Beispiel suche ich das Paket glibc-devel welches die Datei /usr/include/gnu/stubs.h enthält.</p>
<p><pre><code>marix@eddie:~> rpm -qal | grep "/usr/include/gnu/stubs.h"
/usr/include/gnu/stubs.h</code></pre></p>
<p>Leider funktioniert dies wie im Beispiel zu sehen ist nicht so richtig. Zwar wird die Datei gefunden, das Paket aber noch nicht mit angezeigt. RPM zeigt mit -l ja nur die Dateien an, aber nicht die Paketnamen. Zum Glück lässt sich RPM aber über die Option --queryformat genau sagen, welche Informationen es zu einem Paket wie anzeigen soll. Unter http://rpm.org/max-rpm-snapshot/s1-rpm-query-parts.html#S3-RPM-QUERY-QUERYFORMAT-OPTION ist auch der passende Formatierungstext zu finden.</p>
<p><pre><code>marix@eddie:~> rpm -qa --queryformat '[%{=NAME}: %{FILENAMES}\n]' | grep /usr/include/gnu/stubs.h
glibc-devel: /usr/include/gnu/stubs.h</code>
</p>
Screen Spickzettel2008-10-10T18:41:03+02:002010-10-25T17:00:44+02:00Matthias Bachtag:marix.org,2008-10-10:/screen-spickzettel.html
<p>Die wichtigsten Befehle für die Arbeit mit Screen.</p>
<p><!--break--></p>
<p><ul>
<li>Screen starten:
<code>screen</code>
</li></p>
<p><li>Wieder mit der letzten Screen-Sitzung verbinden:
<code>screen -R</code>
</li></p>
<p><li>Screen mit einer Sitzung mit einem vorgegebenen Namen erstellen:
<code>screen -S <i>Name</i></code>
</li></p>
<p><li>Eine neue Screen-Sitzung im Hintergrund starten:
<code>screen -dmS <i>Name</i></code>
</li></p>
<p><li>Liste aller Screen-Sitzungen anzeigen:
<code>screen --ls</code>
</li></p>
<p><li>Wieder mit der Screen-Sitzung …</li></p>
<p>Die wichtigsten Befehle für die Arbeit mit Screen.</p>
<p><!--break--></p>
<p><ul>
<li>Screen starten:
<code>screen</code>
</li></p>
<p><li>Wieder mit der letzten Screen-Sitzung verbinden:
<code>screen -R</code>
</li></p>
<p><li>Screen mit einer Sitzung mit einem vorgegebenen Namen erstellen:
<code>screen -S <i>Name</i></code>
</li></p>
<p><li>Eine neue Screen-Sitzung im Hintergrund starten:
<code>screen -dmS <i>Name</i></code>
</li></p>
<p><li>Liste aller Screen-Sitzungen anzeigen:
<code>screen --ls</code>
</li></p>
<p><li>Wieder mit der Screen-Sitzung mit dem vorgebenen Namen verbinden:
<code>screen -r <i>Name</i></code>
</li></p>
<p><li>Eine Sitzung mit einem vorgegebenen Namen von ihrer Konsole trennen:
<code>screen -d <i>Name</i></code>
</li></p>
<p><li>Von der aktuellen Sitzung trennen, die Sitzung läuft im Hintergrund weiter:
<code>Strg+A D</code>
Erst Strg und A drücken, dann D drücken.
</li></p>
<p><li>In der Sitzung scrollen:
<code>Strg+A Escape</code>
Erst Strg und A drücken, dann Escape drücken. Anschließend kann mit den Pfeiltasten sowie Bild-Auf und Bild-Ab gescrollt werden. Erneutes drücken von Escape beenden den Scrollen-Modus wieder.
</li></p>
<p><li>Den Namen des aktuellen Fensters ändern:
<code>Strg+A A</code>
Erst Strg und A drücken, dann Shift und A drücken. Der Name ist markiert, man kann ihn mit der Rücktaste löschen und einen neuen eingeben.
</li></p>
<p><li>Strg+A eingeben:
<code>Strg+A a</code>
Erst Strg und A drücken, dann A drücken.
</li></p>
<p><li>Ein neues Fenster erstellen:
<code>Strg+A c</code>
Erst Strg und A drücken, dann C drücken.
</li></p>
<p><li>Zum nächsten Fenster wechseln:
<code>Strg+A n</code>
Erst Strg und A drücken, dann N drücken.
</li></p>
<p><li>Zum vorherigen Fenster wechseln:
<code>Strg+A p</code>
Erst Strg und A drücken, dann P drücken.
</li></p>
<p><li>Fensterliste anzeigen:
<code>Strg+A "</code>
Erst Strg und A drücken, dann " (Shift + 2 bei deutscher Tastatur) drücken.
</li></p>
<p></ul></p>
Installation von KDE 4.1 unter openSUSE 11.02008-09-23T12:06:56+02:002017-07-10T17:26:00+02:00Matthias Bachtag:marix.org,2008-09-23:/installation-von-kde-41-unter-opensuse-110.html
<p>Momentan erfordert die Installation von KDE 4.1 unter openSUSE 11.0 etwas Handarbeit. Dennoch ist sie schnell und leicht erledigt. Für x86-Systeme gibt es unter <a href="http://de.opensuse.org/KDE/KDE4">http://de.opensuse.org/KDE/KDE4</a> auch Links zur Installation mit einem Klick. Wer ein x64-System hat oder es sowieso lieber per Hand macht …</p>
<p>Momentan erfordert die Installation von KDE 4.1 unter openSUSE 11.0 etwas Handarbeit. Dennoch ist sie schnell und leicht erledigt. Für x86-Systeme gibt es unter <a href="http://de.opensuse.org/KDE/KDE4">http://de.opensuse.org/KDE/KDE4</a> auch Links zur Installation mit einem Klick. Wer ein x64-System hat oder es sowieso lieber per Hand macht findet hier eine kurze Anleitung.</p>
<p><!--break--></p>
<p>Zunächst sind in Yast über den Punkt Software-Repositories folgende Repositories hinzuzufügen:
<ul>
<li><code>http://download.opensuse.org/repositories/KDE:/KDE4:/Factory:/Desktop/openSUSE_11.0/</code></li>
<li><code>http://download.opensuse.org/repositories/KDE:/KDE4:/Factory:/Extra-Apps/openSUSE_11.0/</code></li>
<li><code>http://download.opensuse.org/repositories/KDE:/KDE4:/Community/openSUSE_11.0_KDE4_Factory_Desktop/</code></li>
</ul>
Die letzten beiden sind optional, erhöhen aber die Anzahl der zur Verfügung stehenden Anwendungen.</p>
<p>Wie unter <a href="http://de.opensuse.org/KDE/KDE4">http://de.opensuse.org/KDE/KDE4</a> erwähnt, benötigt man außerdem auch noch das Qt-Repository, da KDE 4.1 eine neueres Qt benötigt als bei 11.0 mitgeliefert wird. Fehlt dieses erscheint bei der Auswahl von KDE 4.1-Paketen die Fehlermeldung <code>nichts bietet libqt-x11 >= 4.4.2 benötigt von kdebase4-runtime-4.1.1-48.2.i586</code>.
<ul>
<li><code>http://download.opensuse.org/repositories/KDE:/Qt/openSUSE_11.0/</code>
</ul>
</p>
<p>Sind alle Repositories hinzugefügt kann man in in Yast unter "Software installieren oder löschen" das Schema "KDE 4 Desktop-Umgebung" auswählen. Möchte man alle zum Schema gehörende Software installieren kann man, nachdem man das Schema ausgewählt hat, bei einem Rechtsklick in die Paketliste "Alle in dieser Liste"->"Installieren" auswählen. Hatte man schon KDE 4.0 installiert kann man auch einfach in der Menüleiste "Paket"->"Alle Pakete"->"Aktualisieren falls neuere Version verfügbar" auswählen. Dies aktualisiert dann KDE 4.0 auf 4.1.</p>
JUnit Kurzreferenz2008-08-24T22:37:57+02:002013-01-28T12:57:09+01:00Matthias Bachtag:marix.org,2008-08-24:/junit-kurzreferenz.html
<p>Eigentlich als Einführung gedacht eignet sich der Artikel <a href="http://www.cavdar.net/2008/07/21/junit-4-in-60-seconds/">JUnit 4 in 60 Seconds</a> hervorragend als Kurzreferenz da er alle Features übersichtlich mit je einem Satz erklärt.</p>
Doppelt angezeigte Aktualisierungen im openSUSE-Updater2008-08-24T17:15:50+02:002013-01-28T12:58:04+01:00Matthias Bachtag:marix.org,2008-08-24:/doppelt-angezeigte-aktualisierungen-im-opensuse-updater.html
<p>Seit meinem Update auf openSUSE 11.0 zeigte das openSUSE-Updater-Applet (<code>opensuseupdater-kde</code>) mir alle Aktualisierungen doppelt an. Grund war, dass ich versehentlich zwei Update-Repositories eingebunden hatte. Das Entfernen eines der beiden Repositories löste das Problem.
<!--break-->
<img src="https://marix.org/Anhänge/doppelteUpdatesImOpensuseUpdaterApplet.png" />
Im Bild ist zu sehen, dass die Updates für Java 5 und Java 6 doppelt vorhanden …</p>
<p>Seit meinem Update auf openSUSE 11.0 zeigte das openSUSE-Updater-Applet (<code>opensuseupdater-kde</code>) mir alle Aktualisierungen doppelt an. Grund war, dass ich versehentlich zwei Update-Repositories eingebunden hatte. Das Entfernen eines der beiden Repositories löste das Problem.
<!--break-->
<img src="https://marix.org/Anhänge/doppelteUpdatesImOpensuseUpdaterApplet.png" />
Im Bild ist zu sehen, dass die Updates für Java 5 und Java 6 doppelt vorhanden sind. Da das Applet nur eine graphische Schnittstelle für zypper ist lag es nahe zu schauen, ob dieses das gleiche Verhalten aufweist.</p>
<p><pre><code>marix@eddie:~> zypper lu
Die Daten des Repositorys 'Lokale RPMs' sind veraltet. Sie können 'zypper refresh' als Root ausführen, um die Daten zu aktualisieren.
Lese installierte Pakete...
Patches</p>
<p>Repository | Name | Version | Kategorie | Status
------------------------------+----------------+---------+-----------+---------
openSUSE-11.0-FTP-UPDATE 11.0 | java-1_5_0-sun | 96 | security | Benötigt
openSUSE-11.0-Updates | java-1_5_0-sun | 96 | security | Benötigt
openSUSE-11.0-FTP-UPDATE 11.0 | java-1_6_0-sun | 97 | security | Benötigt
openSUSE-11.0-Updates | java-1_6_0-sun | 97 | security | Benötigt</code></pre></p>
<p>Auch zypper zeigt jedes Update doppelt. Doch auch die Ursache des Problems ist zu sehen. Jede Aktualisierung ist aus zwei verschiedenen Repositories zu beziehen. Das erklärt sowohl wieso es die Updates doppelt gibt, als auch, wieso trotzdem immer korrekt aktualisiert wurde. Denn zypper hat immer nur das Update aus der ersten Quelle wirklich installiert, ähnlich wie bei Paketen die aus mehreren Quellen zu holen sind.</p>
<p><pre><code>marix@eddie:~> zypper lr
# | Alias | Name | Aktiviert | Auffrischen
---+-------------------------------+-----------------------------------+-----------+------------
1 | Lokale_RPMs | Lokale RPMs | Ja | Ja
2 | suse_1 | openSUSE-11.0-FTP-SRC-NonOSS 11.0 | Ja | Ja
3 | Marix'_Home_Repository_1 | Marix' Home Repository | Ja | Ja
4 | NVIDIA_Repository | NVIDIA Repository | Ja | Ja
5 | KDE:KDE4:Factory:Desktop | KDE:KDE4:Factory:Desktop | Ja | Ja
6 | openSUSE-11.0-FTP_11.0 | openSUSE-11.0-FTP 11.0 | Ja | Ja
7 | home:thindil_1 | home:thindil | Ja | Ja
8 | VideoLan_Repository | VideoLan Repository | Ja | Ja
9 | 11.0 | openSUSE-11.0-FTP-UPDATE 11.0 | Ja | Ja
10 | openSUSE-11.0-FTP-DEBUG_11.0 | openSUSE-11.0-FTP-DEBUG 11.0 | Ja | Ja
11 | Marix'_Sane_Repository | Marix' Sane Repository | Nein | Ja
12 | openSUSE-11.0-Updates | openSUSE-11.0-Updates | Ja | Ja
13 | Security_and_Privacy_1 | Security and Privacy | Ja | Ja
14 | home:dstoecker | home:dstoecker | Nein | Ja
15 | Packman_Repository | Packman Repository | Ja | Ja
16 | openSUSE-11.0-FTP-NonOSS_11.0 | openSUSE-11.0-FTP-NonOSS 11.0 | Ja | Ja
17 | openSUSE-DVD 11.0 | openSUSE-DVD 11.0 | Nein | Nein
18 | suse | openSUSE-11.0-FTP-SRC 11.0 | Ja | Ja</code></pre></p>
<p>In der Auflistung aller Quellen sieht man an Position 9 und 12 die beiden Update-Repositories. Zum Glück kann man mit zypper die Repositories auch über ihre Nummer identifizieren, so ist das entfernen nur wenig Tipparbeit.</p>
<p><pre><code>marix@eddie:~> sudo zypper rr 9
Entferne Repository 'openSUSE-11.0-FTP-UPDATE 11.0' [fertig]
Repository 'openSUSE-11.0-FTP-UPDATE 11.0' wurde entfernt.</code></pre></p>
<p>Eine anschließende Überprüfung der verfügbaren Updates zeigt, dass das Problem erfolgreich behoben wurde.</p>
<p><pre><code>marix@eddie:~> sudo zypper refresh
Lade Metadaten von Repository 'Lokale RPMs' herunter [fertig]
Repository 'openSUSE-11.0-FTP-SRC-NonOSS 11.0' ist aktuell.
Repository 'Marix' Home Repository' ist aktuell.
Repository 'NVIDIA Repository' ist aktuell.
Repository 'KDE:KDE4:Factory:Desktop' ist aktuell.
Repository 'openSUSE-11.0-FTP 11.0' ist aktuell.
Repository 'home:thindil' ist aktuell.
Repository 'VideoLan Repository' ist aktuell.
Repository 'openSUSE-11.0-FTP-DEBUG 11.0' ist aktuell.
Repository 'openSUSE-11.0-Updates' ist aktuell.
Repository 'Security and Privacy' ist aktuell.
Repository 'Packman Repository' ist aktuell.
Repository 'openSUSE-11.0-FTP-NonOSS 11.0' ist aktuell.
Repository 'openSUSE-11.0-FTP-SRC 11.0' ist aktuell.
Alle Repositories wurden aufgefrischt.
marix@eddie:~> zypper lu
Lese installierte Pakete...
Patches</p>
<p>Repository | Name | Version | Kategorie | Status
----------------------+----------------+---------+-----------+---------
openSUSE-11.0-Updates | java-1_5_0-sun | 96 | security | Benötigt
openSUSE-11.0-Updates | java-1_6_0-sun | 97 | security | Benötigt</code></pre></p>
<p>Ist man sowieso schon auf der Konsole unterwegs kann man die Updates auch gleich von dort einspielen.</p>
<p><pre><code>marix@eddie:~> sudo zypper up
Lese installierte Pakete...</p>
<p>Die folgenden Pakete werden aktualisiert:
java-1_6_0-sun java-1_6_0-sun-devel java-1_6_0-sun-alsa java-1_6_0-sun-jdbc
java-1_5_0-sun-plugin java-1_5_0-sun</p>
<p>Die folgenden NEUEN Patches werden installiert:
java-1_6_0-sun java-1_5_0-sun</p>
<p>Gesamtgröße des Herunterladens: 55,5 M. Nach der Operation werden zusätzlich 21,1 M genutzt.
Fortfahren? [JA/nein]:
Herunterladen von Paket java-1_6_0-sun-1.6.0.u7-1.1.x86_64 (1/8), 21,9 M (79,6 M installiert)
Lade Delta herunter: ./rpm/x86_64/java-1_6_0-sun-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm, 437,3 K
Lade herunter: java-1_6_0-sun-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig (127,1 K/s)]
Wende Delta an: ./java-1_6_0-sun-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Installiere: java-1_6_0-sun-1.6.0.u7-1.1 [fertig]
Herunterladen von Paket java-1_5_0-sun-1.5.0_update16-1.1.i586 (2/8), 20,1 M (74,4 M installiert)
Lade herunter: java-1_5_0-sun-1.5.0_update16-1.1.i586.rpm [fertig (195,7 K/s)]
Installiere: java-1_5_0-sun-1.5.0_update16-1.1 [fertig]
Herunterladen von Paket java-1_6_0-sun-devel-1.6.0.u7-1.1.x86_64 (3/8), 13,0 M (51,9 M installiert)
Lade Delta herunter: ./rpm/x86_64/java-1_6_0-sun-devel-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm, 6,2 M
Lade herunter: java-1_6_0-sun-devel-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig (130,2 K/s)]
Wende Delta an: ./java-1_6_0-sun-devel-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Installiere: java-1_6_0-sun-devel-1.6.0.u7-1.1 [fertig]
Herunterladen von Paket java-1_6_0-sun-alsa-1.6.0.u7-1.1.x86_64 (4/8), 40,0 K (88,0 K installiert)
Lade Delta herunter: ./rpm/x86_64/java-1_6_0-sun-alsa-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm, 16,5 K
Lade herunter: java-1_6_0-sun-alsa-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Wende Delta an: ./java-1_6_0-sun-alsa-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Installiere: java-1_6_0-sun-alsa-1.6.0.u7-1.1 [fertig]
Herunterladen von Paket java-1_6_0-sun-jdbc-1.6.0.u7-1.1.x86_64 (5/8), 32,0 K (88,0 K installiert)
Lade Delta herunter: ./rpm/x86_64/java-1_6_0-sun-jdbc-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm, 16,2 K
Lade herunter: java-1_6_0-sun-jdbc-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Wende Delta an: ./java-1_6_0-sun-jdbc-1.6.0.u6_1.6.0.u7-8.1_1.1.x86_64.delta.rpm [fertig]
Installiere: java-1_6_0-sun-jdbc-1.6.0.u7-1.1 [fertig]
Herunterladen von Paket java-1_5_0-sun-plugin-1.5.0_update16-1.1.i586 (6/8), 469,0 K (1,7 M installiert)
Lade Delta herunter: ./rpm/i586/java-1_5_0-sun-plugin-1.5.0_update15_1.5.0_update16-12.1_1.1.i586.delta.rpm, 60,7 K
Lade herunter: java-1_5_0-sun-plugin-1.5.0_update15_1.5.0_update16-12.1_1.1.i586.delta.rpm [fertig]
Wende Delta an: ./java-1_5_0-sun-plugin-1.5.0_update15_1.5.0_update16-12.1_1.1.i586.delta.rpm [fertig]
Installiere: java-1_5_0-sun-plugin-1.5.0_update16-1.1 [fertig]</code></pre></p>
Dateinamen in Gnuplot vervollständigen2008-04-07T14:27:55+02:002013-01-28T13:04:56+01:00Matthias Bachtag:marix.org,2008-04-07:/dateinamen-gnuplot-vervollständigen.html<p>In <a href=
<p>In <a href="http://www.ubuntu.com/">Ubuntu</a> fehlt <a href="http://www.gnuplot.info/">Gnuplot</a> leider die Unterstützung für <a href="http://tiswww.case.edu/php/chet/readline/rltop.html">die GNU Readline Bilbliothek</a>. Deshalb kann man Dateinamen leider nicht mit der Tabulatortaste vervollständigen lassen.</p>
<p>Auf http://telin.ugent.be/~slippens/drupal/node/158 wird beschrieben, wie man mithilfe von <a href="http://utopia.knoware.nl/~hlub/rlwrap/">rlwrap</a> das Problem umgehen kann. Ist rlwrap noch nicht installiert lässt sich das leicht nachholen.<br>
<pre><code>sudo aptitude install rlwrap</code></pre>
Anschließend ruft man gnuplot mithilfe von rlwrap auf. <code>-c</code> steht hierbei für die Vervollsändigung von Dateinamen, <code>-a</code> sorgt dafür, dass rlwrap uns die Vervollständigung unabhängig vom ausgeführten Programm anbietet.<br>
<pre><code>rlwrap -a -c gnuplot</code></pre></p>
<p>Der expliziete Aufruf von rlwrap entfällt durch das Hinzufügen eines Alias in <code>~/.bashrc</code>.<br>
<pre><code>alias gnuplot='rlwrap -a -c /usr/bin/gnuplot' </code></pre>
Anschließend lassen sich in Gnuplot von Anführungszeichen gesetzte Dateinamen mit der Tabulatortaste vervollständigen.
</p>
Unsichtbare Wände in Descent 3 mit Wine2008-04-06T10:46:08+02:002013-01-28T13:05:49+01:00Matthias Bachtag:marix.org,2008-04-06:/unsichtbare-wände-descent-3-mit-wine.html
<p>Wer unter Linux mithilfe von Wine die Windowsversion von Descent 3 spielt hatte seit ein paar Versionen mit unsichtaren Wänden zu kämpfen, genauer genommen mit einem abgeschalteten Z-Buffer-Test. <a href="http://www.winehq.org/?announce=0.9.59">Wine 0.9.59</a> behebt den Bug wieder. Fertige Pakete finden sich im <a href="http://software.opensuse.org/search?baseproject=ALL&p=1&q=wine">openSUSE Build Service</a>.</p>
LVM unter Knoppix verwenden2008-04-03T20:52:35+02:002010-08-17T00:19:28+02:00Matthias Bachtag:marix.org,2008-04-03:/lvm-unter-knoppix-verwenden.html<p>Muss man in einem System das LVM nutzt die Festplatte wechseln hilft Knoppix bei der Migration. Prinzipiell kann man einfach direkt die Partitionen von einer auf die andere Platte kopieren, möchte man aber diese Gelegenheit nutzen um das die Festplatte neu aufzuteilen, z.B. LVM nur noch für die Distribution zu verwenden während der Rest in einem RAID landet, muss man sich damit beschäftigen wie man LVM unter Knoppix nutzt.
</p>
<p>Muss man in einem System das LVM nutzt die Festplatte wechseln hilft Knoppix bei der Migration. Prinzipiell kann man einfach direkt die Partitionen von einer auf die andere Platte kopieren, möchte man aber diese Gelegenheit nutzen um das die Festplatte neu aufzuteilen, z.B. LVM nur noch für die Distribution zu verwenden während der Rest in einem RAID landet, muss man sich damit beschäftigen wie man LVM unter Knoppix nutzt.</p>
<p>Wie auch RAID nutzt LVM den Device Mapper. Dieser wird bei Knoppix, das ja eigentlich keine Festplatte verwendet, nicht automatisch geladen. Dies lässt sich aber leicht von Hand nachholen.</p>
<p><pre><code>modprobe md</code></pre></p>
<p>Nun sollte man die physikalischen Volume Groups suchen auf denen sich die logischen Volumes befinden.</p>
<p><pre><code>vgscan --mknodes</code></pre></p>
<p>Diese lassen sich nun mit mit <code>vgchange</code> aktivieren.</p>
<p><pre><code>vgchange -a y</code></pre></p>
<p>Jetzt lassen sich auch die logischen Volumes anzeigen.</p>
<p><pre><code>lvscan</code></pre></p>
<p>Dies erzeugt auch die notwendigen Device-Dateien, so dass man die darauf befindlichen Dateisysteme anschließend mounten kann. In meinem Fall das alte /- und das alte /local-Dateisystem, welche sich auf den logischen Volumes root und local befinden. Diese sind gehören zur Gruppe system.</p>
<p><pre><code>mkdir /media/oldroot
mkdir /media/oldlocal
mount /dev/system/root /media/oldroot
mount /dev/system/local /media/oldlocal</code></pre></p>
<p>Um die Dateien auf das neue Dateisystem zu schieben muss auf der Zielfestplatte erst das physische Volume erstellt werden. Die dafür zuvor notwendige Partitionierung geschieht am einfachsten mit YaST noch aus dem alten laufenden System bevor man den Umzug startet.</p>
<p><pre><code>pvcreate /dev/sdc2</code></pre></p>
<p>Auf dem physischen Volume lässt sich dann die neue Volume-Group erstellen. Ich verwende den Namen noraid mir selbst zu verdeutlichen auf dieser Gruppe keine wichtigen Daten abzulegen.</p>
<p><pre><code>vgcreate noraid /dev/sdc2</code></pre></p>
<p>Auf dieser neuen Gruppe können nun logische Volumes angelegt werden. In diesem Fall wieder root und local. Mit <code>-L</code> wird hierbei die Größe des Volumes angegeben.</p>
<p><pre><code>lvcreate -n root -L 20G noraid
lvcreate -n local -L 40G noraid</code></pre></p>
<p>Nun müssen auf den Volumes Dateisysteme angelegt werden. In meinem Fall ext3 mit den Standardeinstellungen.</p>
<p><pre><code>mkfs.ext3 /dev/noraid/root
mkfs.ext3 /dev/noraid/local</code></pre></p>
<p>Die neu erstellten Dateisysteme lassen sich nun mounten.</p>
<p><pre><code>mkdir /media/newroot
mkdir /media/newlocal
mount /dev/noraid/root /media/newroot
mount /dev/noraid/local /media/newlocal</code></pre></p>
<p>Jetzt können wir die Dateien von der alten Platte auf die neue Kopieren. Hierbei sorgt <code>--archive</code> dafür, dass die Metadaten der kopieren Dateien wie Zugriffs- und Erstellungszeiten, Berechtigungen usw. nicht ändern und symbolische Links als solche erhalten bleiben.</p>
<p><pre><code>cp --archive /media/oldroot/* /media/newroot/
cp --archive /media/oldlocal/* /media/newlocal/</code></pre></p>
<p>Ist der Vorgang beendet, was durchaus eine Weile dauern sollte, sollte man die Dateisysteme wieder unmounten und anschließend mit <code>vgchange</code> LVM wieder anhalten.</p>
<p><pre><code>umount /media/oldroot
umount /media/oldlocal
umount /media/newroot
umount /media/newlocal</p>
<p>vgchange -a n</code></pre></p>
<p>Eine sehr gute Referenz zum zu LVM ist das <a href="http://www.linuxhaven.de/dlhp/HOWTO/DE-LVM-HOWTO.html">Linux LVM HOWTO</a>.</p>
RAID5 unter Knoppix verwenden2008-04-03T19:44:33+02:002010-08-17T00:10:03+02:00Matthias Bachtag:marix.org,2008-04-03:/raid5-unter-knoppix-verwenden.html
<p>Möchte man Änderungen an den Festplatten durchführen ist eine Live-System wie Knoppix sehr praktisch, da es unabhängig von diesen seinen Dienst verrichtet. Dies funktioniert selbst dann, wenn auf dem System ein Software-RAID5 genutzt wird.</p>
<p><!--break--></p>
<p>Knoppix lädt, vermutlich da es meist als Live-System ohne Festplatten verwendet wird, den dafür benötigten Treiber …</p>
<p>Möchte man Änderungen an den Festplatten durchführen ist eine Live-System wie Knoppix sehr praktisch, da es unabhängig von diesen seinen Dienst verrichtet. Dies funktioniert selbst dann, wenn auf dem System ein Software-RAID5 genutzt wird.</p>
<p><!--break--></p>
<p>Knoppix lädt, vermutlich da es meist als Live-System ohne Festplatten verwendet wird, den dafür benötigten Treiber nicht von alleine. Dies lässt sich aber problemlos von Hand erledigen.</p>
<p><pre><code>modprobe md</code></pre></p>
<p>Da der Treiber nicht in den Kernel einkompiliert ist, sondern als Modul geladen wird ist es leider nicht möglich alle RAIDs mithilfe automatisch zu laden.</p>
<p><pre><code>mdadm --auto-detect</code></pre></p>
<p>Zunächst einmal lässt sich inspizieren, auf welchen Partitionen sich überhaupt ein RAID befindet. Die zwei Fragezeichen sorgen dafür, dass alle Partitionen auf allen Festplatten durchsucht werden. Zumindest solange keine Platte mehr als 10 Partitionen hat.</p>
<p><pre><code>mdadm --examine --brief /dev/sd??</code></pre></p>
<p>Hat man alle Partitionen des RAID gefunden lässt sich dieses mit mdadm --assemble in Betrieb nehmen. Hier liegt das RAID bei zwei Platten auf der dritten und bei einer auf der ersten Partition jeder Platte und wir verwenden den RAID-Device 0 für unser RAID.</p>
<p><pre><code>mdadm --assemble /dev/md/0 /dev/sda3 /dev/sdb3 /dev/sdc1</code></pre></p>
<p>Der Erfolg lässt sich mit im proc-Dateisystem überprüfen.</p>
<p><pre><code>cat /proc/mdstat
Personalities : [linear] [raid6] [raid5] [raid4]
md0 : active raid5 sda3[0] sdc1[3] sdb3[2]
808984832 blocks super 1.0 level 5, 64k chunk, algorithm 2 [3/3] [UUU]</p>
<p>unused devices: <none></code></pre></p>
<p>Damit haben wir das RAID als Festplatte eingebunden. Jetzt müssten wir noch noch das darauf befindliche Dateisystem einbinden. Hierzu legen wir einen Ordner an und binden mit Mounten den RAID-Device auf diesen.</p>
<p><pre><code>mkdir /media/raid
mount /dev/md0 /media/raid</code></pre></p>
<p>Jetzt lässt sich das RAID verwenden. Um die Datenkonsistenz zu wahren empfiehlt es sich das Dateisystem vor dem Herunterfahren explizit vom Dateisystem zu lösen und anschließend das RAID anzuhalten.</p>
<p><pre><code>umount /media/raid
mdadmin --stop /dev/md/0</code></pre></p>
<p>Mehr Informationen zu den einzelnen Befehlen und zur allgemeinen Verwendung von Software RAID finden sich im <a href="http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO.html">Software-RAID HOWTO</a>.</p>
Rootkits und Rootkit-Erkennung2008-04-03T07:48:07+02:002010-08-17T00:09:40+02:00Matthias Bachtag:marix.org,2008-04-03:/rootkits-und-rootkit-erkennung.html
<p>Im Mai 2006 hielt ich im Seminar <a href="http://pvs.informatik.uni-heidelberg.de/Teaching/csfp-06.html">Computersicherheit für Paranoiker</a> diesen Vortrag, in dem ich zunächst über die Klassifikation und Funktionsweise von Rootkits sprach um dann Abwehrstrategien und Software zur Erkennung von Rootkits vorzustellen.</p>
<p><!--break--></p>
<p>Zum Herunterladen:
<ul>
<li><a href="https://marix.org/Anhänge/notes.pdf">Vortragsfolien mit Notizen als PDF</a>
<li><a href="https://marix.org/Anhänge/rootkits.tar.gz">Latex-Quelltext des Vortrags</a>
</ul></p>
<p>Weitere Vorträge zur Computersicherheit von anderen …</p>
<p>Im Mai 2006 hielt ich im Seminar <a href="http://pvs.informatik.uni-heidelberg.de/Teaching/csfp-06.html">Computersicherheit für Paranoiker</a> diesen Vortrag, in dem ich zunächst über die Klassifikation und Funktionsweise von Rootkits sprach um dann Abwehrstrategien und Software zur Erkennung von Rootkits vorzustellen.</p>
<p><!--break--></p>
<p>Zum Herunterladen:
<ul>
<li><a href="https://marix.org/Anhänge/notes.pdf">Vortragsfolien mit Notizen als PDF</a>
<li><a href="https://marix.org/Anhänge/rootkits.tar.gz">Latex-Quelltext des Vortrags</a>
</ul></p>
<p>Weitere Vorträge zur Computersicherheit von anderen Studenten sind auf der <a href="http://pvs.informatik.uni-heidelberg.de/Teaching/CSFP-06/">Materialienseite des Seminars</a>, sowie auf der <a href="http://pvs.informatik.uni-heidelberg.de/Teaching/CSFP-0506/index.html">Materialienseite des vorherigen Semesters</a> zu finden.
</p>
Paketverwaltung verloren2008-02-29T07:49:19+01:002013-01-28T13:06:59+01:00Matthias Bachtag:marix.org,2008-02-29:/paketverwaltung-verloren.html
<p>Auf leider nicht nachvollziehbare Weise hatte ich letztens plötzlich mein YaST verloren. Dies machte sich dadurch bemerkbar, dass KDE den Versuch "Installieren von Software" zu Starten mit der Bemerkung es könne "/sbin/yast" nicht finden beendete. Zeitlich fiel das ganze mit einem KDE4-Update zusammen, allerdings war mir bei diesem kein …</p>
<p>Auf leider nicht nachvollziehbare Weise hatte ich letztens plötzlich mein YaST verloren. Dies machte sich dadurch bemerkbar, dass KDE den Versuch "Installieren von Software" zu Starten mit der Bemerkung es könne "/sbin/yast" nicht finden beendete. Zeitlich fiel das ganze mit einem KDE4-Update zusammen, allerdings war mir bei diesem kein Konflikt aufgefallen.</p>
<p>Zum Glück wird die Paket- und Quellenverwaltung inzwischen nicht mehr YaST-intern abgehandelt, sondern durch die libzypper, für die mit zypper auch ein Kommandozeilenwerkzeug existiert. So ließ sich YaST schnell wieder installieren.</p>
<p><!--break--></p>
<p><pre><code>sudo zypper install yast2</code></pre></p>
<p>So bekam ich zwar mein YaST zurück, leider fehlte aber immer noch das Paket zum "Installieren von Software". Mit zypper war dies allerdings auch schnell gefunden.</p>
<p><pre><code>zypper search yast</code></pre></p>
<p>Das gesuchte Paket heißt yast2-packager, also schnell mit zypper installiert.</p>
<p><pre><code>sudo zypper install yast2-packager</code></pre></p>
Rechner ausschalten mit openSUSE 10.32008-02-27T10:15:05+01:002013-01-28T13:07:35+01:00Matthias Bachtag:marix.org,2008-02-27:/rechner-ausschalten-mit-opensuse-103.html
<p>Nachdem ich endlich dazu gekommen war das Windows 2000 auf einem alten PIII 550 MHz durch openSUSE 10.3 zu ersetzen funktionierte der Rechner zwar wunderbar, allerdings weigerte er sich beharrlich sich nach dem Herunterfahren selbständig abzuschalten. Auch unter Windows hatte es damals etwas Nachdruck bei der Konfiguration der Energieverwaltung …</p>
<p>Nachdem ich endlich dazu gekommen war das Windows 2000 auf einem alten PIII 550 MHz durch openSUSE 10.3 zu ersetzen funktionierte der Rechner zwar wunderbar, allerdings weigerte er sich beharrlich sich nach dem Herunterfahren selbständig abzuschalten. Auch unter Windows hatte es damals etwas Nachdruck bei der Konfiguration der Energieverwaltung gebraucht, aber wie diesen Nachdruck unter Linux ausüben? Der Vergleich der Aufrufe des normalen und des Safemode-Systems in Grub legte schnell nahe alle Kombinationen der Parameter apm bzw. acpi = off oder on durchzuspielen. Doch alles half nichts. <a href="http://lists.opensuse.org/opensuse/2008-02/msg03121.html">Der entscheidende Hinweis</a> kam dann zufällig auf der opensuse Mailingliste. Mit der Parametrisierung apm=off und acpi=force schaltet das System sich wie gewünsch von alleine ab sobald es heruntergefahren ist. Das ganze noch mit Hilfe von Yast direkt in GRUB eingetragen und das System läuft, bzw. schaltet ab wie Butter.</p>
Umzug einer Amarok-Sammlung von SQLite nach MySQL2008-01-16T23:14:27+01:002013-01-28T13:08:08+01:00Matthias Bachtag:marix.org,2008-01-16:/umzug-einer-amarok-sammlung-von-sqlite-nach-mysql.html<p>Eigentlich gibt es im <a href=
<p>Eigentlich gibt es im <a href="http://amarok.kde.org/wiki/Hauptseite">Amarok-Wiki</a> eine schöne <a href="http://amarok.kde.org/wiki/De:MySQL_HowTo">Anleitung</a> wie man seine Sammlung von <a href="http://www.sqlite.org/">SQLite</a> nach <a href="http://www.mysql.com">MySQL</a> konvertieren kann. Leider stieß ich dabei allerdings auf ein paar, zum Glück leicht lösbare, Schwierigkeiten.</p>
<p>Zunächst einmal habe ich analog zur Anleitung mit <a href="http://www.phpmyadmin.net/">phpMyAdmin</a> eine Datenbank mit dazugehörigem Benutzer für <a href="http://amarok.kde.org>Amarok</a> angelegt. Dann habe ich der Anleitung folgend meine SQLite Datenbank erstmal in eine Datei exportiert.</p>
<p>Beim ersten Import-Versuch hatte ich Probleme mit den create-Befehlen in der exportierten Datenbank. Diese kann man aber umgehen, indem man alle " create table"-befehle aus der datei entfernt. um jetzt trotzdem zu einer datenbank zu kommen sollte man amarok kurz starten und schon einmal gegen mysql-datenbank konfigurieren. dann werden alle tabellen wie benötigt angelegt. anschließend sollte man amarok gleich wieder beenden um probleme durch parallele manipulationen der datenbank zu vermeiden.< p>
<p>Beim nächsten Importversuch scheiterte ich an einer "Duplicate Key"-Fehlermeldung. Ursache des ganzen war, dass die Datenbank mit der <a href="http://en.wikipedia.org/wiki/Collation">Kollation</a> latin1_swedish_ci erstellt worden war, Amarok aber wie ganz KDE natürlich mit UTF-8 Zeichenketten arbeitet. Zum Glück kann man die Kollation in phpMyAdmin wenn man die Datenbank ausgewählt hat im Tab Operationen leicht auf utf8_general_ci ändern. Anschließend einmal alle Tabellen droppen und nochmal von vorne. Die Kollation latin1_swedish_ci scheint übrigens entweder in MySQL oder phpMyAdmin die Standardeinstellung zu sein. Zumindest habe ich dieses Verhalten schon auf mehreren Systemen beobachtet. Wer aufpasst kann sie übrigens in phpMyAdmin auch gleich beim Anlegen der Datenbank richtig auswählen.</p>
<p>Als nächstes stolperte ich über eine weitere kleine Inkonsistenz. So beachtet Amarok bei Verwendung der SQLite-Datenbank bei den Tags anscheinend die Groß-/Kleinschreibung. Dies macht natürlich eigentlich keinen Sinn, und da eine Groß-/Kleinschreibung ignorierende Kollation ausgewählt war hat MySQL sich natürlich korrekterweise über den Versuche mehrere gleiche Tags anzulegen beschwert. Also einfach mit einem Texteditor die Duplikate aus der Datai entfernt, Tabellen geleert und wieder von vorne.</p>
<p>Am Ender der Datei folgen noch ein paar "index create"-Statements. Da diese von Amarok bereits angelegt wurden schlagen diese ntürlich fehl. Da es die letzten Statements sind und die MySQL-Datenbank nicht transaktional ist kann man diesen Fehler aber getrost ignorieren.</p>
<p>Grund für die ganze Aktion war übrigens, dass Amarok bei großen Sammlungen mit der MySQL-Datenbank einiges schneller sein soll. Subjektiv scheint dies auch zu stimmen, allerdings habe ich keine Messungen durchgeführt welche diese Behauptung bestätigen.</p>
<p></p>
Glimpfliche Schrecksekunden mit Amarok2008-01-15T16:11:33+01:002013-01-28T13:08:50+01:00Matthias Bachtag:marix.org,2008-01-15:/glimpfliche-schrecksekunden-mit-amarok.html<p>Nach einem durch Harwarefehler bedingten kurzfristigen Umzug meines Systems auf ein RAID5 bereitete <a href=
<p>Nach einem durch Harwarefehler bedingten kurzfristigen Umzug meines Systems auf ein RAID5 bereitete <a href="http://amarok.kde.org">Amarok</a> mir zwei kurze Schrecksekunden. Zum Glück ließen aber beide sich ohne Probleme und viel Aufwand beseitigen.</p>
<p>Zunächst fingen alle Einträge in meiner Datenbank an sich zu verdoppeln. Sobald man ein Stück spielte oder es auch nur in die Wiedergabeliste hinzufügte fand man auf einmal zwei Einträge in der Datenbank. Diese waren absolut identisch und verwiesen auf die gleiche Datei. Dateien die neu zur Sammlung hinzugefügt wurden zeigten das verhalten interessanterweise nicht. Da ich die MySQL-Datenbank aufgrund des Umzugs die Datenbank sowieso gerade erst gesichert hatte wagte ich ein "Extras->Sammlung neu erfassen". Anschließend waren alle doppelten Einträge verschwunden, neue Duplikate gab es auch keine und Statistiken sind auch nicht verloren gegangen.</p>
<p>Die nächste Schrecksekunde kam kurz darauf. Leide kann ich nicht mehr nachvollziehen, ob eine Aktualisierung von Amarok oder die Erweiterung des RAID um eine weitere Festplatte die Ursache war. Plötzlich fehlten sämtliche Stücke in meiner Sammlung. Die Dateien waren natürlich noch dar und interessanterweise waren in den Tabellen der MySQL-Datenbank auch noch alle Einträge vorhanden, nur Amarok hielt es anscheinen nicht für nötig diese anzuzeigen. Nach der positiven Erfahrung beim letzten Problem wagte ich auch hier, natürlich mit einer aktuellen Datensicherung ausgerüstet, ein "Extras->Sammlung neu erfassen". Keine 10 Minuten später war die Sammlung wieder da, inklusive aller Statistiken.</p>
<p>Hinzuzufügen ist, dass ich nicht die offiziell mit openSUSE ausgelieferte Version von Amarok verwende, sondern die aus dem <a href="http://packman.links2linux.org">Packman Repository</a>. Der mit mit openSUSE ausgelieferte Version fehlt nämlich die Unterstützung für MySQL.</p>
Umzug abgeschlossen2007-10-24T20:50:33+02:002007-10-24T20:50:33+02:00Matthias Bachtag:marix.org,2007-10-24:/umzug-abgeschlossen.html
<p>Der Umzug ist erfolgreich abgeschlossen. Jetzt wird wieder an Inhalten gearbeitet.</p>
Auszeiten2007-10-22T12:32:44+02:002007-10-22T12:32:44+02:00Matthias Bachtag:marix.org,2007-10-22:/auszeiten.html
<p>Auch wenn die wichtigsten Komponent von Marix World inzwischen umgezogen sind wird immer noch kräftig gearbeitet. Unter anderem an den Nameservern. Dadurch kann es auch in den nächsten Tagen immer wieder zu Ausfällen von bis zu 24 Stunden kommen.</p>
Umgezogen2007-10-20T11:46:26+02:002007-10-22T19:30:44+02:00Matthias Bachtag:marix.org,2007-10-20:/umgezogen.html
<p>Marix World ist auf einen Server umgezogen. Nachdem bei Server4You nur noch das nicht mehr unterstützte SuSE 9.3 angeboten wurde ist Marix World auf einen neuen Server bei Strato umgezogen. Dadurch kam es leider zu ein paar Ausfällen, da die Nameservereinträge erst korrekt weiterpropagiert werden mussten, aber sobald dieser …</p>
<p>Marix World ist auf einen Server umgezogen. Nachdem bei Server4You nur noch das nicht mehr unterstützte SuSE 9.3 angeboten wurde ist Marix World auf einen neuen Server bei Strato umgezogen. Dadurch kam es leider zu ein paar Ausfällen, da die Nameservereinträge erst korrekt weiterpropagiert werden mussten, aber sobald dieser Text lesbar ist war alles erfolgreich.</p>
Zattoo unter openSUSE 10.2 64-Bit2007-09-15T22:29:51+02:002013-01-28T13:09:46+01:00Matthias Bachtag:marix.org,2007-09-15:/zattoo-unter-opensuse-102-64-bit.html<p>Wie auf <a href=http://www.heise.de/newsticker/meldung/95981>heise online</a> berichtet ist <a href=http://www.zattoo.de>Zattoo</a> jetzt auch in Deutschland frei verfügbar. Leider aber nur als 32-Bit-Programm und mit einer etwas merkwürdigen Installationsanleitung.</p>
<p>Zum Herunterladen ist zunächst eine Registrierung notwendig. Entgegen der Aussage auf der Webseite muss man aber eigentlich noch nicht mal eine gültige Emailaddresse verwenden, da keine Aktivierungsemail verschickt wird, sondern die Addresse wirklich lediglich zur Benutzeridentifikation verwendet wird.</p>
<p>Wie auf <a href="http://www.heise.de/newsticker/meldung/95981">heise online</a> berichtet ist <a href="http://www.zattoo.de">Zattoo</a> jetzt auch in Deutschland frei verfügbar. Leider aber nur als 32-Bit-Programm und mit einer etwas merkwürdigen Installationsanleitung.</p>
<p>Zum Herunterladen ist zunächst eine Registrierung notwendig. Entgegen der Aussage auf der Webseite muss man aber eigentlich noch nicht mal eine gültige Emailaddresse verwenden, da keine Aktivierungsemail verschickt wird, sondern die Addresse wirklich lediglich zur Benutzeridentifikation verwendet wird.</p>
<p>Die Installationsanleitung verwundert etwas, da sie unter anderem möchte, dass man XULRunner in das Zattoo-Verzeichnis installiert, obwohl dieses eigentlich bei openSUSE mitgeliefert wird. An den in der Anleitung angegebenen von Hand angelegten symbolischen Links kommt man leider nicht vorbei. Außerdem sind im RPM leider keine Abhängigkeiten gepflegt. Deshalb müssen einige Bibliotheken leider von Hand auf 32-Bit umgestellt werden.</p>
<p>Bevor man das Zattoo-RPM installiert sollte man zunächst sicherstellen, dass man die folgenden Libraries in 32-Bit installiert hat. Es kann sein, dass weitere Bibliotheken benötigt werden, aber diese sind mir aufgefallen. Um ein Paket in 32-Bit zu installieren muss man im YAST Packetmanagment im Reiter Version die 32-Bit Version (i586) auswählen. Ist das Paket schon installiert kann es notwendig sein das Paket auch noch von Hand auf "Aktualisieren" zu setzen.
<ul>
<li>libgnomeui-32bit (Ok, die ist immer 32-Bit)</li>
<li>gtkglext</li>
<li>mozilla-xulrunner181</li>
<li>faad2</li>
</ul></p>
<p>Nachdem das Zattoo-RPM installiert ist müssen die symbolischen Links hinzugefügt werden. Möchte man die XULRunner-Bibliothek von openSUSE verwenden sehen die Links allerdings etwas anders aus.
<pre><code>sudo ln -s /usr/lib/xulrunner-1.8.1/libgtkembedmoz.so libgtkembedmoz.so.0d
sudo ln -s /usr/lib/xulrunner-1.8.1/libxpcom.so libxpcom.so.0d
sudo ln -s /usr/lib/xulrunner-1.8.1/libmozjs.so libmozjs.so.0d
sudo ln -s /usr/lib/libplds4.so libplds4.so.0d
sudo ln -s /usr/lib/libplc4.so libplc4.so.0d
sudo ln -s /usr/lib/libnspr4.so libnspr4.so.0d
sudo ln -s /usr/lib/xulrunner-1.8.1/libxul.so libxul.so.0d</code></pre></p>
<p>Anschließen muss man noch den Linker auf die im Zattoo-Verzichnis liegenden Bibliotheken und Links hinweisen.
<pre><code>sudo /sbin/ldconfig /usr/lib/zattoo/</code></pre>
Bei Auslassen dieses Schrittes stürzt Zattoo jedesmal ab sobald es anfängt einen Kanal abzuspielen. In der Logdatei <pre><code>~/.Zattoo/Data/logs/zattoo.errorlog</code></pre> findet sich dann eine Meldung, dass eine bestimmte Funktion nicht gefunden werden konnte. </p>
<p>Persönlich finde ich es auch noch praktisch das Programm als zattoo verfügbar zu machen, da zattoo_player doch etwas lang zum tippen ist und zattood ein Tab-Complete verhindert.
<pre><code>sudo ln -s /usr/bin/zattoo_player /usr/local/bin/zattoo</code></pre></p>
<p>Anchließen hat man einen funktionierenden P2P-Fernseher der auf den ersten Eindruck sehr gut zu funktionieren scheint.</p>
Lesezeichen aktualisiert2007-09-12T10:32:35+02:002007-09-12T10:32:35+02:00Matthias Bachtag:marix.org,2007-09-12:/lesezeichen-aktualisiert.html
<p>Die Lesezeichen wurden mal wieder aktualisiert. Hinzugekommen sind Verweise auf <a href="http://www.slyclan.de>Vortex</a>, die <a href=" http: odf.sf.net">Open Descent Foundation</a>, Tools wie <a href="http://www.i2p.net">I2P</a> und ein paar andere.</p>
Ton für OSS-Programme2007-07-05T21:04:43+02:002013-01-28T13:10:19+01:00Matthias Bachtag:marix.org,2007-07-05:/ton-für-oss-programme.html
<p>Auf meine OpenSUSE 10.2 Systeme hatte ich zunächst in Anwendungen wie X2, welche beim Ton noch auf OSS setzen, keinen Ton. Zum Glück lies sich das Problem am Ende durch ein einfaches Löschen der Konfiguration von KDesktop lösen.
<!--break-->
Statt Ton bekam ich bei allen Anwendungen die OSS verwenden eine …</p>
<p>Auf meine OpenSUSE 10.2 Systeme hatte ich zunächst in Anwendungen wie X2, welche beim Ton noch auf OSS setzen, keinen Ton. Zum Glück lies sich das Problem am Ende durch ein einfaches Löschen der Konfiguration von KDesktop lösen.
<!--break-->
Statt Ton bekam ich bei allen Anwendungen die OSS verwenden eine Fehlermeldung, obwohl der Ton bei anderen Anwendungen ging.
<pre><code>/dev/dsp: Das Gerät oder die Ressource ist belegt</code></pre>
Jegliche suche nach eventuell noch laufenden Programmen welche die Tonausgabe blockieren könnten brachte zunächst keinen Erfolg. Amarok, Arts etc. waren alle gegen Alsa konfiguriert. Es war auch ohne Probleme möglich mehrere Anwendungen gleichzeitig Ton ausgeben zu lassen. Auch waren die Treiber für die OSS-Emulation unter Alsa geladen.
<pre><code>marix@eddie:~> lsmod | grep oss
snd_pcm_oss 71680 0
snd_mixer_oss 35840 1 snd_pcm_oss
snd_pcm 115464 4 snd_pcm_oss,snd_hda_intel,snd_hda_codec
snd 89384 14 snd_pcm_oss,snd_mixer_oss,snd_seq,snd_seq_device,snd_hda_intel,snd_hda_codec,snd_pcm,snd_timer</code></pre>
Einen entscheidenden Hinweis lieferte ein mutiges Durchstarten von Alsa.
<pre><code>sudo /usr/sbin/rcalsasound restart</code></pre>
Danach hatte ich zwar Ton in X2, allerdings war mein Desktop auf einmal schwarz. Ein Neustarten von KDesktop bestätigte meinen Verdacht. Anschließend war die Tonausgabe wieder blockiert. Beim Neustarten von Alsa beendete KDestkop kommentarlos. Offensichtlich war es für die blockade der Tonausgabe, was sich auch leicht prüfen lies.
<pre><code>marix@eddie:~> lsof /dev/dsp* /dev/snd/**
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
kdesktop 19572 marix mem CHR 116,4 255811 /dev/snd/pcmC0D0p
kdesktop 19572 marix 11r CHR 116,2 255551 /dev/snd/timer
kdesktop 19572 marix 12u CHR 116,4 255811 /dev/snd/pcmC0D0p
kdesktop 19572 marix 13u CHR 116,6 255819 /dev/snd/controlC0</code></pre>
Blieb die Frage, wie man das Problem löst. Ein kurze Suche mit meiner Leiblingssuchmaschine (nicht die mit den zwei O, dafür bin ich schon zu lange im Netz) lieferte mir dann den entscheidenden Hinweis. Auf http://www.linux-club.de/ftopic60033.html ist zu lesen, dass diese Problem wohl durch die Konfiguration von KDesktop verursacht ist. Löschen der Konfiguration löst das Problem.
<pre><code>mv ~/.kde/share/config/kdesktoprc ~/.kde/share/config/kdesktoprc.bak</code></pre>
Leider habe ich nicht herausgefunden welcher Teil der Konfiguration das Problem verursacht, da diese eigentlich keine Informationen zur Tonausgabe enthält. Allerdings hat ein Löschen auch nur zur Folge, dass man den Bildschirmhintergrund und den Bildschirmschoner neu setzen muss, der Aufwand hält sich also in Grenzen.
Das beste daran ist, dass jetzt auch Descent 3 wieder richtig funktioniert. Das hatte sich bis jetzt nämlich immer kommentarlos gleich wieder beendet.</p>
<p>Kleines Update: Nach diesen Änderungen ist es jetzt auch möglich OSS-Programme mit aoss zu verwenden. Dies hat den Vorteil, dass man den Amarok im Hintergrund weiterlaufen kann und somit Musik und Anwendungston hat.</p>
Arts Startprobleme schnell gelöst2007-07-05T11:08:52+02:002013-01-28T13:10:45+01:00Matthias Bachtag:marix.org,2007-07-05:/arts-startprobleme-schnell-gelöst.html
<p>Seitdem ich mein KDE mithilfe der Quelle http://software.opensuse.org/KDE:/KDE3/opensuse_10.2/ aus dem SuSE-Build-Service auf 3.5.7 aktualisiert habe stürzte Arts immer beim Start ab.
<!--break-->
Ein Start des artsd in der Konsole erzeugte anschließend diese Ausgabe.
<pre><code>marix@eddie:/opt/kde3/lib64> artsd
unix_connect: can't connect …</code></pre></p>
<p>Seitdem ich mein KDE mithilfe der Quelle http://software.opensuse.org/KDE:/KDE3/opensuse_10.2/ aus dem SuSE-Build-Service auf 3.5.7 aktualisiert habe stürzte Arts immer beim Start ab.
<!--break-->
Ein Start des artsd in der Konsole erzeugte anschließend diese Ausgabe.
<pre><code>marix@eddie:/opt/kde3/lib64> artsd
unix_connect: can't connect to server (unix:/tmp/ksocket-marix/eddie.site-5e24-468ca6d0)
loading extension from '/opt/kde3/lib64/libartsmidi.so' failed: /opt/kde3/lib64/libartsmidi.so: cannot open shared object file: No such file or directory
MCOP ObjectManager: Could not load extension libartsmidi.la.
MCOP ObjectManager: can't find implementation for Arts::MidiManager.
loading extension from '/opt/kde3/lib64/libartsbuilder.so' failed: /opt/kde3/lib64/libartsbuilder.so: cannot open shared object file: No such file or directory
MCOP ObjectManager: Could not load extension libartsbuilder.la.
MCOP ObjectManager: can't find implementation for Arts::ArtsBuilderLoader.
Speicherzugriffsfehler</code></pre>
Das ist dann auch schon der entscheidende Hinweis zur Lösung des Problems. Anscheinend wurden bei der Erstellung der Pakete ein paar Links vergessen. Ein hinzufügen der Links löst das Problem.
<pre><code>
sudo ln -s libartsmidi.so.0 libartsmidi.so
sudo ln -s libartsbuilder.so.0 libartsbuilder.so
sudo ln -s libartsakode.so.0 libartsakode.so
sudo ln -s libarts_akode.so.0 libarts_akode.so
</code></pre></p>
Punklandung in den D3-Stats2007-05-23T11:04:42+02:002013-01-28T13:11:18+01:00Matthias Bachtag:marix.org,2007-05-23:/punklandung-den-d3-stats.html
<p>Da habe ich in den <a href="http://www.d3stats.de">D3-Stats</a> nicht nur endlich die 1000-Punkte-Marke geknackt, nein, ich habe sie genau getroffen. Hätte ich das bewusst versucht hätte ich es nie geschafft. Da man es in <a href="http://www.d3stats.de/pdetails.php?pid=10443">meinem Profil</a> vermutlich nur bis zur nächsten Aktualisierung sehen kann ist hier ein Screenshot vom freudigen Ereignis.</p>
<p><img src="https://marix.org/Anhänge/descent_1000bonus.png" /></p>
USB-Joysticks und openSUSE 10.22007-05-09T00:58:28+02:002013-01-28T13:11:50+01:00Matthias Bachtag:marix.org,2007-05-09:/usb-joysticks-und-opensuse-102.html
<p>Schließt man einen USB-Joystick an hat <a href="http://www.opensuse.org">openSUSE</a> ein recht merkwürdiges Verhalten. Zumindest gilt dies für meinem Fall, bei dem ein Logitech Extreme 3D Pro an ein Asus Motherboard mit nForce 570 SLI-Chipsatz angeschlossen wird. Auf dem System läuft openSUSE 10.2 x86_64. Zum Glück lässt sich diese Problem mit wenigen …</p>
<p>Schließt man einen USB-Joystick an hat <a href="http://www.opensuse.org">openSUSE</a> ein recht merkwürdiges Verhalten. Zumindest gilt dies für meinem Fall, bei dem ein Logitech Extreme 3D Pro an ein Asus Motherboard mit nForce 570 SLI-Chipsatz angeschlossen wird. Auf dem System läuft openSUSE 10.2 x86_64. Zum Glück lässt sich diese Problem mit wenigen Handgriffen lösen.</p>
<p><!--break--></p>
<p>Zunächst scheint das System den Joystick korrekt zu erkennen, was unter anderem anhand von dmesg zu sehen ist.
<pre><code>marix@eddie:~> dmesg | grep Joystick
input: USB HID v1.10 Joystick [Logitech Logitech Extreme 3D Pro] on usb-0000:00:02.0-1
input: USB HID v1.10 Joystick [Logitech Logitech Extreme 3D] on usb-0000:00:02.0-4</code></pre>
Wie zu sehen ist habe ich gleich zwei Joysticks angeschlossen. Zunächst schein aber alles zu funktionieren.</p>
<p>Interessant wird die Sache sobald man versucht den Joystick zu verwenden. Started man zum Beispiel das hervorgagende <a href="http://www.dxx-rebirth.de">D1X-Rebirth</a> bekommt man eine wenig erfreulich Meldung.
<pre><code>sdl-joystick: found 0 joysticks</code></pre>
Bestätigt wird die schlechte nachricht auch beim Einsatz von joy2key.
<pre><code>Error opening /dev/input/js0!
Are you sure you have joystick support in your kernel?</code></pre>
Wie die Meldung vermuten lässt, liefert ein <code>ls /dev/input/ | grep js</code> nichts zurück. Der Joystick funktioniert zwar als USB-Gerät, aber seine Semantik ist unbekannt.</p>
<p>Die Fehlermeldung von joy2key führt zur Lösung. Um den Joystick auch unter /dev/input zu sehen muss das Kernelmodul joydev geladen werden.
<pre><code>eddie:~ # modprobe joydev</code></pre>
Damit dies auch bei jedem Systemstart automatisch geschieht muss eine zeile in /etc/init.d/boot.local eingefügt werden.
<pre><code>/sbin/modprobe joydev</code></pre>
Nun steht der Joystick auch bei jedem Systemstart sofort zur Verfügung.</p>
<p>Nun zur Kuriosität. Startet man YaST und installiert neue Software funktioniert der Joystick anschließend reproduzierbar auch so. In diesem Fall scheint aus irgendeinem Grund das Modul also immer geladen zu werden. Sieht fast so aus, als wären Joysticks leider nicht mehr verbreitet genug um von Anfang an berücksichtigt zu werden und wurden beim Startup einfach vergessen.</p>
XIII und Date Execution Prevention2007-04-10T09:55:32+02:002013-01-28T13:12:12+01:00Matthias Bachtag:marix.org,2007-04-10:/xiii-und-date-execution-prevention.html<p>Nach langer Zeit fand ich endlich mal Zeit den Comic-Shooter XIII zu testen. Nachdem ich nach dem Intro schon auf den weiteren Verlauf der Geschichte gespannt war, machte mir den Segen der Technik einen Strich durch die Rechnung. Das Spiel stürzte im ersten Level wiederholt mit einem Illegal Access Error ab.
</p>
<p>Nach langer Zeit fand ich endlich mal Zeit den Comic-Shooter XIII zu testen. Nachdem ich nach dem Intro schon auf den weiteren Verlauf der Geschichte gespannt war, machte mir den Segen der Technik einen Strich durch die Rechnung. Das Spiel stürzte im ersten Level wiederholt mit einem Illegal Access Error ab.
Zunächst würde man denken, kein Problem, es gibt ja Altavista, Google und Co. Nach dann doch etwas längerer Suche fand ich den entscheidenden Tipp. XIII scheint mit selbstmodifizierendem Code zu arbeiten. Ich hatte zwar gewusst, dass der Software-Renderer der verwendeten Unreal-Engine das nutzt, sonst sieht man dies aber doch eher selten. Die kollidiert natürlich mit der in Windows XP SP 2 eingeführten Data Execution Prevention (XIII), die auf unterstützten CPUs, bei mir einer AMD X2 3800+, defaultmäßig aktiv ist.
Der eigentliche Sinn der Data Execution Prevention ist die Sicherheit des Systems zu erhöhen, denn normallerweise ändert eine Programm nicht seinen eigenen Befehlsabfolge sondern arbeitet auf Daten die nicht als Teil des Programms ausgeführt werden sollen. Geschieht dies doch ist dies meistens ein Hinweis darauf, dass ein Angreifer versucht hat einen Programmfehler auszunutzen um eigene Befehle auszuführen. DEP soll dies verhindern. Um auch Programme zu unterstützen die auf die Möglichkeit sich selbst zu umzuschreiben angewiesen sind gibt es aber die Möglichkeit diese für einzelne Programme abzuschalten.
Nicht dem radikalen vorgeschlagenen Weg folgend DEP komplett abzuschalten fügt ich in den DEP-Einstellungen (zu finden über Arbeitsplatz>Einstellungen) eine Ausnahme für XIII hinzu. Leider half dies allerdings noch nicht. Eine alte Windows-Wahrheit bewahrheitete sich mal wieder. Egal was du umstellst und egal was Windows sagt, anschließend immer Neustarten. Nach einem Neustart allerdings konnte ich XIII endlich genießen.
Ärgerlich, hätte ich XIII bei seinem erscheinen gespielt hätte ich auf meiner damaligen CPU (AMD 1400) diese Problem nicht gehabt, jetzt wo es schon alle möglichen Patches für XIII gab hat mich dann meine Hardware dran gehindert. Eigentlich sollte es ja andersrum sein ;).</p>
Drupal rockt2007-02-18T20:02:04+01:002007-02-18T20:02:04+01:00Matthias Bachtag:marix.org,2007-02-18:/drupal-rockt.html<p>Jetzt, da ich endlich mal wenigstens ein paar Minuten Zeit habe um mich um meine Webseite zu kümmern gefällt mir Drupal immer mehr.</p>
<p>Dank Apaches mod_rewrite haben die einzelnen Seiten nun lesbare Addressen und mit Drupals Alias-Funktion werden sie auch noch merkbar. Caching und RSS-Aggregation machen die Seit auch Sonntags und mit dem Konqueror über DSL besuchbar.
</p>
<p>Jetzt, da ich endlich mal wenigstens ein paar Minuten Zeit habe um mich um meine Webseite zu kümmern gefällt mir Drupal immer mehr.</p>
<p>Dank Apaches mod_rewrite haben die einzelnen Seiten nun lesbare Addressen und mit Drupals Alias-Funktion werden sie auch noch merkbar. Caching und RSS-Aggregation machen die Seit auch Sonntags und mit dem Konqueror über DSL besuchbar.</p>
<p>Auch für meine Lesezeichen habe ich nun eindlich eine eigene Seite. Leider habe ich noch kein Drupal-Modul gefunden mit dem ich die Lesezeichen gut verwalten kann, aber dank des sehr guten Drupal-Stylesheets kann ich sie immerhin auch mit lesbarem Sourcecode auf einer Seite gruppiert und zweispaltig anzeigen.</p>
Marix World aktualisiert2007-02-11T22:21:47+01:002007-02-11T22:22:24+01:00Matthias Bachtag:marix.org,2007-02-11:/marix-world-aktualisiert.html<p>Nachdem ich lange Zeit leider keine Zeit hatte mehr als das nötigste auf meinem Server zu machen wurde jetzt endlich mal die Seite aktualisiert.
</p>
<p>Nachdem ich lange Zeit leider keine Zeit hatte mehr als das nötigste auf meinem Server zu machen wurde jetzt endlich mal die Seite aktualisiert.
Drupal wurde auf die aktuellste Version gebracht, dies ist leicht dadurch ersichtlich, dass die Seite jetzt einigermasen ansehlich aussieht. Auch habe ich endlich wieder mein traditionelles Seitenlogo in die Seite eingebaut, auch wenn es dringend nochmal überarbeitet werden muss. Der Eisbär sieht momentan doch etwas gerupft aus. Als nächste Schritte werde ich jetzt bei gelegenheit Anfangen eine Linksammlung aufzubauen und alle Programme die früher mal auf meiner Seite zu finden waren wieder hochzuladen.</p>
Webdemo gegen Vorratsdatenspeicherung2006-12-12T00:56:50+01:002007-02-11T22:18:05+01:00Matthias Bachtag:marix.org,2006-12-12:/webdemo-gegen-vorratsdatenspeicherung.html<p>Der <a href=
<p>Der <a href="http://www.vorratsdatenspeicherung.de/">Arbeitskreis Vorratsdatenspeicherung</a> ruft zum 14.12.2006 zu einem Protesttag gegen die Vorratsdatenspeicherung auf.
Gemäß der beschlossenen EU-Richtlinie zur Vorratsdatenspeicherung, sollen alle Telekommunikationsgesellschaften und Internetprovider in den EU-Staaten verpflichtet werden, die Verkehrsdaten aller Telekommunikationsvorgänge und Internetnutzungen aller Kundinnen und Kunden für mindestens sechs und bis zu 24 Monate zu speichern. Ein Briefgeheimnis ist damit gibt es damit für elektronischen Datenverkehr nicht mehr. Hinzu kommt das bei den heute üblichen Flatrates eine Speicherung von Verbindungsdaten noch nicht einmal zu Abrechnungszwecken notwendig ist, weshalb sie bisher aus Datenschutzgründen nicht zulässig war. Generell ist zu bedenken, dass alle Daten die erst einmal gesammelt sind natürlich auch Interessenten anziehen.</p>