<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Marix.org</title><link href="https://marix.org/" rel="alternate"></link><link href="https://marix.org/feeds/all.atom.xml" rel="self"></link><id>https://marix.org/</id><updated>2025-06-22T00:00:00+02:00</updated><entry><title>Wenn Workflows in Codeberg CI nicht starten wollen</title><link href="https://marix.org/wenn-workflows-in-codeberg-ci-nicht-starten-wollen.html" rel="alternate"></link><published>2025-06-22T00:00:00+02:00</published><updated>2025-06-22T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-06-22:/wenn-workflows-in-codeberg-ci-nicht-starten-wollen.html</id><summary type="html">&lt;p&gt;&lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; ist eine großartige Plattform für Codehosting, die durch einen Verein unabhängig von finanziellen Interessen und in Europa betrieben wird.
Sie bietet viele der Funktionen, die GitHub so beliebt gemacht haben, darunter auch &lt;a href="https://ci.codeberg.org"&gt;Codeberg CI&lt;/a&gt;, das es ermöglicht, Workflows auf Commits und Pull Requests auszuführen.
Gestern rannte ich jedoch wieder …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; ist eine großartige Plattform für Codehosting, die durch einen Verein unabhängig von finanziellen Interessen und in Europa betrieben wird.
Sie bietet viele der Funktionen, die GitHub so beliebt gemacht haben, darunter auch &lt;a href="https://ci.codeberg.org"&gt;Codeberg CI&lt;/a&gt;, das es ermöglicht, Workflows auf Commits und Pull Requests auszuführen.
Gestern rannte ich jedoch wieder einmal in das Problem, dass Workflows nicht starten wollten.
Da das Problem und seine Lösung zwar &lt;a href="https://codeberg.org/Codeberg-CI/feedback/issues/96#issuecomment-2830310"&gt;in einem Issue auf Codeberg&lt;/a&gt; erwähnt werden, dieser aber nicht schnell zu finden ist und die Lösung auch nur skizziert, möchte ich diese hier auch nochmal dokumentieren.&lt;/p&gt;
&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;
&lt;p&gt;Nachdem ein neuer Commit zu Codeberg geschickt wurde, startet der Workflow nicht.
Beim Öffnen des Workflows wird angezeigt, dass ein Fehler aufgetreten ist.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot eine Workflows auf Codberg CI, statt der Logs wird angezeigt: Oh nein, ein Fehler ist aufgetreten!" src="https://marix.org/Bilder/Codeberg/Workflow Fehler.png"&gt;&lt;/p&gt;
&lt;p&gt;Geht man auf „Fehler anzeigen“, wird angezeigt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;could not load config from forge: %!w()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Startet man den Werkflow über die Schaltfläche „Neustarten“ in der oberen rechten Ecke neu, so ändert sich die Fehlermeldung zu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pipeline definition not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieses Problem tritt auch bei Workflows auf, die zuvor einwandfrei funktioniert haben.
Die Ursache für dieses Verhalten liegt oft in der hohen Last auf Codeberg, die durch DOS-Angriffe oder KI-Scraper verursacht wird.
Diese hohe Last kann dazu führen, dass Events verloren gehen, was wiederum zu diesem Zustand führt.&lt;/p&gt;
&lt;h2 id="die-losung"&gt;Die Lösung&lt;/h2&gt;
&lt;p&gt;Die Lösung für dieses Problem besteht darin, einen neuen Commit zu pushen.
Mit der folgenden Technik kann dies ohne zusätzliche Änderungen am Code erfolgen.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Lokalen Commit anpassen:
    Folgender Befehl, auf dem lokalen Branch ausgeführt, erstellt einen Commit, der dem alten entspricht, aber eine neue Prüfsumme hat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit --amend --allow-empty
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Den neuen Commit zu Codeberg schieben:
    Folgender Befehl überschreibt den letzten stand auf Codeberg mit dem neu erstellten Commit.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push --force-with-lease
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Wichtig:&lt;/em&gt; Diese Technik darf nur verwendet werden, wenn man sich sicher ist, dass niemand anderes mit dem Branch arbeitet.
Ansonsten bekommt die anderen Nutzer:innen Probleme, wenn die den Branch aktualisieren wollen.
Wenn es doch notwendig sein sollte, dann solten die anderen Nutzer:innen informiert werden, sodass sie beim nächsten Pull die Rebase-Strategie verwenden.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Trotz dieses kleinen Problems is Codeberg eine großartige Plattform, die ich gerne nutze.
Kennt man das Problem und die Lösung, ist es auch, falls es auftritt, schnell behoben.&lt;/p&gt;
&lt;p&gt;Damit Codeberg weiter eine großartige Plattform bleibt, ist es wichtig, dass wir &lt;a href="https://join.codeberg.org/"&gt;sie unterstützen&lt;/a&gt;.
Ich tue dies aktuell, mangels Zeit für ein ehrenamtliches Engagement, durch eine &lt;a href="https://join.codeberg.org/"&gt;Födermitgliedschaft&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="Codeberg"></category><category term="CI"></category><category term="Workflows"></category></entry><entry><title>Spielen auf openSUSE</title><link href="https://marix.org/spielen-auf-opensuse.html" rel="alternate"></link><published>2025-06-16T00:00:00+02:00</published><updated>2025-06-16T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-06-16:/spielen-auf-opensuse.html</id><summary type="html">&lt;p&gt;Im &lt;a href="https://news.opensuse.org"&gt;Blog von openSUSE&lt;/a&gt; erschient Anfang des Jahres &lt;a href="https://news.opensuse.org/2025/01/16/gaming-on-linux-how-os-stacks-up/"&gt;ein Artikel über das Spielen auf openSUSE&lt;/a&gt;.
Der Artikel ist ein toller Startpunkt um sich openSUE fürs Gaming perfekt einzurichten und beschreibt tatsächlich ziemlich genau auch mein System:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Steam um einfach Spiele zu installieren die ich auch auf dem Steam Deck nutzen …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Im &lt;a href="https://news.opensuse.org"&gt;Blog von openSUSE&lt;/a&gt; erschient Anfang des Jahres &lt;a href="https://news.opensuse.org/2025/01/16/gaming-on-linux-how-os-stacks-up/"&gt;ein Artikel über das Spielen auf openSUSE&lt;/a&gt;.
Der Artikel ist ein toller Startpunkt um sich openSUE fürs Gaming perfekt einzurichten und beschreibt tatsächlich ziemlich genau auch mein System:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Steam um einfach Spiele zu installieren die ich auch auf dem Steam Deck nutzen will.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lutris.net/"&gt;Lutris&lt;/a&gt; um meine Spielesammlung zu verwalten und auch um von Gog.com und anderen zu installieren.&lt;/li&gt;
&lt;li&gt;Die proprietären Nvidia-Treiber, da ich eine Nvidia-Grafikkarte nutze.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flightlessmango/MangoHud"&gt;MangoHud&lt;/a&gt; um die FPS und andere Statistiken im Spiel anzuzeigen.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/FeralInteractive/gamemode"&gt;GameMode&lt;/a&gt; um die Energieverwaltung des Systems automatisch umzustellen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die größte Abweichung zwischen meinem System und dem Artikel liegt darin, dass ich &lt;a href="https://get.opensuse.org/leap"&gt;Leap&lt;/a&gt; verwende, während der Artikel auf &lt;a href="https://get.opensuse.org/tumbleweed"&gt;Tumbleweed&lt;/a&gt; eingeht.
Meine Entscheidung liegt hier vor allem darin begründet, dass vor langer Zeit die Nutzung der Nvidia-Treiber auf Leap einfacher war.
Außerdem habe ich so auf allen openSUSE-Systemen in der Familie die gleiche Basis.&lt;/p&gt;
&lt;p&gt;Außer dem Nvidia-Treiber erwähnt der Artikel auch die, keine weitere Konfiguration benötigende, Unterstützung von AMD-Grafikkarten.
Von dieser werde ich, bei der aktuellen Entwicklung des Grafikkartenmarktes, wohl auch beim nächsten Hardware-Upgrade profitieren.&lt;/p&gt;
&lt;p&gt;Ein Werkzeug, das ich regelmäßig nutze, fehlt im Artikel: &lt;a href="https://marix.org/dieser-rattenfanger-befreit-mause.html"&gt;Piper&lt;/a&gt;.
Damit verwalte ich die Profile meiner Maus.&lt;/p&gt;
&lt;p&gt;Besonders hat mich gefreut, dass der Artikel mit &lt;a href="https://github.com/FeralInteractive/gamemode"&gt;GameMode&lt;/a&gt; auch ein Werkzeug erwähnt, dass ich vor langer Zeit mal in die Distribution gebracht habe.
Es ist immer schön zu sehen, wenn Pakete tatsächlich auch von anderen genutzt und geschätzt werden, und man nicht nur für sich selbst gearbeitet hat.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Gaming"></category><category term="Gamemode"></category></entry><entry><title>Tailscale auf Android automatisch starten</title><link href="https://marix.org/tailscale-auf-android-automatisch-starten.html" rel="alternate"></link><published>2025-06-05T00:00:00+02:00</published><updated>2025-06-05T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-06-05:/tailscale-auf-android-automatisch-starten.html</id><summary type="html">&lt;p&gt;Die meisten Android-Apps, die dauerhaft im Hintergrund laufen sollen, bieten eine Option zum automatischen Start an.
Bei Tailscale fehlt diese Option allerdings.
Das wirkt auf den ersten Blick etwas seltsam, denn als VPN sollte Tailscale seine Arbeit ja eigentlich dezent im Hintergrund erledigen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Android's Einstellungsseite für das Tailscale-VPN" src="https://marix.org/Bilder/Tailscale/Android-VPN-Einstellungen.png"&gt;&lt;/p&gt;
&lt;p&gt;Tatsächlich &lt;a href="https://github.com/tailscale/tailscale/issues/510#issuecomment-650755889"&gt;benötigt Tailscale aber keine spezielle Einstellung …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die meisten Android-Apps, die dauerhaft im Hintergrund laufen sollen, bieten eine Option zum automatischen Start an.
Bei Tailscale fehlt diese Option allerdings.
Das wirkt auf den ersten Blick etwas seltsam, denn als VPN sollte Tailscale seine Arbeit ja eigentlich dezent im Hintergrund erledigen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Android's Einstellungsseite für das Tailscale-VPN" src="https://marix.org/Bilder/Tailscale/Android-VPN-Einstellungen.png"&gt;&lt;/p&gt;
&lt;p&gt;Tatsächlich &lt;a href="https://github.com/tailscale/tailscale/issues/510#issuecomment-650755889"&gt;benötigt Tailscale aber keine spezielle Einstellung, um im Hintergrund zu laufen, denn Android hat dafür eine eigene Einstellung&lt;/a&gt;.
Diese findet sich in den Einstellungen unter „Netzwerk &amp;amp; Internet“ &amp;gt; „VPN“ &amp;gt; „Tailscale“ &amp;gt; „Durchgehend aktives VPN“.
Zumindest ist dies unter Android 14 der Fall.
Die Struktur der Einstellungen ändert sich bei Android ja häufiger mal mit neuen Versionen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Exit-Node-Status in der Tailscale-App" src="https://marix.org/Bilder/Tailscale/Exit-Node-Status.png"&gt;&lt;/p&gt;
&lt;p&gt;Ob der Netzwerkverkehr dann über einen VPN-Tunnel läuft, hängt dann von der Konfiguration in der Tailscale-App ab.
Nur wenn dort ein Exit-Node konfiguriert ist, wird der gesamte Netzwerkverkehr über Tailscale geleitet.
Ansonsten wird nur der Verkehr zu anderen Tailscale-Geräten über den VPN-Tunnel geleitet.
Der restliche Verkehr läuft dann zwar auf dem Gerät einmal durch Tailscale, verlässt das Gerät dann aber wie ohne VPN.&lt;/p&gt;</content><category term="Blog"></category><category term="Tailscale"></category><category term="Android"></category><category term="VPN"></category></entry><entry><title>Wenn die PineTime nur noch das Infinitime-Logo anzeigt</title><link href="https://marix.org/wenn-die-pinetime-nur-noch-das-infinitime-logo-anzeigt.html" rel="alternate"></link><published>2025-06-01T00:00:00+02:00</published><updated>2025-06-01T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-06-01:/wenn-die-pinetime-nur-noch-das-infinitime-logo-anzeigt.html</id><summary type="html">&lt;p&gt;Kürzlich begrüßte mich meine &lt;a href="https://pine64.org/devices/pinetime/"&gt;PineTime&lt;/a&gt; mit dem InfiniTime-Logo und tat nichts weiter.
Ich schloss sofort, dass die Uhr abgestürzt und im Recovery-Modus gelandet war.
Ein Neustart sollte das Problem beheben, dieser brachte mich aber nur wieder in den Recovery-Modus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Eine PineTime im Recovery-Modus" src="https://marix.org/Bilder/PineTime-Recovery.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Eine kurze Recherche führte mich zu &lt;a href="https://github.com/InfiniTimeOrg/InfiniTime/issues/576"&gt;einem alten Fehlerbericht im InfiniTime-Repository …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kürzlich begrüßte mich meine &lt;a href="https://pine64.org/devices/pinetime/"&gt;PineTime&lt;/a&gt; mit dem InfiniTime-Logo und tat nichts weiter.
Ich schloss sofort, dass die Uhr abgestürzt und im Recovery-Modus gelandet war.
Ein Neustart sollte das Problem beheben, dieser brachte mich aber nur wieder in den Recovery-Modus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Eine PineTime im Recovery-Modus" src="https://marix.org/Bilder/PineTime-Recovery.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Eine kurze Recherche führte mich zu &lt;a href="https://github.com/InfiniTimeOrg/InfiniTime/issues/576"&gt;einem alten Fehlerbericht im InfiniTime-Repository&lt;/a&gt;.
Die Uhr befand sich tatsächlich im Recovery-Modus.
Ich hatte es aber wohl geschafft die Uhr im Schlaf gleich mehrfach neu zu starten.
Daraufhin ging die Uhr von einer fehlerhaften Firmware aus und löschte diese, sodass sie nur noch im Recovery-Modus starten konnte.&lt;/p&gt;
&lt;p&gt;Glücklicherweise verbindet sich die Uhr auch im Recovery-Modus noch automatisch mit &lt;a href="https://gadgetbridge.org/"&gt;Gadgetbridge&lt;/a&gt;.
Damit lässt sich dann auf dem normalen Weg, wie auch bei einem normalen Update, die Firmware neu aufspielen.&lt;/p&gt;
&lt;p&gt;Nachdem die Firmware neu aufgespielt ist und die Uhr neu gestartet hat, darf man dann lediglich nicht vergessen diese, auch hier genau wie bei einem Update, wieder neu zu bestätigen.
Ansonsten landet man beim nächsten, gewollten oder ungewollten, Neustart wieder im gleichen Zustand.&lt;/p&gt;</content><category term="Blog"></category><category term="PineTime"></category><category term="Infinitime"></category><category term="Smartwatch"></category><category term="Gadgetbridge"></category></entry><entry><title>Der yt-dlp Spickzettel</title><link href="https://marix.org/der-yt-dlp-spickzettel.html" rel="alternate"></link><published>2025-03-30T00:00:00+01:00</published><updated>2025-03-30T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-03-30:/der-yt-dlp-spickzettel.html</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; ist ein leistungsstarkes Kommandozeilen-Tool zum Herunterladen von Videos und Audiodateien von einer Vielzahl von Websites, darunter YouTube, Vimeo, die Mediatheken der öffentlich-rechtlichen Sender, und viele andere.
Es ist eine Weiterentwicklung des ursprünglichen &lt;a href="https://youtube-dl.readthedocs.io"&gt;youtube-dl&lt;/a&gt; und bietet zahlreiche zusätzliche Funktionen und Verbesserungen.
Allerdings kann einen die Vielzahl an Optionen und Parametern …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; ist ein leistungsstarkes Kommandozeilen-Tool zum Herunterladen von Videos und Audiodateien von einer Vielzahl von Websites, darunter YouTube, Vimeo, die Mediatheken der öffentlich-rechtlichen Sender, und viele andere.
Es ist eine Weiterentwicklung des ursprünglichen &lt;a href="https://youtube-dl.readthedocs.io"&gt;youtube-dl&lt;/a&gt; und bietet zahlreiche zusätzliche Funktionen und Verbesserungen.
Allerdings kann einen die Vielzahl an Optionen und Parametern, die ein Aufruf von &lt;code&gt;yt-dlp --help&lt;/code&gt; ausspuckt, und die auch &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;https://github.com/yt-dlp/yt-dlp&lt;/a&gt; dokumentiert, schnell überfordern.
Deshalb hier ein Spickzettel mit den wichtigsten Optionen und Parametern, die ich häufig benutze.&lt;/p&gt;
&lt;h2 id="die-kommandozeile"&gt;Die Kommandozeile&lt;/h2&gt;
&lt;p&gt;yt-dlp ist eine Kommandozeilenanwendung.
Als solche muss sie über eine Konsole oder ein Terminal aufgerufen werden.
Sie nimmt ihren exakten Arbeitsauftrag beim Auftrag durch Optionen und Argumente entgegen.
Die grundlegende Syntax für yt-dlp lautet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp [OPTIONEN...] URL [URL...]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hierbei ist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;: Die URL einer Webseite auf der sich der herunterzuladende Inhalt befindet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPTIONEN...&lt;/code&gt;: Verschiedene Optionen, die das Verhalten von yt-dlp steuern.
  Diese haben üblicherweise die Form &lt;code&gt;--option&lt;/code&gt; oder &lt;code&gt;--option wert&lt;/code&gt;.
  Mehrere Optionen können durch Leerzeichen getrennt angegeben werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ein-video-herunterladen"&gt;Ein Video herunterladen&lt;/h2&gt;
&lt;p&gt;Um ein Video herunterzuladen, reicht folgender Befehl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp https://example.com/seite/mit/video
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In diesem Fall lädt yt-dlp das Video von der angegebenen URL herunter und speichert es im aktuellen Verzeichnis.
Hierbei wählt es automatisch das Format mit der besten verfügbaren Qualität aus.&lt;/p&gt;
&lt;p&gt;Handelt sich bei dem Medieninhalt auf der Webseite um eine Audiodatei, wird diese ebenfalls heruntergeladen.
Allerdings wird diese in diesem Fall oft nicht in einem der gebräuchlichen Audioformate gespeichert, sodass nicht jedes Abspielgerät mit diesen Dateien zurechtkommt.&lt;/p&gt;
&lt;h2 id="nur-audio-herunterladen"&gt;Nur Audio herunterladen&lt;/h2&gt;
&lt;p&gt;yt-dlp kann auch explizit nur die Audiodatei herunterladen.
In diesem Fall wird die Audiodatei in einem der gebräuchlichen Audioformate gespeichert.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --extract-audio https://example.com/seite/mit/audio
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dies funktioniert insbesondere auch bei Webseiten, die Videos mit einer Audiospur anbieten.
So lässt sich zum Beispiel die Audiospur eines Videos herunterladen, ohne das Video selbst zu speichern.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --extract-audio https://example.com/seite/mit/video
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="ausgabeformat-festlegen"&gt;Ausgabeformat festlegen&lt;/h2&gt;
&lt;p&gt;Soll yt-dlp die heruntergeladenen Dateien in einem bestimmten Format speichern, kann dies mit der Option &lt;code&gt;--merge-output-format&lt;/code&gt; angegeben werden.
Um beispielsweise die heruntergeladenen Videos im MP4-Format zu speichern, lautet der Befehl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --merge-output-format mp4 https://example.com/seite/mit/video
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In diesem Fall wählt yt-dlp automatisch das beste verfügbare, in einem MP4 speicherbare, Videoformat aus und speichert es zusammen mit der Audiospur in einer MP4-Datei.&lt;/p&gt;
&lt;p&gt;Dies funktioniert auch bei Audiodateien.
Für diese gibt es aber nochmal einen eigenen Parameter, der die Audiodatei in einem bestimmten Format speichert.
Dieser Parameter heißt &lt;code&gt;--audio-format&lt;/code&gt; und sollte in Kombination mit der Option &lt;code&gt;--extract-audio&lt;/code&gt; verwendet werden.
Um beispielsweise die heruntergeladene Audiodatei im MP3-Format zu speichern, lautet der Befehl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --extract-audio --audio-format mp3 https://example.com/seite/mit/audio
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="dateiname-anpassen"&gt;Dateiname anpassen&lt;/h2&gt;
&lt;p&gt;Der Parameter &lt;code&gt;--output&lt;/code&gt; ermöglicht es, den Dateinamen der heruntergeladenen Datei anzupassen.
Hierbei ist es wichtig, dass der Dateiname immer auf &lt;code&gt;%(ext)s&lt;/code&gt; endet.
yt-dlp ersetzt diesen Platzhalter durch die Dateierweiterung des heruntergeladenen Inhalts.
Da yt-dlp während des Downloads aber verschiedene temporäre Dateien anlegt, braucht es diesen Platzhalter um Kollisionen zu vermeiden, auch wenn explizit eine MP4-Datei heruntergeladen wird.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --output "mein_video.%(ext)s" --merge-output-format mp4 https://example.com/seite/mit/video
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In diesem Fall wird die heruntergeladene Datei in &lt;code&gt;mein_video.mp4&lt;/code&gt; gespeichert.&lt;/p&gt;
&lt;h2 id="mehrere-dateien-herunterladen"&gt;Mehrere Dateien herunterladen&lt;/h2&gt;
&lt;p&gt;Übergibt amn yt-dlp mehrere URLs, lädt yt-dlp alle angegebenen Dateien herunter.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp https://example.com/seite/mit/video1 https://example.com/seite/mit/video2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Außerdem erkennt yt-dlp auf vielen Seiten auch Playlisten und lädt alle Videos in der Playlist herunter.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp https://example.com/seite/mit/playlist
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="weiterfuhrende-links"&gt;Weiterführende Links&lt;/h2&gt;
&lt;p&gt;Diese Liste kratzt natürlich nur an der Oberfläche.
Alle möglichkeiten yt-dlp aufzurufen, um Beispielsweise mehrere Tonspuren in bestimmten Sprachen herunterzuladen, finden sich in der Hilfe, die mit &lt;code&gt;yt-dlp --help&lt;/code&gt; aufgerufen werden kann.
Außerdem gibt es auf &lt;a href="https://yt-dlp-docs.netlify.app/"&gt;https://yt-dlp-docs.netlify.app/&lt;/a&gt; eine umfangreiche inoffizielle Dokumentation in englischer Sprache mit vielen Beispielen.&lt;/p&gt;</content><category term="Blog"></category><category term="Video"></category><category term="yt-dlp"></category></entry><entry><title>Avidemux Warteschlange: Effiziente Videobearbeitung im Handumdrehen</title><link href="https://marix.org/avidemux-warteschlange-effiziente-videobearbeitung-im-handumdrehen.html" rel="alternate"></link><published>2025-03-29T00:00:00+01:00</published><updated>2025-03-29T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-03-29:/avidemux-warteschlange-effiziente-videobearbeitung-im-handumdrehen.html</id><summary type="html">&lt;p&gt;&lt;a href="https://avidemux.org"&gt;Avidemux&lt;/a&gt; ist ein beliebtes Open-Source-Tool zur Videobearbeitung, das sich durch seine Benutzerfreundlichkeit und Vielseitigkeit auszeichnet.
Ein oft übersehenes, aber äußerst nützliches Feature ist die Warteschlange, die es ermöglicht, mehrere Videos zu schneiden und anschließend in einem Rutsch zu verarbeiten.
Doch wie nutzt man diese Funktion?
Außer einem Menüeintrag um „Zur …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://avidemux.org"&gt;Avidemux&lt;/a&gt; ist ein beliebtes Open-Source-Tool zur Videobearbeitung, das sich durch seine Benutzerfreundlichkeit und Vielseitigkeit auszeichnet.
Ein oft übersehenes, aber äußerst nützliches Feature ist die Warteschlange, die es ermöglicht, mehrere Videos zu schneiden und anschließend in einem Rutsch zu verarbeiten.
Doch wie nutzt man diese Funktion?
Außer einem Menüeintrag um „Zur Warteschlange hinzufügen“ gibt es im Benutzerinterface von Avidemux nämlich keine weiteren Hinweise darauf, dass Avidemux eine Warteschlange hat.&lt;/p&gt;
&lt;h2 id="auftrage-zur-warteschlange-hinzufugen"&gt;Aufträge zur Warteschlange hinzufügen&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Das Datei Menü von Avidemux mit dem Eintrag &amp;quot;Zur Warteschlange hinzufügen&amp;quot;." src="https://marix.org/Bilder/Avidemux/Zur Warteschlange hinzufügen.png"&gt;&lt;/p&gt;
&lt;p&gt;Dieser Teil ist noch einfach.
Anstatt das Video zu speichern, wählt man im Datei-Menü den Eintrag "Zur Warteschlange hinzufügen" um Aufträge zur Warteschlange hinzufügen.&lt;/p&gt;
&lt;h2 id="verwaltung-und-ausfuhrung-der-warteschlange"&gt;Verwaltung und Ausführung der Warteschlange&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Das Avidemux Jobs Interface mit einer Warteschlange." src="https://marix.org/Bilder/Avidemux/Avidemux Jobs.png"&gt;&lt;/p&gt;
&lt;p&gt;Für die Verwaltung und Ausführung der Warteschlange gibt es ein eigenes Benutzerinterface: Avidemux Jobs.
Leider hat dieses Interface keinen Eintrag im Startmenü, was die Nutzung erschwert. Um Avidemux Jobs zu starten, muss man die Anwendung direkt über die Konsole aufrufen.
Der Name der ausführbaren Datei beginnt immer mit &lt;code&gt;avidemux3_jobs_&lt;/code&gt;, gefolgt vom Namen des UI-Toolkits.
Auf openSUSE lautet der Name beispielsweise &lt;code&gt;avidemux3_jobs_qt5&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="abhangigkeit-von-avidemux-kommandozeilenversion"&gt;Abhängigkeit von Avidemux Kommandozeilenversion&lt;/h2&gt;
&lt;p&gt;Avidemux Jobs verwendet standardmäßig die Kommandozeilenversion von Avidemux zur Abarbeitung der Warteschlange.
Daher muss diese installiert sein. Sollte die Kommandozeilenversion nicht verfügbar sein, kann man Avidemux Jobs anweisen, die QT-Version zu verwenden.&lt;/p&gt;
&lt;h2 id="manueller-startmenu-eintrag"&gt;Manueller Startmenü-Eintrag&lt;/h2&gt;
&lt;p&gt;Umgebungen wie KDE ermöglichen es, manuell einen Startmenü-Eintrag für Avidemux Jobs anzulegen.
Dies spart den Umweg über die Konsole und erleichtert den Zugriff auf das Tool.&lt;/p&gt;
&lt;h2 id="zukunftige-verbesserungen"&gt;Zukünftige Verbesserungen&lt;/h2&gt;
&lt;p&gt;Um das Problem für zukünftige Versionen zu lösen, habe ich &lt;a href="https://github.com/mean00/avidemux2/pull/543"&gt;einen Pull Request bei Avidemux eingereicht, der einen Startmenü-Eintrag für Avidemux Jobs anlegt&lt;/a&gt;.
Bleibt zu hoffen, dass dieser in einer der nächsten Versionen von Avidemux integriert wird.&lt;/p&gt;</content><category term="Blog"></category><category term="Video"></category><category term="Avidemux"></category></entry><entry><title>GIMP im Einzelfenster-Modus nutzen</title><link href="https://marix.org/gimp-im-einzelfenster-modus-nutzen.html" rel="alternate"></link><published>2025-03-28T00:00:00+01:00</published><updated>2025-03-28T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2025-03-28:/gimp-im-einzelfenster-modus-nutzen.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.gimp.org/"&gt;GIMP&lt;/a&gt; startet standardmäßig im Mehrfenster-Modus, was heutzutage eher ungewöhnlich ist.
Wer lieber den in den meisten Anwendungen üblichen Einfenster-Modus nutzen möchte, kann ganz einfach über das Menü darauf wechseln.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein GIMP im Mehrfenster-Modus mit aufgeklapptem Fenster-Menü" src="https://marix.org/Bilder/GIMP/Auf Einzelfenster-Modus wechseln.png"&gt;&lt;/p&gt;
&lt;p&gt;Die Option „Einzelfenster-Modus“ findet sich in der Menüleiste unter „Fenster“.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein GIMP im Einzelfenster-Modus mit aufgeklapptem Dialog-Menü" src="https://marix.org/Bilder/GIMP/Werkzeugeinstellungen hinzufügen.png"&gt;&lt;/p&gt;
&lt;p&gt;Eventuell fehlende Dialoge, wie die Werkzeugeinstellungen, können anschließend über den Abschnitt …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.gimp.org/"&gt;GIMP&lt;/a&gt; startet standardmäßig im Mehrfenster-Modus, was heutzutage eher ungewöhnlich ist.
Wer lieber den in den meisten Anwendungen üblichen Einfenster-Modus nutzen möchte, kann ganz einfach über das Menü darauf wechseln.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein GIMP im Mehrfenster-Modus mit aufgeklapptem Fenster-Menü" src="https://marix.org/Bilder/GIMP/Auf Einzelfenster-Modus wechseln.png"&gt;&lt;/p&gt;
&lt;p&gt;Die Option „Einzelfenster-Modus“ findet sich in der Menüleiste unter „Fenster“.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein GIMP im Einzelfenster-Modus mit aufgeklapptem Dialog-Menü" src="https://marix.org/Bilder/GIMP/Werkzeugeinstellungen hinzufügen.png"&gt;&lt;/p&gt;
&lt;p&gt;Eventuell fehlende Dialoge, wie die Werkzeugeinstellungen, können anschließend über den Abschnitt „Andockbare Dialoge“ im Fenster-Menü hinzugefügt werden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Bildschirmfoto von GIMP im Einzelfenster-Modus" src="https://marix.org/Bilder/GIMP/Einzelfenster-Modus.png"&gt;&lt;/p&gt;</content><category term="Blog"></category><category term="GIMP"></category><category term="Spickzettel"></category></entry><entry><title>Mit einem aktuellen Android mit dem VPN einer alten FRITZ!Box verbinden</title><link href="https://marix.org/mit-einem-aktuellen-android-mit-dem-vpn-einer-alten-fritzbox-verbinden.html" rel="alternate"></link><published>2024-05-24T00:00:00+02:00</published><updated>2024-05-24T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-05-24:/mit-einem-aktuellen-android-mit-dem-vpn-einer-alten-fritzbox-verbinden.html</id><summary type="html">&lt;p&gt;Wer in die Verlegenheit kommt sich von einem aktuellen Android mit dem VPN einer älteren FRITZ!Box, wie der 7560, verbinden zu müssen, stellt schnell fest, dass sich der von der FRITZ!Box gewünschte VPN-Typ &lt;em&gt;"IPSec" oder "IPSec Xauth PSK"&lt;/em&gt; im VPN-Dialog von Android nicht auswählen lässt.
Android hat diese …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wer in die Verlegenheit kommt sich von einem aktuellen Android mit dem VPN einer älteren FRITZ!Box, wie der 7560, verbinden zu müssen, stellt schnell fest, dass sich der von der FRITZ!Box gewünschte VPN-Typ &lt;em&gt;"IPSec" oder "IPSec Xauth PSK"&lt;/em&gt; im VPN-Dialog von Android nicht auswählen lässt.
Android hat diese auf dem veralteten Anmeldeverfahren IKEv1 basierenden Typen nämlich in Version 12 rausgeworfen.
AVM unterstützt die moderneren Anmeldeverfahren auf Basis von IKEv2 aber erst ab FRITZ!OS 7.50.
Und dieses ist nicht mehr für alle noch unterstützten FRITZ!Boxen erschienen.&lt;/p&gt;
&lt;p&gt;Eine Lösung für diese Problem ist auf dem Androiden die App &lt;a href="https://play.google.com/store/apps/details?id=com.gmail.mjm4456.vpncilla"&gt;VpnCilla&lt;/a&gt; zu installieren.
Diese dient ausschließlich dazu sich mit alten IKEv1-VPNs zu verbinden.
Bevor ihr diese kauft empfiehlt es sich zunächst einmal die Probeversion &lt;a href="https://play.google.com/store/apps/details?id=com.gmail.mjm4456.vpncillatrial"&gt;VpnCilla (Trial)&lt;/a&gt; auszuprobieren.
Klappt alles und ihr möchtet die App über den Probezeitraum hinaus verwenden, so lassen sich die Einstellungen anschließend auch in die Vollversion übernehmen.&lt;/p&gt;
&lt;p&gt;Für meinen Ursprünglichen Einsatzzweck, ich brauchte für ein Wochenende die Option Verbindungen ins Internet über einen bestimmten Anschluss umzuleiten, hätte mir die Probeversion übrigens völlig ausgereicht.
Da das zu meiner völligen Zufriedenheit funktioniert hat, habe ich mir dann anschließend trotzdem, als Dankeschön an den Autor, die Vollversion gekauft.
Diese habe ich seitdem auch gelegentlich mal wieder genutzt habe.
Dabei ist es mir dann auch durchaus mal passiert, dass ich einen ganzen Tag mit aktivem VPN herumgelaufen bin, weil ich vergessen hatte es Abzuschalten und es auch nicht zu irgendwelchen Problem geführt hätte, die mich das hätten merken lassen.&lt;/p&gt;
&lt;p&gt;Was die Nutzung des veralteten VPN-Typs angeht, so sollte natürlich, wenn möglich, schon besser ein aktueller genutzt werden.
Bei aktuellen FRITZ!Boxen bietet sich hierbei die Nutzung von Wireguard an.
Geht es aber nur darum die eigene Internetnutzung über einen bestimmten Anschluss umzuleiten und sind im Netz der FRITZ!Box keine sonstigen offenen Dienste, so sollte die Nutzung der älteren VPN-Typen unproblematisch.
Der Austausch der FRITZ!Box würde in diesem Fall nur Elektroschrott produzieren, denn schlimmstenfalls reduziert ein angreifbares VPN die Sicherheit ja darauf, dass die Geräte im VPN und an der FRITZ!Box effektiv direkt im Internet stehen.&lt;/p&gt;</content><category term="Blog"></category><category term="Android"></category><category term="VPN"></category><category term="FRITZ!Box"></category></entry><entry><title>Widerspenstige DVDs auslesen</title><link href="https://marix.org/widerspenstige-dvds-auslesen.html" rel="alternate"></link><published>2024-04-06T00:00:00+02:00</published><updated>2024-04-06T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-04-06:/widerspenstige-dvds-auslesen.html</id><summary type="html">&lt;p&gt;Normalerweise ist &lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; ja eine zuverlässige und einfache Lösung wenn es darum geht DVDs für die Wiedergabe auf Geräten ohne optisches Laufwerk in eine Videodatei zu wandeln.
Bei einer DVD rannte ich dabei jetzt aber in ein kurioses Problem.
Nach ungefähr der Hälfte des Umwandlungsprozesses sagte &lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; es sei fertig …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Normalerweise ist &lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; ja eine zuverlässige und einfache Lösung wenn es darum geht DVDs für die Wiedergabe auf Geräten ohne optisches Laufwerk in eine Videodatei zu wandeln.
Bei einer DVD rannte ich dabei jetzt aber in ein kurioses Problem.
Nach ungefähr der Hälfte des Umwandlungsprozesses sagte &lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; es sei fertig.
Die Videodatei enthielt dann aber auch nur die Hälfte des Films.&lt;/p&gt;
&lt;p&gt;Online finden sich verschiedene Erklärungen für dieses Phänomen.
Nur passten Erklärungen wie eine überlastete CPU oder Leseprobleme von der DVD nicht zu meiner Situation.
&lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; hatte die CPU quasi für sich alleine.
Und das Problem trat auch auf wenn ich die Daten aus einem mit &lt;a href="https://sourceforge.net/projects/dvdbackup/"&gt;dvdbackup&lt;/a&gt; erstellten Abbild auf SSD einlas.&lt;/p&gt;
&lt;p&gt;Auch der &lt;a href="https://www.videolan.org/vlc/"&gt;VLC&lt;/a&gt; tat sich mit dieser DVD erstaunlich schwer.
Er erzeugte zwar eine Videodatei welche den kompletten Film enthielt, doch Ton und Bild waren asynchron.
Außerdem scheint &lt;a href="https://www.videolan.org/vlc/"&gt;VLC&lt;/a&gt; es nicht zu unterstützen eine Datei mir mehreren Tonspuren zu erstellen.&lt;/p&gt;
&lt;p&gt;Die Lösung war es letztlich, wie &lt;a href="https://wiki.ubuntuusers.de/DVDs_manuell_rippen/"&gt;im Artikel zum manuellen rippen von DVDs auf Ubuntuusers&lt;/a&gt; erläutert, mit &lt;a href="http://www.mplayerhq.hu"&gt;MPlayer&lt;/a&gt; den Film von der DVD in eine einzelne VOB Datei zu extrahieren.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mplayer dvd://2 -v -dumpstream -dumpfile title02.vob
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In meinem Fall war der relevante Titel der zweite auf der DVD.
Ansonsten ist entsprechend die Nummer des Titels an das Argument &lt;code&gt;dvd://&lt;/code&gt; anzuhängen.&lt;/p&gt;
&lt;p&gt;Während &lt;a href="https://sourceforge.net/projects/dvdbackup/"&gt;dvdbackup&lt;/a&gt; die Struktur der DVD mit mehreren VOBs komplett replizierte, gibt es jetzt nur eine Datei.
Und diese Datei lies sich dann ganz normal und erfolgreich mit &lt;a href="https://handbrake.fr/"&gt;Handbrake&lt;/a&gt; konvertieren.
Der einzige Wermutstropfen ist, dass dabei die Kapitelstruktur verloren gegangen ist.&lt;/p&gt;</content><category term="Blog"></category></entry><entry><title>Mehrsprachige Videos aus der ZDF Mediathek herunterladen</title><link href="https://marix.org/mehrsprachige-videos-aus-der-zdf-mediathek-herunterladen.html" rel="alternate"></link><published>2024-03-26T00:00:00+01:00</published><updated>2024-03-26T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-03-26:/mehrsprachige-videos-aus-der-zdf-mediathek-herunterladen.html</id><summary type="html">&lt;p&gt;Die Mediatheken der Öffentlich-Rechtlichen haben ja immer wieder Perlen zu bieten.
Leider aber häufig nur für sehr kurze Zeit, und nicht umbedingt dann, wenn ich als Nutzer auch Zeit habe diese zu konsumieren.
Und auch so manches Endgerät, wie die PlayStation, harmonieren nicht so wunderbar mit den Mediatheken.
Mit &lt;a href="https://mediathekview.de"&gt;MediathekView …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die Mediatheken der Öffentlich-Rechtlichen haben ja immer wieder Perlen zu bieten.
Leider aber häufig nur für sehr kurze Zeit, und nicht umbedingt dann, wenn ich als Nutzer auch Zeit habe diese zu konsumieren.
Und auch so manches Endgerät, wie die PlayStation, harmonieren nicht so wunderbar mit den Mediatheken.
Mit &lt;a href="https://mediathekview.de"&gt;MediathekView&lt;/a&gt; und &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; gibt es aber ja zum Glück hervorragende Möglichkeiten Medien zur zeit- und gerätesouveränen Nutzung auf einen lokalen DLNA-Server oder ein Plex zu sichern.&lt;/p&gt;
&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;
&lt;p&gt;Ärgerlich ist hierbei, wenn Original- und synchronisierte Version in den Mediatheken als separate Videos angeboten werden.
Denn das Video ist ja in allen Versionen dasselbe.
Wird es für alle Sprachversionen separat gesichert, sorgt es für doppelte Downloadgröße und doppelten Speicherbedarf.
Dabei würde eine zusätzliche Tonspur nur minimalen Platz verbrauchen.&lt;/p&gt;
&lt;h2 id="mehrsprachige-videos-herunterladen"&gt;Mehrsprachige Videos herunterladen&lt;/h2&gt;
&lt;p&gt;In der Mediathek des ZDF finden sich inzwischen auch Videos bei denen allen Sprachversionen parallel ausgeliefert werden.
Leider lassen sich diese nicht direkt über &lt;a href="https://mediathekview.de"&gt;MediathekView&lt;/a&gt; herunterladen.
Aber mit &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; ist dies möglich.
Der Magie besteht hierdrin in der Nutzung des Parameters &lt;code&gt;--audio-multistream&lt;/code&gt; und der korrekten Auswahl der Tonspuren.
Letzere lässt sich durch die Auswahl &lt;code&gt;bestaudio&lt;/code&gt; auch automatisieren, allerdings müssen alle Sprachen explizit angegeben werden, also beispielsweise &lt;code&gt;bestaudio[language=de]+bestaudio[langauge=en]&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="die-arbeit-an-ein-skript-delegieren"&gt;Die Arbeit an ein Skript delegieren&lt;/h2&gt;
&lt;p&gt;Um die Sprachen nicht jedes mal von Hand auswählen zu müssen hilft ein kleine Shellscript welches zuerst per &lt;code&gt;yt-dlp --dump-json&lt;/code&gt; die Metadaten des Videos abfragt, aus diesen die Sprachen per &lt;a href="https://jqlang.github.io/jq/"&gt;jq&lt;/a&gt; extrahiert und daraus den passenden Parameter für &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; baut.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

set -eu -o pipefail

echo "Lade ${1} als ${2}"

AUDIO=$(yt-dlp --dump-json "${1}" | jq -r '[[.formats[] | select(.vcodec == "none") | .language] | sort | unique[] | "+bestaudio[language=\(.)]"] | join("")')

yt-dlp --write-subs --sub-langs 'deu,eng,fra' --audio-multistreams --format "bestvideo${AUDIO}" --embed-metadata --merge-output-format 'mp4' --write-thumbnail --output "${2}.%(ext)s" "${1}"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Skript übernimmt die URL eines Videos als erster Parameter, und schreibt mehrsprachiges Video, Untertitel, und ein Titelbild in Dateien welche den zweiten Parameter als Namen nutzen.
Das erlaubt die Dateien direkt mit &lt;a href="https://support.plex.tv/articles/categories/your-media/"&gt;den passenden Namen für die Metadatenerkennung von Plex anzulegen&lt;/a&gt;.
Um also beispielsweise &lt;a href="https://www.zdf.de/filme/spielfilm-highlights/sugar-108.html"&gt;Sugar&lt;/a&gt; aus der ZDF-Mediathek für eine Wiedergabe an der PS5 per Plex herzunterzuladen würde das, als &lt;code&gt;zdf_mt_dl.sh&lt;/code&gt; abgelegte, Skript wie folgt aufgerufen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;zdf_mt_dl.sh 'https://www.zdf.de/filme/spielfilm-highlights/sugar-108.html' 'Sugar (2022)'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="das-skript-erklart"&gt;Das Skript erklärt&lt;/h2&gt;
&lt;p&gt;Das anfängliche &lt;code&gt;set -eu -o pipefail&lt;/code&gt; stellt sicher, dass das Skript abbricht wenn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ein Aufruf im Skript einen Fehler zurückgibt (&lt;code&gt;-e&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;und zwar auch, wenn wir das Ergebnis per Pipe weitergeben (&lt;code&gt;-o pipefail&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Auch beim Zugriff auf eine undefinierte Variable bricht das Skript ab (&lt;code&gt;-u&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;yt-dlp --dump-json&lt;/code&gt; holt die Metadaten von der übergebenen URL und gibt diese als JSON aus.
Diese verarbeiter der Aufruf von &lt;a href="https://jqlang.github.io/jq/"&gt;jq&lt;/a&gt; weiter.
Aus allen Formaten werden nur diese ausgewählt, bei welchen das Attribut &lt;code&gt;vcoded&lt;/code&gt; den Wert &lt;code&gt;none&lt;/code&gt; hat, also die reinen Audio-Stream.
Von diesen lesen wir das Attribut &lt;code&gt;language&lt;/code&gt; aus, sortieren diese, sortieren Duplicate aus, und setzen diese per &lt;code&gt;\(.)&lt;/code&gt; jeweils in die Zeichenkette &lt;code&gt;"+bestaudio[language=\(.)]"&lt;/code&gt; ein.
Wichtig ist hier, dass wir das ganze nochmal ein eckigen Klammern haben, damit bekommen wir nicht eine Zeichenkette pro Zeile im Output von &lt;a href="https://jqlang.github.io/jq/"&gt;jq&lt;/a&gt;, sondern bekommen das ganze immer noch als JSON-Array.
Damit können wir diese am Schluss noch per &lt;code&gt;join("")&lt;/code&gt; zusammenfassen und bekommen dann so etwas wie &lt;code&gt;+bestaudio[language=de]+bestaudio[langauge=en]&lt;/code&gt; welches wir dann anschließend über die Variable &lt;code&gt;${AUDIO}&lt;/code&gt; in unseren Aufruf von &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; setzen können.&lt;/p&gt;
&lt;p&gt;Beim Aufruf von &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; nutzt das Skript noch ein paar weitere Parameter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--write-subs&lt;/code&gt; holt, falls verfügbar, auch die Untertitel mit aus der Mediathek.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--sublangs 'deu,eng,fra'&lt;/code&gt; wählt die Sprachen aus die &lt;code&gt;--write-subs&lt;/code&gt; versuchen soll.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--audio-multistreams&lt;/code&gt; sorgt dafür, dass mehrere Tonspuren in der geschriebenen Datei landen dürfen. Sonst gäbe die Auswahl mehrerer Spuren einen Fehler.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--format "bestvideo${AUDIO}"&lt;/code&gt; wählt die Spuren aus. Wir wollen die beste Videospur, und zu jeder Sprache das beste Audio. &lt;code&gt;${AUDIO}&lt;/code&gt; wird hier mit der Spezifikation der Tonspuren ersetzt die wir zuvor zusammegebastelt haben.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--embed-metadata&lt;/code&gt; sorgt dafür, dass die Tonspuren auch schöne Namen haben.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--merge-output-format&lt;/code&gt; sorgt dafür, dass eine &lt;code&gt;mp4&lt;/code&gt; statt einer &lt;code&gt;mkv&lt;/code&gt; geschrieben wird. Das hat bei der Weitergabe an eine PlayStation den Vorteil, dass die PlayStation MP4-Dateien, anders als Matroska-Dateien direkt abspielen kann. So wird im Zweifel der Medienserver ein klein wenig entlastet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--write-thumbnail&lt;/code&gt; sorgt dafür, dass das Titelbild zur Datei mitgesichert wird.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--output "${2}.%(ext)s"&lt;/code&gt; schließlich lässt &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt; unseren vorgegebenen Dateinamen übernehmen, aber für die einzelnen Dateien selbst die passende Endung auswählen. Ein deutscher Untertitel lautet beim oben genannten Beispiel also unter &lt;code&gt;Sugar (2022).deu.vtt&lt;/code&gt;, das Video selbst unter &lt;code&gt;Sugar (2022).mp4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aktuelle-versionen-des-skripts"&gt;Aktuelle Versionen des Skripts&lt;/h2&gt;
&lt;p&gt;Die aktuelle Version des Skripts ist auf &lt;a href="https://codeberg.org/"&gt;Codeberg&lt;/a&gt; zu finden: &lt;a href="https://codeberg.org/Marix/mt-dl"&gt;https://codeberg.org/Marix/mt-dl&lt;/a&gt;.
Diese kann auch mit den Mediatheken anderer Sender, wie der ARD und Arte, genutzt werden.&lt;/p&gt;</content><category term="Blog"></category></entry><entry><title>Am Linuxrechner Bluetooth per USB nachrüsten</title><link href="https://marix.org/am-linuxrechner-bluetooth-per-usb-nachrusten.html" rel="alternate"></link><published>2024-03-24T00:00:00+01:00</published><updated>2024-03-24T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-03-24:/am-linuxrechner-bluetooth-per-usb-nachrusten.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Linux"></category><category term="Bluetooth"></category></entry><entry><title>Dynamisches Laden von Kernelmodulen beim Zugriff durch Nutzer</title><link href="https://marix.org/dynamisches-laden-von-kernelmodulen-beim-zugriff-durch-nutzer.html" rel="alternate"></link><published>2024-03-14T00:00:00+01:00</published><updated>2024-03-14T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-03-14:/dynamisches-laden-von-kernelmodulen-beim-zugriff-durch-nutzer.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="http://cdemu.org/"&gt;CDEmu&lt;/a&gt;, welche diese Abbilder im CUE/BIN-Format als virtuelles Laufwerk einbinden kann.&lt;/p&gt;
&lt;p&gt;Damit der, für &lt;a href="http://cdemu.org/"&gt;CDEmu&lt;/a&gt; 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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um die Gerätedateien für die nachzuladenden Module beim Start des Systems anzulegen gibt es &lt;a href="https://www.man7.org/linux/man-pages/man8/depmod.8.html"&gt;&lt;code&gt;modules.devname&lt;/code&gt;&lt;/a&gt;. Kernelmodule können also angeben, dass sie eine Gerätedatei brauchen und diese wird beim Start angelegt.&lt;/li&gt;
&lt;li&gt;Auf Systemen mit Systemd kennt &lt;a href="https://www.man7.org/linux/man-pages/man7/udev.7.html"&gt;udev&lt;/a&gt; das spezielle Tag &lt;code&gt;uaccess&lt;/code&gt;. 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.&lt;/li&gt;
&lt;li&gt;Die Regeln von &lt;a href="https://www.man7.org/linux/man-pages/man7/udev.7.html"&gt;udev&lt;/a&gt; werden eigentlich durch das Laden der Kernelmodule, bzw. das Auftauchen von Gerätedateien ausgelöst. Die per &lt;code&gt;modules.devname&lt;/code&gt; angelegten Dateien lösen diese Regeln aber nicht aus. &lt;a href="https://www.man7.org/linux/man-pages/man7/udev.7.html"&gt;udev&lt;/a&gt; kennt aber die Option &lt;code&gt;static_node&lt;/code&gt; welche &lt;a href="https://www.man7.org/linux/man-pages/man7/udev.7.html"&gt;udev&lt;/a&gt; anweist die Regel auch auf die Platzhalterdatei anzuwenden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href="https://www.man7.org/linux/man-pages/man7/udev.7.html"&gt;udev&lt;/a&gt;-Regel welche diese Mechanismen nutzt findet sich übrigens &lt;a href="https://github.com/ValveSoftware/steam-for-linux/issues/4794"&gt;bei der vom Steam-Controller genutzten Datei &lt;code&gt;/dev/uinput&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://cdemu.org/"&gt;CDEmu&lt;/a&gt; wirft, wenn die Berechtigungen nicht korrekt gesetzt sind übrigens folgende Fehlermeldung:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FEHLER: Fehler beim Verbunden zum CDEmu Daemon: g-io-error-quark: Error calling StartServiceByName for net.sf.cdemu.CDEmuDaemon: Timeout was reached (24)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein Blick in das Log des Daemons mit dem sich &lt;code&gt;cdemu&lt;/code&gt; zu verbinden sucht zeigte dann, dass der Service nicht die Berechtigung hat auf den virtuellen Gerätetreiber zuzugreifen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cdemu0: Kernel I/O: failed to open control device /dev/vhba_ctl: Keine Berechtigung!
&lt;/code&gt;&lt;/pre&gt;</content><category term="Blog"></category><category term="Linux"></category></entry><entry><title>Minecraft auf openSUSE Leap 15.5</title><link href="https://marix.org/minecraft-auf-opensuse-leap-155.html" rel="alternate"></link><published>2024-01-06T15:00:00+01:00</published><updated>2024-01-06T15:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-01-06:/minecraft-auf-opensuse-leap-155.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bildschirmfoto der Fehlermeldung &amp;quot;Spielabsturz&amp;quot; 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"&gt;&lt;/p&gt;
&lt;p&gt;Der in der Fehlermeldung angegebene Exit-Code 6 hiflt leider nicht viel weiter.
Suchen danach führen zu vielen verschiedenen möglichen …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bildschirmfoto der Fehlermeldung &amp;quot;Spielabsturz&amp;quot; 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"&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#
# 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
#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Glücklicherweise lässt sich die von Minecraft verwendete Java-Laufzeitumgebung konfigurieren.
Diese findet sich im Abschnitt "Mehr Optionen" der Installationseinstellungen.
Tragen wir hier &lt;code&gt;/usr/bin/java&lt;/code&gt; ein, so wird das aktuellste auf dem System installierte Java verwendet.&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Die Konfiguration einer Installation von Minecraft finden wir übrigens unter „Bearbeiten“ im erweiterten Menü der Installation im Reiter „Installationen“.&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo zypper in java-17-openjdk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach können wir dann endlich Minecraft auf openSUSE Leap 15.5 genießen.&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;/p&gt;</content><category term="Blog"></category><category term="Minecraft"></category><category term="openSUSE"></category><category term="Linux"></category><category term="Games"></category></entry><entry><title>Minecraft auf der PlayStation mit geteiltem Bildschirm spielen</title><link href="https://marix.org/minecraft-auf-der-playstation-mit-geteiltem-bildschirm-spielen.html" rel="alternate"></link><published>2024-01-02T22:00:00+01:00</published><updated>2024-01-02T22:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2024-01-02:/minecraft-auf-der-playstation-mit-geteiltem-bildschirm-spielen.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bildschirmfoto von Minecraft im lokalen Mehrspielermodus mit vier Spielern" src="https://marix.org/Bilder/Minecraft-lokaler-Multiplayer-ohne-PSN-account.png"&gt;&lt;/p&gt;
&lt;p&gt;Um einem laufenden Spiel bezutreten ist lediglich folgendes notwendig:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aktivieren eines weiteren DualSense- oder DualShock,&lt;/li&gt;
&lt;li&gt;Auswahl einen lokalen Benutzers auf der PlayStation auswählen, und schließlich&lt;/li&gt;
&lt;li&gt;Drücken der Optionstaste, das ist die Taste rechts oberhalb vom Touchpad, auf dem beitretenden Controller.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Soweit ich das testen kann funktioniert das ganze auch in allen Kombinationen von Spielern mit und ohne PSN- und Microsoft-Konten.&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="Minecraft"></category><category term="PS5"></category><category term="PlayStation"></category><category term="Games"></category></entry><entry><title>Ubisofts kleine Falle für Steam-Spieler und Gamemode-Nutzer</title><link href="https://marix.org/ubisofts-kleine-falle-fur-steam-spieler-und-gamemode-nutzer.html" rel="alternate"></link><published>2023-07-04T00:00:00+02:00</published><updated>2023-08-01T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2023-07-04:/ubisofts-kleine-falle-fur-steam-spieler-und-gamemode-nutzer.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;gamemoderun&lt;/code&gt; nutzt, unerwartet im &lt;a href="https://github.com/FeralInteractive/gamemode"&gt;Gamemode&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot des im Hintergrund weiterlaufenden Ubisoft Connect." src="https://marix.org/Bilder/Ubisoft Connect läuft im Hintergrund weiter.png"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Meine bisherigen Suchen führten weiterhin zu &lt;a href="https://www.reddit.com/r/uplay/comments/4f4ep4/closing_uplay_on_game_exit/"&gt;ein paar abenteuerlichen Skripten für einzelne Ubisoft-Spiele auf Windows&lt;/a&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="Steam"></category><category term="Gaming"></category><category term="Linux"></category><category term="Ubisoft Connect"></category></entry><entry><title>Verbindungsprobleme mit Ubisoft Connect unter Linux lösen</title><link href="https://marix.org/verbindungsprobleme-mit-ubisoft-connect-unter-linux-losen.html" rel="alternate"></link><published>2023-05-18T00:00:00+02:00</published><updated>2023-05-18T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2023-05-18:/verbindungsprobleme-mit-ubisoft-connect-unter-linux-losen.html</id><summary type="html">&lt;p&gt;Der Versuch das aktuelle TrackMania zu starten führte auf meinem Rechner unter Linux reproduzierbar zu folgendem Fehler:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Verbindung Verloren&lt;/p&gt;
&lt;p&gt;Ein Ubisoft-Dienst ist im Moment nicht verfügbar. Du kannst es später erneut versuchen oder in den Offline-Modus wechseln.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Bildschirmfoto mit der Fehlermeldung, dass die Verbinung zum Ubisoft-Dienst verloren wurde" src="https://marix.org/Bilder/Ubisoft Connect Verbindungsfehler.png"&gt;&lt;/p&gt;
&lt;p&gt;Zum Glück &lt;a href="https://www.reddit.com/r/SteamDeck/comments/ymqvbz/ubisoft_connect_connection_lost_stuck/"&gt;hatte jemand auf Reddit schon sehr viel Zeit darauf verwendet, dass …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Der Versuch das aktuelle TrackMania zu starten führte auf meinem Rechner unter Linux reproduzierbar zu folgendem Fehler:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Verbindung Verloren&lt;/p&gt;
&lt;p&gt;Ein Ubisoft-Dienst ist im Moment nicht verfügbar. Du kannst es später erneut versuchen oder in den Offline-Modus wechseln.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Bildschirmfoto mit der Fehlermeldung, dass die Verbinung zum Ubisoft-Dienst verloren wurde" src="https://marix.org/Bilder/Ubisoft Connect Verbindungsfehler.png"&gt;&lt;/p&gt;
&lt;p&gt;Zum Glück &lt;a href="https://www.reddit.com/r/SteamDeck/comments/ymqvbz/ubisoft_connect_connection_lost_stuck/"&gt;hatte jemand auf Reddit schon sehr viel Zeit darauf verwendet, dass Problem zu debuggen.&lt;/a&gt;
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 &lt;code&gt;net.ipv4.tcp_mtu_probing&lt;/code&gt;, welche dafür auf den Wert &lt;code&gt;1&lt;/code&gt; zu setzen ist.&lt;/p&gt;
&lt;p&gt;Zum Testen lässt sich die Option per &lt;code&gt;sudo sysctl net.ipv4.tcp_mtu_probing=1&lt;/code&gt; temporär aktivieren.
Mit dem nächsten Reboot, oder einem &lt;code&gt;sudo sysctl net.ipv4.tcp_mtu_probing=0&lt;/code&gt; ist das normale Verhalten wiederhergestellt.&lt;/p&gt;
&lt;p&gt;Um das Verhalten permanent zu aktivieren muss die Option in die Sysctl-Konfiguration eingetragen werden.
Am besten in eine eigene Datei in &lt;code&gt;/etc/sysctl/conf.d/&lt;/code&gt;.
Also, &lt;code&gt;/etc/sysctl.d/50-enable-ipv4-mtu-probing.conf&lt;/code&gt; anlegen und folgendes reinschreiben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sysctl net.ipv4.tcp_mtu_probing=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="Steam"></category><category term="Gaming"></category><category term="Linux"></category><category term="Ubisoft Connect"></category><category term="Legacy IP"></category></entry><entry><title>Meine Gedanken zum neuen Sprint-Format der Formel 1</title><link href="https://marix.org/meine-gedanken-zum-neuen-sprint-format-der-formel-1.html" rel="alternate"></link><published>2023-05-09T00:00:00+02:00</published><updated>2023-05-09T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2023-05-09:/meine-gedanken-zum-neuen-sprint-format-der-formel-1.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="Formel 1"></category><category term="Motorsport"></category></entry><entry><title>Pre-commit auf openSUSE Leap 15.4</title><link href="https://marix.org/pre-commit-auf-opensuse-leap-154.html" rel="alternate"></link><published>2022-02-07T00:00:00+01:00</published><updated>2022-02-07T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2022-02-07:/pre-commit-auf-opensuse-leap-154.html</id><summary type="html">&lt;p&gt;Beim Upgrade von openSUSE Leap 15.3 auf openSUSE Leap 15.4 ergibt sich bei &lt;a href="https://pre-commit.com/"&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; ein interessantes Problem.
Auf älteren Versionen von Leap konnte das Paket aus dem &lt;a href="https://build.opensuse.org/project/show/devel:languages:python"&gt;Entwicklungsprojekt &lt;code&gt;devel:languages:python&lt;/code&gt;&lt;/a&gt; installiert werden.
Dort findet sich aber keine Version für Leap 15.4.
Eine solche findet sich jetzt …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Beim Upgrade von openSUSE Leap 15.3 auf openSUSE Leap 15.4 ergibt sich bei &lt;a href="https://pre-commit.com/"&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; ein interessantes Problem.
Auf älteren Versionen von Leap konnte das Paket aus dem &lt;a href="https://build.opensuse.org/project/show/devel:languages:python"&gt;Entwicklungsprojekt &lt;code&gt;devel:languages:python&lt;/code&gt;&lt;/a&gt; installiert werden.
Dort findet sich aber keine Version für Leap 15.4.
Eine solche findet sich jetzt in meinem Projekt &lt;a href="https://build.opensuse.org/package/show/home%3AtheMarix%3Apy36/python-pre-commit"&gt;&lt;code&gt;home:theMarix:py36&lt;/code&gt;&lt;/a&gt; und lässt sich von dort einfach installieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;zypper addrepo https://download.opensuse.org/repositories/home:theMarix:py36/15.4/home:theMarix:py36.repo
zypper refresh
zypper install python3-pre-commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Problem entsteht, weil &lt;a href="https://pre-commit.com/"&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; 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.
&lt;a href="https://pre-commit.com/"&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; 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 &lt;code&gt;devel:languages:python&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Im Projekt &lt;a href="https://build.opensuse.org/package/show/home%3AtheMarix%3Apy36/python-pre-commit"&gt;&lt;code&gt;home:theMarix:py36&lt;/code&gt;&lt;/a&gt; befindet sich jetzt einfach ein Link auf die letzte Revision des Pakets in &lt;code&gt;devel:languages:python&lt;/code&gt; die noch mit Python 3.6 kompatibel war.
So gibt es jetzt zwar leider keine aktuelle Version von &lt;a href="https://pre-commit.com/"&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Linux"></category></entry><entry><title>Besser Brille putzen</title><link href="https://marix.org/besser-brille-putzen.html" rel="alternate"></link><published>2022-02-05T00:00:00+01:00</published><updated>2022-02-05T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2022-02-05:/besser-brille-putzen.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gläser einsprühen.&lt;/li&gt;
&lt;li&gt;Mit fliesendem Wasser abspülen.&lt;/li&gt;
&lt;li&gt;Mit einem normalen Spültuch trocken reiben.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category></entry><entry><title>KTorrent friert ein</title><link href="https://marix.org/ktorrent-friert-ein.html" rel="alternate"></link><published>2022-01-29T00:00:00+01:00</published><updated>2022-01-29T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2022-01-29:/ktorrent-friert-ein.html</id><summary type="html">&lt;p&gt;Die Tage musste ich leider Feststellen, dass mein KTorrent beim Download der aktuellen &lt;a href="https://haveibeenpwned.com/Passwords"&gt;Pwned-Passwords-List von Have I been Pwned&lt;/a&gt; komplett einfror.
&lt;a href="https://www.qwant.com/?q=ktorrent+freezes"&gt;Eine Suche nach dem Problem&lt;/a&gt; liefert nicht viele Treffer, aber fördert &lt;a href="https://forums.opensuse.org/showthread.php/523076-Ktorrent-freeze-and-Firefox"&gt;einen 5 Jahre alten Forenbeitrag zutage, der eine Lösung für das Problem liefert&lt;/a&gt;.
Den Firefox einmal kurz zu …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die Tage musste ich leider Feststellen, dass mein KTorrent beim Download der aktuellen &lt;a href="https://haveibeenpwned.com/Passwords"&gt;Pwned-Passwords-List von Have I been Pwned&lt;/a&gt; komplett einfror.
&lt;a href="https://www.qwant.com/?q=ktorrent+freezes"&gt;Eine Suche nach dem Problem&lt;/a&gt; liefert nicht viele Treffer, aber fördert &lt;a href="https://forums.opensuse.org/showthread.php/523076-Ktorrent-freeze-and-Firefox"&gt;einen 5 Jahre alten Forenbeitrag zutage, der eine Lösung für das Problem liefert&lt;/a&gt;.
Den Firefox einmal kurz zu schließen taut KTorrent wieder auf.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ist KTorrent bereits gestartet bevor Firefox die Datei übergibt, so scheint das Problem nicht aufzutreten.&lt;/li&gt;
&lt;li&gt;Kopiert man die URL der Torrent-Datei in die Zwischenablage, kann man diese auch aus KTorrent direkt mit &lt;em&gt;Datei - Adresse öffnen&lt;/em&gt; bzw. &lt;code&gt;Strg+P&lt;/code&gt; öffnen und umgeht die Interaktion zwischen Firefox und KTorrent komplett.&lt;/li&gt;
&lt;/ol&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Bug"></category><category term="Workaround"></category><category term="KTorrent"></category><category term="Firefox"></category><category term="BitTorrent"></category></entry><entry><title>Bootprobleme mit Leap 15.3 und Radeon-Grafik</title><link href="https://marix.org/bootprobleme-mit-leap-153-und-radeon-grafik.html" rel="alternate"></link><published>2022-01-28T00:00:00+01:00</published><updated>2022-02-07T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2022-01-28:/bootprobleme-mit-leap-153-und-radeon-grafik.html</id><summary type="html">&lt;p&gt;Mit dem am Mittwoch durch den Patch &lt;code&gt;openSUSE-SLE-15.3-2022-198&lt;/code&gt; gelieferten Kernel mit Version &lt;code&gt;5.3.18-150300.59.43.1&lt;/code&gt; 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mit dem am Mittwoch durch den Patch &lt;code&gt;openSUSE-SLE-15.3-2022-198&lt;/code&gt; gelieferten Kernel mit Version &lt;code&gt;5.3.18-150300.59.43.1&lt;/code&gt; 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 &lt;code&gt;nomodeset&lt;/code&gt; gestartet werden.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://marix.org/alte-kernelversionen-installiert-behalten.html"&gt;einem älteren Artikel von mir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;nomodeset&lt;/code&gt; umgehen.
Am einfachsten lässt sich dieser über das Modul &lt;em&gt;Bootloader&lt;/em&gt; im Abschnitt &lt;em&gt;System&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Um den Bootparameter beim Start manuell zu setzen muss im Bootmenü die Taste &lt;code&gt;E&lt;/code&gt; gedrückt werden.
Dies öffnet den gerade ausgewählten Startmenüeintrag in einem einfachen Editor.
Hier ist die mit &lt;code&gt;linux&lt;/code&gt; beginnende Zeile zu suchen und an deren Ende der Parameter &lt;code&gt;nomodeset&lt;/code&gt; hinzuzufügen.
Durch einen Druck auf &lt;code&gt;F10&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Mehr Informationen zu diesem Problem finden sich &lt;a href="https://bugzilla.opensuse.org/show_bug.cgi?id=1195168"&gt;im Bugzilla&lt;/a&gt;.
Dort gibt es auch schon eine verifizierte richtige Lösung des Problems, welche im nächsten Kernel-Patch dann enthalten sein dürfte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aktualisierung vom 7.2.2022&lt;/strong&gt;: Mit dem Update &lt;code&gt;openSUSE-SLE-15.3-2022-340&lt;/code&gt;, welches den Kernel auf Version &lt;code&gt;5.3.18-150300.59.46&lt;/code&gt; hebt, ist das Problem behoben.
Die betroffenen Systeme starten auch ohne den Workaround &lt;code&gt;nomodeset&lt;/code&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Bug"></category><category term="Workaround"></category></entry><entry><title>American und Euro Truck Simulator 2 1.40</title><link href="https://marix.org/american-und-euro-truck-simulator-2-140.html" rel="alternate"></link><published>2021-03-26T00:00:00+01:00</published><updated>2021-03-26T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2021-03-26:/american-und-euro-truck-simulator-2-140.html</id><summary type="html">&lt;p&gt;Diese Woche erschien Version 1.40 der beiden Geschwisterspiele &lt;a href="https://worldoftrucks.com/"&gt;American und Euro Truck Simulator 2&lt;/a&gt;.
Und ich bin begeistert, sowohl vom neuen Lichtsystem als auch von der Überarbeitung des deutschen Teils der Karte.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Screenshot aus dem Führerhaus, dem Sonnengang entgegen auf Amsterdam zufahrend." src="https://marix.org/Bilder/Sonnenuntergang-bei-Amsterdam.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Tatsächlich immer noch etwas erstaunt es mich immer noch ein wenig, dass ich von diesem Spiel so …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Diese Woche erschien Version 1.40 der beiden Geschwisterspiele &lt;a href="https://worldoftrucks.com/"&gt;American und Euro Truck Simulator 2&lt;/a&gt;.
Und ich bin begeistert, sowohl vom neuen Lichtsystem als auch von der Überarbeitung des deutschen Teils der Karte.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Screenshot aus dem Führerhaus, dem Sonnengang entgegen auf Amsterdam zufahrend." src="https://marix.org/Bilder/Sonnenuntergang-bei-Amsterdam.jpg"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;Going East&lt;/em&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="Games"></category></entry><entry><title>Die Beta von openSUSE Leap 15.3 ist da</title><link href="https://marix.org/die-beta-von-opensuse-leap-153-ist-da.html" rel="alternate"></link><published>2021-03-06T00:00:00+01:00</published><updated>2021-03-06T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2021-03-06:/die-beta-von-opensuse-leap-153-ist-da.html</id><summary type="html">&lt;p&gt;Diese Woche &lt;a href="https://news.opensuse.org/2021/03/03/opensuse-leap-153-reaches-beta-build-phase/"&gt;erschien die Beta von openSUSE Leap 15.3&lt;/a&gt;, 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Diese Woche &lt;a href="https://news.opensuse.org/2021/03/03/opensuse-leap-153-reaches-beta-build-phase/"&gt;erschien die Beta von openSUSE Leap 15.3&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Auch &lt;a href="https://marix.org/opensuse-leap-151-mit-usb-stick-als-schlussel-fur-die-festplattenverschlusselung.html"&gt;meine Methode zum Booten mit Keystick&lt;/a&gt; funktioniert mit der Beta von Leap 15.3 wunderbar.&lt;/p&gt;
&lt;p&gt;Einen kleinen Stolperer gibt es momentan noch beim &lt;a href="https://en.opensuse.org/SDB:System_upgrade#Running_the_Upgrade"&gt;Onlineupgrade&lt;/a&gt; auf die Beta, zumindest wenn man bereits den Weg mit der Variablen &lt;code&gt;releasever&lt;/code&gt; in den Quellen für die Paketpfade nimmt.
Nach dem Update &lt;a href="https://bugzilla.opensuse.org/show_bug.cgi?id=1182951"&gt;zeigt &lt;code&gt;/etc/products.d/baseproduct&lt;/code&gt; ins Leere&lt;/a&gt;.
Das hat zur Folge, dass Zypper die Paketquellen nicht mehr findet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm /etc/products.d/baseproduct &amp;amp;&amp;amp; sudo ln /etc/products.d/Leap.prod /etc/products.d/baseproduct
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Linux"></category></entry><entry><title>openSUSE Leap 15.1 mit USB-Stick als Schlüssel für die Festplattenverschlüsselung</title><link href="https://marix.org/opensuse-leap-151-mit-usb-stick-als-schlussel-fur-die-festplattenverschlusselung.html" rel="alternate"></link><published>2021-03-06T00:00:00+01:00</published><updated>2023-06-10T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2021-03-06:/opensuse-leap-151-mit-usb-stick-als-schlussel-fur-die-festplattenverschlusselung.html</id><summary type="html">&lt;p&gt;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 &lt;a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html"&gt;schon damals hier im Blog dokumentiert&lt;/a&gt;.
Leider funktionierte …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html"&gt;schon damals hier im Blog dokumentiert&lt;/a&gt;.
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.&lt;/p&gt;
&lt;h2 id="festplattenverschlusselung"&gt;Festplattenverschlüsselung&lt;/h2&gt;
&lt;p&gt;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 &lt;code&gt;/boot&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="usb-stick-als-schlussel"&gt;USB-Stick als Schlüssel&lt;/h2&gt;
&lt;p&gt;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 &lt;code&gt;/dev/sdb&lt;/code&gt; im System zu sehen, kann er wie folgt passend formatiert werden.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkfs.ext2 -L keystick /dev/sdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Label &lt;code&gt;keystick&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Anschließend sollte ein Schlüssel generiert und auf dem USB-Stick hinterlegen werden. Dies kann mit &lt;code&gt;pwgen&lt;/code&gt; gemacht werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pwgen -s 1024 1 &amp;gt; /media/keystick/keyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und schließlich muss der Schlüssel der verschlüsselten Partition hinzugefügt werden.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cryptsetup luksAddKey /dev/sda2 /media/keystick/keyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In diesem Beispiel befindet sich die verschlüsselte Partition auf &lt;code&gt;/dev/sda2&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="usb-stick-beim-booten-nutzen"&gt;USB-Stick beim Booten nutzen&lt;/h2&gt;
&lt;p&gt;Um den Schlüssel beim Booten vom USB-Stick zu lesen muss der Kernelparameter &lt;code&gt;rd.luks.key&lt;/code&gt; auf die Schlüsseldatei zeigen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rd.luks.key=/keyfile:LABEL=keystick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Damit der Parameter &lt;code&gt;rd.luks.key&lt;/code&gt; 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 &lt;code&gt;/etc/dracut.conf.d/50-keystick.conf&lt;/code&gt; mit folgendem Inhalt anzulegen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;omit_dracutmodules+=" systemd "
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Leerzeichen im Wert sind hier Absicht.
Ohne diese wirft Dracut eine Warnung:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dracut: WARNING: &amp;lt;key&amp;gt;+=" &amp;lt;values&amp;gt; ": &amp;lt;values&amp;gt; should have surrounding white spaces!
dracut: WARNING: This will lead to unwanted side effects! Please fix the configuration file.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein anschließendes &lt;code&gt;mkinitrd&lt;/code&gt; erzeugt eine Initrd ohne Systemd und das System kann zukünftig bei eingestecktem USB-Stick ohne Passworteingabe gestartet werden.&lt;/p&gt;
&lt;h2 id="vorteile-gegenuber-der-alten-methode"&gt;Vorteile gegenüber der alten Methode&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://marix.org/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html"&gt;Bei der alten Methode&lt;/a&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Security"></category></entry><entry><title>CD-ROMs von Klett unter Linux nutzen</title><link href="https://marix.org/cd-roms-von-klett-unter-linux-nutzen.html" rel="alternate"></link><published>2021-01-04T00:00:00+01:00</published><updated>2021-01-04T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2021-01-04:/cd-roms-von-klett-unter-linux-nutzen.html</id><summary type="html">&lt;p&gt;Der &lt;a href="https://www.klett.de"&gt;Klett Verlag&lt;/a&gt; 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 &lt;code&gt;index.html&lt;/code&gt; Datei auch wunderbar auf nicht-Windows-Systemen nutzen ließen.
Häufig wird dann aber eine kaputte Seite dargestellt …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Der &lt;a href="https://www.klett.de"&gt;Klett Verlag&lt;/a&gt; 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 &lt;code&gt;index.html&lt;/code&gt; 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 &lt;code&gt;index.hml&lt;/code&gt; sichtbar zu schalten.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://askubuntu.com/questions/370906/unable-to-see-files-in-dvd-hidden-using-windows-7"&gt;auf askubuntu.com&lt;/a&gt;: Die CD muss mit der Option &lt;code&gt;unhide&lt;/code&gt; eingebunden werden.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /tmp/klett
sudo mount -o unhide -t iso9660 /dev/sr0 /tmp/klett
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach ist die CD mit allen Dateien in &lt;code&gt;/tmp/klett&lt;/code&gt; verfügbar und ich kann z.B. mit einem &lt;code&gt;xdg-open /tmp/klett/index.html&lt;/code&gt; den Inhalt öffnen.&lt;/p&gt;
&lt;p&gt;Zur Erklärung der obigen Kommandozeile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mit &lt;code&gt;mkdir /tmp/klett&lt;/code&gt; lege ich ein temporäres Verzeichnis an. Es in &lt;code&gt;/tmp&lt;/code&gt; anzulegen erspart es mir hinterher aufräumen zu müssen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; ist Notwendig, da ein normaler Nutzer keine Optionen angeben kann.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o unhide&lt;/code&gt; macht die normalerweise versteckten Dateien sichtbar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t iso9660&lt;/code&gt; gibt explizit an welches Dateisystem verwendet wird. &lt;code&gt;mount&lt;/code&gt; kann dies normalerweise auch automatisch erkennen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/sr0&lt;/code&gt; ist mein optisches Laufwerk.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Linux"></category></entry><entry><title>Mein bisher kleinster Pull-Request</title><link href="https://marix.org/mein-bisher-kleinster-pull-request.html" rel="alternate"></link><published>2020-10-25T00:00:00+02:00</published><updated>2020-10-25T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2020-10-25:/mein-bisher-kleinster-pull-request.html</id><summary type="html">&lt;p&gt;Kürzlich &lt;a href="https://chaos.social/@maralorn/104921191938830488"&gt;berichtete @maralorn@chaos.social über seinen bisher kleinsten Pull Request&lt;/a&gt;.
Dies lies mich kurz darüber nachdenken, was wohl mein kleinster Pull Request bisher war.
Tatsächlich habe ich kürzlich &lt;a href="https://github.com/ceph/ceph/pull/36932"&gt;einen Pull Request bei Ceph gemacht um einen Tippfehler in der Beschreibung des RPM Paketes für den Prometheus-Exporter zu fixen&lt;/a&gt;.
Jetzt …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kürzlich &lt;a href="https://chaos.social/@maralorn/104921191938830488"&gt;berichtete @maralorn@chaos.social über seinen bisher kleinsten Pull Request&lt;/a&gt;.
Dies lies mich kurz darüber nachdenken, was wohl mein kleinster Pull Request bisher war.
Tatsächlich habe ich kürzlich &lt;a href="https://github.com/ceph/ceph/pull/36932"&gt;einen Pull Request bei Ceph gemacht um einen Tippfehler in der Beschreibung des RPM Paketes für den Prometheus-Exporter zu fixen&lt;/a&gt;.
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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;zypper search prometheus&lt;/code&gt; 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.&lt;/p&gt;</content><category term="Beiträge zu freier Software"></category><category term="Mastodon"></category><category term="Ceph"></category></entry><entry><title>Catherine</title><link href="https://marix.org/catherine.html" rel="alternate"></link><published>2020-10-23T00:00:00+02:00</published><updated>2020-10-23T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2020-10-23:/catherine.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="_1"&gt;★★☆☆☆&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="Games"></category><category term="Spiel"></category><category term="Rezension"></category><category term="Playstation Plus"></category></entry><entry><title>Den Aktualisierungsstand von openSUSE mit Prometheus überwachen</title><link href="https://marix.org/den-aktualisierungsstand-von-opensuse-mit-prometheus-uberwachen.html" rel="alternate"></link><published>2020-06-21T00:00:00+02:00</published><updated>2020-06-21T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2020-06-21:/den-aktualisierungsstand-von-opensuse-mit-prometheus-uberwachen.html</id><summary type="html">&lt;p&gt;Letzte Woche habe ich Version 0.2.1 des &lt;a href="https://gitlab.com/Marix/zypper-patch-status-collector"&gt;Zypper-Patch-Status-Collectors&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Letzte Woche habe ich Version 0.2.1 des &lt;a href="https://gitlab.com/Marix/zypper-patch-status-collector"&gt;Zypper-Patch-Status-Collectors&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Durch Umleiten der Ausgabe in eine &lt;code&gt;prom&lt;/code&gt; Datei ins Textfile-Collector-Verzeichnis des Node-Exporters von Prometheus kommen die Metriken dann ins Monitoring.
Wurde der Node-Exporter wie folgt aufgerufen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node_exporter --collector.textfile.directory /var/lib/node_exporter/collector
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann lassen sie die Metriken wie folgt in Prometheus abladen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;zypper-patch-status-collector &amp;gt; /var/lib/node_exporter/collector/zypper.prom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stündlich per Systemd Timer aufgerufen hat Prometheus dann eine gute Übersicht über den Aktualisierungszustand der beobachteten openSUSE-Systeme.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- alert: 'ZypperPatchesPending'
  expr: 'sum(zypper_applicable_patches) by (instance) &amp;gt; 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) &amp;gt; 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 &amp;lt; 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 &amp;lt; 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"} &amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Installation des Collectors erfolgt am einfachsten über &lt;a href="https://software.opensuse.org/package/python3-zypper-patch-status-collector"&gt;mein Community-Paket auf software.opensuse.org&lt;/a&gt;.
Ich veröffentliche das Paket zwar auch &lt;a href="https://pypi.org/project/zypper-patch-status-collector/"&gt;auf pypi.org&lt;/a&gt;, aber ein Werkzeug mit Bezug zu Zypper am System vorbei zu installieren wäre dann doch etwas sehr verquer.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Monitoring"></category><category term="Prometheus"></category><category term="Python"></category></entry><entry><title>Der schusselige WLAN-Client</title><link href="https://marix.org/der-schusselige-wlan-client.html" rel="alternate"></link><published>2020-05-11T00:00:00+02:00</published><updated>2020-05-11T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2020-05-11:/der-schusselige-wlan-client.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="KDE fragt per Dialog nach einem Passwort fürs WLAN" src="https://marix.org/Bilder/WLAN-Passwortabfrage.png"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lists.opensuse.org/opensuse/2020-04/msg00581.html"&gt;Eine Nachfrage auf der Mailingliste von openSUSE&lt;/a&gt; brachte mich dann mit einem Verweis auf &lt;a href="https://lists.opensuse.org/opensuse-de/2019-10/msg00099.html"&gt;eine Diskussion auf der deutschsprachigen Liste&lt;/a&gt; auf die Lösung des Problems:
Anscheinend verursacht die &lt;em&gt;MAC address randomization&lt;/em&gt; das Problem.
Seit jene abgeschaltet ist trat das Problem nicht mehr auf.&lt;/p&gt;
&lt;p&gt;Ein einfacher weg die &lt;em&gt;MAC address randomization&lt;/em&gt; abzuschalten findet sich auf &lt;a href="https://blog.muench-johannes.de/networkmanager-disable-mac-randomization-314"&gt;https://blog.muench-johannes.de/networkmanager-disable-mac-randomization-314&lt;/a&gt;.
Es ist lediglich die Datei &lt;code&gt;/etc/NetworkManager/conf.d/100-disable-wifi-mac-randomization.conf&lt;/code&gt; mit folgendem Inhalt anzulegen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[connection]
wifi.mac-address-randomization=1

[device]
wifi.scan-rand-mac-address=no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wieso dieses Vorgehen in einem Netzwerk ohne MAC-Adressen-Filter notwendig sein sollte ist mir zwar schleierhaft, aber solange es hilft…&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="WLAN"></category><category term="Wi-Fi"></category><category term="NetworkManager"></category></entry><entry><title>Alte Kernelversionen installiert behalten</title><link href="https://marix.org/alte-kernelversionen-installiert-behalten.html" rel="alternate"></link><published>2019-08-16T00:00:00+02:00</published><updated>2019-08-16T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2019-08-16:/alte-kernelversionen-installiert-behalten.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Zum Glück lässt sich die Menge der aufbewahrten Kernel sehr flexibel Konfigurieren.
Die Konfiguration findet sich in der Datei &lt;code&gt;/etc/zypp/zypp.conf&lt;/code&gt;
Entscheiden ist der Wert der Option &lt;code&gt;multiversion.kernels&lt;/code&gt;.
Diese wird standardmäßig wie folgt gesetzt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;multiversion.kernels = latest,latest-1,running
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;multiversion.kernels = latest,latest-1,running,4.12.14-lp151.28.10.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wichtig ist, dass hier die Paketversion benötigt wird, nicht die vom Kernel bei einem &lt;code&gt;uname -a&lt;/code&gt; ausgegebene Version.
Letzteres würde lautet für den im Beispiel benutzen Kernel folgendes ausgeben.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die dazugehörige Paketversion lässt sich per &lt;code&gt;rpm&lt;/code&gt; oder &lt;code&gt;zypper&lt;/code&gt; abfragen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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

&amp;gt; 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)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wie im Beispiel zu sehen ist, liefert &lt;code&gt;zypper&lt;/code&gt; die einfacher zu lesende Ausgabe, &lt;code&gt;rpm&lt;/code&gt; aber eine deutlich kompaktere.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Weitere Informationen zur Installation mehrerer Kernelversionen finden sich &lt;a href="https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha.tuning.multikernel.html#sec.tuning.multikernel.enable.keep"&gt;in der englischen Referenzdokumentation von openSUSE Leap&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>Automatisiertes Tippen von Passwörtern auf openSUSE</title><link href="https://marix.org/automatisiertes-tippen-von-passwortern-auf-opensuse.html" rel="alternate"></link><published>2019-08-11T00:00:00+02:00</published><updated>2019-08-11T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2019-08-11:/automatisiertes-tippen-von-passwortern-auf-opensuse.html</id><summary type="html">&lt;p&gt;Die Passwortverwaltung &lt;a href="https://keepass.info/"&gt;KeePass&lt;/a&gt; hat das äußerst praktische Feature &lt;em&gt;Auto-Type&lt;/em&gt; 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die Passwortverwaltung &lt;a href="https://keepass.info/"&gt;KeePass&lt;/a&gt; hat das äußerst praktische Feature &lt;em&gt;Auto-Type&lt;/em&gt; 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 &lt;code&gt;xdotool&lt;/code&gt; nachinstalliert.
Ansonsten begrüßt folgende Fehlermeldung:&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;keepass&lt;/code&gt; eigentlich dafür sorgen, dass auch &lt;code&gt;xdotool&lt;/code&gt; installiert wird.&lt;/p&gt;
&lt;p&gt;Zum Glück hat openSUSE &lt;a href="https://en.opensuse.org/openSUSE:How_to_contribute_to_Factory"&gt;einen gut Dokumentierten Prozess um Korrekturen zu Paketen beizutragen&lt;/a&gt;.
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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://build.opensuse.org/request/show/690171"&gt;Wie man an meinem Request sehen kann&lt;/a&gt; habe ich &lt;code&gt;xdotool&lt;/code&gt; übrigens nicht einfach als Abhängigkeit zu &lt;code&gt;keepass&lt;/code&gt; hinzugefügt, denn KeePass funktioniert ja auch ohne &lt;code&gt;xdotool&lt;/code&gt; fehlerfrei.
Stattdessen nutze ich den &lt;a href="https://en.opensuse.org/openSUSE:Package_dependencies#Recommends"&gt;Vorschlagsmechanismus&lt;/a&gt;, also &lt;code&gt;Recommends&lt;/code&gt; statt &lt;code&gt;Depends&lt;/code&gt;.
So bekommt ein normaler Nutzer das empfohlene Paket automatisch mitinstalliert.
Wer aber &lt;code&gt;--no-recommends&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;Auto-Type&lt;/em&gt; nutzen.&lt;/p&gt;</content><category term="Beiträge zu freier Software"></category><category term="openSUSE"></category><category term="KeePass"></category><category term="Passwörter"></category><category term="Security"></category></entry><entry><title>openSUSE-Pakete für den Client und das Dateisystem von Keybase</title><link href="https://marix.org/opensuse-pakete-fur-den-client-und-das-dateisystem-von-keybase.html" rel="alternate"></link><published>2018-11-12T00:00:00+01:00</published><updated>2018-11-12T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-11-12:/opensuse-pakete-fur-den-client-und-das-dateisystem-von-keybase.html</id><summary type="html">&lt;p&gt;&lt;a href="https://keybase.io/"&gt;Keybase&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://keybase.io/"&gt;Keybase&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Die grundlegenden Funktionen von Keybase sind über &lt;a href="https://keybase.io/docs/command_line"&gt;das Kommandozeilenwerkzeug &lt;code&gt;keybase&lt;/code&gt;&lt;/a&gt; verfügbar.
Dieses wird vom Paket &lt;code&gt;keybase-client&lt;/code&gt; bereitgestellt und lässt sich in Tumbleweed durch ein einfaches &lt;code&gt;sudo zypper install keybase-client&lt;/code&gt; installieren.
Für Leap 15.0 ist das Paket leider nur als Versuchspaket verfügbar, welches sich am besten &lt;a href="https://software.opensuse.org/package/keybase-client"&gt;per 1-Klick-Installation von software.opensuse.org installieren&lt;/a&gt; lässt.&lt;/p&gt;
&lt;p&gt;Außerdem bietet Keybase noch zwei weitere nützliche Funktionen.
Mit &lt;a href="https://keybase.io/docs/kbfs"&gt;dem dazugehörigen Dateisystem&lt;/a&gt; lassen sich Daten verschlüsselt und signiert mit anderen Nutzer tauschen.
Auch öffentlich lassen sich darüber Dateien anbieten.
Diese erscheinen dann unter &lt;code&gt;https://&amp;lt;nutzername&amp;gt;.keybase.pub&lt;/code&gt;, und sind natürlich nicht verschlüsselt sondern nur signiert.
Hierfür wird das Paket &lt;code&gt;kbfs&lt;/code&gt; benötigt.
Ist diese installiert, kann man per &lt;code&gt;systemctl --user start kbfs&lt;/code&gt; das Dateisystem starten, welches dann unter &lt;code&gt;${XDG_RUNTIME_DIR}/keybase/kbfs&lt;/code&gt; erscheint.&lt;/p&gt;
&lt;p&gt;Die zweite nützliche Funktion ist es &lt;a href="https://keybase.io/blog/encrypted-git-for-everyone"&gt;Git-Repositories verschlüsselt in Keybase abzulegen&lt;/a&gt;.
Hierzu wird das Paket &lt;code&gt;kbfs-git&lt;/code&gt; benötigt.
Sobald diese installiert ist, und das Dateisystem aktiv, kann Git auf Repositories welche das Protokoll &lt;code&gt;keybase&lt;/code&gt; nutzen zugreifen.
Die Verwaltung erfolgt hierbei über das Kommando &lt;code&gt;keybase git&lt;/code&gt;.&lt;/p&gt;</content><category term="Beiträge zu freier Software"></category><category term="openSUSE"></category></entry><entry><title>Dieser Rattenfänger befreit Mäuse</title><link href="https://marix.org/dieser-rattenfanger-befreit-mause.html" rel="alternate"></link><published>2018-10-31T00:00:00+01:00</published><updated>2018-10-31T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-10-31:/dieser-rattenfanger-befreit-mause.html</id><summary type="html">&lt;p&gt;Seit letzter Woche ist &lt;a href="https://github.com/libratbag/piper"&gt;Piper&lt;/a&gt; in &lt;a href="https://www.opensuse.org/#Tumbleweed"&gt;openSUSE Tumbleweed&lt;/a&gt; als Paket enthalten.
&lt;a href="https://github.com/libratbag/piper"&gt;Piper&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Screenshot von Piper" src="https://marix.org/Bilder/Piper.png"&gt;&lt;/p&gt;
&lt;p&gt;Bei meiner Logitech G502 kann ich mit Piper nicht nur …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seit letzter Woche ist &lt;a href="https://github.com/libratbag/piper"&gt;Piper&lt;/a&gt; in &lt;a href="https://www.opensuse.org/#Tumbleweed"&gt;openSUSE Tumbleweed&lt;/a&gt; als Paket enthalten.
&lt;a href="https://github.com/libratbag/piper"&gt;Piper&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Screenshot von Piper" src="https://marix.org/Bilder/Piper.png"&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Zur Installation muss das Paket &lt;code&gt;piper&lt;/code&gt; ausgewählt werden, entweder in der grafischen Paketverwaltung, per &lt;a href="https://software.opensuse.org/package/piper"&gt;1-Klick-Installation auf software.opensuse.org&lt;/a&gt; oder auf der Kommandozeile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo zypper install piper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Games"></category><category term="Hardware"></category></entry><entry><title>HTTP/2 im Apache auf openSUSE</title><link href="https://marix.org/http2-im-apache-auf-opensuse.html" rel="alternate"></link><published>2018-10-23T00:00:00+02:00</published><updated>2018-10-23T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-10-23:/http2-im-apache-auf-opensuse.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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) &lt;em&gt;Worker&lt;/em&gt; kompatibel ist, welches immer noch der Standard ist.&lt;/p&gt;
&lt;p&gt;Um HTTP/2 zu aktivieren ist zunächst ein kompatibles MPM zu installieren.
Eine gute Wahl ist hierbei das MPM &lt;em&gt;Event&lt;/em&gt;, welches unter openSUSE durch das Paket &lt;code&gt;apache2-event&lt;/code&gt; bereitgestellt wird.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo zypper install apache2-event
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alle notwendige Konfiguration kann anschließend in der Datei &lt;code&gt;/etc/sysconfig/apache2&lt;/code&gt; vorgenommen werden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Das korrekte MPM auswählen: &lt;code&gt;APACHE_MPM=event&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Das HTTP2-Module durch hinzufügen von &lt;code&gt;http2&lt;/code&gt; zum Wert von &lt;code&gt;APACHE_MODULES&lt;/code&gt; aktivieren.&lt;/li&gt;
&lt;li&gt;Den Wert &lt;code&gt;HTTP2&lt;/code&gt; zu &lt;code&gt;APACHE_SERVER_FLAGS&lt;/code&gt; um die von openSUSE mitgelieferte Konfiguration für HTTP/2 zu aktivieren.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ab dem nächsten, per &lt;code&gt;systemctl restart apache2&lt;/code&gt; durchführbaren, Neustart ist der Server dann per HTTP/2 zu erreichen.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>GameMode</title><link href="https://marix.org/gamemode.html" rel="alternate"></link><published>2018-06-22T00:00:00+02:00</published><updated>2018-10-14T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-06-22:/gamemode.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="https://www.feralinteractive.com/de/"&gt;Feral Interactive&lt;/a&gt; entwickelte &lt;a href="https://github.com/FeralInteractive/gamemode"&gt;GameMode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/FeralInteractive/gamemode"&gt;GameMode&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Da selbst Spiele von Feral Interactive noch nicht durchgängig GameMode unterstützen gibt es außerdem &lt;em&gt;libgamemodeauto&lt;/em&gt;.
&lt;em&gt;Libgamemodeauto&lt;/em&gt; kann per &lt;code&gt;LD_PRELOAD&lt;/code&gt; mit einer Anwendung mitgeladen werden und sorgt dann automatisch für den Wechsel in den Spielemodus.
Installiert man &lt;em&gt;libgamemodeauto&lt;/em&gt; über das openSUSE-Paket &lt;code&gt;libgamemodeauto0&lt;/code&gt;, so findet es sich in &lt;code&gt;/usr/lib64/libgamemodeauto.so.0&lt;/code&gt;.
Um es im Spiel &lt;code&gt;game&lt;/code&gt; zu nutzen ist diese dann wie folgt zu starten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LD_PRELOAD=/usr/lib64/libgamemodeauto.so.0 game
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um Spiele per Steam mit &lt;em&gt;libgamemodeauto&lt;/em&gt; zu starten ist in den Startoptionen des Spieles folgendes einzutragen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LD_PRELOAD=$LD_PRELOAD:/usr/lib64/libgamemodeauto.so.0 %command%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Kommandozeilen finden sich auch in der Paketbeschreibung von &lt;code&gt;libgamemodeauto0&lt;/code&gt;, welche sich per &lt;code&gt;zypper info libgamemodeauto0&lt;/code&gt; anzeigen lässt.&lt;/p&gt;
&lt;p&gt;Der einfachste Weg GameMode zu installieren ist &lt;a href="https://software.opensuse.org/download.html?project=games%3Atools&amp;amp;package=libgamemodeauto"&gt;den Download oder die Anleitung von software.opensuse.org&lt;/a&gt; zu nutzen.
In Tumbleweed reicht ein einfaches &lt;code&gt;zypper install ligbamemodeauto0&lt;/code&gt;.
In Leap ist &lt;em&gt;libgameodeauto&lt;/em&gt; leider noch nicht eingezogen, so dass zuvor das Repository &lt;em&gt;games:tools&lt;/em&gt; hinzugefügt werden muss.&lt;/p&gt;
&lt;p&gt;Zusätzliche Aktionen für den Start und das Ende des Spielemodus lassen sich in der Datei &lt;code&gt;~/.config/gamemode.ini&lt;/code&gt; definieren.
Bei mir sieht diese so aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[custom]
start=
  cd &amp;amp;&amp;amp; boinccmd --set_run_mode never
  akonadictl stop
  balooctl suspend
  notify-send "GameMode started"
end=
  notify-send "GameMode ended"
  akonadictl start
  balooctl resume
  cd &amp;amp;&amp;amp; boinccmd --set_run_mode auto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit &lt;code&gt;boinccmd&lt;/code&gt; wird Boinc für die dauer der Spielesitzung angehalten.
Mit &lt;code&gt;akonadictl&lt;/code&gt; halte ich effektiv mein Emailprogram an und mit &lt;code&gt;balooctl&lt;/code&gt; 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 &lt;code&gt;killall gamemoded&lt;/code&gt;.
Durch die nächste Anwendung, welche den GameMode nutzen möchte, wird der Prozess automatisch wieder gestartet, dann mit der neuen Konfiguration.&lt;/p&gt;
&lt;p&gt;Für einfache Tests gibt es außerdem noch die Möglichkeit den Spielemodus mittels &lt;code&gt;gamemode -r&lt;/code&gt; explizit zu aktivieren.
Beenden des Programmes per &lt;code&gt;Strg+C&lt;/code&gt; deaktiviert den Spielemodus dann wieder.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Games"></category><category term="Tools"></category></entry><entry><title>Ein paar Tipps zum Aktualisieren von openSUSE</title><link href="https://marix.org/ein-paar-tipps-zum-aktualisieren-von-opensuse.html" rel="alternate"></link><published>2018-06-10T00:00:00+02:00</published><updated>2018-06-10T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-06-10:/ein-paar-tipps-zum-aktualisieren-von-opensuse.html</id><summary type="html">&lt;p&gt;Seit dem 25. Mai 2018 ist &lt;a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0"&gt;openSUSE Leap 15.0&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seit dem 25. Mai 2018 ist &lt;a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0"&gt;openSUSE Leap 15.0&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.opensuse.org/Portal:15.0" title="openSUSE Leap 15.0"&gt;&lt;img alt="openSUSE Leap 15.0 ist jetzt verfügbar" src="https://marix.org/Bilder/openSUSE-Leap-15.0-verfügbar.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="der-nvidia-treiber"&gt;Der NVIDIA-Treiber&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Sollte das System bereits aktualisiert und Nouveau aktiv sein, so empfiehlt es sich den alten NVIDIA-Treiber mittels &lt;code&gt;zypper remove nvidia*&lt;/code&gt; komplett zu deinstallieren und anschließen neu zu installieren.
Eine Neuinstallation mittels &lt;code&gt;zypper install --force&lt;/code&gt; hat bei mir in der Vergangenheit meißtens nicht den gewünschten Erfolg gebracht.&lt;/p&gt;
&lt;h2 id="uefi"&gt;UEFI&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="repositories"&gt;Repositories&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h3 id="die-konfigurierten-repositories"&gt;Die konfigurierten Repositories&lt;/h3&gt;
&lt;p&gt;Zypper kann einem mit &lt;code&gt;repos -u&lt;/code&gt; 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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="installierte-pakete-eines-repositories-anzeigen"&gt;Installierte Pakete eines Repositories anzeigen&lt;/h3&gt;
&lt;p&gt;Fragt man sich wozu ein bestimmtes Repository im System ist kann man sich mit &lt;code&gt;zypper search --repo &amp;lt;repository-id&amp;gt; --installed-only&lt;/code&gt; die aus einem bestimmten Repository installierten Pakete anzeigen lassen.
Am Beispiel des NVIDIA-Repositories sieht das bei mir dann so aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="verwaiste-pakete-aufraumen"&gt;Verwaiste Pakete aufräumen&lt;/h2&gt;
&lt;p&gt;Nach dem Update lohnt es sich häufig verwaiste Pakete zu entfernen.
Solche kann man mit einer Kombination von &lt;code&gt;zypper search&lt;/code&gt; und &lt;code&gt;grep&lt;/code&gt; leicht auffinden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; zypper search --details --installed-only --type package | grep Systempakete
i+ | Desurium                                    | Paket | 0.8.0_rc10-3.1                                       | x86_64 | (Systempakete)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Möchte man ein Paket gerne behalten lohnt es sich mit &lt;code&gt;zypper search --details &amp;lt;Paketname&amp;gt;&lt;/code&gt; 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 &lt;a href="https://software.opensuse.org"&gt;https://software.opensuse.org&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Spickzettel"></category></entry><entry><title>Grid Autosport auf openSUSE 42.3</title><link href="https://marix.org/grid-autosport-auf-opensuse-423.html" rel="alternate"></link><published>2018-05-10T00:00:00+02:00</published><updated>2018-05-10T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-05-10:/grid-autosport-auf-opensuse-423.html</id><summary type="html">&lt;p&gt;&lt;a href="http://www.gridgame.com"&gt;Grid Autosport&lt;/a&gt; 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 &lt;a href="https://www.gran-turismo.com"&gt;Gran Tourismo&lt;/a&gt; findet es einen exzellenten Mittelweg und ist, im Gegensatz zu diesem, auch auf Linux spielbar.
Es eignet sich somit also auch …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.gridgame.com"&gt;Grid Autosport&lt;/a&gt; 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 &lt;a href="https://www.gran-turismo.com"&gt;Gran Tourismo&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Der Startbildschirm von Grid Autosport auf openSUSE" src="https://marix.org/Bilder/Grid-Autosport-auf-openSUSE.png"&gt;&lt;/p&gt;
&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; Adding process 17089 for game ID 255220
&amp;gt;&amp;gt;&amp;gt; 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)
&amp;gt;&amp;gt;&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hier liegt also eine Inkompatibilität zwischen der vom Spiel mitgebrachten Curl-Bibliothek und den von Steam mitgebrachten Bibliotheken SSL und Crypto vor.&lt;/p&gt;
&lt;h2 id="die-losung-aus-dem-netz"&gt;Die Lösung aus dem Netz&lt;/h2&gt;
&lt;p&gt;Beim Googeln findet sich schnell &lt;a href="https://forums.opensuse.org/showthread.php/520922-Steam-libcrypto-error"&gt;eine Lösung welche vorschlägt &lt;code&gt;libcrypto.so.1.0.0&lt;/code&gt; aus der Steam-Runtime entfernen&lt;/a&gt;.
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.&lt;/p&gt;
&lt;h2 id="die-bessere-losung"&gt;Die bessere Lösung&lt;/h2&gt;
&lt;p&gt;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 &lt;a href="https://www.feralinteractive.com"&gt;Feral Interactive&lt;/a&gt; portiert wurden.
So ist auch &lt;a href="https://www.dirtgame.com"&gt;Dirt Rally&lt;/a&gt; von diesem Problem betroffen.
Für dieses Spiel findet sich &lt;a href="https://forums.opensuse.org/showthread.php/524557-Can-t-run-Dirt-Rally-on-Steam"&gt;eine Lösung&lt;/a&gt; welche sich Analog auch auf Grid Autosport anwenden lässt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ins Spielverzeichnis wechseln: &lt;code&gt;cd &amp;lt;steam library&amp;gt;/steamapps/common/Grid\ Autosport/lib/x86_64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dort auf die libcrypto des Systems linken:&lt;pre&gt;&lt;code&gt;&amp;gt; ln -s /lib64/libcrypto.so.1.0.0
&amp;gt; ln -s /lib64/libssl.so.1.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Steam"></category><category term="Games"></category><category term="Racing"></category></entry><entry><title>Zwei neue Pakete für openSUSE</title><link href="https://marix.org/zwei-neue-pakete-fur-opensuse.html" rel="alternate"></link><published>2018-04-25T00:00:00+02:00</published><updated>2018-04-25T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-04-25:/zwei-neue-pakete-fur-opensuse.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.opensuse.org/#Tumbleweed"&gt;openSUSE Tumbleweed&lt;/a&gt; enthält jetzt zwei neue Pakete welche ich erstellt habe: &lt;a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python"&gt;python-emoji&lt;/a&gt; und &lt;a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole"&gt;python-ntfy&lt;/a&gt;.
Ersteres hat es sogar noch in &lt;a href="https://www.opensuse.org/#Leap"&gt;openSUSE Leap 15.0&lt;/a&gt; geschafft.&lt;/p&gt;
&lt;p&gt;Die Funktionalität von &lt;a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python"&gt;python-emoji&lt;/a&gt; ist schnell erklärt und trotzdem unglaublich nützlich, wie diese leichte Abwandlung des Beispiels aus &lt;a href="https://pypi.org/project/emoji/"&gt;der Paketbeschreibung auf PyPI&lt;/a&gt; zeigt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; import emoji …&lt;/code&gt;&lt;/pre&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.opensuse.org/#Tumbleweed"&gt;openSUSE Tumbleweed&lt;/a&gt; enthält jetzt zwei neue Pakete welche ich erstellt habe: &lt;a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python"&gt;python-emoji&lt;/a&gt; und &lt;a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole"&gt;python-ntfy&lt;/a&gt;.
Ersteres hat es sogar noch in &lt;a href="https://www.opensuse.org/#Leap"&gt;openSUSE Leap 15.0&lt;/a&gt; geschafft.&lt;/p&gt;
&lt;p&gt;Die Funktionalität von &lt;a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python"&gt;python-emoji&lt;/a&gt; ist schnell erklärt und trotzdem unglaublich nützlich, wie diese leichte Abwandlung des Beispiels aus &lt;a href="https://pypi.org/project/emoji/"&gt;der Paketbeschreibung auf PyPI&lt;/a&gt; zeigt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; import emoji
&amp;gt;&amp;gt; print(emoji.emojize('Python ist :thumbs_up:'))
Python ist 👍
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Natürlich funktioniert dies sowohl in &lt;a href="https://docs.python.org/3/"&gt;modernem Python&lt;/a&gt; als auch in &lt;a href="https://docs.python.org/2/"&gt;klassischem Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eines der Pakete welche von &lt;a href="https://software.opensuse.org/package/python-emoji" title="Emojis für Python"&gt;python-emoji&lt;/a&gt; profitieren ist &lt;a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole"&gt;python-ntfy&lt;/a&gt;.
&lt;a href="https://software.opensuse.org/package/python-ntfy" title="Pushnachrichten für die Konsole"&gt;python-ntfy&lt;/a&gt; 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 &lt;code&gt;ntfy done&lt;/code&gt;.
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. 😉&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>Mastodon</title><link href="https://marix.org/mastadon.html" rel="alternate"></link><published>2018-04-22T00:00:00+02:00</published><updated>2018-04-22T00:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-04-22:/mastadon.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="https://joinmastodon.org/"&gt;Mastodon&lt;/a&gt;.
Nachdem ich davon jetzt schon ein paar mal gehört habe gebe ich diesem jetzt auch mal eine Chance.
Ihr findet mich dort als &lt;a href="https://chaos.social/@marix"&gt;@marix@chaos.social&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="Social Networks"></category></entry><entry><title>Bash-Completion for OSC in Verzeichnissen mit Leerzeichen</title><link href="https://marix.org/bash-completion-for-osc-in-verzeichnissen-mit-leerzeichen.html" rel="alternate"></link><published>2018-03-21T00:00:00+01:00</published><updated>2018-03-21T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-03-21:/bash-completion-for-osc-in-verzeichnissen-mit-leerzeichen.html</id><summary type="html">&lt;p&gt;Mit diesem Artikel führe ich &lt;a href="https://marix.org/category/beitrage-zu-freier-software.html"&gt;meine Serie zu kleinen Beträgen zu freier Software&lt;/a&gt; fort.
Diesmal nahm ich mich dem Problem an, dass die Bash-Completion des Kommandozeilenprogrammes für den &lt;a href="http://openbuildservice.org/"&gt;Open Build Service&lt;/a&gt; – &lt;code&gt;osc&lt;/code&gt; – in Verzeichnissen mit Leerzeichen im Pfad nicht richtig funktioniert.&lt;/p&gt;
&lt;p&gt;Ich gehöre zu dieser, anscheinend raren, Spezies Mensch die …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mit diesem Artikel führe ich &lt;a href="https://marix.org/category/beitrage-zu-freier-software.html"&gt;meine Serie zu kleinen Beträgen zu freier Software&lt;/a&gt; fort.
Diesmal nahm ich mich dem Problem an, dass die Bash-Completion des Kommandozeilenprogrammes für den &lt;a href="http://openbuildservice.org/"&gt;Open Build Service&lt;/a&gt; – &lt;code&gt;osc&lt;/code&gt; – in Verzeichnissen mit Leerzeichen im Pfad nicht richtig funktioniert.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;osc&lt;/code&gt;, welche statt der gewünschten Vorschläge Fehlermeldungen produzierte:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://github.com/openSUSE/osc/pull/392"&gt;Der Fix&lt;/a&gt; ist trivial und war schnell implementiert und ändert nur sieben Zeilen Code.
Einfach in den betroffenen Zeilen doppelte Anführungszeichen um die Variable &lt;code&gt;${PWD}&lt;/code&gt; eingefügt und schon wurde der Verzeichnisname korrekt im ganzen, statt als mehrere Argument, an &lt;code&gt;test&lt;/code&gt; übergeben.
Wenige Stunden später wurde &lt;a href="https://github.com/openSUSE/osc/pull/392"&gt;der Pull-Request auf Github&lt;/a&gt; dann auch schon in den Hauptzweig gemerged.
In Zukunft stolpert man also über ein WTF weniger. 😃&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;gleich&lt;/em&gt; mal auf den Code zu schauen.
Viele Probleme lassen sich viel leichter abstellen als man denkt.&lt;/p&gt;</content><category term="Beiträge zu freier Software"></category></entry><entry><title>Tests für openSUSE's Paket des Prometheus-Node-Exporters</title><link href="https://marix.org/tests-fur-opensuses-paket-des-prometheus-node-exporters.html" rel="alternate"></link><published>2018-03-12T00:00:00+01:00</published><updated>2018-03-12T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-03-12:/tests-fur-opensuses-paket-des-prometheus-node-exporters.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Letzten Monat habe ich mir mal openSUSEs Paket des &lt;a href="https://github.com/prometheus/node_exporter"&gt;Node-Exporters für Prometheus&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.opensuse.org/openSUSE:Packaging_Go#Example_template"&gt;Das Beispiel im Wiki von openSUSE&lt;/a&gt; beinhaltet das Ausführen der Tests.
Somit ist der Fehler schnell behoben.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%check
%gotest github.com/prometheus/node_exporter...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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 &lt;a href="https://github.com/prometheus/node_exporter/blob/v0.15.2/Makefile"&gt;das Makefile&lt;/a&gt; verrät, dass hierfür das Target &lt;code&gt;collector/fixtures/sys/.unpacked&lt;/code&gt; zuständig ist.
Also schnell noch ein &lt;code&gt;make collector/fixtures/sys/.unpacked&lt;/code&gt; in den Abschnitt &lt;code&gt;%build&lt;/code&gt; eingefügt und schon funktioniert alles.&lt;/p&gt;
&lt;p&gt;Damit war &lt;a href="https://build.opensuse.org/request/show/577884"&gt;der Submitrequest&lt;/a&gt; dann auch schon bereit und ist inzwischen auch angenommen worden.&lt;/p&gt;</content><category term="Beiträge zu freier Software"></category></entry><entry><title>Steam vergisst ständig die Anmeldung</title><link href="https://marix.org/steam-vergisst-standig-die-anmeldung.html" rel="alternate"></link><published>2018-02-26T00:00:00+01:00</published><updated>2018-02-27T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-02-26:/steam-vergisst-standig-die-anmeldung.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;code&gt;~/.steam/registry.vdf&lt;/code&gt; zu schreiben.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Steams Anmeldefenster" src="https://marix.org/Bilder/Steam-Login-Dialog.png"&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://www.vex-mania.de/lans/VEX-LAN-18-2018"&gt;VEX-LAN 18&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Tasse der VEX-LAN 18" src="https://marix.org/Bilder/VEX-LAN-18-Tasse.JPG"&gt;&lt;/p&gt;
&lt;p&gt;Zum Glück bin ich nicht der erste der dem Problem begegnet ist.
Neben &lt;a href="https://github.com/ValveSoftware/steam-for-linux/issues/5030"&gt;der Fehlerbermeldung auf Github&lt;/a&gt; gibt es auch &lt;a href="https://wiki.archlinux.org/index.php/Steam/Troubleshooting#Steam_forgets_password"&gt;einen Eintrag in der Steam-FAQ von Arch-Linux&lt;/a&gt; in dem sich eine Möglichkeit findet das Problem zu vermeiden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod -w ~/.steam/registry.vdf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category><category term="Steam"></category><category term="Gaming"></category><category term="VEX"></category></entry><entry><title>openSUSE Leap 42.3 auf dem Raspberry Pi 2 ohne Monitor nutzen</title><link href="https://marix.org/opensuse-leap-423-ohne-monitor-auf-dem-raspberry-pi-2.html" rel="alternate"></link><published>2018-01-02T00:00:00+01:00</published><updated>2018-01-02T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2018-01-02:/opensuse-leap-423-ohne-monitor-auf-dem-raspberry-pi-2.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="https://en.opensuse.org/HCL:Raspberry_Pi2" title="Raspbarry PI2 documentation on the openSUSE Wiki"&gt;im Wiki von openSUSE&lt;/a&gt; detailliert dokumentiert.
Mit wenigen kleinen Änderungen lässt sich so auch &lt;a href="https://www.opensuse.org/#Leap"&gt;openSUSE Leap&lt;/a&gt; auf dem Raspberry Pi 2 nutzen, und zwar ohne an diesen Monitor oder Maus anschließen zu müssen.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/"&gt;http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/&lt;/a&gt;.
Für den Betrieb ohne Tastatur und Monitor bietet sich die Variante &lt;em&gt;Just enough OS (JeOS)&lt;/em&gt; an.
Damit findet man die passende Datei indem man &lt;a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/"&gt;die Downloadseite&lt;/a&gt; nach &lt;code&gt;JeOS-raspberrypi2&lt;/code&gt; durchsucht.
Aktuell ist dies &lt;a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz"&gt;http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz&lt;/a&gt;.
Es empfiehlt sich auch &lt;a href="http://download.opensuse.org/ports/armv7hl/distribution/leap/42.3/appliances/openSUSE-Leap42.3-ARM-JeOS-raspberrypi2.armv7l.raw.xz.sha256"&gt;die Prüfsumme&lt;/a&gt; zu checken.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Warnung zu den nicht formatierten Zeilen liegt daran, dass der Inhalt mit PGP signiert ist.
Die Signatur lässt sich mit &lt;a href="https://gnupg.org/"&gt;GPG&lt;/a&gt; prüfen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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 &amp;lt;opensuse@opensuse.org&amp;gt;" [vollständig]
note: random_seed file not updated
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt wo klar ist, dass das Image nicht beschädigt ist, kann man &lt;a href="https://en.opensuse.org/HCL:Raspberry_Pi2" title="Raspbarry PI2 documentation on the openSUSE Wiki"&gt;der Anleitung für Tumbleweed im openSUSE-Wiki&lt;/a&gt; folgen.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;dmesg&lt;/code&gt; 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 (&lt;code&gt;sd 8:0:0:3: [sdi] 15677440 512-byte logical blocks: (8.03 GB/7.48 GiB)&lt;/code&gt;) und die Partitionsliste (&lt;code&gt;sdi: sdi1 sdi2 &amp;lt; sdi5 sdi6 &amp;gt; sdi3&lt;/code&gt;) ausgegeben.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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 &amp;lt; sdi5 sdi6 &amp;gt; 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 &amp;lt; sdi5 sdi6 &amp;gt; sdi3
[37769.488248] sd 8:0:0:3: [sdi] Attached SCSI removable disk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um das Image auf die Karte zu schreiben benötigt man Root-Rechte.
Das Gerät muss von &lt;code&gt;/dev/sdX&lt;/code&gt; auf den korrekten Bezeichner angepasst werden.
Für obiges Beispiel &lt;code&gt;/dev/sdi&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hierbei passiert folgendes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;xzcat&lt;/code&gt; entpackt das Image auf die Standardausgabe.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd&lt;/code&gt; übernimmt über die Standardeingabe das entpackte Image und schreibt es 1:1 auf das angegebene Gerät, und zwar ohne zu Puffern.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync&lt;/code&gt; stellt sicher, dass alle Daten auch wirklich geschrieben wurden und die Karte sicher entnommen werden kann.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Anschließend kann man den Raspberry Pi 2 mit den üblichen Schritten in Betrieb nehmen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Karte herausnehmen und in den Pi stecken,&lt;/li&gt;
&lt;li&gt;Netzwerk an den Raspberry Pi 2 anschließen,&lt;/li&gt;
&lt;li&gt;und dann Strom auf Pi geben.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;linux&lt;/code&gt; meldet.
An einer Fritz!Box ist er deshalb als &lt;code&gt;linux.fritz.box&lt;/code&gt; erreichbar.&lt;/p&gt;
&lt;p&gt;Nun kann man sich also das erste mal anmelden. Der Nutzer ist &lt;code&gt;root&lt;/code&gt; und das Passwort &lt;code&gt;linux&lt;/code&gt;.
Hat man eine Fritz!Box also: &lt;code&gt;ssh root@linux.fritz.box&lt;/code&gt;.
Beim ersten Anmelden sollte man gleich noch die Inbetriebnahme das Basissystems abschließen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Das Passwort ändern,&lt;/li&gt;
&lt;li&gt;dem eigenen SSH-Key per &lt;code&gt;ssh-copy-id&lt;/code&gt; auf dem Raspberry Pi Berechtigung zum Anmelden geben,&lt;/li&gt;
&lt;li&gt;Updates einspielen,&lt;/li&gt;
&lt;li&gt;und den Hostnamen ändern.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Das &lt;em&gt;Just enough&lt;/em&gt; in &lt;em&gt;JeOS&lt;/em&gt; ist übrigens durchaus ernst gemeint.
Wer sein System anschließend mit Ansible weiter einrichten möchte sollte dort noch Python komplett installieren: &lt;code&gt;zypper in python3&lt;/code&gt;.
Ohne diesen Schritt kann es zu kuriosen Fehlermeldungen kommen, da Teile der Standardbibliothek in der minimalen Installation von Python fehlen.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Raspberry Pi"></category></entry><entry><title>Wieso ich pytest in PyCharm immer mit --no-cov ausführe</title><link href="https://marix.org/wieso-ich-pytest-in-pycharm-immer-mit-no-cov-ausfuhre.html" rel="alternate"></link><published>2017-12-12T00:00:00+01:00</published><updated>2017-12-12T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2017-12-12:/wieso-ich-pytest-in-pycharm-immer-mit-no-cov-ausfuhre.html</id><summary type="html">&lt;p&gt;Immer wieder habe ich mich, beim Versuch einen fehlgeschlagenen Test in &lt;a href="https://www.jetbrains.com/pycharm/"&gt;PyCharm&lt;/a&gt; zu debuggen, gewundert wieso meine Haltepunkte misachtet werden.
Um dies zu vermeiden führe ich &lt;a href="https://docs.pytest.org"&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/a&gt; in PyCharm inzwischen immer mit der Option &lt;code&gt;--no-cov&lt;/code&gt; aus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="PyCharm-Konfiguration für pytest mit --no-cov" src="https://marix.org/Bilder/PyCharm-pytest-nocov.png"&gt;&lt;/p&gt;
&lt;p&gt;Das Plugin &lt;a href="https://github.com/pytest-dev/pytest-cov"&gt;&lt;code&gt;pytest-cov&lt;/code&gt;&lt;/a&gt; hilft einem wunderbar dabei einen Überblick über die Testabdeckung zu behalten …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Immer wieder habe ich mich, beim Versuch einen fehlgeschlagenen Test in &lt;a href="https://www.jetbrains.com/pycharm/"&gt;PyCharm&lt;/a&gt; zu debuggen, gewundert wieso meine Haltepunkte misachtet werden.
Um dies zu vermeiden führe ich &lt;a href="https://docs.pytest.org"&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/a&gt; in PyCharm inzwischen immer mit der Option &lt;code&gt;--no-cov&lt;/code&gt; aus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="PyCharm-Konfiguration für pytest mit --no-cov" src="https://marix.org/Bilder/PyCharm-pytest-nocov.png"&gt;&lt;/p&gt;
&lt;p&gt;Das Plugin &lt;a href="https://github.com/pytest-dev/pytest-cov"&gt;&lt;code&gt;pytest-cov&lt;/code&gt;&lt;/a&gt; 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 &lt;code&gt;pytest.ini&lt;/code&gt; zu tun.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[pytest]
addopts = --cov=example
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Dafür kollidiert &lt;code&gt;pytest-cov&lt;/code&gt; aber mit dem Debugger von PyCharm.
Denn beide registrieren sich per &lt;a href="https://docs.python.org/3/library/sys.html#sys.settrace"&gt;&lt;code&gt;sys.settrace&lt;/code&gt;&lt;/a&gt; um allen ausgeführten Code inspizieren zu können.
Nutzt man &lt;code&gt;pytest-cov&lt;/code&gt; 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 &lt;code&gt;pytest-cov&lt;/code&gt; durch die Option &lt;code&gt;--no-cov&lt;/code&gt; deaktiveren.
Damit fehlt dann zwar auch die Information zur Testabdeckung, aber dafür hat PyCharm ja, wie gesagt, seine eigene Funktionalität.&lt;/p&gt;</content><category term="Blog"></category><category term="Python"></category><category term="PyCharm"></category><category term="Tipps und Tricks"></category><category term="Entwicklungsumgebung"></category><category term="Test Driven Development"></category></entry><entry><title>Wie man Python-Module in PyCharm ausführt</title><link href="https://marix.org/wie-man-python-module-in-pycharm-ausfuhrt.html" rel="alternate"></link><published>2017-12-02T00:00:00+01:00</published><updated>2017-12-02T00:00:00+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2017-12-02:/wie-man-python-module-in-pycharm-ausfuhrt.html</id><summary type="html">&lt;p&gt;Beim Lesen &lt;a href="https://blog.jetbrains.com/pycharm/2017/11/pycharm-2017-3-is-out-now/"&gt;der Veröffentlichungsankündigung von PyCharm 2017.3&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Enthält ein Modul in der aktuellen Pythonumgebung ein …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Beim Lesen &lt;a href="https://blog.jetbrains.com/pycharm/2017/11/pycharm-2017-3-is-out-now/"&gt;der Veröffentlichungsankündigung von PyCharm 2017.3&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Enthält ein Modul in der aktuellen Pythonumgebung ein Paket &lt;code&gt;__main__.py&lt;/code&gt;, so kann man dieses durch den Aufruf &lt;code&gt;python -m &amp;lt;modulename&amp;gt;&lt;/code&gt; direkt ausführen. Ein beliebtes Bespiel dafür ist der in der Standardbibliothek enthaltene einfache HTTP-Server, der mit &lt;code&gt;python -m http.server &amp;lt;port&amp;gt;&lt;/code&gt; ausgeführt werden kann.&lt;/p&gt;
&lt;p&gt;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 – &lt;code&gt;-m&lt;/code&gt; angegeben werden. PyCharm ruft nämlich am Ende immer &lt;code&gt;&amp;lt;ausgewählter Pythoninterpreter&amp;gt; &amp;lt;Interpreteroptionen&amp;gt; &amp;lt;Skriptname&amp;gt; &amp;lt;Skriptparameter&amp;gt;&lt;/code&gt; auf. Enden die Interpreteroptionen mit &lt;code&gt;-m&lt;/code&gt; interpretiert Python den „Skriptnamen“ als Modulnamen. In älteren Versionen von PyCharm muss man für obiges Beispiel also lediglich als Skript &lt;code&gt;http.server&lt;/code&gt; und bei den Interpreteroptionen &lt;code&gt;-m&lt;/code&gt; eintragen.&lt;/p&gt;</content><category term="Blog"></category><category term="Python"></category><category term="PyCharm"></category><category term="Tipps und Tricks"></category></entry><entry><title>Öffentliche PSN-Profile</title><link href="https://marix.org/offentliche-psn-profile.html" rel="alternate"></link><published>2017-10-05T22:15:00+02:00</published><updated>2017-10-05T22:15:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2017-10-05:/offentliche-psn-profile.html</id><summary type="html">&lt;p&gt;Durch &lt;a href="https://blog.de.playstation.com/2017/10/03/ps4-systemsoftware-update-5-00-ab-heute-erhltlich/"&gt;das PS4-Systemsoftware-Update 5.00&lt;/a&gt; wurde ich auf eine Änderung im Playstation Network aufmerksam auf welche ich lange gewartet hatte: Es gibt jetzt öffentliche Profile.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Durch &lt;a href="https://blog.de.playstation.com/2017/10/03/ps4-systemsoftware-update-5-00-ab-heute-erhltlich/"&gt;das PS4-Systemsoftware-Update 5.00&lt;/a&gt; wurde ich auf eine Änderung im Playstation Network aufmerksam auf welche ich lange gewartet hatte: Es gibt jetzt öffentliche Profile.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://my.playstation.com/theMarix"&gt;Meins&lt;/a&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="Games"></category><category term="Playstation"></category></entry><entry><title>Wenn das System zu gut aufräumt</title><link href="https://marix.org/wenn-das-system-zu-gut-aufraumt.html" rel="alternate"></link><published>2017-09-04T22:30:00+02:00</published><updated>2017-09-06T21:00:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2017-09-04:/wenn-das-system-zu-gut-aufraumt.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ich nutze tatsächlich häufig das Verzeichnis &lt;code&gt;/tmp&lt;/code&gt;.
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 &lt;a href="https://docs.python.org/3/library/venv.html"&gt;virtuellen Python-Umgebungen&lt;/a&gt; lege ich, seit mich &lt;a href="https://www.holger-peters.de/"&gt;Holger Peters&lt;/a&gt; mal auf diese Idee gebracht hat, stets dort ab.
Seit einiger Zeit löschte mir meine &lt;a href="https://www.opensuse.org/"&gt;openSUSE&lt;/a&gt; meine gerade angelegten Dateien aber immer kurz nach dem Systemstart unter der Nase weg.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://www.freedesktop.org/software/systemd/man/systemd.timer.html"&gt;Systemd-Timer&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;marix@eddie:~&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der alte Cronjob hatte eine Konfigurationsdatei in &lt;code&gt;/etc/sysconfig&lt;/code&gt; in der man die Schonzeit für Dateien in &lt;code&gt;/tmp&lt;/code&gt; und &lt;code&gt;/var/tmp&lt;/code&gt; konfigurieren konnte.
Beim Systemd-Job übernehmen die Konfigurationsdateien von &lt;code&gt;systemd-tmpfiles&lt;/code&gt; diesen Job.
Die dazugehörige Manpage ist &lt;a href="https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html"&gt;&lt;code&gt;tmpfiles.d (5)&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Standardatei &lt;code&gt;/usr/lib/tmpfiles.d/tmp.conf&lt;/code&gt; 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.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 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 -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die schuldige Konfiguration fand sich in &lt;code&gt;/etc/tmpfiles.d/tmp.conf&lt;/code&gt;.
Hier muss, bei einem der vielen Versionsupgrades welche mein System hinter sich hat, ein kleiner Übertragungsfehler passiert sein.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;d /tmp 1777 root root 0d
d /var/tmp 1777 root root -
x /tmp/* - - - - root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit dem Alter Null Tage wird &lt;code&gt;systemd-tmpfiles&lt;/code&gt; 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.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;d /tmp 1777 root root 1d
d /var/tmp 1777 root root -
x /tmp/* - - - - root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und das schöne an Systemd ist, dass man so eine Änderung dann auch gleich sehr leicht testen kann.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start systemd-tmpfiles-clean.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eine Anwendung welche mit dem agressiven Aufräumen der temporären Dateien gar nicht klar kommt ist übrigens meine früher so geliebter Browser &lt;a href="https://www.opera.com/de"&gt;Opera&lt;/a&gt;.
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 &lt;a href="https://www.mozilla.org/de/firefox/new/"&gt;Firefox&lt;/a&gt; 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.&lt;/p&gt;</content><category term="Blog"></category><category term="openSUSE"></category><category term="Systemd"></category></entry><entry><title>Umgebaut</title><link href="https://marix.org/umgebaut.html" rel="alternate"></link><published>2017-08-27T21:30:00+02:00</published><updated>2017-08-27T21:30:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2017-08-27:/umgebaut.html</id><summary type="html">&lt;p&gt;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 &lt;a href="https://marix.org/feeds/all.atom.xml"&gt;https …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;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 &lt;a href="https://marix.org/feeds/all.atom.xml"&gt;https://marix.org/feeds/all.atom.xml&lt;/a&gt; umzustellen.&lt;/p&gt;
&lt;p&gt;Gründe für den Umbau gab es gleich mehrere.
So war Marix.org auf mobilen Geräten ziemlich unbrauchbar und ein Wechsel von &lt;a href="https://www.drupal.org/"&gt;Drupal 7&lt;/a&gt; auf &lt;a href="https://www.drupal.org/"&gt;Drupal 8&lt;/a&gt; war auch überfällig.
Meine Performanceprobleme mit Drupal hatten sich zwar bereits durch einen Wechsel von &lt;a href="https://www.strato.de/"&gt;Strato&lt;/a&gt; zu &lt;a href="https://www.netcup.de/"&gt;Netcup&lt;/a&gt; gelöst, aber die häufig notwendigen Sicherheitsupdates, welche bei &lt;a href="https://www.drupal.org/"&gt;Drupal&lt;/a&gt; leider auch nicht mit einem &lt;code&gt;zypper up&lt;/code&gt; schnell eingespielt sind, blieben ein Ärgernis.
So habe ich jetzt auf eine komplett statische Seite umgestellt welche mithilfe das &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt;-basierte &lt;a href="https://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; generiert wird.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Blog"></category></entry><entry><title>openSUSE Leap 42.2 auf antiker Hardware</title><link href="https://marix.org/opensuse-leap-422-auf-antiker-hardware.html" rel="alternate"></link><published>2016-12-19T21:24:15+01:00</published><updated>2016-12-19T21:24:15+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-12-19:/opensuse-leap-422-auf-antiker-hardware.html</id><summary type="html">
&lt;p&gt;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 &lt;a href="https://en.opensuse.org/Lifetime"&gt;dessen Supportendes,&lt;/a&gt; war aber ein update nötig. Und da auch das damals vorinstallierte Windows Vista sein Lebensende erreicht hatte, und seit mehreren …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;a href="https://en.opensuse.org/Lifetime"&gt;dessen Supportendes,&lt;/a&gt; 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 &lt;a href="https://en.opensuse.org/Portal:42.2"&gt;openSUSE Leap 42.2&lt;/a&gt; durch. Wie bei jeder Rechnerneuinstallation stolperte ich dabei über ein paar Eigenarten, aber insgesamt läuft das System wunderbar.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>PyCharm 2016.3</title><link href="https://marix.org/pycharm-20163.html" rel="alternate"></link><published>2016-12-05T20:44:46+01:00</published><updated>2016-12-05T20:44:46+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-12-05:/pycharm-20163.html</id><summary type="html">
&lt;p&gt;Letzte Woche erschien &lt;a href="https://www.jetbrains.com/pycharm/whatsnew/"&gt;PyCharm 2016.3&lt;/a&gt; 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 &lt;code&gt;--keepdb&lt;/code&gt; und &lt;code&gt;--parallel&lt;/code&gt; nutzen. Ersteres beschleunigt die Testausführung ungemein, wenn man immer wieder wenige kurze Tests …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Letzte Woche erschien &lt;a href="https://www.jetbrains.com/pycharm/whatsnew/"&gt;PyCharm 2016.3&lt;/a&gt; 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 &lt;code&gt;--keepdb&lt;/code&gt; und &lt;code&gt;--parallel&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Insgesamt lohnt das Update auf PyCharm 2016.3 also. Für mich vor allem wegen der deutlich verbesserten Django-Unterstützung.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Python"></category><category term="PyCharm"></category></entry><entry><title>Devpi-Builder 2.2.0</title><link href="https://marix.org/devpi-builder-220.html" rel="alternate"></link><published>2016-07-05T23:58:40+02:00</published><updated>2016-07-05T23:59:15+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-07-05:/devpi-builder-220.html</id><summary type="html">
&lt;p&gt;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 &lt;a href="https://pypi.python.org/pypi/devpi-builder/2.2.0"&gt;Version 2.2.0 von Brandon, dem Devpi-Builder,&lt;/a&gt; so. Dank eines &lt;a href="https://github.com/blue-yonder/devpi-builder/pull/97"&gt;Pull-Requests von Travis Mehlinger&lt;/a&gt; bekommt man nun, wenn eine Build fehlschlägt …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;a href="https://pypi.python.org/pypi/devpi-builder/2.2.0"&gt;Version 2.2.0 von Brandon, dem Devpi-Builder,&lt;/a&gt; so. Dank eines &lt;a href="https://github.com/blue-yonder/devpi-builder/pull/97"&gt;Pull-Requests von Travis Mehlinger&lt;/a&gt; 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 &lt;a href="https://github.com/blue-yonder/devpi-builder/issues/49"&gt;hatte mich schon länger gestört.&lt;/a&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Python"></category><category term="Devpi"></category><category term="Devpi-Builder"></category><category term="Open Source"></category></entry><entry><title>Devpi-Builder 2.1.0</title><link href="https://marix.org/devpi-builder-210.html" rel="alternate"></link><published>2016-04-24T12:56:19+02:00</published><updated>2016-04-24T12:56:19+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-04-24:/devpi-builder-210.html</id><summary type="html">
&lt;p&gt;Es ist ja cool, wenn es einem &lt;a href="http://www.blue-yonder.com"&gt;der Arbeitgeber&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Es ist ja cool, wenn es einem &lt;a href="http://www.blue-yonder.com"&gt;der Arbeitgeber&lt;/a&gt; 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 &lt;a href="https://pypi.python.org/pypi/devpi-builder/2.1.0"&gt;Version 2.1.0 von Brandon, dem Devpi-Builder,&lt;/a&gt; veröffentlichen nachdem &lt;a href="https://github.com/hlawrenz"&gt;Hans Lawrenz&lt;/a&gt; Unterstützung für zertifikatsbasierte Authentifizierung beigetragen hat.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Python"></category><category term="Devpi"></category><category term="Devpi-Builder"></category><category term="Open Source"></category></entry><entry><title>Devpi-Cleaner 0.2.0</title><link href="https://marix.org/devpi-cleaner-020.html" rel="alternate"></link><published>2016-04-17T21:46:37+02:00</published><updated>2016-04-18T08:29:58+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-04-17:/devpi-cleaner-020.html</id><summary type="html">
&lt;p&gt;Wer einen größeren &lt;a href="http://doc.devpi.net"&gt;Devpi-Server&lt;/a&gt; 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 &lt;a href="http://doc.devpi.net"&gt;Devpi-Client&lt;/a&gt; noch leidlich komfortabel lösen, aber schon nichtvolatile Indices machen daraus ein aufwendiges Unterfangen mit mehreren manuellen Schritten, bei dem leicht Fehler unterlaufen …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Wer einen größeren &lt;a href="http://doc.devpi.net"&gt;Devpi-Server&lt;/a&gt; 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 &lt;a href="http://doc.devpi.net"&gt;Devpi-Client&lt;/a&gt; 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 &lt;a href="https://pypi.python.org/pypi/devpi-cleaner"&gt;Léon, den Devpi-Cleaner&lt;/a&gt;, der es beispielsweise ermöglichte alle alten Enwicklungsversionen zu entfernen oder den Index nur für die Dauer der Löschoperation volatil zu schalten.&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Bei meinem Arbeitgeber &lt;a href="http://www.blue-yonder.com"&gt;Blue Yonder&lt;/a&gt; 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 &lt;a href="https://pypi.python.org/pypi/devpi-cleaner"&gt;Léon, dem Devpi-Cleaner&lt;/a&gt; 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 &lt;a href="https://github.com/blue-yonder/devpi-cleaner/blob/master/CHANGELOG.rst"&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Python"></category><category term="Devpi"></category><category term="Programmierung"></category><category term="Blue Yonder"></category><category term="Devpi-Cleaner"></category></entry><entry><title>Kein CUDA nach dem Update auf openSUSE Leap 42.1</title><link href="https://marix.org/kein-cuda-nach-dem-update-auf-opensuse-leap-421.html" rel="alternate"></link><published>2016-04-15T22:41:40+02:00</published><updated>2017-08-05T21:31:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-04-15:/kein-cuda-nach-dem-update-auf-opensuse-leap-421.html</id><summary type="html">
&lt;p&gt;Nachdem ich meine Workstation &lt;a href="https://marix.org/Blog/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html"&gt;von openSUSE 13.1 auf openSUSE Leap 42.1 migriert&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;Das Problem&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Nach dem Update fanden CUDA nutzende …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Nachdem ich meine Workstation &lt;a href="https://marix.org/Blog/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html"&gt;von openSUSE 13.1 auf openSUSE Leap 42.1 migriert&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;Das Problem&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Nach dem Update fanden CUDA nutzende Anwendungen keine Grafikkarte. So meldete &lt;a href="https://boinc.berkeley.edu"&gt;Boinc&lt;/a&gt; &lt;code&gt;No usable GPUs found&lt;/code&gt;. Prinzipiell funktionierte die Grafikkarte aber. So hatte ich volle 3D-Beschleunigung, und auch &lt;a href="https://developer.nvidia.com/nvidia-system-management-interface"&gt;&lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/a&gt; meldete die erwarteten Daten:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;+------------------------------------------------------+
| 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                                               |
+-----------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;Die Analyse&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.nvidia.com/cuda-downloads"&gt;NVIDIA bietet CUDA zwar für einige SUSE-Varianten zum Download&lt;/a&gt;, 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 &lt;a href="https://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt; benötigt man nur die &lt;a href="https://github.com/KhronosGroup/OpenCL-Headers/"&gt;Header&lt;/a&gt;, welche man einfach direkt zum Code legen kann, und einen C-Compiler.&lt;/p&gt;
&lt;p&gt;Schon der erste Versuch mit einem Beispielprogramm welches nur die OpenCL-Runtime initialisiert zeigt das Problem:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&gt; sudo ./platform
modprobe: FATAL: Module nvidia-uvm not found.
Failed to get platforms: -1001
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Das &lt;code&gt;sudo&lt;/code&gt; ist hier übrigens nur vorangestellt um es zu ermöglichen Kernel-Module nachzuladen. Ohne &lt;code&gt;sudo&lt;/code&gt; erhält man den gleichen Fehler, aber ohne die essentielle Information zum Kernelmodul.&lt;/p&gt;
&lt;p&gt;Schnell konnte ich herausfinden, dass eigentlich alle Kernelmodule installiert sind:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&gt; 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

&gt; 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

&gt; ls /lib/modules/4.1.12-1-default/updates/
nvidia.ko  nvidia-uvm.ko
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Allerdings war das nicht das Modulverzeichnis des aktuell laufenden Kernels:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&gt; 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
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Wo liegen also dessen Module? &lt;code&gt;/lib/modules/4.1.13-5-default/updates&lt;/code&gt; existiert nicht. Das NVIDIA-Modul ist aber schnell gefunden:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&gt; ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Nur fehlt in diesem Verzeichnis das &lt;code&gt;nvidia-uvm.ko&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;Die Lösung&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Eine Neuinstallation des dazugehörigen Paketes lässt dann endlich auch OpenCL wieder richtig initialisieren:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&gt; zypper in in -f nvidia-uvm-gfxG03-kmp-default

&gt; ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko  nvidia-uvm.ko

&gt; modprobe nvidia-uvm

&gt; ./platform
Failed to get platforms: -1001

&gt; sudo ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE

&gt; ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Um die Grafikkarte tatsächlich zu verwenden war dann allerdings noch ein Neustart notwendig.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="GPGPU"></category><category term="NVIDIA"></category></entry><entry><title>openSUSE 13.1 mit UEFI und Vollverschlüsselung auf openSUSE Leap 42.1 migrieren</title><link href="https://marix.org/opensuse-131-mit-uefi-und-vollverschl%C3%BCsselung-auf-opensuse-leap-421-migrieren.html" rel="alternate"></link><published>2016-01-03T22:38:05+01:00</published><updated>2016-03-12T21:41:53+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2016-01-03:/opensuse-131-mit-uefi-und-vollverschlüsselung-auf-opensuse-leap-421-migrieren.html</id><summary type="html">
&lt;p&gt;Da &lt;a href="http://lists.opensuse.org/opensuse-announce/2015-11/msg00003.html"&gt;der offizielle Support für openSUSE 13.1 am 5.1.2015 endet&lt;/a&gt; war es höchste Zeit meine Workstation mal auf &lt;a href="https://en.opensuse.org/Portal:42.1"&gt;openSUSE Leap 42.1&lt;/a&gt; zu migrieren. Solche Migrationen mache ich mit SUSE schon seit es noch einstellige Versionsnummern hatte. Diesmal war die Migration allerdings ungewohnt holprig.&lt;/p&gt;
&lt;p&gt;Meine Workstation nutzt …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Da &lt;a href="http://lists.opensuse.org/opensuse-announce/2015-11/msg00003.html"&gt;der offizielle Support für openSUSE 13.1 am 5.1.2015 endet&lt;/a&gt; war es höchste Zeit meine Workstation mal auf &lt;a href="https://en.opensuse.org/Portal:42.1"&gt;openSUSE Leap 42.1&lt;/a&gt; zu migrieren. Solche Migrationen mache ich mit SUSE schon seit es noch einstellige Versionsnummern hatte. Diesmal war die Migration allerdings ungewohnt holprig.&lt;/p&gt;
&lt;p&gt;Meine Workstation nutzt ein vermutlich nicht ganz gewöhnliches Set-Up. OpenSUSE ist parallel zu Windows 10 installiert, und beides wird per &lt;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"&gt;UEFI Secure Boot&lt;/a&gt; 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 &lt;a href="https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#CSM_booting"&gt;BIOS-Boot&lt;/a&gt;, 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 &lt;a href="https://en.wikipedia.org/w/index.php?title=PEBKAC"&gt;PEBKAC&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Leider tritt einem beim Versuch die DVD mit openSUSE Leap 42.1 per UEFI zu booten &lt;a href="https://bugzilla.opensuse.org/show_bug.cgi?id=950569"&gt;Bug 950569&lt;/a&gt; in den Weg. Der Bootcode auf der DVD ist nicht korrekt signiert, was auf meinem System zufolge hat, dass der Bildschirm einfach schwarz bleibt. &lt;a href="https://nwrickert2.wordpress.com/2015/11/02/preparing-for-a-leap-42-1-install/"&gt;Das Problem lässt sich lösen, indem man Secure Boot im BIOS temporär deaktiviert&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Ein weiteres &lt;a href="https://bugzilla.opensuse.org/show_bug.cgi?id=904987"&gt;Problem bei openSUSE Leap 42.1 ist, dass es zumindest bei Upgrades nicht korrekt mit verschlüsselten Root-Partitionen umgehen kann&lt;/a&gt;. Beim Boot „vergisst“ das System nach der Passphrase zu fragen. Wechselt man durch die Konsolen findet zeigt sich folgende Fehlermeldung: &lt;code&gt;Failed to start systemd-cryptsetup@luks&amp;lt;codierte ID&amp;gt;.service:&lt;/code&gt;. Ich habe die ID in der Fehlermeldung mal gekürzt ;). Wie in &lt;a href="https://bugzilla.opensuse.org/show_bug.cgi?id=904987"&gt;Bug 904987&lt;/a&gt; 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 &lt;code&gt;rd.luks.uuid&lt;/code&gt; mitgibt.&lt;/p&gt;
&lt;p&gt;Die ID des LUKS-Containers lässt sich mit &lt;a href="https://gitlab.com/cryptsetup/cryptsetup"&gt;Cryptsetup&lt;/a&gt; herausfinden. Liegt die Root-Partition z.B. auf &lt;code&gt;/dev/sda2&lt;/code&gt;, so lässt sich die ID wie folgt herausfinden.
&lt;pre&gt;&lt;code&gt;&gt; cryptsetup luksUUID /dev/sda2
07246af2-915a-bd54-6a5s-6a5c35d15f45
&lt;/code&gt;&lt;/pre&gt;
Der Bootparameter muss dann in &lt;code&gt;/etc/sysconfig/bootloader&lt;/code&gt; zum Wert &lt;code&gt;DEFAULT_APPEND&lt;/code&gt; hinzugefügt werden. Dieser sollte dann z.B. wie folgt aussehen:
&lt;pre&gt;&lt;code&gt;DEFAULT_APPEND="splash=silent quiet showopts rd.luks.uuid=07246af2-915a-bd54-6a5s-6a5c35d15f45"
&lt;/code&gt;&lt;/pre&gt;
Anschließend einmal den Bootloader neu schreiben lassen und das System fragt wieder nach dem Passwort. Idealerweise wird dieser Workaround schon &lt;i&gt;vor&lt;/i&gt; dem Update implementiert. Nicht, weil dann der Bootloader sowieso neu geschrieben wird, sondern weil man sich dann das Herumgewurschtel mit einem Recovery-System spart.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="EFI"></category><category term="Computersicherheit"></category><category term="Linux"></category></entry><entry><title>Projekte von Gitorious zu Gitlab.com umgezogen</title><link href="https://marix.org/projekte-von-gitorious-zu-gitlabcom-umgezogen.html" rel="alternate"></link><published>2015-04-24T22:06:08+02:00</published><updated>2015-04-24T22:06:08+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2015-04-24:/projekte-von-gitorious-zu-gitlabcom-umgezogen.html</id><content type="html">
&lt;p&gt;Da &lt;a href="https://gitorious.org"&gt;Gitorious&lt;/a&gt; nach der &lt;a href="https://about.gitlab.com/2015/03/03/gitlab-acquires-gitorious/"&gt;Akquise durch Gitlab&lt;/a&gt; Ende Mai die Pforten schließen wird, beziehungsweise nur noch Archivcharakter haben wird, habe ich alle meine dortigen Projekte zu &lt;a href="https://gitlab.com"&gt;Gitlab&lt;/a&gt; umgezogen. &lt;a href="https://gitlab.com/Marix/Einhard"&gt;Einhard&lt;/a&gt;, &lt;a href="https://gitlab.com/Marix/FindOpenCL"&gt;FindOpenCL&lt;/a&gt;, &lt;a href="https://gitlab.com/Marix/CLU"&gt;CLU&lt;/a&gt;, &lt;a href="https://gitlab.com/Marix/QuickClusterOverview"&gt;Quick Cluster Overview&lt;/a&gt; und &lt;a href="https://gitlab.com/Marix/Klepsydra"&gt;Klepsydra&lt;/a&gt; sind dort nun unter &lt;a href="https://gitlab.com/u/Marix"&gt;meinem Account&lt;/a&gt; zu finden.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Cluster"></category><category term="Anwendung"></category><category term="CMake"></category><category term="Quick Cluster Overview"></category><category term="Bibliothek"></category></entry><entry><title>Quick Cluster Overview jetzt auf Gitlab.com gehostet</title><link href="https://marix.org/quick-cluster-overview-jetzt-auf-gitlabcom-gehostet.html" rel="alternate"></link><published>2015-04-24T21:57:27+02:00</published><updated>2017-07-10T17:13:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2015-04-24:/quick-cluster-overview-jetzt-auf-gitlabcom-gehostet.html</id><content type="html">
&lt;p&gt;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 &lt;a href="https://gitlab.com/Marix/QuickClusterOverview"&gt;https://gitlab.com/Marix/QuickClusterOverview&lt;/a&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Quick Cluster Overview"></category></entry><entry><title>Kalibrieren von Joysticks in Windows 8</title><link href="https://marix.org/kalibrieren-von-joysticks-windows-8.html" rel="alternate"></link><published>2014-11-25T23:25:48+01:00</published><updated>2014-11-25T23:25:48+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-11-25:/kalibrieren-von-joysticks-windows-8.html</id><summary type="html">
&lt;p&gt;Ö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. &lt;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"&gt;In Microsofts Foren&lt;/a&gt; findet sich zum Glück eine Lösung für das Problem. Hält man im Dialog „Gamecontroller …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Ö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. &lt;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"&gt;In Microsofts Foren&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Windows"></category><category term="Gaming"></category></entry><entry><title>„Indie Game: The Movie“ auf openSUSE</title><link href="https://marix.org/%E2%80%9Eindie-game-movie%E2%80%9C-auf-opensuse.html" rel="alternate"></link><published>2014-11-23T21:56:37+01:00</published><updated>2014-11-23T22:02:16+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-11-23:/„indie-game-movie“-auf-opensuse.html</id><summary type="html">
&lt;p&gt;Startet man unter openSUSE, bzw. mit einem KDE-Desktop, von &lt;a href="http://store.steampowered.com/"&gt;Steam&lt;/a&gt; aus &lt;a href="http://www.indiegamethemovie.com/"&gt;„Indie Game: The Movie“&lt;/a&gt;, so kommt zwar ein archaisch wirkendes Xterm hoch, welches behauptet einem &lt;a href="http://www.adobe.com/products/air.html"&gt;Adobe AIR&lt;/a&gt; zu installieren, allerdings passiert danach nichts mehr. Hat man Adobe AIR bereits installiert startet „Indie Game: The Movie“ ohne Probleme.&lt;/p&gt;
&lt;p&gt;Hier kommen …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Startet man unter openSUSE, bzw. mit einem KDE-Desktop, von &lt;a href="http://store.steampowered.com/"&gt;Steam&lt;/a&gt; aus &lt;a href="http://www.indiegamethemovie.com/"&gt;„Indie Game: The Movie“&lt;/a&gt;, so kommt zwar ein archaisch wirkendes Xterm hoch, welches behauptet einem &lt;a href="http://www.adobe.com/products/air.html"&gt;Adobe AIR&lt;/a&gt; zu installieren, allerdings passiert danach nichts mehr. Hat man Adobe AIR bereits installiert startet „Indie Game: The Movie“ ohne Probleme.&lt;/p&gt;
&lt;p&gt;Hier kommen gleich mehrere Probleme zusammen:
&lt;ul&gt;&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
Woran genau die Installation scheitert habe ich nicht herausgefunden.&lt;/p&gt;
&lt;p&gt;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. &lt;a href="http://askubuntu.com/questions/87447/how-can-i-install-adobe-air"&gt;Legt man, an sich redundant, das korrekte Verzeichnis in die Umgebungsvariable &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt;, so läuft der Installer erfolgreich durch.&lt;/a&gt; Nach dem Download ist also folgendes in einer Konsole auszuführen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;chmod +x AdobeAIRInstaller.bin
su # sudo gibt per default keinen Zugriff auf den laufenden X-Server
LD_LIBRARY_PATH=/usr/lib64 ./AdobeAIRInstaller.bin
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Gaming"></category><category term="Steam"></category><category term="Linux"></category></entry><entry><title>Android-Apps ohne Benachrichtigungen</title><link href="https://marix.org/android-apps-ohne-benachrichtigungen.html" rel="alternate"></link><published>2014-10-28T11:25:44+01:00</published><updated>2014-10-28T11:25:44+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-10-28:/android-apps-ohne-benachrichtigungen.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Android"></category></entry><entry><title>Einhard 0.4</title><link href="https://marix.org/einhard-04.html" rel="alternate"></link><published>2014-10-27T18:19:35+01:00</published><updated>2017-08-05T21:28:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-10-27:/einhard-04.html</id><summary type="html">
&lt;p&gt;Ab sofort ist Version 0.4 von &lt;a href="https://marix.org/Projekte/einhard.md"&gt;Einhard&lt;/a&gt; verfügbar.&lt;/p&gt;
&lt;p&gt;Diese Version bietet folgende neuen Fähigkeiten:
&lt;ul&gt;
&lt;li&gt;Mehrzeilige Lognachrichten werden jetzt besser dargestellt.&lt;/li&gt;
&lt;li&gt;Das Zeichen zum Separieren der Bestandteile des Zeitstempels kann frei gewählt werden. Normalerweise wird weiter der Doppelpunkt verwendet.&lt;/li&gt;
&lt;li&gt;Ein Großteil des Codes wurde von den Headern in eine Bibliothek …&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Ab sofort ist Version 0.4 von &lt;a href="https://marix.org/Projekte/einhard.md"&gt;Einhard&lt;/a&gt; verfügbar.&lt;/p&gt;
&lt;p&gt;Diese Version bietet folgende neuen Fähigkeiten:
&lt;ul&gt;
&lt;li&gt;Mehrzeilige Lognachrichten werden jetzt besser dargestellt.&lt;/li&gt;
&lt;li&gt;Das Zeichen zum Separieren der Bestandteile des Zeitstempels kann frei gewählt werden. Normalerweise wird weiter der Doppelpunkt verwendet.&lt;/li&gt;
&lt;li&gt;Ein Großteil des Codes wurde von den Headern in eine Bibliothek verschoben um Code der Einhard verwendet schneller kompilieren zu lassen.&lt;/li&gt;
&lt;li&gt;Einhard kann jetzt aus mehreren Threads heraus verwendet werden.&lt;/li&gt;
&lt;li&gt;Einhard kann auch mit Clang genutzt und übersetzt werden.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Der Code findet sich auf Gitlab unter dem Tag &lt;cite&gt;v0.4&lt;/cite&gt;: &lt;a href="https://gitlab.com/Marix/Einhard/tree/v0.4"&gt;https://gitlab.com/Marix/Einhard/tree/v0.4&lt;/a&gt;:. Von dort lässt er sich auch &lt;a href="https://gitlab.com/Marix/Einhard/repository/archive.tar.bz2?ref=v0.4"&gt;als Tarball herunterladen.&lt;/a&gt;
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Bibliothek"></category><category term="Einhard"></category><category term="Programmierung"></category></entry><entry><title>Civilization 5, V-Sync und KDE</title><link href="https://marix.org/civilization-5-v-sync-und-kde.html" rel="alternate"></link><published>2014-09-11T00:31:21+02:00</published><updated>2014-09-11T00:31:21+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-09-11:/civilization-5-v-sync-und-kde.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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“-&gt;„Erweitert“.&lt;/p&gt;
    </content><category term="Blog"></category><category term="KDE"></category><category term="Civilization"></category><category term="Gaming"></category><category term="Linux"></category></entry><entry><title>Threema</title><link href="https://marix.org/threema.html" rel="alternate"></link><published>2014-01-04T18:06:01+01:00</published><updated>2014-07-14T21:17:47+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2014-01-04:/threema.html</id><summary type="html">
&lt;p&gt;Nach dem NSA-Skandal scheint sich jetzt mit &lt;a href="https://threema.ch"&gt;Threema&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Nach dem NSA-Skandal scheint sich jetzt mit &lt;a href="https://threema.ch"&gt;Threema&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ich bin natürlich auch per Threema zu erreichen. Fragt mich einfach nach meiner ID. Meine alte ID &lt;cite&gt;YYYZBANM&lt;/cite&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Privatsphäre"></category><category term="Android"></category><category term="Anwendung"></category><category term="Computersicherheit"></category></entry><entry><title>Chiliproject-Tickets aus Commits heraus schließen</title><link href="https://marix.org/chiliproject-tickets-aus-commits-heraus-schlie%C3%9Fen.html" rel="alternate"></link><published>2013-09-25T15:31:22+02:00</published><updated>2013-09-25T15:31:22+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-09-25:/chiliproject-tickets-aus-commits-heraus-schließen.html</id><summary type="html">
&lt;p&gt;In &lt;a href="https://www.chiliproject.org/"&gt;ChiliProject&lt;/a&gt; &amp;ndash; und natürlich auch in &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; &amp;ndash; können Tickets aus Commits heraus referenziert und Geschlossen werden. Da ich immer wieder neu heraussuchen muss, wie das geht, hier die Kurzanleitung:
&lt;pre&gt;&lt;code&gt;refs #123&lt;/code&gt;&lt;/pre&gt;
Referenziert das Ticket 123. Alternativ ist auch &lt;code&gt;references&lt;/code&gt; oder &lt;code&gt;IssueID&lt;/code&gt; möglich.
Um ein Ticket zu schließen ist folgendes in …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;In &lt;a href="https://www.chiliproject.org/"&gt;ChiliProject&lt;/a&gt; &amp;ndash; und natürlich auch in &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; &amp;ndash; können Tickets aus Commits heraus referenziert und Geschlossen werden. Da ich immer wieder neu heraussuchen muss, wie das geht, hier die Kurzanleitung:
&lt;pre&gt;&lt;code&gt;refs #123&lt;/code&gt;&lt;/pre&gt;
Referenziert das Ticket 123. Alternativ ist auch &lt;code&gt;references&lt;/code&gt; oder &lt;code&gt;IssueID&lt;/code&gt; möglich.
Um ein Ticket zu schließen ist folgendes in den Commit einzufügen:
&lt;pre&gt;&lt;code&gt;fixes #123&lt;/code&gt;&lt;/pre&gt;
Alternativ kann &lt;code&gt;closes&lt;/code&gt; verwendet werden.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Das ganze lässt sich auch anpassen. Die Einstellungen finden sich unter &lt;code&gt;Administration-&gt;Konfiguration-&gt;Projektarchive&lt;/code&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Programmierung"></category></entry><entry><title>Die Trailer der letzten Wochen: Meine Highlights</title><link href="https://marix.org/gametrailer.html" rel="alternate"></link><published>2013-07-05T16:46:13+02:00</published><updated>2013-07-05T17:25:27+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-07-05:/gametrailer.html</id><summary type="html">In den letzten Wochen gab es einige coole Trailer zu neuen Spielen. Hier sind meine persönlichen Highlights.</summary><content type="html">
&lt;p&gt;In den letzten Wochen gab es einige coole Trailer zu neuen Spielen. Hier sind meine persönlichen Highlights.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/JRwDa5OSHtE?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Ub9CtV524yI?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/9hfCcQG5n5M?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Außerdem gibt es neues vom Hexer. „The Witcher 3“ verspricht ein wahrhaft episches Abenteuer zu werden.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/TZ_G6XiHoUA?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Der Trailer zu „Borderlands 2: Tiny Tina“ verspricht die klassischen Action-RPGs jetzt mal dem für Borderlands typischen Humor auszusetzen.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/SCGXss3plDc?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;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...&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Vb62WFsNkCo?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/9kmUf3fflrA?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Borderlands"></category><category term="The Witcher"></category><category term="Computerspiel"></category><category term="Need for Speed"></category><category term="Civilization"></category><category term="TrackMania"></category><category term="Eve Online"></category><category term="Trailer"></category></entry><entry><title>Aktive Reservierungen in SLURM verlängern</title><link href="https://marix.org/aktive-reservierungen-slurm-verl%C3%A4ngern.html" rel="alternate"></link><published>2013-06-25T11:09:17+02:00</published><updated>2013-06-25T11:17:41+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-06-25:/aktive-reservierungen-slurm-verlängern.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://slurm.schedmd.com/"&gt;SLURM&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://slurm.schedmd.com/"&gt;SLURM&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Als kleines Beispiel soll folgende Reservierung verlängert werden:
&lt;pre&gt;&lt;code&gt;bach@login:~&gt; 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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Der naive Versuch die Reservierung zu verlängern scheitert:
&lt;pre&gt;&lt;code&gt;bach@login:~&gt; 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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Weist man die Reservierung an etwaige Nutzungkonflikte zu ignorieren, so kann sie problemlos verlängert werden:
&lt;pre&gt;&lt;code&gt;sudo scontrol update reservationname=bach_2 endtime=2013-07-29 flags=IGNORE_JOBS
Reservation updated. &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Das Flag &lt;code&gt;IGNORE_JOBS&lt;/code&gt; 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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Cluster"></category><category term="SLURM"></category></entry><entry><title>Glossareinträge in TikZ-UML-Diagrammen verwenden</title><link href="https://marix.org/glossareintr%C3%A4ge-tikz-uml-diagrammen-verwenden.html" rel="alternate"></link><published>2013-05-09T10:54:29+02:00</published><updated>2013-05-09T10:54:29+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-05-09:/glossareinträge-tikz-uml-diagrammen-verwenden.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.ensta-paristech.fr/~kielbasi/tikzuml/index.php?lang=en"&gt;TikZ-UML&lt;/a&gt; und &lt;a href="http://dante.ctan.org/tex-archive/help/Catalogue/entries/glossaries.html"&gt;Glossaries&lt;/a&gt; sind äußerst nützliche Pakete für &lt;a href="http://www.latex-project.org/"&gt;LaTeX&lt;/a&gt;. Leider scheiterte mein erster Versuch einen Eintrag meines Glossars als Klassenname zu verwenden mit folgender Fehlermeldung:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;! Missing \endcsname inserted.
&lt;to be read again&gt;
                   \let
l.95                            \umlemptyclass[y=0, x=0]{\glstext{prng}}
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Die Lösung ist auf den Link zum Glossar zu verzichten. Da TikZ-UML …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.ensta-paristech.fr/~kielbasi/tikzuml/index.php?lang=en"&gt;TikZ-UML&lt;/a&gt; und &lt;a href="http://dante.ctan.org/tex-archive/help/Catalogue/entries/glossaries.html"&gt;Glossaries&lt;/a&gt; sind äußerst nützliche Pakete für &lt;a href="http://www.latex-project.org/"&gt;LaTeX&lt;/a&gt;. Leider scheiterte mein erster Versuch einen Eintrag meines Glossars als Klassenname zu verwenden mit folgender Fehlermeldung:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;! Missing \endcsname inserted.
&lt;to be read again&gt;
                   \let
l.95                            \umlemptyclass[y=0, x=0]{\glstext{prng}}
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;\glsentrytext&lt;/code&gt; anstelle von &lt;code&gt;\glstext&lt;/code&gt; wird der Glossareintrag zum Klassennamen. Nur draufklicken um in das Glossar zu kommen kann man leider nicht.&lt;/p&gt;
    </content><category term="Blog"></category><category term="LaTeX"></category></entry><entry><title>Makros als OpenCL-Kommandozeilenparameter</title><link href="https://marix.org/makros-als-opencl-kommandozeilenparameter.html" rel="alternate"></link><published>2013-02-04T17:16:00+01:00</published><updated>2017-07-10T17:16:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-02-04:/makros-als-opencl-kommandozeilenparameter.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.khronos.org/registry/cl/"&gt;Die OpenCL-Specifikation&lt;/a&gt; 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 &lt;code&gt;-DMACRO[=WERT]&lt;/code&gt; angesagt ist, ist der Parameter in OpenCL mit einem Leerzeichen spezifiziert, also &lt;code&gt;-D MACRO[=WERT]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Die AMD und NVIDIA-Platformen kommen wunderbar mit der vom …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.khronos.org/registry/cl/"&gt;Die OpenCL-Specifikation&lt;/a&gt; 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 &lt;code&gt;-DMACRO[=WERT]&lt;/code&gt; angesagt ist, ist der Parameter in OpenCL mit einem Leerzeichen spezifiziert, also &lt;code&gt;-D MACRO[=WERT]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;CL_INVALID_BUILD_OPTIONS&lt;/code&gt;. In &lt;a href="
http://mathema.tician.de/software/pyopencl"&gt;PyOpenCL&lt;/a&gt; wird daraus dann folgende Fehlermeldung:
&lt;code&gt;pyopencl.RuntimeError: clBuildProgram failed: invalid build options -&lt;/code&gt;
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 &lt;code&gt;-DFOO&lt;/code&gt; endet. Ein &lt;code&gt;-DFOO -DBLA&lt;/code&gt; verarbeitet er völlig erwartungsgemäß.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Mac OS X"></category><category term="OpenCL"></category><category term="Programmierung"></category></entry><entry><title>Steam einfach auf openSUSE installieren</title><link href="https://marix.org/create-blogeintrag-0.html" rel="alternate"></link><published>2013-02-02T15:56:08+01:00</published><updated>2013-02-02T16:00:29+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-02-02:/create-blogeintrag-0.html</id><summary type="html">
&lt;p&gt;Es ist jetzt wieder möglich &lt;a href="http://steampowered.com"&gt;Steam&lt;/a&gt; per &lt;a href="http://de.opensuse.org/1-Klick-Installation"&gt;1-Klick-Installation&lt;/a&gt; auf &lt;a href="http://www.opensuse.org"&gt;openSUSE&lt;/a&gt; zu installieren. Die passenden Links findet man über &lt;a href="http://software.opensuse.org/package/steam"&gt;die SUSE Software Suche&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Steam war bereits kurz nach Start der offenen Beta im OpenSUSE Build Service verfügbar, dort aber &lt;a href="http://lists.opensuse.org/opensuse-buildservice/2013-01/msg00023.html"&gt;im Januar aufgrund rechtlicher Problem wieder herausgeflogen.&lt;/a&gt; Im Endeffekt lief es darauf …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Es ist jetzt wieder möglich &lt;a href="http://steampowered.com"&gt;Steam&lt;/a&gt; per &lt;a href="http://de.opensuse.org/1-Klick-Installation"&gt;1-Klick-Installation&lt;/a&gt; auf &lt;a href="http://www.opensuse.org"&gt;openSUSE&lt;/a&gt; zu installieren. Die passenden Links findet man über &lt;a href="http://software.opensuse.org/package/steam"&gt;die SUSE Software Suche&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Steam war bereits kurz nach Start der offenen Beta im OpenSUSE Build Service verfügbar, dort aber &lt;a href="http://lists.opensuse.org/opensuse-buildservice/2013-01/msg00023.html"&gt;im Januar aufgrund rechtlicher Problem wieder herausgeflogen.&lt;/a&gt; Im Endeffekt lief es darauf hinaus, dass es von Valve keine offizielle Genehmigung für das openSUSE-Projekt gab Steam zu verbreiten. &lt;a href="http://lists.opensuse.org/opensuse-buildservice/2013-02/msg00001.html"&gt;Jetzt hat Steam seine Lizens so geändert, dass jeder Steam-Pakete weiterverbreiten darf&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Spiele"></category><category term="Steam"></category></entry><entry><title>Cyberpunk 2077</title><link href="https://marix.org/create-blogeintrag.html" rel="alternate"></link><published>2013-02-01T11:20:16+01:00</published><updated>2013-02-02T15:59:47+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2013-02-01:/create-blogeintrag.html</id><summary type="html">
&lt;p&gt;Diesen Januar gab es ja einige imposante Rendertrailer zu sehen. Am meisten beeindruckt hat mich allerdings der Trailer für &lt;a href="http://cyberpunk.net/"&gt;Cyberpunk 2077&lt;/a&gt;. 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Diesen Januar gab es ja einige imposante Rendertrailer zu sehen. Am meisten beeindruckt hat mich allerdings der Trailer für &lt;a href="http://cyberpunk.net/"&gt;Cyberpunk 2077&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/P99qJGrPNLs?autoplay=0`" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Computerspiel"></category><category term="Trailer"></category></entry><entry><title>MIDI-Eingabe in openSUSE 12.1</title><link href="https://marix.org/midi-eingabe-opensuse-121.html" rel="alternate"></link><published>2012-03-10T14:13:15+01:00</published><updated>2013-01-27T18:48:09+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2012-03-10:/midi-eingabe-opensuse-121.html</id><summary type="html">
&lt;p&gt;Da kommt man nach langer Zeit endlich mal wieder dazu seine &lt;a href="http://www.hercules.com/de/DJ-Musik/bdd/p/12/dj-console-mk2-virtualdj-djc-ed/"&gt;Hercules DJ Console MK2&lt;/a&gt; anzuschließen, und dann findet &lt;href=&amp;quot;http: mixxx.org &amp;quot;&gt;Mixxx&lt;/a&gt; kein MIDI-Gerät. Die Lösung ist einfach. In aktuellen Versionen von openSUSE sind die Geräte unter &lt;code&gt;/dev/snd&lt;/code&gt; nur noch für den Nutzer &lt;code&gt;root&lt;/code&gt; und die Gruppe &lt;code&gt;audio&lt;/code&gt; verfügbar. Die Lösung …&lt;/href=&amp;quot;http:&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Da kommt man nach langer Zeit endlich mal wieder dazu seine &lt;a href="http://www.hercules.com/de/DJ-Musik/bdd/p/12/dj-console-mk2-virtualdj-djc-ed/"&gt;Hercules DJ Console MK2&lt;/a&gt; anzuschließen, und dann findet &lt;href=&amp;quot;http: mixxx.org &amp;quot;&gt;Mixxx&lt;/a&gt; kein MIDI-Gerät. Die Lösung ist einfach. In aktuellen Versionen von openSUSE sind die Geräte unter &lt;code&gt;/dev/snd&lt;/code&gt; nur noch für den Nutzer &lt;code&gt;root&lt;/code&gt; und die Gruppe &lt;code&gt;audio&lt;/code&gt; verfügbar. Die Lösung: Den eigenen Nutzer der Gruppe &lt;code&gt;audio&lt;/code&gt; hinzufügen, neu anmelden und schon geht es wieder. :)&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Musik"></category><category term="DJing"></category></entry><entry><title>OpenCL-Tracing mit Tau</title><link href="https://marix.org/opencl-tracing-mit-tau.html" rel="alternate"></link><published>2012-01-24T18:24:32+01:00</published><updated>2013-01-27T18:49:23+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2012-01-24:/opencl-tracing-mit-tau.html</id><summary type="html">
&lt;p&gt;Um &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt;-Anwendungen auf der NVIDIA Platform zu tracen gibt es den &lt;a href="http://developer.nvidia.com/nvidia-visual-profiler"&gt;NVIDIA Visual Profiler&lt;/a&gt;. Um sie auf der AMD Platform zu tracen gibt es den &lt;a href="http://developer.amd.com/tools/AMDAPPProfiler/Pages/default.aspx"&gt;AMD APP Profiler&lt;/a&gt;. Problem gelöst – oder? Leider gibt es ein paar spezielle Situationen in denen das nicht reicht. Der AMD APP Debugger kann zwar …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Um &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt;-Anwendungen auf der NVIDIA Platform zu tracen gibt es den &lt;a href="http://developer.nvidia.com/nvidia-visual-profiler"&gt;NVIDIA Visual Profiler&lt;/a&gt;. Um sie auf der AMD Platform zu tracen gibt es den &lt;a href="http://developer.amd.com/tools/AMDAPPProfiler/Pages/default.aspx"&gt;AMD APP Profiler&lt;/a&gt;. 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 &lt;a href="http://www.gremedy.com/"&gt;gDEBugger&lt;/a&gt; kann zwar unter Linux visualisieren, kann aber nicht auf der Kommandozeile messen. &lt;a href="http://www.cs.uoregon.edu/Research/tau/home.php"&gt;Tau&lt;/a&gt;, 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 &lt;a href="https://github.com/theMarix/APP-Profiler-Visualization-Tool"&gt;mein erster Versuch&lt;/a&gt; war.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tau installieren&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;./configure -opencl=&lt;pfad zu opencl&gt;
make install&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Tau installiert sich übrigens in ein nach der Architektur benanntes Unterverzeichnis des Build-Verzeichnisses&amp;hellip;. Soll es woanders lassen müsste man &lt;code&gt;configure&lt;/code&gt; den passenden Pfad via &lt;code&gt;-prefix&lt;/code&gt; mitgeben. Man beachte, das es hier nur einen Minus gibt&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Anschließend müssen noch &lt;code&gt;PATH&lt;/code&gt; und &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; angepasst werden, also z.B.:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trace erstellen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Um ein Trace zu erstellen verwendet man &lt;code&gt;tau_exec&lt;/code&gt; wie folgt:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;TAU_TRACE=1 tau_exec -T PROFILE,SERIAL -opencl &lt;anwendung&gt; &lt;argumente der anwendung&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TAU_TRACE=1&lt;/code&gt; ist notwendig damit Tau auch Tracing und nicht nur Profiling betreibt. &lt;code&gt;SERIAL&lt;/code&gt; ist notwendig damit &lt;code&gt;tau_exec&lt;/code&gt; die Anwendung direkt und nicht via &lt;code&gt;mpirun&lt;/code&gt; startet.&lt;/p&gt;
&lt;p&gt;Anschließend existieren mehrere &lt;code&gt;tautrace.0.0.?.trc&lt;/code&gt;-Dateien. Da Jumpshot mit slog2-Dateien arbeitet müssen diese noch konvertiert werden:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;tau_treemerge.pl
tau2slog2 tau.trc tau.edf -o &lt;egal&gt;.slog2&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trace analysieren&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die slog2-Datei kann anschließend mit &lt;a href="http://www.mcs.anl.gov/research/projects/perfvis/software/viewers/index.htm#Jumpshot"&gt;Jumpshot&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="OpenCL"></category><category term="Profiling"></category><category term="Optimierung"></category><category term="Programmierung"></category></entry><entry><title>Philosophisches von zypper</title><link href="https://marix.org/philosophisches-von-zypper.html" rel="alternate"></link><published>2012-01-15T11:39:26+01:00</published><updated>2013-01-27T18:57:39+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2012-01-15:/philosophisches-von-zypper.html</id><summary type="html">
&lt;p&gt;Beim Versuch den &lt;a href="http://www.simfy.de/downloads/player"&gt;Simfy Desktop Player&lt;/a&gt; zu installieren überraschte &lt;a href="http://en.opensuse.org/Zypper"&gt;zypper&lt;/a&gt; gerade mit folgender Meldung:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Bleibt die Frage, was …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Beim Versuch den &lt;a href="http://www.simfy.de/downloads/player"&gt;Simfy Desktop Player&lt;/a&gt; zu installieren überraschte &lt;a href="http://en.opensuse.org/Zypper"&gt;zypper&lt;/a&gt; gerade mit folgender Meldung:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Bleibt die Frage, was er damit sagen wollte:
&lt;ul&gt;
  &lt;li&gt;Diese Software willst du eigentlich gar nicht verwenden?&lt;/li&gt;
  &lt;li&gt;Heißt ja, wirklich immer ja?&lt;/li&gt;
  &lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Kurioses"></category><category term="Feuilleton"></category></entry><entry><title>ACLs – Dann klappt auch das Inotify bei Mediatomb</title><link href="https://marix.org/acls-%E2%80%93-dann-klappt-auch-das-inotify-bei-mediatomb.html" rel="alternate"></link><published>2012-01-07T19:54:02+01:00</published><updated>2013-01-27T19:01:23+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2012-01-07:/acls-–-dann-klappt-auch-das-inotify-bei-mediatomb.html</id><summary type="html">&lt;p&gt;Die traditionellen Unix-Dateiberechtigungen stoßen öfter mal an ihre Grenzen. Zum Beispiel bei meinem Versuch &lt;a href=</summary><content type="html">
&lt;p&gt;Die traditionellen Unix-Dateiberechtigungen stoßen öfter mal an ihre Grenzen. Zum Beispiel bei meinem Versuch &lt;a href="http://mediatomb.cc/"&gt;Mediatomb&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Meine ACL für das oberste Verzeichnis sieht aus wie folgt:
&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;mediatomb&lt;/code&gt; bekommt explizit Lese- und Schreibberechtigung für dieses Verzeichnis. Dadurch kann Mediatomb dann Inotify verwenden um das Verzeichnis auf Veränderungen zu überwachen.&lt;/p&gt;
&lt;p&gt;Besonders  wichtig sind die mit &lt;code&gt;default:&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Um diese ACL auf einen bestehenden Dateibaum anzuwenden packt man sie am besten in eine Datei, in meinem Fall habe ich sie einfach &lt;code&gt;acl&lt;/code&gt; genannt, und wendet sie mit &lt;code&gt;setfacl&lt;/code&gt; rekursiv an.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;setfacl -R --set-file acl /OberstesVerzeichnis/&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Hierbei gibt es noch einen kleinen Trick. Die Berechtigung &lt;code&gt;X&lt;/code&gt;, anstelle von &lt;code&gt;x&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="PS3"></category><category term="Linux"></category></entry><entry><title>Bessere D3-Startlinks für http://d3.descent.cx/</title><link href="https://marix.org/bessere-d3-startlinks-f%C3%BCr-httpd3descentcx.html" rel="alternate"></link><published>2011-09-24T20:13:16+02:00</published><updated>2013-01-28T11:14:31+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-09-24:/bessere-d3-startlinks-für-httpd3descentcx.html</id><summary type="html">
&lt;p&gt;&lt;a href="https://marix.org/Publikationen/d3.descent.cx.user.js"&gt;Das hier vorgestellte Skript&lt;/a&gt; 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. &lt;a href="http://slyclan.de/"&gt;Vortex&lt;/a&gt; installiert, so kann man durch den Klick auf den Link direkt Descent 3 starten, welches dann mit dem …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="https://marix.org/Publikationen/d3.descent.cx.user.js"&gt;Das hier vorgestellte Skript&lt;/a&gt; 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. &lt;a href="http://slyclan.de/"&gt;Vortex&lt;/a&gt; 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 &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt; sowie mit &lt;a href="http://www.mozilla.org/de/firefox/"&gt;Firefox&lt;/a&gt;, wobei letzterer die &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/"&gt;Greasemonkey-Erweiterung&lt;/a&gt; benötigt.&lt;/p&gt;
&lt;p&gt;In &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt; müss man zunächst sicherstellen, dass User-JavaScript aktiviert ist. Hierzu geht man im Menü auf Extras-&gt;Einstellungen-&gt;Erweitert-&gt;Inhalte-&gt;JavaScript-Optionen. Hier muss ein User-JavaScript-Verzeichnis eingetragen sein. In dieses Verzeichnis wird die Datei &lt;a href="https://marix.org/Publikationen/d3.descent.cx.user.js"&gt;d3.descent.cx.user.js&lt;/a&gt; abgespeichert, und beim nächsten Aufruf von http://d3.descent.cx/ werden die Links schon ersetzt.&lt;/p&gt;
&lt;p&gt;In &lt;a href="http://www.mozilla.org/de/firefox/"&gt;Firefox&lt;/a&gt; muss zunächst die Erweiterung &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/"&gt;Greasemonkey&lt;/a&gt; installiert werden. Nach dem nötigen Neustart ist die Datei &lt;a href="https://marix.org/Publikationen/d3.descent.cx.user.js"&gt;d3.descent.cx.user.js&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Hier nochmal der Link zum herunterladen bzw. zur Installation: &lt;a href="https://marix.org/Publikationen/d3.descent.cx.user.js"&gt;d3.descent.cx.user.js&lt;/a&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Gaming"></category><category term="User-JavaScript"></category><category term="Descent"></category></entry><entry><title>OpenCL: Buffer vs. mehrere Devices</title><link href="https://marix.org/opencl-buffer-vs-mehrere-devices.html" rel="alternate"></link><published>2011-09-19T18:24:56+02:00</published><updated>2013-01-28T11:15:23+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-09-19:/opencl-buffer-vs-mehrere-devices.html</id><summary type="html">&lt;p&gt;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 &lt;code&gt;clCreateBuffer&lt;/code&gt; bietet ja leider keine Möglichkeit anzugeben auf welchem Device der Speicher allokiert werden soll.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;code&gt;clCreateBuffer&lt;/code&gt; bietet ja leider keine Möglichkeit anzugeben auf welchem Device der Speicher allokiert werden soll.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf"&gt;AMD APP Programming Guide&lt;/a&gt;. NVIDIA geht in seiner &lt;a href="http://developer.nvidia.com/nvidia-gpu-computing-documentation"&gt;GPU Computing Documentation&lt;/a&gt; zwar nicht explizit auf diese Problematik ein, Beiträge in den &lt;a href="http://forums.nvidia.com/index.php?showtopic=192398&amp;amp;st=0&amp;amp;gopid=1192390&amp;amp;#entry1192390"&gt;Foren von NVIDIA&lt;/a&gt; und &lt;a href="http://www.khronos.org/message_boards/viewtopic.php?f=28&amp;amp;t=3724"&gt;Khronos&lt;/a&gt; dokumentieren aber dieses Verhalten. Bedenken sollte man allerdings, dass man, um von diesem Verhalten zu profitieren, &lt;code&gt;CL_MEM_COPY_HOST_PTR&lt;/code&gt; nicht verwenden darf.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf"&gt;AMDs Programming Guide&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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. &lt;a href="http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf"&gt;Die OpenCL-Spezifikation&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Außerdem sollte man auch immer bedenken, dass Buffer welche ausschließlich auf der CPU verwendet werden mit &lt;code&gt;CL_MEM_ALLOC_HOST_PTR&lt;/code&gt; oder &lt;code&gt;CL_MEM_USE_HOST_PTR&lt;/code&gt; initialisiert werden sollten um unnötiges kopieren der Daten zu vermeiden.&lt;/p&gt;
    </content><category term="Blog"></category><category term="OpenCL"></category><category term="Programmierung"></category></entry><entry><title>Liebe Berliner, geht Wählen!</title><link href="https://marix.org/liebe-berliner-geht-w%C3%A4hlen.html" rel="alternate"></link><published>2011-09-18T11:33:12+02:00</published><updated>2011-09-18T11:33:12+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-09-18:/liebe-berliner-geht-wählen.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;a href="http://blog.fefe.de/?ts=b08d858b"&gt;bei Fefe berichtet&lt;/a&gt;, 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!“;&lt;/p&gt;
&lt;p&gt;&lt;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"&gt; &lt;param name="movie" value="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" /&gt; &lt;param name="flashvars" value="title=Blumentopf_Wahlwerbespot&amp;amp;uniqueName=34358831&amp;amp;albumArt=http%3A%2F%2Fcdn.last.fm%2Fdepth%2Fcatalogue%2Fnoimage%2Fnocover_flashplayer.png&amp;amp;duration=124&amp;amp;image=http%3A%2F%2Fuserserve-ak.last.fm%2Fserve%2Fimage%3A320%2F34358831.jpg&amp;amp;FSSupport=true&amp;amp;creator=Blumentopf" /&gt; &lt;param name="allowScriptAccess" value="always" /&gt; &lt;param name="allowNetworking" value="all" /&gt; &lt;param name="allowFullScreen" value="true" /&gt; &lt;param name="quality" value="high" /&gt; &lt;param name="bgcolor" value="000000" /&gt; &lt;param name="wmode" value="opaque" /&gt; &lt;param name="menu" value="false" /&gt; &lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Politik"></category></entry><entry><title>Spaß mit gcc und geschützten Leerzeichen</title><link href="https://marix.org/spa%C3%9F-mit-gcc-und-gesch%C3%BCtzten-leerzeichen.html" rel="alternate"></link><published>2011-09-14T21:16:03+02:00</published><updated>2013-01-28T11:16:11+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-09-14:/spaß-mit-gcc-und-geschützten-leerzeichen.html</id><summary type="html">&lt;p&gt;Wenn ich von meinem Mac aus in einem &lt;a href=</summary><content type="html">
&lt;p&gt;Wenn ich von meinem Mac aus in einem &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; auf einem anderen Rechner programmiere beschwert sich &lt;a href="http://gcc.gnu.org/"&gt;gcc&lt;/a&gt; öfter mal über folgendes und weigert sich die Datei zu kompilieren:
&lt;pre&gt;&lt;code&gt;some_source.cpp:519:2: error: stray ‘\302’ in program
some_source.cpp:519:2: error: stray ‘\240’ in program
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://stackoverflow.com/questions/5167656/error-stray-302-in-program"&gt;Stackoverflow&lt;/a&gt; fand ich dann den Hinweis in die richtige Richtung. Das Problem ergibt sich durch versehentlich eingegebene &lt;a href="http://de.wikipedia.org/wiki/Geschütztes_Leerzeichen"&gt;geschützte Leerzeichen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.
&lt;pre&gt;&lt;code&gt;set listchars=nbsp:_
set list
&lt;/code&gt;&lt;/pre&gt;
Der &lt;code&gt;listchars&lt;/code&gt;-Befehl legt fest wodurch welches Zeichen ersetzt werden soll, der &lt;code&gt;list&lt;/code&gt;-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 &lt;code&gt;.vimrc&lt;/code&gt; jetzt so aussieht:
&lt;pre&gt;&lt;code&gt;set listchars=tab:»·,trail:·,nbsp:_
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Vim"></category><category term="Programmierung"></category></entry><entry><title>Wie man in node.js URLs auf Funktionen abbildet</title><link href="https://marix.org/wie-man-nodejs-urls-auf-funktionen-abbildet.html" rel="alternate"></link><published>2011-09-04T12:56:40+02:00</published><updated>2017-08-05T14:44:01+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-09-04:/wie-man-nodejs-urls-auf-funktionen-abbildet.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;In der &lt;a href="http://nodejs.org/docs/v0.4.11/api/http.html#request.url"&gt;Doku zu node.js&lt;/a&gt; geht hervor, dass das Request-Objekt die URL im Attribut &lt;code&gt;url&lt;/code&gt; 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:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;var url_mapping = {
  '/': printIndex,
  '/index.html': printIndex
}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Die Funktion &lt;code&gt;printIndex&lt;/code&gt; kann so aussehen:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;// Ok, not really an index, but works.
var printIndex = function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!\n');
}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Die Abbildung wird dann wie folgt implementiert:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mapped = url_mappings[req.url];
if (mapped) {
  mapped(req, res);
} else {
  console.log(req.url + ' has not been mapped');
  invalidURL(req, res);
}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Der Code nutzt aus, dass wir in JavaScript dynamisch auf Werte eines Objektes zugreifen können und &lt;code&gt;undefined&lt;/code&gt; 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 &lt;code&gt;hasOwnProperty&lt;/code&gt;, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Um auch diesen Fall abzuhandeln können wir einen Array nutzen der Objekte enthält die jeweils ein Muster auf eine Funktion abbildet:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;var pattern_mapping = [
  { pattern: '/echo/', mapped: echo },
  { pattern: /^\/regexp/, mapped: printMatch }
];&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;for (i = 0; !mapped &amp;&amp; i &lt; pattern_mappings.length; i = i + 1) {
  pattern = pattern_mappings[i].pattern;
  console.log('Testing pattern ' + i + ': ' + pattern + ' [' + typeof(pattern) + ']');
  if( typeof(pattern) === 'string' &amp;&amp; req.url.slice(0, pattern.length) === pattern ) {
    mapped = pattern_mappings[i].mapped;
  } else if ( pattern.test &amp;&amp; typeof(pattern.test) === 'function' &amp;&amp; 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;
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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 &amp;&amp; i &lt; pattern_mappings.length; i = i + 1) {
      pattern = pattern_mappings[i].pattern;
      console.log('Testing pattern ' + i + ': ' + pattern + ' [' + typeof(pattern) + ']');
      if( typeof(pattern) === 'string' &amp;&amp; req.url.slice(0, pattern.length) === pattern ) {
        mapped = pattern_mappings[i].mapped;
      } else if ( pattern.test &amp;&amp; typeof(pattern.test) === 'function' &amp;&amp; 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);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Zum einfacheren rumspielen mit dem Code gibt es das Beispiel als Datei: &lt;a href="https://marix.org/Anhänge/path.js"&gt;path.js&lt;/a&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="node.js"></category><category term="JavaScript"></category></entry><entry><title>Mediatomb vs. PS3 vs. Opera</title><link href="https://marix.org/mediatomb-vs-ps3-vs-opera.html" rel="alternate"></link><published>2011-04-16T12:16:31+02:00</published><updated>2013-01-28T12:49:25+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-04-16:/mediatomb-vs-ps3-vs-opera.html</id><summary type="html">&lt;p&gt;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 &lt;a href=</summary><content type="html">
&lt;p&gt;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 &lt;a href="http://mediatomb.cc"&gt;Mediatomb&lt;/a&gt; mal sah, und mal nicht sah. Inzwischen konnte ich das Problem auf eine Wechselwirkung mit &lt;a href="http://unite.opera.com/overview/"&gt;Opera Unite&lt;/a&gt; zurückführen. Schaltet man diese Funktionalität auf allen Rechnern im LAN aus verschwindet das Problem.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://quassel-irc.org/"&gt;Quassel-IRC&lt;/a&gt; und &lt;a href="http://opera.com"&gt;Opera&lt;/a&gt; besteht, ersteres aber keinerlei UPnP-Funktionalität besitzt, war das Problem schnell eingegrenzt.&lt;/p&gt;
&lt;p&gt;Sucht man nach UPnP und Opera findet man auch schnell heraus, &lt;a href="http://forum.soft32.com/linux/disable-UPnP-ftopict500480.html"&gt;dass dieses nur vom Opera Unite genutzt wird&lt;/a&gt;. Schaltet man dies ab, indem man auf der Seite &lt;code&gt;opera:config&lt;/code&gt; in den User Prefs den Haken vor &lt;code&gt;Enable Unite&lt;/code&gt; entfernt, verschwindet auch die Störung.&lt;/p&gt;
&lt;p&gt;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.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Opera"></category><category term="PS3"></category><category term="Netzwerke"></category></entry><entry><title>Zwei Hinweise zum IPv6-Routing mit openSUSE</title><link href="https://marix.org/zwei-hinweise-zum-ipv6-routing-mit-opensuse.html" rel="alternate"></link><published>2011-04-02T11:09:57+02:00</published><updated>2013-01-28T12:50:13+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-04-02:/zwei-hinweise-zum-ipv6-routing-mit-opensuse.html</id><summary type="html">
&lt;p&gt;Den Artikel &lt;a href="http://www.heise.de/ct/inhalt/2011/08/190/"&gt;&lt;quote&gt;Doppelmoppel – IPv6-Zugang fürs LAN nachrüsten&lt;/quote&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;Das mit dem LAN verbundene Netzwerkinterface benötigt eine gültige IPv6-Adresse aus dem LAN-Subnetz. Diese …&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Den Artikel &lt;a href="http://www.heise.de/ct/inhalt/2011/08/190/"&gt;&lt;quote&gt;Doppelmoppel – IPv6-Zugang fürs LAN nachrüsten&lt;/quote&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;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 &lt;a href="http://www.litech.org/radvd/"&gt;radvd&lt;/a&gt; am lokalen Interface nicht funktioniert.&lt;/p&gt;
&lt;p&gt;Diese Adresse kann man via &lt;code&gt;ifconfig add &amp;lt;in radvd eingetragenes prefix&amp;gt;:&amp;lt;mac addresse&amp;gt;/64&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Hat das lokale Interface keine gültige IPv6 im LAN-Subnetz werden die aus dem LAN kommenden Pakete vom Router verworfen.&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;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.&lt;/p&gt;
&lt;p&gt;Hierzu editiert man die Datei &lt;code&gt;/etc/sysconfig/SuSEfirewall2&lt;/code&gt; und ändert den Wert &lt;code&gt;FW_FORWARD&lt;/code&gt; auf &lt;code&gt;"&amp;lt;lokales IPv6-Netz&amp;gt;,2000::/3"&lt;/code&gt;. 2000::/3 bezeichnet alle gültigen IPv6-Adressen. Im obigen Beispiel wäre der Eintrag dann &lt;code&gt;FW_FORWARD="2a01:498:4c8::/64,2000::/3"&lt;/code&gt;. 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.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://www.heise.de/netze/artikel/IPv6-Privacy-Extensions-einschalten-1204783.html"&gt;ausführlicher Artikel bei Heise-Netze&lt;/a&gt; für alle Betriebssysteme. Ob die Aktivierung der Privacy Extensions erfolgreich war kann man z.B. durch den Aufruf von &lt;a href="http://www.sixxs.net/"&gt;sixxs.net&lt;/a&gt; prüfen, welches oben rechts die aufrufende IPv6-Adresse anzeigt.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Netzwerke"></category><category term="IPv6"></category></entry><entry><title>USB-Stick als Schlüssel für die Festplattenverschlüsselung</title><link href="https://marix.org/usb-stick-als-schl%C3%BCssel-f%C3%BCr-die-festplattenverschl%C3%BCsselung.html" rel="alternate"></link><published>2011-03-05T01:57:05+01:00</published><updated>2017-01-08T14:50:33+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2011-03-05:/usb-stick-als-schlüssel-für-die-festplattenverschlüsselung.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.opensuse.org"&gt;OpenSUSE&lt;/a&gt; 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 &amp;mdash; ohne Tastatur und Monitor &amp;mdash; betrieben stört hierbei allerdings die …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.opensuse.org"&gt;OpenSUSE&lt;/a&gt; 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 &amp;mdash; ohne Tastatur und Monitor &amp;mdash; 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. &lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; 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 &lt;em&gt;nicht&lt;/em&gt; mehr. Es gibt einen neuen Mechanismus, welchen ich, sobald ich ihn ausführlich getestet habe, verbloggen und hier verlinken werde.&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;&lt;h3&gt;Ist ein USB-Stick als Schlüssel sicher?&lt;/h3&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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. &lt;/p&gt;
&lt;p&gt;&lt;h3&gt;Die Anleitung&lt;/h3&gt;&lt;/p&gt;
&lt;p&gt;&lt;h4&gt;Backup&lt;/h4&gt;
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.&lt;/p&gt;
&lt;p&gt;Unter openSUSE ist es hierbei wichtig den Anfang des initrd und kernel-Namens zu ändern, da diese vom Befehl &lt;code&gt;mkinitrd&lt;/code&gt; sonst dennoch aktualisiert werden.
&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;
Außerdem sollte man sich der Einfachheit halber gleich einen passenden Eintrag im Grub anlegen, wozu man in der Datei &lt;code&gt;/boot/grub/menu.lst&lt;/code&gt; die passenden Zeilen einfügt:
&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;
Dadurch kann man anschließend jederzeit auch noch mit dem bei der Installation vergebenen Passwort das System starten.&lt;/p&gt;
&lt;p&gt;&lt;h4&gt;Anlegen des Schlüssels&lt;/h4&gt;
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
&lt;pre&gt;&lt;code&gt;mkfs.ext2 -L keystick /dev/sdb&lt;/code&gt;&lt;/pre&gt;
erzeugt werden. &lt;code&gt;keystick&lt;/code&gt; gibt hierbei das Label des erzeugten Dateisystems an, &lt;code&gt;/dev/sdb&lt;/code&gt; 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.
&lt;pre&gt;&lt;code&gt;tune2fs -L keystick /dev/sdb&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Das Label kann natürlich frei gewählt werden. Es dient später zur Identifizierung des Sticks. Dies hat zwei Vorteile:
&lt;ul&gt;
&lt;li&gt;Der USB-Stick unabhängig von hinzugekommenen oder entfernten Datenträgern gefunden&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Anschließend sollte ein Passwort generieren und auf dem USB-Stick hinterlegen. Meine bevorzugte Methode ist diese:
&lt;pre&gt;&lt;code&gt;pwgen -s 1024 1 &gt; /media/keystick/keyfile&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.
&lt;pre&gt;&lt;code&gt;cat oldkey /media/keystick/keyfile &gt; tmp&lt;/code&gt;&lt;/pre&gt;
Damit kann man nun die passenden Tastatureingaben simulieren:
&lt;pre&gt;&lt;code&gt;cryptsetup luksAddKey /dev/sda2 &lt; tmp&lt;/code&gt;&lt;/pre&gt;
Anschließend wird die temporäre Datei nicht mehr benötigt:
&lt;pre&gt;&lt;code&gt;rm tmp&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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:
&lt;pre&gt;&lt;code&gt;cryptsetup luksAddKey /dev/sda2 &lt; /media/keystick/keyfile&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;h4&gt;Erstellen der neuen Initramdisk&lt;/h4&gt;
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 &lt;code&gt;INITRD_MODULES&lt;/code&gt; in &lt;code&gt;/etc/sysconfig/kernel&lt;/code&gt; folgende Werte enthält:
&lt;pre&gt;&lt;code&gt;usb_storage scsi_mod&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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:
&lt;pre&gt;&lt;code&gt;#!/bin/sh

STICK=/dev/disk/by-label/keystick
FSTYPE=ext2
slumber=150
modprobe usb-storage 1&gt;&amp;2
modprobe scsi_mod 1&gt;&amp;2
mkdir /keystick 1&gt;2&amp;
sleep 5 1&gt;2&amp;

while [ $slumber -gt 0 ] &amp;&amp; [ ! -e "$STICK" ]; do
      sleep 1
      slumber=$(( $slumber - 1 ))
done
if ! mount -t $FSTYPE -r $STICK /keystick ; then
   $( echo 'FAILED!!!' ) 1&gt;2&amp;
   echo ''
   exit 1
fi

cat /keystick/keyfile&lt;/p&gt;

umount /keystick 1&gt;2&amp;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Damit LUKS weiß, dass es den Wert von einem Skript erhält muss die Datei &lt;code&gt;/etc/crypttab&lt;/code&gt; angepasst werden:
&lt;pre&gt;&lt;code&gt;cr_sda2         /dev/sda2       none    initrd,luks,keyscript=/root/keyscript.sh&lt;/code&gt;&lt;/pre&gt;
Hierbei sind zwei Dinge zu beachten:
&lt;ul&gt;
&lt;li&gt;Ist &lt;code&gt;keyscript&lt;/code&gt; gesetzt ist &lt;strong&gt;keine&lt;/strong&gt; interaktive Eingabe mehr möglich. Deshalb sollte man die alte Initramdisk (welche die alte Konfiguration enthält) vorher sichern.&lt;/li&gt;
&lt;li&gt;Der Wert &lt;code&gt;initrd&lt;/code&gt; ist notwendig, da openSUSE bei der Generierung der Initramdisk sonst nicht merkt, dass es das Keyscript mit einpacken muss.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Zu guter letzt kann durch den Aufruf von &lt;code&gt;mkinitrd&lt;/code&gt; die neue Initramdisk erstellt werden. Ein Neustart sollte den Schlüssel dann vom USB-Stick lesen anstatt diesen interaktiv zu erwarten.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;h3&gt;Eine Anmerkung zur Distributionsaktualisierung&lt;/h3&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;nicht&lt;/em&gt;! 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 &lt;code&gt;cryptsetup luksAddKey&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;h3&gt;Quellen&lt;/h3&gt;&lt;/p&gt;
&lt;p&gt;Da die Literatur &amp;mdash; was openSUSE angeht &amp;mdash; 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:&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://forum.ubuntuusers.de/topic/luks-root-partition-mit-schluessel-auf-usb-st/#post-1928847"&gt;http://forum.ubuntuusers.de/topic/luks-root-partition-mit-schluessel-auf-usb-st/#post-1928847&lt;/a&gt; lieferte die Vorlage für mein Keyscript.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions"&gt;http://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions&lt;/a&gt; hilft enorm beim Verständnis.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forums.fedoraforum.org/showthread.php?t=241942"&gt;http://forums.fedoraforum.org/showthread.php?t=241942&lt;/a&gt; zeigt im Prinzip den ganzen Vorgang, funktioniert leider nicht 1:1 für openSUSE.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wejn.org/how-to-make-passwordless-cryptsetup.html"&gt;http://wejn.org/how-to-make-passwordless-cryptsetup.html&lt;/a&gt; zeigt mehrere Variationen des Themas, aber passt auch nicht direkt auf openSUSE.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://raftaman.net/?p=300"&gt;http://raftaman.net/?p=300&lt;/a&gt; ist inspirierend, löst aber nicht ganz das gleiche Problem (der verwendete USB-Stick ist cool).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Remote_unlocking_of_the_root_.28or_other.29_partition"&gt;https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Remote_unlocking_of_the_root_.28or_other.29_partition&lt;/a&gt; liefert Grundlagen, wenn man dies möchte.&lt;/li&gt;
&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Computersicherheit"></category></entry><entry><title>Civilization V im LAN</title><link href="https://marix.org/civilization-v-im-lan.html" rel="alternate"></link><published>2010-12-19T17:25:20+01:00</published><updated>2017-07-10T17:19:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-12-19:/civilization-v-im-lan.html</id><summary type="html">&lt;p&gt;Nachdem &lt;a href=</summary><content type="html">
&lt;p&gt;Nachdem &lt;a href="http://www.civilization5.com/"&gt;Civilization V&lt;/a&gt; ja an &lt;a href="http://store.steampowered.com/"&gt;Steam&lt;/a&gt; gebunden, und damit mit einem gewissen Online-Zwang aber auch &lt;a href="http://support.steampowered.com/kb_article.php?ref=9439-QHKN-1308"&gt;SteamPlay&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fair-Use im LAN&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;ol&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Spiel starten und Spaß haben&lt;/li&gt;
&lt;li&gt;Am Schluß darf man natürlich nicht vergessen auf den Gästerechnern im Steam wieder den Benutzer zu ändern.&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speichern&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ein manuelles Speichern ist im LAN nicht vorgesehen. Stattdessen wird das Spiel, anscheinend unabhängig von der Einstellung im Optionsmenü, jede Runde automatisch gespeichert.&lt;/p&gt;
&lt;p&gt;Man kann zwar mit &lt;code&gt;Strg+S&lt;/code&gt; den Speichern-Dialog aufrufen, welcher im Menü fehlt, diese Speicherstände werden aber im Laden-Dialog der beim Spielstart sichtbar ist nicht angezeigt.&lt;/p&gt;
&lt;p&gt;Da die automatischen Speicherstände nur nach Runde benannt werden empfiehlt es sich bei jeder Spielunterbrechung die aktuelle Runde zu notieren und&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SteamPlay&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Spiele"></category></entry><entry><title>Wenn Apps im Android Market in "Authorizing purchase…" hängen…</title><link href="https://marix.org/wenn-apps-im-android-market-authorizing-purchase-h%C3%A4ngen.html" rel="alternate"></link><published>2010-12-18T18:03:25+01:00</published><updated>2013-01-28T12:51:05+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-12-18:/wenn-apps-im-android-market-authorizing-purchase-hängen.html</id><summary type="html">
&lt;p&gt;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.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Den Download der betroffenen Anwendung im Market abbrechen.&lt;br /&gt;
In meinem Fall ging dies nicht im Dialog der Anwendung, sondern nur durch …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Den Download der betroffenen Anwendung im Market abbrechen.&lt;br /&gt;
In meinem Fall ging dies nicht im Dialog der Anwendung, sondern nur durch &amp;quot;Rechtsklick&amp;quot;, also lange halten, in der Download-Übersicht.&lt;/li&gt;&lt;li&gt;Die Anwendung deinstallieren. Hierzu die Einstellungen starten, dort Anwendungen auswählen und die entsprechende Anwendung auswählen. Dort gibt es dann einen &amp;quot;Deinstallieren&amp;quot;-Knopf.&lt;/li&gt;&lt;li&gt;Den Cache des Markets löschen.&lt;br /&gt;
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 &amp;quot;Cache leeren&amp;quot; wählen.&lt;/li&gt;&lt;li&gt;Handy neustarten.&lt;br /&gt;
Erneut nicht umbedingt notwendig, aber sicher ist sicher.&lt;/li&gt;&lt;li&gt;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.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Mit dieser Methode konnte ich das Problem bis jetzt immer beheben. Einziger Nachteil ist, dass man im Fall von &lt;a href="http://twidroyd.com/"&gt;Twidroy&lt;/a&gt;&lt;a href="http://twidroyd.com/"&gt;d&lt;/a&gt; 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 &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt; auftreten.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Android"></category></entry><entry><title>c't offline update auf dem Mac</title><link href="https://marix.org/ct-offline-update-auf-dem-mac.html" rel="alternate"></link><published>2010-11-03T18:12:38+01:00</published><updated>2013-01-28T12:51:28+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-11-03:/ct-offline-update-auf-dem-mac.html</id><summary type="html">
&lt;p&gt;Die &lt;a href="http://www.heise.de/software/download/wsus_offline_update_ehemals_ct_offline_update/38170"&gt;c't Offline Update&lt;/a&gt;, 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Die &lt;a href="http://www.heise.de/software/download/wsus_offline_update_ehemals_ct_offline_update/38170"&gt;c't Offline Update&lt;/a&gt;, 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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Windows"></category><category term="Mac"></category><category term="Computersicherheit"></category></entry><entry><title>Quick Cluster Overview jetzt auf Gitorious</title><link href="https://marix.org/quick-cluster-overview-jetzt-auf-gitorious.html" rel="alternate"></link><published>2010-09-27T14:16:27+02:00</published><updated>2017-07-10T17:13:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-09-27:/quick-cluster-overview-jetzt-auf-gitorious.html</id><summary type="html">
&lt;p&gt;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 &lt;a href="https://gitorious.org/qco"&gt;https://gitorious.org/qco&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich habe lokal noch einige Aktualisierungen und Ideen herumliegen. Ich hoffe ich …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;a href="https://gitorious.org/qco"&gt;https://gitorious.org/qco&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich habe lokal noch einige Aktualisierungen und Ideen herumliegen. Ich hoffe ich finde die nächsten Tage mal die Zeit diese auch einzupflegen.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Quick Cluster Overview"></category></entry><entry><title>OpenCL und #include</title><link href="https://marix.org/opencl-und-include.html" rel="alternate"></link><published>2010-02-11T00:06:10+01:00</published><updated>2017-07-10T17:21:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-02-11:/opencl-und-include.html</id><summary type="html">&lt;p&gt;Jeder der das erste mal versucht in einem &lt;a href=</summary><content type="html">
&lt;p&gt;Jeder der das erste mal versucht in einem &lt;a href="http://de.wikipedia.org/wiki/OpenCL"&gt;OpenCL&lt;/a&gt;-Kernel eine Headerdatei mit &lt;code&gt;#include "header.h"&lt;/code&gt; einzubinden scheitert für gewöhnlich mit einer Fehlermeldung im Stiele von &lt;code&gt; catastrophic error: cannot open source file "header.h"&lt;/code&gt;. Grund ist, dass der Compiler normalerweise nicht im Quellverzeichnis nach der Headerdatei sucht. Man muss dem Befehl &lt;code&gt;clBuildProgram&lt;/code&gt; explizit den Pfad per Compileroption &lt;code&gt;-I /pfad/zu/den/headern/&lt;/code&gt; übergeben.&lt;/p&gt;
&lt;p&gt;Beim Implementieren der Parameterübergabe an &lt;code&gt;clBuildProgram&lt;/code&gt; fällt schnell auf, wieso er den Pfad nicht von alleine kennt. Ein "&lt;code&gt;-I .&lt;/code&gt;" 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:
&lt;pre&gt;&lt;code&gt;char compiler_options[256];
sprintf( compiler_options, "-I \"%s\"", SOURCE_DIRECTORY );
err = clBuildProgram( program, 0, NULL, compiler_options, NULL, NULL);&lt;/code&gt;&lt;/pre&gt;
Hier ist es wichtig, dass &lt;code&gt;compiler_options&lt;/code&gt; groß genug ist um mit jedem möglicherweise übergebenen Pfad zu funktionieren!&lt;/p&gt;
&lt;p&gt;Um den Code in unterschiedlichen Verzeichnissen übersetzen zu können definiert man diese Konstante am besten außerhalb und übergibt sie zur Compilezeit:
&lt;pre&gt;&lt;code&gt;gcc -DSOURCE_DIRECTORY="$(pwd)" -o headerTest headerTest.c&lt;/code&gt;&lt;/pre&gt;
Nutzt man &lt;a href="http://cmake.org"&gt;CMake&lt;/a&gt; so reicht es in der &lt;code&gt;CMakeList.txt&lt;/code&gt; die folgende Zeile hinzuzufügen:
&lt;pre&gt;&lt;code&gt;add_definitions( -DSOURCE_DIRECTORY="${CMAKE_SOURCE_DIR}" )&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.
&lt;pre&gt;&lt;code&gt;char compiler_options[256];
sprintf( compiler_options, "-I %s", SOURCE_DIRECTORY );
err = clBuildProgram( program, 0, NULL, compiler_options, NULL, NULL);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="OpenCL"></category><category term="CMake"></category><category term="Programmierung"></category></entry><entry><title>Zusätzliche Modulverzeichnisse für CMake</title><link href="https://marix.org/zus%C3%A4tzliche-modulverzeichnisse-f%C3%BCr-cmake.html" rel="alternate"></link><published>2010-02-09T01:43:49+01:00</published><updated>2013-01-28T12:52:40+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-02-09:/zusätzliche-modulverzeichnisse-für-cmake.html</id><summary type="html">&lt;p&gt;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 &lt;a href=</summary><content type="html">
&lt;p&gt;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 &lt;a href="http://gitorious.org/findopencl"&gt;FindOpenCL&lt;/a&gt; möchte man aber nicht gleich global im System verankern. Die Lösung liegt in der Variable &lt;code&gt;CMAKE_MODULE_PATH&lt;/code&gt;. Die in dieser Variablen Verzeichnisse werden von &lt;code&gt;find_package(&lt;package&gt;)&lt;/code&gt; vor den Verzeichnissen der CMake-Installation durchsucht.&lt;/p&gt;
&lt;p&gt;Soll der Pfad zu den zusätzlichen Modulen nicht in jedem &lt;code&gt;CMakeList.txt&lt;/code&gt; 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 &lt;code&gt;~/.bashrc&lt;/code&gt; folgende Zeile an:
&lt;pre&gt;&lt;code&gt;# Have CMake also search for modules in ~/.cmake/modules
alias cmake="cmake -DCMAKE_MODULE_PATH=~/.cmake/modules"&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Compilierung"></category><category term="CMake"></category></entry><entry><title>Patch für die Hercules DJ Console-Treiber für Linux 2.6.30 und neuer</title><link href="https://marix.org/patch-f%C3%BCr-die-hercules-dj-console-treiber-f%C3%BCr-linux-2630-und-neuer.html" rel="alternate"></link><published>2010-02-06T16:48:20+01:00</published><updated>2013-01-28T12:53:09+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-02-06:/patch-für-die-hercules-dj-console-treiber-für-linux-2630-und-neuer.html</id><summary type="html">&lt;p&gt;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 &lt;a href=</summary><content type="html">
&lt;p&gt;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 &lt;a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch"&gt;kleiner Patch&lt;/a&gt; behebt das Problem indem er den entscheidenden Aufruf auf die neue Funktion ändert.&lt;/p&gt;
&lt;p&gt;Hat man den Treiber nach der &lt;a href="http://ts.hercules.com/eng/index.php?pg=view_files&amp;amp;gid=2&amp;amp;fid=28&amp;amp;pid=177&amp;amp;cid=1"&gt;Anleitung auf der Webseite&lt;/a&gt; installiert, so kann man mit &lt;code&gt;dkms status&lt;/code&gt; 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: &lt;code&gt;hdjmod, 1.28: added&lt;/code&gt;. Wäre die installation erfolgreich gewesen müsste hier &lt;code&gt;installed&lt;/code&gt; stehen.&lt;/p&gt;
&lt;p&gt;Der nächste Schritt nach dem add ist der build. Ein Blick in das Logdatei &lt;code&gt;/var/lib/dkms/hdjmod/1.28/build/make.log&lt;/code&gt; zeigt das Problem: &lt;pre&gt;&lt;code&gt;/var/lib/dkms/hdjmod/1.28/build/device.c:1663: error: implicit declaration of function ‘snd_card_new’&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt; &lt;a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch"&gt;Der Patch&lt;/a&gt; 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 &lt;code&gt;/usr/src/hdjmod-1.28&lt;/code&gt; und ruft dort &lt;code&gt;sudo patch -p1 &lt; /path/to/hdjmod_kernel_2.6.30.patch&lt;/code&gt; auf. Anschließen baut man mit &lt;code&gt;sudo dkms build -m hdjmod -v 1.28&lt;/code&gt; das Modul und installiert es mit &lt;code&gt;sudo dkms install -m hdjmod -v 1.28&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://marix.org/Anhänge/hdjmod_kernel_2.6.30.patch"&gt;&gt;Hier kann man den Patch herunterladen&lt;&lt;a /&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Treiber"></category><category term="Hercules"></category><category term="Linux"></category></entry><entry><title>MacPorts hinter Proxies verwenden</title><link href="https://marix.org/macports-hinter-proxies-verwenden.html" rel="alternate"></link><published>2010-01-20T16:51:35+01:00</published><updated>2013-01-28T12:53:36+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2010-01-20:/macports-hinter-proxies-verwenden.html</id><summary type="html">&lt;p&gt;Sitzt man mit seinem Mac in einem Netzwerk ohne direkten Zugang zum Internet funktioniert &lt;a href=</summary><content type="html">
&lt;p&gt;Sitzt man mit seinem Mac in einem Netzwerk ohne direkten Zugang zum Internet funktioniert &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; leider nicht automatisch mit den im System eingepflegten Proxies. Durch manuelles Setzen der Umgebungsvariablen http_proxy und RSYNC_PROXY lässt sich &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; aber ohne Einschränkungen nutzen.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;eccentrica:~ marix$ sudo port selfupdate
---&gt;  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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; auch &lt;a href="http://rsync.samba.org/"&gt;rsync&lt;/a&gt; verwendet, welches nicht die http_proxy-Variable interpretiert. Deshalb muss auch die Variable RSYNC_PROXY gesetzt werden.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;An Stelle des port selfupgrade kann natürlich eine beliebige Anzahl anderer Befehle stehen.&lt;/p&gt;
&lt;p&gt;Ein weiteres Problem entsteht, wenn &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; verwendet um an den Quelltext des zu installierenden Programmes zu kommen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;ash-3.2# port install iterm
---&gt;  Computing dependencies for iTerm
---&gt;  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.&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; lässt sich leider nicht über Umgebungsvariablen zur Verwendung des Proxies überreden. Stattdessen muss man die Datei ~/.subversion/servers entsprechend anpassen.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Mac OS X"></category><category term="Proxy"></category><category term="MacPorts"></category></entry><entry><title>Mystic Mine unter openSUSE 11.2</title><link href="https://marix.org/mystic-mine-unter-opensuse-112.html" rel="alternate"></link><published>2009-12-04T19:58:49+01:00</published><updated>2013-01-28T12:54:12+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-12-04:/mystic-mine-unter-opensuse-112.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.koonsolo.com/mysticmine/"&gt;Mystic Mine&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Leider scheiterte mein Versuch diese Linuxversion zu nutzen mit folgender Meldung:
&lt;pre&gt;&lt;code&gt;Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/cx_Freeze/initscripts …&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.koonsolo.com/mysticmine/"&gt;Mystic Mine&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Leider scheiterte mein Versuch diese Linuxversion zu nutzen mit folgender Meldung:
&lt;pre&gt;&lt;code&gt;Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/cx_Freeze/initscripts/Console.py", line 29, in &lt;module&gt;
  File "monorail.py", line 34, in &lt;module&gt;
  File "koon/app.py", line 10, in &lt;module&gt;
  File "koon/snd.py", line 4, in &lt;module&gt;
  File "ExtensionLoader_pygame_mixer.py", line 12, in &lt;module&gt;
ImportError: libSDL_mixer-1.2.so.0: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Das ist mal ein schönes Beispiel für eine zielführende Fehlermeldung. SDL_mixer ist nicht installiert, die Installation der passenden Bibliothek hilft.
&lt;code&gt;sudo zypper in SDL_mixer&lt;/code&gt;
&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Computerspiel"></category><category term="Linux"></category></entry><entry><title>Serverupdate</title><link href="https://marix.org/serverupdate.html" rel="alternate"></link><published>2009-10-24T11:41:15+02:00</published><updated>2009-10-26T00:18:42+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-10-24:/serverupdate.html</id><summary type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 ...&lt;/p&gt;
&lt;p&gt;2. Update: Die Greylist läuft auch wieder =&gt; Spam gegen 0. Genau so der Quasselcore und endlich kann mein Dovecot auch Sieve. :)&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Nutzung von Graﬁkprozessoren in Anwendungen der Hochenergiephysik</title><link href="https://marix.org/diplomarbeit.html" rel="alternate"></link><published>2009-09-07T11:36:51+02:00</published><updated>2009-09-07T12:35:55+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-09-07:/diplomarbeit.html</id><summary type="html">&lt;p&gt;... ist der Titel meiner Diplomarbeit, mit welcher ich das Studium der Physik erfolgreich abschloss.

&lt;/p&gt;</summary><content type="html">
&lt;p&gt;... ist der Titel meiner Diplomarbeit, mit welcher ich das Studium der Physik erfolgreich abschloss.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://marix.org/Publikationen/diplomarbeit.pdf"&gt;Die komplette englischsprachige Arbeit&lt;/a&gt; kann als PDF &lt;a href="https://marix.org/Publikationen/diplomarbeit.pdf"&gt;heruntergeladen&lt;/a&gt; werden.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Uni"></category><category term="CUDA"></category><category term="Physik"></category><category term="Programmierung"></category></entry><entry><title>Blumentopfs Wahlwerbespot</title><link href="https://marix.org/blumentop-wahlwerbespot.html" rel="alternate"></link><published>2009-08-27T12:03:09+02:00</published><updated>2009-08-27T12:03:09+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-08-27:/blumentop-wahlwerbespot.html</id><summary type="html">Normallerweise versuche ich diese Seite, obwohl ich engagierter &lt;a href=http://www.piratenpartei.de&gt;Pirat&lt;/a&gt; bin, unpolitisch zu halten und bin auch kein großer Fan von Hip-Hop. Den Wahlaufruf der Band &lt;a href=http://www.lastfm.de/music/Blumentopf&gt;Blumentopf&lt;/a&gt; zur &lt;a href=http://de.wikipedia.org/wiki/Bundestagswahl_2009&gt;Bundestagswahl 2009&lt;/a&gt; finde ich aber so gut, dass er trotzdem hierher kommt.</summary><content type="html">
&lt;p&gt;
Normallerweise versuche ich diese Seite, obwohl ich engagierter &lt;a href="http://www.piratenpartei.de"&gt;Pirat&lt;/a&gt; bin, unpolitisch zu halten und bin auch kein großer Fan von Hip-Hop. Den Wahlaufruf der Band &lt;a href="http://www.lastfm.de/music/Blumentopf"&gt;Blumentopf&lt;/a&gt; zur &lt;a href="http://de.wikipedia.org/wiki/Bundestagswahl_2009"&gt;Bundestagswahl 2009&lt;/a&gt; finde ich aber so gut, dass er trotzdem hierher kommt.
&lt;/p&gt;
&lt;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"&gt; &lt;param name="movie" value="http://cdn.last.fm/videoplayer/33/VideoPlayer.swf" /&gt; &lt;param name="flashvars" value="title=Blumentopf_Wahlwerbespot&amp;amp;uniqueName=34358831&amp;amp;albumArt=http%3A%2F%2Fcdn.last.fm%2Fdepth%2Fcatalogue%2Fnoimage%2Fnocover_flashplayer.png&amp;amp;duration=124&amp;amp;image=http%3A%2F%2Fuserserve-ak.last.fm%2Fserve%2Fimage%3A320%2F34358831.jpg&amp;amp;FSSupport=true&amp;amp;creator=Blumentopf" /&gt; &lt;param name="allowScriptAccess" value="always" /&gt; &lt;param name="allowNetworking" value="all" /&gt; &lt;param name="allowFullScreen" value="true" /&gt; &lt;param name="quality" value="high" /&gt; &lt;param name="bgcolor" value="000000" /&gt; &lt;param name="wmode" value="opaque" /&gt; &lt;param name="menu" value="false" /&gt; &lt;/object&gt;
    </content><category term="Blog"></category><category term="Politik"></category><category term="Bundestagswahl 2009"></category></entry><entry><title>Cuda ohne graphische Oberfläche profilen</title><link href="https://marix.org/cuda-ohne-graphische-oberfl%C3%A4che-profilen.html" rel="alternate"></link><published>2009-01-20T12:26:28+01:00</published><updated>2010-08-17T00:19:55+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-01-20:/cuda-ohne-graphische-oberfläche-profilen.html</id><summary type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Zum Glück ist die Profilingfunktionalität von CUDA auf niedrigerer Ebene …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Die für die Konfiguration zuständigen Umgebungsvariablen sind:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CUDA_PROFILE&lt;/em&gt; &amp;ndash; Dies ist die einzige zwingend erforderliche Variable. Hat sie den Wert 1 werden Profiler-Daten geschrieben.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CUDA_PROFILE_CSV&lt;/em&gt;  &amp;ndash; Ist diese Variable auf 1 gesetzt werden die Daten als CSV geschrieben. Dieses kann dan später vom Visual Profiler importiert werden.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CUDA_PROFILE_LOG&lt;/em&gt;  &amp;ndash; Hier kann der Name der Log-Datei vorgegeben werden. Ansonsten wird profile.log verwendet.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CUDA_PROFILE_CONFIG&lt;/em&gt;  &amp;ndash; Hier kann eine Konfigurationsdatei angegeben werden in welcher spezifiziert wird welche Zähler mitprotokoliert werden sollen.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;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:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;gld_incoherent&lt;/em&gt;  &amp;ndash; Anzahl der nicht zusammengefügten lesenden Zugriffe auf den globalen Speicher, funktioniert nicht auf GT200-basierten Karten.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;gst_incoherent&lt;/em&gt;  &amp;ndash; Anzahl der nicht zusammengefügten schreibenden Zugriffe auf den globalen Speicher, funktioniert nicht auf GT200-basierten Karten.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;gld_coherent&lt;/em&gt;  &amp;ndash; Anzahl der zusammengefügten lesenden Speicherzugriffe.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;gst_coherent&lt;/em&gt;  &amp;ndash; Anzahl der zusammengefügten schreibenden Speicherzugriffe.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;local_load&lt;/em&gt;  &amp;ndash; Anzahl der lesenden Zugriffe auf den lokalen Speicher.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;local_store&lt;/em&gt;  &amp;ndash; Anzahl der schreibenden Zugriffe auf den lokalen Speicher.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;branch&lt;/em&gt;  &amp;ndash; Gesamte Anzahl der Verzweigungen&lt;/li&gt;
&lt;li&gt;&lt;em&gt;divergent_branch&lt;/em&gt;  &amp;ndash; Gesamte Anzahl der Verzweigungen welche zu serialisierter Ausführung führten&lt;/li&gt;
&lt;li&gt;&lt;em&gt;instructions&lt;/em&gt;  &amp;ndash; Befehlszähler&lt;/li&gt;
&lt;li&gt;&lt;em&gt;warp_serialize&lt;/em&gt;  &amp;ndash; Anzahl von Threads in Warps die aufgrund von Adresskonflikten beim Zugfriff auf den gemeinsamen oder den konstanten Speicher.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;cta_launched&lt;/em&gt;  &amp;ndash; Anzahl der ausgeführten Blöcke.&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
export CUDA_PROFILE=1
export CUDA_PROFILE_CSV=1
export CUDA_PROFILE_LOG=meinCudaProgramm.profile.csv
./meinCudaProgramm&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="MPI"></category><category term="Profiling"></category><category term="CUDA"></category><category term="Spickzettel"></category></entry><entry><title>Projektpraktikumsbericht zu Quick Cluster Overview</title><link href="https://marix.org/projektpraktikumsbericht-zu-quick-cluster-overview.html" rel="alternate"></link><published>2009-01-17T20:36:16+01:00</published><updated>2010-08-17T00:18:43+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-01-17:/projektpraktikumsbericht-zu-quick-cluster-overview.html</id><content type="html">
&lt;p&gt;Dieser Bericht beschreibt die Funktionsweise, Installation und Konfiguration der von mir als Projektpraktikum geschriebenen Anwendung Quick Cluster Overview.&lt;/p&gt;
&lt;p&gt;PDF des Berichtes: &lt;a href="https://marix.org/Anhänge/bericht.pdf"&gt;bericht.pdf&lt;/a&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Quick Cluster Overview"></category></entry><entry><title>Projektpraktikumsvortrag über Quick Cluster Overview</title><link href="https://marix.org/projektpraktikumsvortrag-%C3%BCber-quick-cluster-overview.html" rel="alternate"></link><published>2009-01-17T20:33:31+01:00</published><updated>2010-08-17T00:18:09+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-01-17:/projektpraktikumsvortrag-über-quick-cluster-overview.html</id><content type="html">
&lt;p&gt;Dieser Projektpraktikumsvortrag stellt Quick Cluster Overview mit seinen wichtigsten Features vor und beschreibt seine Architektur.&lt;/p&gt;
&lt;p&gt;PDF des Vortrags: &lt;a href="https://marix.org/Anhänge/vortrag.pdf"&gt;vortrag.pdf&lt;/a&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Quick Cluster Overview"></category></entry><entry><title>Ein paar Hinweise zur Migration eine openSUSE auf ein RAID5</title><link href="https://marix.org/ein-paar-hinweise-zur-migration-eine-opensuse-auf-ein-raid5.html" rel="alternate"></link><published>2009-01-17T20:17:44+01:00</published><updated>2009-01-17T20:17:44+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-01-17:/ein-paar-hinweise-zur-migration-eine-opensuse-auf-ein-raid5.html</id><summary type="html">Möchte man ein System auf ein RAID5 migrieren reichen dafür die drei Festplatten. Für Ubuntu ist dies auf &lt;a href=http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/&gt;Netzpiraten.ch&lt;/a&gt; schön beschreiben. Hier findet ihr die entsprechende Anleitung für openSUSE.</summary><content type="html">
&lt;p&gt;
Möchte man ein System auf ein RAID5 migrieren reichen dafür die drei Festplatten. Für Ubuntu ist dies auf &lt;a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/"&gt;Netzpiraten.ch&lt;/a&gt; schön beschreiben.
&lt;/p&gt;
&lt;p&gt;
Ist der Grund für die Migration ein Hardwarefehler, so dass man die Ausgangsfestplatte anschließend tauschen möchte, kann man, statt wie auf &lt;a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/"&gt;Netzpiraten.ch&lt;/a&gt; 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.
&lt;/p&gt;
&lt;p&gt;
Ein solches, einem RAID1 entsprechendes RAID5, weigert sich YaST allerdings anzulegen. Nutzt man allerdings die auf &lt;a href="http://blog.netzpiraten.ch/ubuntu-migration-auf-ein-software-raid-5/"&gt;Netzpiraten.ch&lt;/a&gt; oder im &lt;a href="http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO.html"&gt;The Software-RAID HOWTO&lt;/a&gt; beschreibenen Befehle gelingt dies problemlos.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;&lt;code&gt;mdadm --create /dev/md0 -n2 -l5 /dev/sdb3 /dev/sdc3&lt;/code&gt;&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
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 &lt;a href="/node/99"&gt;RAID unter Knoppix einbinden&lt;/a&gt;. Dort kann man die Dateien mit &lt;code&gt;cp --archive&lt;/code&gt; kopieren.
&lt;/p&gt;
&lt;p&gt;
Möchte man das RAID5 später um eine Festplatte, zum Beispiel die zuvor eingesparte Dritte, erweitern, hilft die &lt;a href="http://isomerica.net/archives/2007/07/12/growing-a-linux-software-raid-5-completely-online/"&gt;Beschreibung auf isomerica.net&lt;/a&gt;. Wer ext3 verwendet muss nur statt &lt;code&gt;xfs_growfs&lt;/code&gt; &lt;code&gt;resize2fs&lt;/code&gt; verwenden. Der komplette Vergrößerungsvorgang kann komplett aus dem laufenden System erfolgen. Hierbei hilft &lt;code&gt;watch&lt;/code&gt; den Fortschritt zu beobachten.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Linux"></category><category term="openSUSE"></category><category term="Knoppix"></category><category term="Ubuntu"></category></entry><entry><title>Quick Cluster Overview Version 0.1</title><link href="https://marix.org/quick-cluster-overview-version-01.html" rel="alternate"></link><published>2009-01-17T20:17:44+01:00</published><updated>2009-01-17T20:17:44+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2009-01-17:/quick-cluster-overview-version-01.html</id><summary type="html">Version 0.1 von Quick Cluster Overview enthält die folgenden wichtigen Features:
&lt;ul&gt;
  &lt;li&gt;Kann Daten aus Ganglia extrahieren.&lt;/li&gt;
  &lt;li&gt;Kann Daten aus Lemon extrahieren.&lt;/li&gt;
  &lt;li&gt;Generiert Übersichtsgraphen mit Gnuplot.&lt;/li&gt;
  &lt;li&gt;Enthält eine modifizierte Version von &lt;a href=http://sourceforge.net/projects/php-gnuplot/&gt;PHP-GNUPlot&lt;/a&gt; die eine höhere Geschwindigkeit aufweißt.&lt;/li&gt;
  &lt;li&gt;Zieht Daten maximal einmal pro konfiguriertem Zeitintervall aus dem Cluster und nutzt anschließend die bereits generierten Graphen.&lt;/li&gt;
</summary><content type="html">
&lt;p&gt;
Version 0.1 von Quick Cluster Overview enthält die folgenden wichtigen Features:
&lt;ul&gt;
  &lt;li&gt;Kann Daten aus Ganglia extrahieren.&lt;/li&gt;
  &lt;li&gt;Kann Daten aus Lemon extrahieren.&lt;/li&gt;
  &lt;li&gt;Generiert Übersichtsgraphen mit Gnuplot.&lt;/li&gt;
  &lt;li&gt;Enthält eine modifizierte Version von &lt;a href="http://sourceforge.net/projects/php-gnuplot/"&gt;PHP-GNUPlot&lt;/a&gt; die eine höhere Geschwindigkeit aufweißt.&lt;/li&gt;
  &lt;li&gt;Zieht Daten maximal einmal pro konfiguriertem Zeitintervall aus dem Cluster und nutzt anschließend die bereits generierten Graphen.&lt;/li&gt;
  &lt;li&gt;Modularer Aufbau, dadurch leichte Erweiterbarkeit auf andere Monitoringsysteme und Plot-Anwendungen.&lt;/li&gt;
  &lt;li&gt;Leichte Modifizierbarkeit der Seitendarstellung durch den Einsatz der &lt;a href="http://www.smarty.net/"&gt;Smarty Template Engine&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Dokumentation welche die Installation und Konfiguration beschreibt findet sich im Download und im &lt;a href="https://marix.org/Blog/projektpraktikumsbericht-zu-quick-cluster-overview.html"&gt;Projektpraktikumsbericht&lt;/a&gt;. Genauere Darstellungen der Funktionsweise im auf dieser Version basierenden &lt;a href="https://marix.org/Blog/projektpraktikumsbericht-zu-quick-cluster-overview.html"&gt;Projektpraktikumsbericht&lt;/a&gt; und dem ebenfalls auf dieser Version basierenden &lt;a href="https://marix.org/Blog/projektpraktikumsvortrag-über-quick-cluster-overview.html"&gt;Projektpraktikumsvortrag&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Benötigte Software:
&lt;ul&gt;
  &lt;li&gt;Webserver&lt;/li&gt;
  &lt;li&gt;PHP 5 oder neuer&lt;/li&gt;
  &lt;li&gt;Gnuplot&lt;/li&gt;
  &lt;li&gt;Ganglia oder Lemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Lizens: GPLv2, der Download enthält aber im Verzeichnis &lt;i&gt;contrib&lt;/i&gt; einige Fremdanwendungen deren Lizens abweichen kann. Die entsprechenden Lizensen sind den einzelnen Anwendungen in diesem Verzeichnis zu entnehmen.
&lt;/p&gt;

&lt;p&gt;
Datei: &lt;a href="https://marix.org/Publikationen/qco.0.1.tar.bz2"&gt;qco.0.1.tar.bz2&lt;/a&gt;
&lt;/p&gt;

    </content><category term="Blog"></category><category term="Quick Cluster Overview"></category></entry><entry><title>Import von Amarok 1.4-MySQL-Datenbank in Amarok 2</title><link href="https://marix.org/import-von-amarok-14-mysql-datenbank-amarok-2.html" rel="alternate"></link><published>2008-12-23T20:04:17+01:00</published><updated>2013-01-28T12:54:57+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-12-23:/import-von-amarok-14-mysql-datenbank-amarok-2.html</id><summary type="html">
&lt;p&gt;Der Import meiner in MySQL abgelegten Amarok 1.4-Datenbank in Amarok 2 wollte zunächst nicht klappen. Ich scheiterte immer mit &lt;code&gt;QMYSQL: Verbindungsaufbau nicht möglich&lt;/code&gt;. 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Der Import meiner in MySQL abgelegten Amarok 1.4-Datenbank in Amarok 2 wollte zunächst nicht klappen. Ich scheiterte immer mit &lt;code&gt;QMYSQL: Verbindungsaufbau nicht möglich&lt;/code&gt;. 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 &lt;a href="http://bugs.kde.org/show_bug.cgi?id=174269"&gt;KDE Bug 174269&lt;/a&gt;. Kaum war die Voreinstellung &lt;code&gt;localhost&lt;/code&gt; in &lt;code&gt;127.0.0.1&lt;/code&gt; geändert schon rödelte die Kiste los.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Amarok"></category></entry><entry><title>Abhilfe für den "The specified URL cannot be found"-Fehler auf Planet Descent</title><link href="https://marix.org/abhilfe-f%C3%BCr-den-specified-url-cannot-be-found-fehler-auf-planet-descent.html" rel="alternate"></link><published>2008-11-24T00:02:16+01:00</published><updated>2013-01-28T12:55:47+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-11-24:/abhilfe-für-den-specified-url-cannot-be-found-fehler-auf-planet-descent.html</id><summary type="html">
&lt;p&gt;&lt;p&gt;Seit einiger Zeit bekommt man auf &lt;a href="http://www.planetdescent.com"&gt;Planet Descent&lt;/a&gt; beim Versuch einen Beitrag einzustellen den Fehler &amp;quot;The specified URL cannot be found&amp;quot;. 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 &lt;a href="http://www.opera.com"&gt;Opera&lt;/a&gt; ersetzt …&lt;/p&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;p&gt;Seit einiger Zeit bekommt man auf &lt;a href="http://www.planetdescent.com"&gt;Planet Descent&lt;/a&gt; beim Versuch einen Beitrag einzustellen den Fehler &amp;quot;The specified URL cannot be found&amp;quot;. 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 &lt;a href="http://www.opera.com"&gt;Opera&lt;/a&gt; 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-&amp;gt;Einstellungen-&amp;gt;Inhalte-&amp;gt;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.&lt;/p&gt;&lt;h3&gt;Aktuelle Version:&lt;/h3&gt;&lt;p&gt;&lt;a href="https://marix.org/Anhänge/planetdescent.com.0.4.js"&gt;0.4 für Opera&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Vorherige Version:&lt;/h3&gt;&lt;p&gt;&lt;a href="https://marix.org/Anhänge/planetdescent.com.0.3.js"&gt;0.3 für Opera&lt;/a&gt; &lt;a href="https://marix.org/Anhänge/planetdescent.com.0.2.js"&gt;0.2 für Opera&lt;/a&gt; &lt;a href="https://marix.org/Anhänge/planetdescent.com.0.1.js"&gt;0.1 für Opera&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="User-JavaScript"></category><category term="Descent"></category></entry><entry><title>Zu welchem Paket gehörte die Datei nochmal</title><link href="https://marix.org/zu-welchem-paket-geh%C3%B6rte-die-datei-nochmal.html" rel="alternate"></link><published>2008-10-31T14:59:05+01:00</published><updated>2013-01-28T12:56:35+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-10-31:/zu-welchem-paket-gehörte-die-datei-nochmal.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; rpm -qal | grep "/usr/include/gnu/stubs.h"
/usr/include/gnu/stubs.h&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; rpm -qa --queryformat '[%{=NAME}: %{FILENAMES}\n]' | grep /usr/include/gnu/stubs.h
glibc-devel: /usr/include/gnu/stubs.h&lt;/code&gt;
&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="RPM"></category></entry><entry><title>Screen Spickzettel</title><link href="https://marix.org/screen-spickzettel.html" rel="alternate"></link><published>2008-10-10T18:41:03+02:00</published><updated>2010-10-25T17:00:44+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-10-10:/screen-spickzettel.html</id><summary type="html">
&lt;p&gt;Die wichtigsten Befehle für die Arbeit mit Screen.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;Screen starten:
&lt;code&gt;screen&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Wieder mit der letzten Screen-Sitzung verbinden:
&lt;code&gt;screen -R&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Screen mit einer Sitzung mit einem vorgegebenen Namen erstellen:
&lt;code&gt;screen -S &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Eine neue Screen-Sitzung im Hintergrund starten:
&lt;code&gt;screen -dmS &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Liste aller Screen-Sitzungen anzeigen:
&lt;code&gt;screen --ls&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Wieder mit der Screen-Sitzung …&lt;/li&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Die wichtigsten Befehle für die Arbeit mit Screen.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;Screen starten:
&lt;code&gt;screen&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Wieder mit der letzten Screen-Sitzung verbinden:
&lt;code&gt;screen -R&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Screen mit einer Sitzung mit einem vorgegebenen Namen erstellen:
&lt;code&gt;screen -S &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Eine neue Screen-Sitzung im Hintergrund starten:
&lt;code&gt;screen -dmS &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Liste aller Screen-Sitzungen anzeigen:
&lt;code&gt;screen --ls&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Wieder mit der Screen-Sitzung mit dem vorgebenen Namen verbinden:
&lt;code&gt;screen -r &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Eine Sitzung mit einem vorgegebenen Namen von ihrer Konsole trennen:
&lt;code&gt;screen -d &lt;i&gt;Name&lt;/i&gt;&lt;/code&gt;
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Von der aktuellen Sitzung trennen, die Sitzung läuft im Hintergrund weiter:
&lt;code&gt;Strg+A D&lt;/code&gt;
Erst Strg und A drücken, dann D drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;In der Sitzung scrollen:
&lt;code&gt;Strg+A Escape&lt;/code&gt;
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.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Den Namen des aktuellen Fensters ändern:
&lt;code&gt;Strg+A A&lt;/code&gt;
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.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Strg+A eingeben:
&lt;code&gt;Strg+A a&lt;/code&gt;
Erst Strg und A drücken, dann A drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Ein neues Fenster erstellen:
&lt;code&gt;Strg+A c&lt;/code&gt;
Erst Strg und A drücken, dann C drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Zum nächsten Fenster wechseln:
&lt;code&gt;Strg+A n&lt;/code&gt;
Erst Strg und A drücken, dann N drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Zum vorherigen Fenster wechseln:
&lt;code&gt;Strg+A p&lt;/code&gt;
Erst Strg und A drücken, dann P drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Fensterliste anzeigen:
&lt;code&gt;Strg+A "&lt;/code&gt;
Erst Strg und A drücken, dann " (Shift + 2 bei deutscher Tastatur) drücken.
&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Anwendung"></category><category term="Kurzreferenz"></category><category term="Spickzettel"></category><category term="Linux"></category></entry><entry><title>Installation von KDE 4.1 unter openSUSE 11.0</title><link href="https://marix.org/installation-von-kde-41-unter-opensuse-110.html" rel="alternate"></link><published>2008-09-23T12:06:56+02:00</published><updated>2017-07-10T17:26:00+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-09-23:/installation-von-kde-41-unter-opensuse-110.html</id><summary type="html">
&lt;p&gt;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 &lt;a href="http://de.opensuse.org/KDE/KDE4"&gt;http://de.opensuse.org/KDE/KDE4&lt;/a&gt; auch Links zur Installation mit einem Klick. Wer ein x64-System hat oder es sowieso lieber per Hand macht …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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 &lt;a href="http://de.opensuse.org/KDE/KDE4"&gt;http://de.opensuse.org/KDE/KDE4&lt;/a&gt; auch Links zur Installation mit einem Klick. Wer ein x64-System hat oder es sowieso lieber per Hand macht findet hier eine kurze Anleitung.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Zunächst sind in Yast über den Punkt Software-Repositories folgende Repositories hinzuzufügen:
    &lt;ul&gt;
        &lt;li&gt;&lt;code&gt;http://download.opensuse.org/repositories/KDE:/KDE4:/Factory:/Desktop/openSUSE_11.0/&lt;/code&gt;&lt;/li&gt;
        &lt;li&gt;&lt;code&gt;http://download.opensuse.org/repositories/KDE:/KDE4:/Factory:/Extra-Apps/openSUSE_11.0/&lt;/code&gt;&lt;/li&gt;
        &lt;li&gt;&lt;code&gt;http://download.opensuse.org/repositories/KDE:/KDE4:/Community/openSUSE_11.0_KDE4_Factory_Desktop/&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
Die letzten beiden sind optional, erhöhen aber die Anzahl der  zur Verfügung stehenden Anwendungen.&lt;/p&gt;
&lt;p&gt;Wie unter &lt;a href="http://de.opensuse.org/KDE/KDE4"&gt;http://de.opensuse.org/KDE/KDE4&lt;/a&gt; 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 &lt;code&gt;nichts bietet libqt-x11 &gt;= 4.4.2 benötigt von kdebase4-runtime-4.1.1-48.2.i586&lt;/code&gt;.
    &lt;ul&gt;
        &lt;li&gt;&lt;code&gt;http://download.opensuse.org/repositories/KDE:/Qt/openSUSE_11.0/&lt;/code&gt;
    &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;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"-&gt;"Installieren" auswählen. Hatte man schon KDE 4.0 installiert kann man auch einfach in der Menüleiste "Paket"-&gt;"Alle Pakete"-&gt;"Aktualisieren falls neuere Version verfügbar" auswählen. Dies aktualisiert dann KDE 4.0 auf 4.1.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="KDE"></category><category term="Linux"></category></entry><entry><title>JUnit Kurzreferenz</title><link href="https://marix.org/junit-kurzreferenz.html" rel="alternate"></link><published>2008-08-24T22:37:57+02:00</published><updated>2013-01-28T12:57:09+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-08-24:/junit-kurzreferenz.html</id><content type="html">
&lt;p&gt;Eigentlich als Einführung gedacht eignet sich der Artikel &lt;a href="http://www.cavdar.net/2008/07/21/junit-4-in-60-seconds/"&gt;JUnit 4 in 60 Seconds&lt;/a&gt; hervorragend als Kurzreferenz da er alle Features übersichtlich mit je einem Satz erklärt.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Lesezeichen"></category><category term="Kurzreferenz"></category><category term="Java"></category><category term="Spickzettel"></category></entry><entry><title>Doppelt angezeigte Aktualisierungen im openSUSE-Updater</title><link href="https://marix.org/doppelt-angezeigte-aktualisierungen-im-opensuse-updater.html" rel="alternate"></link><published>2008-08-24T17:15:50+02:00</published><updated>2013-01-28T12:58:04+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-08-24:/doppelt-angezeigte-aktualisierungen-im-opensuse-updater.html</id><summary type="html">
&lt;p&gt;Seit meinem Update auf openSUSE 11.0 zeigte das openSUSE-Updater-Applet (&lt;code&gt;opensuseupdater-kde&lt;/code&gt;) 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.
&lt;!--break--&gt;
&lt;img src="https://marix.org/Anhänge/doppelteUpdatesImOpensuseUpdaterApplet.png" /&gt;
Im Bild ist zu sehen, dass die Updates für Java 5 und Java 6 doppelt vorhanden …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Seit meinem Update auf openSUSE 11.0 zeigte das openSUSE-Updater-Applet (&lt;code&gt;opensuseupdater-kde&lt;/code&gt;) 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.
&lt;!--break--&gt;
&lt;img src="https://marix.org/Anhänge/doppelteUpdatesImOpensuseUpdaterApplet.png" /&gt;
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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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&lt;/p&gt;
&lt;p&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; sudo zypper rr 9
Entferne Repository 'openSUSE-11.0-FTP-UPDATE 11.0' [fertig]
Repository 'openSUSE-11.0-FTP-UPDATE 11.0' wurde entfernt.&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Eine anschließende Überprüfung der verfügbaren Updates zeigt, dass das Problem erfolgreich behoben wurde.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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:~&gt; zypper lu
Lese installierte Pakete...
Patches&lt;/p&gt;
&lt;p&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Ist man sowieso schon auf der Konsole unterwegs kann man die Updates auch gleich von dort einspielen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; sudo zypper up
Lese installierte Pakete...&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;p&gt;Die folgenden NEUEN Patches werden installiert:
  java-1_6_0-sun java-1_5_0-sun&lt;/p&gt;
&lt;p&gt;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]&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="zypper"></category></entry><entry><title>Dateinamen in Gnuplot vervollständigen</title><link href="https://marix.org/dateinamen-gnuplot-vervollst%C3%A4ndigen.html" rel="alternate"></link><published>2008-04-07T14:27:55+02:00</published><updated>2013-01-28T13:04:56+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-04-07:/dateinamen-gnuplot-vervollständigen.html</id><summary type="html">&lt;p&gt;In &lt;a href=</summary><content type="html">
&lt;p&gt;In &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; fehlt &lt;a href="http://www.gnuplot.info/"&gt;Gnuplot&lt;/a&gt; leider die Unterstützung für &lt;a href="http://tiswww.case.edu/php/chet/readline/rltop.html"&gt;die GNU Readline Bilbliothek&lt;/a&gt;. Deshalb kann man Dateinamen leider nicht mit der Tabulatortaste vervollständigen lassen.&lt;/p&gt;
&lt;p&gt;Auf http://telin.ugent.be/~slippens/drupal/node/158 wird beschrieben, wie man mithilfe von &lt;a href="http://utopia.knoware.nl/~hlub/rlwrap/"&gt;rlwrap&lt;/a&gt; das Problem umgehen kann. Ist rlwrap noch nicht installiert lässt sich das leicht nachholen.&lt;br&gt;
&lt;pre&gt;&lt;code&gt;sudo aptitude install rlwrap&lt;/code&gt;&lt;/pre&gt;
Anschließend ruft man gnuplot mithilfe von rlwrap auf. &lt;code&gt;-c&lt;/code&gt; steht hierbei für die Vervollsändigung von Dateinamen, &lt;code&gt;-a&lt;/code&gt; sorgt dafür, dass rlwrap uns die Vervollständigung unabhängig vom ausgeführten Programm anbietet.&lt;br&gt;
&lt;pre&gt;&lt;code&gt;rlwrap -a -c gnuplot&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Der expliziete Aufruf von rlwrap entfällt durch das Hinzufügen eines Alias in &lt;code&gt;~/.bashrc&lt;/code&gt;.&lt;br&gt;
&lt;pre&gt;&lt;code&gt;alias gnuplot='rlwrap -a -c /usr/bin/gnuplot' &lt;/code&gt;&lt;/pre&gt;
Anschließend lassen sich in Gnuplot von Anführungszeichen gesetzte Dateinamen mit der Tabulatortaste vervollständigen.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Ubuntu"></category><category term="Linux"></category></entry><entry><title>Unsichtbare Wände in Descent 3 mit Wine</title><link href="https://marix.org/unsichtbare-w%C3%A4nde-descent-3-mit-wine.html" rel="alternate"></link><published>2008-04-06T10:46:08+02:00</published><updated>2013-01-28T13:05:49+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-04-06:/unsichtbare-wände-descent-3-mit-wine.html</id><content type="html">
&lt;p&gt;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. &lt;a href="http://www.winehq.org/?announce=0.9.59"&gt;Wine 0.9.59&lt;/a&gt; behebt den Bug wieder. Fertige Pakete finden sich im &lt;a href="http://software.opensuse.org/search?baseproject=ALL&amp;amp;p=1&amp;amp;q=wine"&gt;openSUSE Build Service&lt;/a&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Wine"></category><category term="Spiele"></category><category term="Descent"></category><category term="Linux"></category></entry><entry><title>LVM unter Knoppix verwenden</title><link href="https://marix.org/lvm-unter-knoppix-verwenden.html" rel="alternate"></link><published>2008-04-03T20:52:35+02:00</published><updated>2010-08-17T00:19:28+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-04-03:/lvm-unter-knoppix-verwenden.html</id><summary type="html">&lt;p&gt;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.

&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;modprobe md&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Nun sollte man die physikalischen Volume Groups suchen auf denen sich die logischen Volumes befinden.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;vgscan --mknodes&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Diese lassen sich nun mit mit &lt;code&gt;vgchange&lt;/code&gt; aktivieren.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;vgchange -a y&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Jetzt lassen sich auch die logischen Volumes anzeigen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;lvscan&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mkdir /media/oldroot
mkdir /media/oldlocal
mount /dev/system/root /media/oldroot
mount /dev/system/local /media/oldlocal&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;pvcreate /dev/sdc2&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;vgcreate noraid /dev/sdc2&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Auf dieser neuen Gruppe können nun logische Volumes angelegt werden. In diesem Fall wieder root und local. Mit &lt;code&gt;-L&lt;/code&gt; wird hierbei die Größe des Volumes angegeben.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;lvcreate -n root -L 20G noraid
lvcreate -n local -L 40G noraid&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Nun müssen auf den Volumes Dateisysteme angelegt werden. In meinem Fall ext3 mit den Standardeinstellungen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mkfs.ext3 /dev/noraid/root
mkfs.ext3 /dev/noraid/local&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Die neu erstellten Dateisysteme lassen sich nun mounten.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mkdir /media/newroot
mkdir /media/newlocal
mount /dev/noraid/root /media/newroot
mount /dev/noraid/local /media/newlocal&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Jetzt können wir die Dateien von der alten Platte auf die neue Kopieren. Hierbei sorgt &lt;code&gt;--archive&lt;/code&gt; dafür, dass die Metadaten der kopieren Dateien wie Zugriffs- und Erstellungszeiten, Berechtigungen usw. nicht ändern und symbolische Links als solche erhalten bleiben.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;cp --archive /media/oldroot/* /media/newroot/
cp --archive /media/oldlocal/* /media/newlocal/&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Ist der Vorgang beendet, was durchaus eine Weile dauern sollte, sollte man die Dateisysteme wieder unmounten und anschließend mit &lt;code&gt;vgchange&lt;/code&gt; LVM wieder anhalten.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;umount /media/oldroot
umount /media/oldlocal
umount /media/newroot
umount /media/newlocal&lt;/p&gt;
&lt;p&gt;vgchange -a n&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Eine sehr gute Referenz zum zu LVM ist das &lt;a href="http://www.linuxhaven.de/dlhp/HOWTO/DE-LVM-HOWTO.html"&gt;Linux LVM HOWTO&lt;/a&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Hardware"></category><category term="Knoppix"></category><category term="Linux"></category></entry><entry><title>RAID5 unter Knoppix verwenden</title><link href="https://marix.org/raid5-unter-knoppix-verwenden.html" rel="alternate"></link><published>2008-04-03T19:44:33+02:00</published><updated>2010-08-17T00:10:03+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-04-03:/raid5-unter-knoppix-verwenden.html</id><summary type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Knoppix lädt, vermutlich da es meist als Live-System ohne Festplatten verwendet wird, den dafür benötigten Treiber …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;modprobe md&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mdadm --auto-detect&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mdadm --examine --brief /dev/sd??&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mdadm --assemble /dev/md/0 /dev/sda3 /dev/sdb3 /dev/sdc1&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Der Erfolg lässt sich mit im proc-Dateisystem überprüfen.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;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]&lt;/p&gt;
&lt;p&gt;unused devices: &lt;none&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;mkdir /media/raid
mount /dev/md0 /media/raid&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;umount /media/raid
mdadmin --stop /dev/md/0&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Mehr Informationen zu den einzelnen Befehlen und zur allgemeinen Verwendung von Software RAID finden sich im &lt;a href="http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO.html"&gt;Software-RAID HOWTO&lt;/a&gt;.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Hardware"></category><category term="Knoppix"></category><category term="Linux"></category></entry><entry><title>Rootkits und Rootkit-Erkennung</title><link href="https://marix.org/rootkits-und-rootkit-erkennung.html" rel="alternate"></link><published>2008-04-03T07:48:07+02:00</published><updated>2010-08-17T00:09:40+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-04-03:/rootkits-und-rootkit-erkennung.html</id><summary type="html">
&lt;p&gt;Im Mai 2006 hielt ich im Seminar &lt;a href="http://pvs.informatik.uni-heidelberg.de/Teaching/csfp-06.html"&gt;Computersicherheit für Paranoiker&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Zum Herunterladen:
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://marix.org/Anhänge/notes.pdf"&gt;Vortragsfolien mit Notizen als PDF&lt;/a&gt;
  &lt;li&gt;&lt;a href="https://marix.org/Anhänge/rootkits.tar.gz"&gt;Latex-Quelltext des Vortrags&lt;/a&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Weitere Vorträge zur Computersicherheit von anderen …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Im Mai 2006 hielt ich im Seminar &lt;a href="http://pvs.informatik.uni-heidelberg.de/Teaching/csfp-06.html"&gt;Computersicherheit für Paranoiker&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Zum Herunterladen:
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://marix.org/Anhänge/notes.pdf"&gt;Vortragsfolien mit Notizen als PDF&lt;/a&gt;
  &lt;li&gt;&lt;a href="https://marix.org/Anhänge/rootkits.tar.gz"&gt;Latex-Quelltext des Vortrags&lt;/a&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Weitere Vorträge zur Computersicherheit von anderen Studenten sind auf der &lt;a href="http://pvs.informatik.uni-heidelberg.de/Teaching/CSFP-06/"&gt;Materialienseite des Seminars&lt;/a&gt;, sowie auf der &lt;a href="http://pvs.informatik.uni-heidelberg.de/Teaching/CSFP-0506/index.html"&gt;Materialienseite des vorherigen Semesters&lt;/a&gt; zu finden.
&lt;/p&gt;
    </content><category term="Blog"></category><category term="Windows"></category><category term="Rootkits"></category><category term="Linux"></category><category term="Computersicherheit"></category></entry><entry><title>Paketverwaltung verloren</title><link href="https://marix.org/paketverwaltung-verloren.html" rel="alternate"></link><published>2008-02-29T07:49:19+01:00</published><updated>2013-01-28T13:06:59+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-02-29:/paketverwaltung-verloren.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;sudo zypper install yast2&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;zypper search yast&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Das gesuchte Paket heißt yast2-packager, also schnell mit zypper installiert.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;sudo zypper install yast2-packager&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Linux"></category></entry><entry><title>Rechner ausschalten mit openSUSE 10.3</title><link href="https://marix.org/rechner-ausschalten-mit-opensuse-103.html" rel="alternate"></link><published>2008-02-27T10:15:05+01:00</published><updated>2013-01-28T13:07:35+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-02-27:/rechner-ausschalten-mit-opensuse-103.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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. &lt;a href="http://lists.opensuse.org/opensuse/2008-02/msg03121.html"&gt;Der entscheidende Hinweis&lt;/a&gt; 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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Hardware"></category><category term="Linux"></category></entry><entry><title>Umzug einer Amarok-Sammlung von SQLite nach MySQL</title><link href="https://marix.org/umzug-einer-amarok-sammlung-von-sqlite-nach-mysql.html" rel="alternate"></link><published>2008-01-16T23:14:27+01:00</published><updated>2013-01-28T13:08:08+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-01-16:/umzug-einer-amarok-sammlung-von-sqlite-nach-mysql.html</id><summary type="html">&lt;p&gt;Eigentlich gibt es im &lt;a href=</summary><content type="html">
&lt;p&gt;Eigentlich gibt es im &lt;a href="http://amarok.kde.org/wiki/Hauptseite"&gt;Amarok-Wiki&lt;/a&gt; eine schöne &lt;a href="http://amarok.kde.org/wiki/De:MySQL_HowTo"&gt;Anleitung&lt;/a&gt; wie man seine Sammlung von &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; nach &lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt; konvertieren kann. Leider stieß ich dabei allerdings auf ein paar, zum Glück leicht lösbare, Schwierigkeiten.&lt;/p&gt;
&lt;p&gt;Zunächst einmal habe ich analog zur Anleitung mit &lt;a href="http://www.phpmyadmin.net/"&gt;phpMyAdmin&lt;/a&gt; eine Datenbank mit dazugehörigem Benutzer für &lt;a href="http://amarok.kde.org&amp;gt;Amarok&amp;lt;/a&amp;gt; angelegt. Dann habe ich der Anleitung folgend meine SQLite Datenbank erstmal in eine Datei exportiert.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;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&amp;quot;-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.&amp;lt; p&gt;
&lt;p&gt;Beim nächsten Importversuch scheiterte ich an einer "Duplicate Key"-Fehlermeldung. Ursache des ganzen war, dass die Datenbank mit der &lt;a href="http://en.wikipedia.org/wiki/Collation"&gt;Kollation&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Programm"></category><category term="Amarok"></category><category term="Linux"></category></entry><entry><title>Glimpfliche Schrecksekunden mit Amarok</title><link href="https://marix.org/glimpfliche-schrecksekunden-mit-amarok.html" rel="alternate"></link><published>2008-01-15T16:11:33+01:00</published><updated>2013-01-28T13:08:50+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2008-01-15:/glimpfliche-schrecksekunden-mit-amarok.html</id><summary type="html">&lt;p&gt;Nach einem durch Harwarefehler bedingten kurzfristigen Umzug meines Systems auf ein RAID5 bereitete &lt;a href=</summary><content type="html">
&lt;p&gt;Nach einem durch Harwarefehler bedingten kurzfristigen Umzug meines Systems auf ein RAID5 bereitete &lt;a href="http://amarok.kde.org"&gt;Amarok&lt;/a&gt; mir zwei kurze Schrecksekunden. Zum Glück ließen aber beide sich ohne Probleme und viel Aufwand beseitigen.&lt;/p&gt;
&lt;p&gt;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-&gt;Sammlung neu erfassen". Anschließend waren alle doppelten Einträge verschwunden, neue Duplikate gab es auch keine und Statistiken sind auch nicht verloren gegangen.&lt;/p&gt;
&lt;p&gt;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-&gt;Sammlung neu erfassen". Keine 10 Minuten später war die Sammlung wieder da, inklusive aller Statistiken.&lt;/p&gt;
&lt;p&gt;Hinzuzufügen ist, dass ich nicht die offiziell mit openSUSE ausgelieferte Version von Amarok verwende, sondern die aus dem &lt;a href="http://packman.links2linux.org"&gt;Packman Repository&lt;/a&gt;. Der mit mit openSUSE ausgelieferte Version fehlt nämlich die Unterstützung für MySQL.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Programm"></category><category term="Amarok"></category><category term="Linux"></category></entry><entry><title>Umzug abgeschlossen</title><link href="https://marix.org/umzug-abgeschlossen.html" rel="alternate"></link><published>2007-10-24T20:50:33+02:00</published><updated>2007-10-24T20:50:33+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-10-24:/umzug-abgeschlossen.html</id><content type="html">
&lt;p&gt;Der Umzug ist erfolgreich abgeschlossen. Jetzt wird wieder an Inhalten gearbeitet.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Auszeiten</title><link href="https://marix.org/auszeiten.html" rel="alternate"></link><published>2007-10-22T12:32:44+02:00</published><updated>2007-10-22T12:32:44+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-10-22:/auszeiten.html</id><content type="html">
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Umgezogen</title><link href="https://marix.org/umgezogen.html" rel="alternate"></link><published>2007-10-20T11:46:26+02:00</published><updated>2007-10-22T19:30:44+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-10-20:/umgezogen.html</id><summary type="html">
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Zattoo unter openSUSE 10.2 64-Bit</title><link href="https://marix.org/zattoo-unter-opensuse-102-64-bit.html" rel="alternate"></link><published>2007-09-15T22:29:51+02:00</published><updated>2013-01-28T13:09:46+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-09-15:/zattoo-unter-opensuse-102-64-bit.html</id><summary type="html">&lt;p&gt;Wie auf &lt;a href=http://www.heise.de/newsticker/meldung/95981&gt;heise online&lt;/a&gt; berichtet ist &lt;a href=http://www.zattoo.de&gt;Zattoo&lt;/a&gt; jetzt auch in Deutschland frei verfügbar. Leider aber nur als 32-Bit-Programm und mit einer etwas merkwürdigen Installationsanleitung.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Wie auf &lt;a href="http://www.heise.de/newsticker/meldung/95981"&gt;heise online&lt;/a&gt; berichtet ist &lt;a href="http://www.zattoo.de"&gt;Zattoo&lt;/a&gt; jetzt auch in Deutschland frei verfügbar. Leider aber nur als 32-Bit-Programm und mit einer etwas merkwürdigen Installationsanleitung.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.
&lt;ul&gt;
  &lt;li&gt;libgnomeui-32bit (Ok, die ist immer 32-Bit)&lt;/li&gt;
  &lt;li&gt;gtkglext&lt;/li&gt;
  &lt;li&gt;mozilla-xulrunner181&lt;/li&gt;
  &lt;li&gt;faad2&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;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.
&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Anschließen muss man noch den Linker auf die im Zattoo-Verzichnis liegenden Bibliotheken und Links hinweisen.
&lt;pre&gt;&lt;code&gt;sudo /sbin/ldconfig /usr/lib/zattoo/&lt;/code&gt;&lt;/pre&gt;
Bei Auslassen dieses Schrittes stürzt Zattoo jedesmal ab sobald es anfängt einen Kanal abzuspielen. In der Logdatei &lt;pre&gt;&lt;code&gt;~/.Zattoo/Data/logs/zattoo.errorlog&lt;/code&gt;&lt;/pre&gt; findet sich dann eine Meldung, dass eine bestimmte Funktion nicht gefunden werden konnte. &lt;/p&gt;
&lt;p&gt;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.
&lt;pre&gt;&lt;code&gt;sudo ln -s /usr/bin/zattoo_player /usr/local/bin/zattoo&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Anchließen hat man einen funktionierenden P2P-Fernseher der auf den ersten Eindruck sehr gut zu funktionieren scheint.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Programm"></category></entry><entry><title>Lesezeichen aktualisiert</title><link href="https://marix.org/lesezeichen-aktualisiert.html" rel="alternate"></link><published>2007-09-12T10:32:35+02:00</published><updated>2007-09-12T10:32:35+02:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-09-12:/lesezeichen-aktualisiert.html</id><content type="html">
&lt;p&gt;Die Lesezeichen wurden mal wieder aktualisiert. Hinzugekommen sind Verweise auf &lt;a href="http://www.slyclan.de&amp;gt;Vortex&amp;lt;/a&amp;gt;, die &amp;lt;a href=" http: odf.sf.net&amp;quot;&gt;Open Descent Foundation&lt;/a&gt;, Tools wie &lt;a href="http://www.i2p.net"&gt;I2P&lt;/a&gt; und ein paar andere.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Ton für OSS-Programme</title><link href="https://marix.org/ton-f%C3%BCr-oss-programme.html" rel="alternate"></link><published>2007-07-05T21:04:43+02:00</published><updated>2013-01-28T13:10:19+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-07-05:/ton-für-oss-programme.html</id><summary type="html">
&lt;p&gt;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.
&lt;!--break--&gt;
Statt Ton bekam ich bei allen Anwendungen die OSS verwenden eine …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.
&lt;!--break--&gt;
Statt Ton bekam ich bei allen Anwendungen die OSS verwenden eine Fehlermeldung, obwohl der Ton bei anderen Anwendungen ging.
&lt;pre&gt;&lt;code&gt;/dev/dsp: Das Gerät oder die Ressource ist belegt&lt;/code&gt;&lt;/pre&gt;
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.
&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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&lt;/code&gt;&lt;/pre&gt;
Einen entscheidenden Hinweis lieferte ein mutiges Durchstarten von Alsa.
&lt;pre&gt;&lt;code&gt;sudo /usr/sbin/rcalsasound restart&lt;/code&gt;&lt;/pre&gt;
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.
&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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&lt;/code&gt;&lt;/pre&gt;
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.
&lt;pre&gt;&lt;code&gt;mv ~/.kde/share/config/kdesktoprc ~/.kde/share/config/kdesktoprc.bak&lt;/code&gt;&lt;/pre&gt;
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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>Arts Startprobleme schnell gelöst</title><link href="https://marix.org/arts-startprobleme-schnell-gel%C3%B6st.html" rel="alternate"></link><published>2007-07-05T11:08:52+02:00</published><updated>2013-01-28T13:10:45+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-07-05:/arts-startprobleme-schnell-gelöst.html</id><summary type="html">
&lt;p&gt;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.
&lt;!--break--&gt;
Ein Start des artsd in der Konsole erzeugte anschließend diese Ausgabe.
&lt;pre&gt;&lt;code&gt;marix@eddie:/opt/kde3/lib64&gt; artsd
unix_connect: can't connect …&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.
&lt;!--break--&gt;
Ein Start des artsd in der Konsole erzeugte anschließend diese Ausgabe.
&lt;pre&gt;&lt;code&gt;marix@eddie:/opt/kde3/lib64&gt; 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&lt;/code&gt;&lt;/pre&gt;
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.
&lt;pre&gt;&lt;code&gt;
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
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category></entry><entry><title>Punklandung in den D3-Stats</title><link href="https://marix.org/punklandung-den-d3-stats.html" rel="alternate"></link><published>2007-05-23T11:04:42+02:00</published><updated>2013-01-28T13:11:18+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-05-23:/punklandung-den-d3-stats.html</id><content type="html">
&lt;p&gt;Da habe ich in den &lt;a href="http://www.d3stats.de"&gt;D3-Stats&lt;/a&gt; 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 &lt;a href="http://www.d3stats.de/pdetails.php?pid=10443"&gt;meinem Profil&lt;/a&gt; vermutlich nur bis zur nächsten Aktualisierung sehen kann ist hier ein Screenshot vom freudigen Ereignis.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://marix.org/Anhänge/descent_1000bonus.png" /&gt;&lt;/p&gt;
    </content><category term="Blog"></category><category term="Descent"></category></entry><entry><title>USB-Joysticks und openSUSE 10.2</title><link href="https://marix.org/usb-joysticks-und-opensuse-102.html" rel="alternate"></link><published>2007-05-09T00:58:28+02:00</published><updated>2013-01-28T13:11:50+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-05-09:/usb-joysticks-und-opensuse-102.html</id><summary type="html">
&lt;p&gt;Schließt man einen USB-Joystick an hat &lt;a href="http://www.opensuse.org"&gt;openSUSE&lt;/a&gt; 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 …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Schließt man einen USB-Joystick an hat &lt;a href="http://www.opensuse.org"&gt;openSUSE&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Zunächst scheint das System den Joystick korrekt zu erkennen, was unter anderem anhand von dmesg zu sehen ist.
&lt;pre&gt;&lt;code&gt;marix@eddie:~&gt; 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&lt;/code&gt;&lt;/pre&gt;
Wie zu sehen ist habe ich gleich zwei Joysticks angeschlossen. Zunächst schein aber alles zu funktionieren.&lt;/p&gt;
&lt;p&gt;Interessant wird die Sache sobald man versucht den Joystick zu verwenden. Started man zum Beispiel das hervorgagende &lt;a href="http://www.dxx-rebirth.de"&gt;D1X-Rebirth&lt;/a&gt; bekommt man eine wenig erfreulich Meldung.
&lt;pre&gt;&lt;code&gt;sdl-joystick: found 0 joysticks&lt;/code&gt;&lt;/pre&gt;
Bestätigt wird die schlechte nachricht auch beim Einsatz von joy2key.
&lt;pre&gt;&lt;code&gt;Error opening /dev/input/js0!
Are you sure you have joystick support in your kernel?&lt;/code&gt;&lt;/pre&gt;
Wie die Meldung vermuten lässt, liefert ein &lt;code&gt;ls /dev/input/ | grep js&lt;/code&gt; nichts zurück. Der Joystick funktioniert zwar als USB-Gerät, aber seine Semantik ist unbekannt.&lt;/p&gt;
&lt;p&gt;Die Fehlermeldung von joy2key führt zur Lösung. Um den Joystick auch unter /dev/input zu sehen muss das Kernelmodul joydev geladen werden.
&lt;pre&gt;&lt;code&gt;eddie:~ # modprobe joydev&lt;/code&gt;&lt;/pre&gt;
Damit dies auch bei jedem Systemstart automatisch geschieht muss eine zeile in /etc/init.d/boot.local eingefügt werden.
&lt;pre&gt;&lt;code&gt;/sbin/modprobe joydev&lt;/code&gt;&lt;/pre&gt;
Nun steht der Joystick auch bei jedem Systemstart sofort zur Verfügung.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="openSUSE"></category><category term="Descent"></category><category term="Linux"></category></entry><entry><title>XIII und Date Execution Prevention</title><link href="https://marix.org/xiii-und-date-execution-prevention.html" rel="alternate"></link><published>2007-04-10T09:55:32+02:00</published><updated>2013-01-28T13:12:12+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-04-10:/xiii-und-date-execution-prevention.html</id><summary type="html">&lt;p&gt;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.
&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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&gt;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 ;).&lt;/p&gt;
    </content><category term="Blog"></category><category term="Windows"></category><category term="Spiele"></category></entry><entry><title>Drupal rockt</title><link href="https://marix.org/drupal-rockt.html" rel="alternate"></link><published>2007-02-18T20:02:04+01:00</published><updated>2007-02-18T20:02:04+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-02-18:/drupal-rockt.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.

&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Marix World aktualisiert</title><link href="https://marix.org/marix-world-aktualisiert.html" rel="alternate"></link><published>2007-02-11T22:21:47+01:00</published><updated>2007-02-11T22:22:24+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2007-02-11:/marix-world-aktualisiert.html</id><summary type="html">&lt;p&gt;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.
&lt;/p&gt;</summary><content type="html">
&lt;p&gt;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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry><entry><title>Webdemo gegen Vorratsdatenspeicherung</title><link href="https://marix.org/webdemo-gegen-vorratsdatenspeicherung.html" rel="alternate"></link><published>2006-12-12T00:56:50+01:00</published><updated>2007-02-11T22:18:05+01:00</updated><author><name>Matthias Bach</name></author><id>tag:marix.org,2006-12-12:/webdemo-gegen-vorratsdatenspeicherung.html</id><summary type="html">&lt;p&gt;Der &lt;a href=</summary><content type="html">
&lt;p&gt;Der &lt;a href="http://www.vorratsdatenspeicherung.de/"&gt;Arbeitskreis Vorratsdatenspeicherung&lt;/a&gt; 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.&lt;/p&gt;
    </content><category term="Blog"></category><category term="Administratives"></category></entry></feed>