{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "cperrin.xyz",
  "home_page_url": "https://staging.cperrin.xyz/",
  "feed_url": "https://staging.cperrin.xyz/index.json",
  "description": "Ein Blog über Sysadmin-Themen und mehr. Außerdem ein spielplatz für CSS für mich.",
  "authors": [
    {
      "name": "Christopher Perrin"
    }
  ],
  "items": [
    {
      "id": "https://staging.cperrin.xyz/2026/06/19/was-k%C3%B6nnen-wir-gegen-die-vibe-committer-tun/",
      "url": "https://staging.cperrin.xyz/2026/06/19/was-k%C3%B6nnen-wir-gegen-die-vibe-committer-tun/",
      "title": "Was können wir gegen die Vibe-Committer tun",
      "summary": "\u003cp\u003eIch hatte kürzlich eine Diskussion auf Mastodon, die durch einen Post der Software Freedom Conservancy über den \u003ca href=\"https://sfconservancy.org/llm-gen-ai/llm-backed-generative-ai-recommendations.html\"\u003eUmgang mit LLM-Gen-AI-Submissions\u003c/a\u003e angestoßen wurde. Es gibt viele Leute, die strikt dagegen sind, LLM-generierten Code in ihre Projekte zu lassen. Das ist definitiv ein verständlicher Standpunkt, wenn man Dinge wie Legalität, unethische Datenquellen, Ressourcenverbrauch und Machtkonzentration bedenkt.\u003c/p\u003e\n\u003cp\u003eAbgesehen davon ist es völlig legitim, wenn ein Maintainer Regeln für Submissions festlegt. Eine FOSS-Lizenz bedeutet nicht einmal, dass ein Maintainer überhaupt mit irgendwem interagieren muss. Sie stellt einfach nur den Sourcecode zur Verfügung.\u003c/p\u003e",
      "content_html": "\u003cp\u003eIch hatte kürzlich eine Diskussion auf Mastodon, die durch einen Post der Software Freedom Conservancy über den \u003ca href=\"https://sfconservancy.org/llm-gen-ai/llm-backed-generative-ai-recommendations.html\"\u003eUmgang mit LLM-Gen-AI-Submissions\u003c/a\u003e angestoßen wurde. Es gibt viele Leute, die strikt dagegen sind, LLM-generierten Code in ihre Projekte zu lassen. Das ist definitiv ein verständlicher Standpunkt, wenn man Dinge wie Legalität, unethische Datenquellen, Ressourcenverbrauch und Machtkonzentration bedenkt.\u003c/p\u003e\n\u003cp\u003eAbgesehen davon ist es völlig legitim, wenn ein Maintainer Regeln für Submissions festlegt. Eine FOSS-Lizenz bedeutet nicht einmal, dass ein Maintainer überhaupt mit irgendwem interagieren muss. Sie stellt einfach nur den Sourcecode zur Verfügung.\u003c/p\u003e\n\u003cp\u003eTrotzdem hat es mich zum Nachdenken gebracht, welche Auswirkungen diese Regeln haben könnten und in welchen Fällen sie sich unterm Strich eher negativ auswirken.\u003c/p\u003e\n\u003ch2 id=\"consent-is-king\"\u003eConsent is King\u003c/h2\u003e\n\u003cp\u003eDie Maintainer machen die Regeln. Ihnen ist die Pflege einer Code-Version anvertraut, zu der andere vielleicht beitragen wollen. Oft ist das eine einzelne Person, die nicht nur etwas erschaffen hat, das sie teilen wollte, sondern es auch auf sich genommen hat, anderen dabei zu helfen, es zu verbessern. Dafür sollten wir für ihre Arbeit dankbar sein und ihre Wünsche respektieren.\u003c/p\u003e\n\u003cp\u003eAber so funktioniert die Welt leider nicht. Ob durch Ignoranz, Anspruchsdenken oder böse Absicht – Maintainer werden oft mit Forderungen oder Feindseligkeit konfrontiert. Ihre Grenzen werden ignoriert, und die Frustration wächst. LLM-generierter Code ist dafür ein perfekter Nährboden. Während manche ihn als den heiligen Gral sehen, halten andere ihn für den Teufel. Diese stark polarisierende Wirkung, kombiniert mit ignorierten Grenzen, führt schnell zu Konflikten.\u003c/p\u003e\n\u003ch2 id=\"solid-snake-und-benny-hill\"\u003eSolid Snake und Benny Hill\u003c/h2\u003e\n\u003cp\u003eJeder Konflikt hat das Potenzial, für alle Seiten extrem stressig zu werden. Das gilt besonders, wenn unschuldige Leute ins Kreuzfeuer geraten. In meinen Jahren als Softwareentwickler habe ich eine Menge schlechten Code gesehen. In letzter Zeit hat so mancher Code meinen Vibe-Code-Sensor ausgelöst, obwohl er von einem Menschen geschrieben wurde.\u003c/p\u003e\n\u003cp\u003eAuf der anderen Seite glaube ich, dass ich die Herkunft einer Code-Submission wahrscheinlich ganz gut verschleiern könnte. Ich würde das niemals tun, besonders nicht, um jemanden zu täuschen. Aber das lässt mich vermuten, dass da draußen viele Leute unterwegs sind, die das gleiche Wissen und kein Problem mit Täuschung haben.\u003c/p\u003e\n\u003cp\u003eDas könnte dazu führen, dass manche Leute ihren LLM-Code wie Solid Snake in eine geheime Basis einschleusen, während andere von einem wütenden Maintainer wie in einem Benny-Hill-Sketch verjagt werden.\u003c/p\u003e\n\u003ch2 id=\"misstrauen-führt-zu-wut-wut-führt-zu-einer-miesen-zeit-für-alle\"\u003eMisstrauen führt zu Wut, Wut führt zu einer miesen Zeit für alle\u003c/h2\u003e\n\u003cp\u003eIch bin natürlich nicht der Erste, der an böswillige Akteure denkt, die versuchen, sich an den Verteidigungen vorbeizuschleichen. Ich bin mir sicher, dass die leidenschaftlichsten Maintainer sich dessen ständig bewusst sind – ständig auf der Hut nach dem kleinsten Hinweis auf LLM-Beteiligung, immer wachsam.\u003c/p\u003e\n\u003cp\u003eOder sie machen sich ständig Sorgen um die Quelle einer Submission, zusätzlich zu deren Qualität – immer misstrauisch. Nach meinen Beobachtungen kann das mit Wut einhergehen. Vielleicht Wut über LLMs, über die Missachtung von Grenzen oder über die zusätzliche Arbeit, die sie reinstecken müssen.\u003c/p\u003e\n\u003cp\u003eAn diesem Punkt drängt sich die Frage auf, wer hier eigentlich noch irgendwas gewinnt. Schlimmer noch: Einige Leute verlieren definitiv. Die Maintainer, neue Programmierer und die FOSS-Community als Ganzes sind negativ betroffen, während Vibe-Coder und LLM-Firmen oft trotzdem bekommen, was sie wollen.\u003c/p\u003e\n\u003ch2 id=\"pragmatische-prinzipien\"\u003ePragmatische Prinzipien\u003c/h2\u003e\n\u003cp\u003eDas klingt alles ziemlich übel für Leute, die Prinzipien haben. Zu seinen Prinzipien zu stehen, kann Unschuldige und sogar den Maintainer verletzen, aber seine Prinzipien aufzugeben, kann genauso wehtun. Mein persönlicher Ausweg: pragmatische Prinzipien.\u003c/p\u003e\n\u003cp\u003eDamit meine ich, mir gezielt die Kämpfe auszusuchen, die ich gewinnen kann und die unterm Strich etwas Positives bewirken. Ein paar meiner Leitprinzipien sind:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSuch bei einer Submission nicht krampfhaft nach Anzeichen für LLM-Code, aber ignoriere sie auch nicht\u003c/li\u003e\n\u003cli\u003eIm Zweifel geh davon aus, dass es von einem Menschen stammt oder sprich deine Zweifel offen an\u003c/li\u003e\n\u003cli\u003eBewerte Submissions in erster Linie nach der Codequalität\u003c/li\u003e\n\u003cli\u003eGeh davon aus, dass die Leute helfen wollen\u003c/li\u003e\n\u003cli\u003eDenk daran, dass wir alle Fehler machen\u003c/li\u003e\n\u003cli\u003eKonzentrier dich auf das Positive\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"nachwort\"\u003eNachwort\u003c/h2\u003e\n\u003cp\u003eIch möchte klarstellen, dass ich will, dass jeder seine Grenzen so setzt, wie er es für richtig hält, und dass das von allen respektiert werden sollte. Ich wünsche mir eine Welt, in der es selbstverständlich ist, dass die Prinzipien anderer respektiert werden.\u003c/p\u003e\n\u003cp\u003eDer pragmatische Ansatz ist nur mein persönlicher Weg, um damit umzugehen, wenn ich meine Prinzipien nicht auf eine gesunde oder erfolgreiche Weise verteidigen kann. Mir ist klar, dass das nicht leicht ist, wenn ein Projekt von \u0026ldquo;Slop\u0026rdquo; überrannt wird. Es ist keine perfekte Lösung und auch nicht für jeden etwas.\u003c/p\u003e\n",
      "date_published": "2026-06-19T00:00:00+00:00",
      "date_modified": "2026-06-19T23:07:43+02:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2026/01/28/veeam-backups-unter-linux-mit-systemd-triggern/",
      "url": "https://staging.cperrin.xyz/2026/01/28/veeam-backups-unter-linux-mit-systemd-triggern/",
      "title": "Veeam Backups unter Linux mit SystemD triggern",
      "summary": "\u003cp\u003eVeeam Backup ist meiner Meinung nach eine der besten Lösungen für Backups die man kostenlos bekommen kann. Besonders unter Linux muss man die mölgichkeit Snapshot-Backups von Ext4 Partitionen machen zu können hervorheben.\u003c/p\u003e\n\u003cp\u003eLeider hat besonders die Linux Version einen Großen nachteil gegenüber der Windows Version: das Scheduling der Backups ist extrem eingeschränkt. Man kann nur Tag und Stunde einstellen an dem das Backup stattfinden soll. Wenn zu dem Zeitpunkt der Rechner im Sleep-Modus oder gar ausgeschaltet ist, wird das Backup nicht durchgeführt und vor allem auch nicht nachgeholt.\u003c/p\u003e",
      "content_html": "\u003cp\u003eVeeam Backup ist meiner Meinung nach eine der besten Lösungen für Backups die man kostenlos bekommen kann. Besonders unter Linux muss man die mölgichkeit Snapshot-Backups von Ext4 Partitionen machen zu können hervorheben.\u003c/p\u003e\n\u003cp\u003eLeider hat besonders die Linux Version einen Großen nachteil gegenüber der Windows Version: das Scheduling der Backups ist extrem eingeschränkt. Man kann nur Tag und Stunde einstellen an dem das Backup stattfinden soll. Wenn zu dem Zeitpunkt der Rechner im Sleep-Modus oder gar ausgeschaltet ist, wird das Backup nicht durchgeführt und vor allem auch nicht nachgeholt.\u003c/p\u003e\n\u003cp\u003eUm das zu umgehen musste ich etwas in die Trickkiste greifen und SystemD Timer, SystemD Services und ein wenig Scrpting verbinden.\u003c/p\u003e\n\u003ch2 id=\"veeam-cli\"\u003eVeeam CLI\u003c/h2\u003e\n\u003cp\u003eMan kann Veeam Jobs auch außerhalb der Terminal UI steuern. Dafür gibt es das \u003ccode\u003eveeamconfig\u003c/code\u003e Tool.\u003c/p\u003e\n\u003cp\u003eBeispielweise kann man mit folgendem Befehl ein Backup starten:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eveeamconfig job run --name \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;JOBNAME\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDas Problem ist nur, dass dieser Befehl nicht blockierend ist, sondern direkt zurückkehrt. Um dann herauszufinden ob das Backup abgeschlossen ist und mit welchem Status, muss man den Befehl\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eveeamconfig job status --name \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;JOBNAME\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eausführen. Weil der Befehl auch nicht blockierend ist, ist die einzige Lösung Polling. Wir müssen immer wieder nachfragen, ob der Job noch läuft, bis er entweder abgeschlossen ist oder fehlerhaft beendet wurde.\u003c/p\u003e\n\u003cp\u003eHier ist der wichtige Teil des Polling-Skripts, der die Job-Übernahme übernimmt:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Session-ID aus der Job-Start-Ausgabe extrahieren\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSESSION_ID\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUTPUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -oP \u003cspan class=\"s1\"\u003e\u0026#39;Session ID: \\[\\{\\K[^}]+\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Session-Status abfragen bis zum Abschluss\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e true\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eSTATUS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e/usr/bin/veeamconfig session info --id \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SESSION_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s2\"\u003e\u0026#34;State:\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eSTATE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATUS\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -oP \u003cspan class=\"s1\"\u003e\u0026#39;State:\\s+\\K\\w+\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Success\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Warning\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Job abgeschlossen mit Status: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Failed\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Job fehlgeschlagen!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Job läuft noch... Status: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$STATE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sleep \u003cspan class=\"nv\"\u003e$POLL_INTERVAL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDas Skript enthält auch eine Signalbehandlung zum kontrollierten Stoppen von Backups bei Bedarf.\u003c/p\u003e\n\u003ch2 id=\"systemd\"\u003eSystemD\u003c/h2\u003e\n\u003cp\u003eDie auf der SystemD Seite war es wesentlich einfacher. SystemD Timer erlauben es mir, den Computer aus dem Sleep-Mode aufzuwecken, um das Backup zu starten. Hierzu muss man lediglich in der \u003ccode\u003e[Timer]\u003c/code\u003e-Block die Option \u003ccode\u003eWakeSystem=true\u003c/code\u003e setzen.\u003c/p\u003e\n\u003cp\u003eDie Service-Unit war genauso wenig ein Problem mit dem Skript. Ich musste lediglich verhindern, dass der Computer wieder in den Schlafzustand wechseln kann solange das Backup läuft. Hierzu habe ich \u003ccode\u003esystemd-inhibit\u003c/code\u003e genutzt.\u003c/p\u003e\n\u003ch3 id=\"systemd-service\"\u003eSystemD Service\u003c/h3\u003e\n\u003cp\u003eDie Service-Unit führt unser Skript aus und verhindert dabei, dass das System während der Backups in den Schlafmodus wechselt:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eVeeam Backup Job %i\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eAfter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003enetwork.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eType\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003esimple\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003esystemd-inhibit --what \u0026#34;sleep:idle:shutdown\u0026#34; --why \u0026#34;Veeam Backup %i\u0026#34; --who \u0026#34;Veeam Job\u0026#34; --mode \u0026#34;block-weak\u0026#34; /usr/local/bin/veeam-run-polling %i\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eRestart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eno\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"systemd-timer\"\u003eSystemD Timer\u003c/h3\u003e\n\u003cp\u003eDieser Timer weckt das System und führt das Backup alle zwei Tage um 10:30 Uhr aus:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eVeeam Backup Timer for Job %i\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Timer]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eOnCalendar\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e*-*-1/2 10:30:00\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003ePersistent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWakeSystem\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDeferReactivation\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eUnit\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eveeam-run@%i.service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Install]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etimers.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlle Unit Files und das Skript sind auf \u003ca href=\"https://git.screebo.net/cperrin/veeam-systemd-timers\"\u003ehttps://git.screebo.net/cperrin/veeam-systemd-timers\u003c/a\u003e zu finden.\u003c/p\u003e\n",
      "date_published": "2026-01-28T00:00:00+00:00",
      "date_modified": "2026-01-28T22:44:24+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2026/01/03/2026-das-jahr-in-dem-windows-zu-sehr-nervt/",
      "url": "https://staging.cperrin.xyz/2026/01/03/2026-das-jahr-in-dem-windows-zu-sehr-nervt/",
      "title": "2026: das Jahr in dem Windows zu sehr nervt",
      "summary": "\u003cp\u003eIn den letzten Tagen habe ich mehrere Blogartikel gelesen, die davon sprechen, dass 2026 das Jahr des Linux-Desktops ist, und das ist eine tolle Sache. Ich finde aber, dass viele der Überschriften und Posts zu dem Thema eine andere Überschrift haben könnten, und zwar „Das Jahr, in dem Windows zu sehr nervt“.\u003c/p\u003e\n\u003ch2 id=\"geschichte-der-verschlimmbesserung\"\u003eGeschichte der Verschlimmbesserung\u003c/h2\u003e\n\u003cp\u003eMicrosoft hat nun seit Jahren sein Betriebssystem stark verschlimmbessert. Windows Vista war ein schwieriger Schritt, weil viele Rechner noch nicht dafür bereit waren, aber es gab zumindest einen technischen Fortschritt, der mit Windows 7 dann relativ sauber abgeschlossen war.\u003c/p\u003e",
      "content_html": "\u003cp\u003eIn den letzten Tagen habe ich mehrere Blogartikel gelesen, die davon sprechen, dass 2026 das Jahr des Linux-Desktops ist, und das ist eine tolle Sache. Ich finde aber, dass viele der Überschriften und Posts zu dem Thema eine andere Überschrift haben könnten, und zwar „Das Jahr, in dem Windows zu sehr nervt“.\u003c/p\u003e\n\u003ch2 id=\"geschichte-der-verschlimmbesserung\"\u003eGeschichte der Verschlimmbesserung\u003c/h2\u003e\n\u003cp\u003eMicrosoft hat nun seit Jahren sein Betriebssystem stark verschlimmbessert. Windows Vista war ein schwieriger Schritt, weil viele Rechner noch nicht dafür bereit waren, aber es gab zumindest einen technischen Fortschritt, der mit Windows 7 dann relativ sauber abgeschlossen war.\u003c/p\u003e\n\u003cp\u003eEin Schritt, den aber nicht viele mitgehen konnten, war der Wechsel zu Windows 8. Der damalige Chef von Microsoft, Steve Ballmer, war überzeugt davon, Windows zum überall einsetzbaren Betriebssystem zu machen. Ob auf dem Tablet oder dem Handy oder dem Desktop oder auf einem ganz neuen Gerät, Windows sollte das Richtige sein. Dabei hat er ein System gemacht, was für kaum einen gut war. Auf dem Desktop war die vollbildfokussierte Oberfläche immer im Weg und hat den Workflow verändert. Tablets gab es kaum welche und die, die es gab, haben damit gekämpft, dass alle Programme, die nutzenswert waren, nicht auf Touch angepasst waren und das System auch viel zu schwer war. Auf dem Handy ist das System nie angekommen, weil einfach keiner Apps entwickelt hat, und somit war es unattraktiv. Weitere unwillkommene Neuerungen von Windows 8 waren Microsoft-Account-Login, bei dem Nutzer sich anstatt mit einem lokalen Konto mit dem Online-Konto bei Microsoft einloggen konnten.\u003c/p\u003e\n\u003cp\u003eEinige der Designentscheidungen von Windows 8 wurden dann mit Windows 8.1 „entschärft“. Der Vollbild-Startmenü-Zwang wurde entfernt und das System wurde wieder nutzbarer Trotzdem begann Microsoft schon mit der nächsten tollen Idee: automatisches Synchronisieren von Dokumenten nach OneDrive. Anstatt die Nutzer zu fragen, wurde einfach davon ausgegangen, dass Nutzer es super finden, wenn ihre Daten einfach so in der Microsoft-Cloud landen. Dazu kam, dass der kostenlose Speicher für die meisten sowieso zu klein war. Aber dann kann man ja einfach dafür zahlen.\u003c/p\u003e\n\u003ch2 id=\"das-für-immer-windows\"\u003eDas „für immer“ Windows\u003c/h2\u003e\n\u003cp\u003eWindows 10 war dann das „für immer“-Windows. Es sollte das letzte Windows sein und kontinuierlich weiterentwickelt werden. Das Bedienkonzept war nun wieder eher klassisch, aber an vielen Ecken wurden strategisch Dinge verschlechtert. Das Startmenü suchte nun nicht mehr nur Programme, sondern auch Dokumente und sogar online. Dementsprechend war es langsam und ungenau Die Tradition von vorinstallierter Fremdsoftware wurde weitergeführt mit Apps wie Candy Crush und LinkedIn, die sich automatisch nach der frischen Installation des Systems mitinstalliert haben.\u003c/p\u003e\n\u003cp\u003eDie „Verbesserungen“ kamen dann nach und nach: OneDrive wurde immer aggressiver angepriesen, Edge hat sich zum Standardbrowser gemacht, immer neue Apps kamen in die Startleiste, die niemand wollte, und vieles mehr. Jedes größere Update hat einige Verbesserungen und viele Verschlimmerungen mit sich gebracht.\u003c/p\u003e\n\u003ch2 id=\"windows-11-und-die-ki\"\u003eWindows 11 und die KI\u003c/h2\u003e\n\u003cp\u003eEin starkes Kippen der Stimmung gegenüber Microsoft war mit der Ankündigung von Windows 11 zu spüren. Das Windows, was eigentlich das für immer Windows sein sollte, würde ersetzt werden. Und dieses Mal durften viele PCs den Weg nicht mitgehen. Mit Windows 11 machte Microsoft TPM 2.0 und Secure Boot Pflicht Für viel ältere Hardware wäre dies das Ende. Aus der nachdrücklichen Einladung, das Microsoft-Konto zu nutzen, in Windows 10 wurde nun eine Pflicht. Natürlich ließ sich das Ganze mit ein paar Tricks umgehen, aber Microsoft macht schnell klar: „Das ist nicht mehr dein Betriebssystem, du bist nur noch Gast hier.“\u003c/p\u003e\n\u003cp\u003eDiese Mentalität wurde nur noch mehr ausgebaut und die Daumenschrauben angezogen. Wir alle waren müde, wir wollten unsere Computer doch einfach nur nutzen. Doch dann passierte das Unerwartete, was die Welt verändern sollte: ChatGPT.\u003c/p\u003e\n\u003cp\u003eDie Tore waren geöffnet, die Techkonzerne bekamen Angst und scheinbar über Nacht war KI das, was alles beherrschen sollte. Ab jetzt musste alles KI haben. KI-Chat, KI-Suche, KI-KI. Wenn es keine KI hatte, war es nicht gut. Je invasiver, je aufdringlicher, je unumgehbarer, desto besser KI in Windows, KI in Paint, KI in Word, KI in Excel, KI in Notepad. Nichts war mehr Sicht Ki sollte ab nun sogar unsere Spiele für uns spielen.\u003c/p\u003e\n\u003ch2 id=\"ein-ventil-für-den-frust\"\u003eEin Ventil für den Frust\u003c/h2\u003e\n\u003cp\u003eWährend Microsoft daran arbeitete, unseren Desktop immer mehr nach ihren Vorstellungen zu gestalten, werkelte eine kleine Firma namens Valve an ihrer eigenen Lösung. Mit dem Steam Deck brachten sie einen PC auf den Markt, in der Form erinnernd an eine übergewichtige Nintendo-Switch-Konsole. Die Hardware selbst war sehr interessant, aber der wirklich aufregende Teil war die Software. Das Besondere war, dass auf dem Gerät Linux lief.\u003c/p\u003e\n\u003cp\u003eMan muss hierbei sagen, dass Valve in der Vergangenheit schon einmal versucht hatte, eine Linux-Konsole auf den Markt zu bringen. Damals als Wohnzimmergerät konzipiert, war die Hoffnung, dass, wenn man mit gutem Beispiel vorangeht, die anderen Entwickler ihre Spiele auch für Linux herausbringen. Das passierte jedoch nicht.\u003c/p\u003e\n\u003cp\u003eAber Valve hatte daraus gelernt und hinter den Kulissen viel Geld und Zeit investiert, um Windows-Spiele auf Linux nicht nur lauffähig, sondern gut lauffähig zu machen. Das Steam Deck war der Beweis, dass es auch ohne Microsoft ging und dass das Mantra, dass man auf Linux keine Spiele spielen kann, von nun an falsch war. Natürlich war nicht alles von Anfang an perfekt. Aber der Grundstein war gelegt, die Infrastruktur war da und der Damm gebrochen.\u003c/p\u003e\n\u003ch2 id=\"die-perfekte-welle\"\u003eDie perfekte Welle\u003c/h2\u003e\n\u003cp\u003eSeit dem Verkaufsstart des Steam Decks hat sich einiges getan an der Spieleunterstützung und die meisten Titel laufen problemlos (manchmal sogar besser als unter Windows). Nur Anti-Cheat-Software macht noch Probleme. Valve hat noch mehr Hardware angekündigt, die auf Windows verzichtet. Dies, gepaart mit der steigenden Nervigkeit von Windows, hat viele Menschen nun davon überzeugt, Linux eine Chance zu geben. Und das ist eine tolle Nachricht für alle. Wenn Microsoft auf einmal mit einem kostenlosen Betriebssystem konkurrieren muss, das den Nutzer respektiert und ständig besser wird, kann das für keinen schlecht sein. Ich hoffe sehr auf das Jahr des Linux-Desktops. Es wird nicht immer einfach, denn nicht jeder möchte nur spielen und Linux hat noch viele Ecken und Kanten.\u003c/p\u003e\n\u003cp\u003eFür mich persönlich hat das Jahr des Linux-Desktops jedoch schon 2025 begonnen und ich kann nur davon profitieren, wenn mehr Menschen den Schritt mit mir gehen.\u003c/p\u003e\n",
      "date_published": "2026-01-03T00:00:00+00:00",
      "date_modified": "2026-01-28T19:37:25+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2023/07/04/das-fediverse-meta-und-threads/",
      "url": "https://staging.cperrin.xyz/2023/07/04/das-fediverse-meta-und-threads/",
      "title": "Das Fediverse, Meta und Threads",
      "summary": "\u003cp\u003eDas Fediverse wächst. Beflügelt von den Problemen bei Twitter und Reddit trauen sich immer mehr Nutzer nun auch auf alternative Plattformen. Besonders \u003ca href=\"https://joinmastodon.org\"\u003eMastodon\u003c/a\u003e, \u003ca href=\"https://join-lemmy.org\"\u003eLemmy\u003c/a\u003e und \u003ca href=\"https://kbin.pub\"\u003eKBin\u003c/a\u003e haben in der letzten Zeit einen explosionsartigen Anstieg von Nutzern erlebt. Dies lief natürlich nicht ohne Probleme ab, aber es zeigt zumindest, dass es vielleicht doch einen Weg gibt, den großen Firmen nicht alle Daten in den Rachen zu schmeißen.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/2023/07/04/das-fediverse-meta-und-threads/fediverse.png\" alt=\"Die vielen Zweige des Fediverse\"\u003e\u003c/p\u003e\n\u003cp\u003eMit dem \u003ca href=\"https://www.w3.org/TR/activitypub/\"\u003eActivityPub-Protokoll\u003c/a\u003e als Kleber zwischen allen Fediverse-Projekten sollte nun auch die Silobildung endlich beendet werden. Jeder kann mit jedem sprechen: Mastodon mit Pixelfed, Pleroma mit Peertube, Lemmy mit KBin. Die Grenzen zwischen den Projekten verschwimmen, auch wenn manchmal Content von einer Software in der Oberfläche einer anderen keinen Sinn macht. Doch hier beginnt das Problem.\u003c/p\u003e",
      "content_html": "\u003cp\u003eDas Fediverse wächst. Beflügelt von den Problemen bei Twitter und Reddit trauen sich immer mehr Nutzer nun auch auf alternative Plattformen. Besonders \u003ca href=\"https://joinmastodon.org\"\u003eMastodon\u003c/a\u003e, \u003ca href=\"https://join-lemmy.org\"\u003eLemmy\u003c/a\u003e und \u003ca href=\"https://kbin.pub\"\u003eKBin\u003c/a\u003e haben in der letzten Zeit einen explosionsartigen Anstieg von Nutzern erlebt. Dies lief natürlich nicht ohne Probleme ab, aber es zeigt zumindest, dass es vielleicht doch einen Weg gibt, den großen Firmen nicht alle Daten in den Rachen zu schmeißen.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/2023/07/04/das-fediverse-meta-und-threads/fediverse.png\" alt=\"Die vielen Zweige des Fediverse\"\u003e\u003c/p\u003e\n\u003cp\u003eMit dem \u003ca href=\"https://www.w3.org/TR/activitypub/\"\u003eActivityPub-Protokoll\u003c/a\u003e als Kleber zwischen allen Fediverse-Projekten sollte nun auch die Silobildung endlich beendet werden. Jeder kann mit jedem sprechen: Mastodon mit Pixelfed, Pleroma mit Peertube, Lemmy mit KBin. Die Grenzen zwischen den Projekten verschwimmen, auch wenn manchmal Content von einer Software in der Oberfläche einer anderen keinen Sinn macht. Doch hier beginnt das Problem.\u003c/p\u003e\n\u003ch2 id=\"meta-threads\"\u003eMeta Threads\u003c/h2\u003e\n\u003cp\u003eDenn auch bei den großen Konzernen stehen die Mühlen nicht still, auch wenn es manchmal so scheinen mag. So hat Meta (ehemals Facebook) sich entschieden, auch ein Teil der Fediverse-Revolution zu sein. Mit einem neuen Projekt, das nun den Namen \u003ca href=\"https://www.threads.net/\"\u003eThreads\u003c/a\u003e erhalten hat, will man sich an das Fediverse anbinden. Es soll wohl eine Art von Microblogging-Plattform wie Twitter oder Mastodon werden. Die Ankündigungen und Leaks wurden im Fediverse natürlich mit größter Vorfreude und Anerkennung aufgenommen. NICHT!\u003c/p\u003e\n\u003cp\u003eViele der Kritiker sahen sich an die von Microsoft geprägte Strategie \u0026ldquo;Embrace, Extend, Extinguish\u0026rdquo; erinnert. Dabei geht es darum, ein Projekt zuerst mit offenen Armen aufzunehmen um Nutzer anzuziehen, dann mit proprietären Erweiterungen auszustatten, die nicht mit dem Ursprünglichen kompatibel sind, und damit dann den Wettbewerber langsam aus dem Markt zu drängen, bis er ausgelöscht ist. Es ist nicht schwer zu sehen, wie Meta solch eine Strategie gegenüber dem Fediverse nutzen könnte.\u003c/p\u003e\n\u003cp\u003eAber die Kritiker gehen auch weiter. Wie wir alle spätestens nach dem Cambridge Analytica Skandal wissen, gibt es bei Meta erhebliche Probleme mit dem Datenschutz. Hinzu kommt, dass ihr primäres Geschäftsmodell darin besteht detaillierte Nutzerprofile zu erstellen und zu kapitalisieren. Und hier wird die Stärke des Fediverse zu einer möglichen Schwäche.\u003c/p\u003e\n\u003ch2 id=\"föderation-nicht-nur-bei-star-trek\"\u003eFöderation nicht nur bei Star Trek\u003c/h2\u003e\n\u003cp\u003eDas Problem lässt sich am einfachsten mit einem kleinen Exkurs zum Thema ActivityPub verstehen. Wie bereits am Anfang erwähnt, ist es das Protokoll was die Kommunikation zwischen den ganzen Fediverse Projekten ermöglicht. Sobald beispielweise eine Mastodon instanz wie mastodon.social ijre Nutzern erlaubt den Nutzern von anderen Instanzen zu folgen sowie umgekehrt, dann gilt dieser Server als föderiert. Dies gilt genau so für Gruppen, Communities, Magazines oder andere \u0026ldquo;Dinge\u0026rdquo; denen man folgen kann. Sobald nun ein Nutzer auf Instanz A einem Nutzer auf Instanz B folgt, werden alle öffentlichen Updates des Nutzers auf Instanz B an Instanz A geschickt und auf Instanz A gespeichert.\u003c/p\u003e\n\u003cp\u003eDer aufmerksame Leser mag nun hier das Problem entdeckt haben. Wenn ein Threads-Nutzer jetzt einem Nutzer auf einer Fediverse Instanz folgt, landen unweigerlich Daten von Fediverse-Nutzern auf Meta-Servern. Dies kann eingeschränkt werden, indem eine Instanz sich von Threads deföderiert, also die Kommunikation der Instanz mit Threads unterbindet. Viele Betreiber von Instanzen haben diesen Schritt auch schon angekündigt, während andere erst noch abwarten wollen. Die Meinungen sind auf jeden Fall gespalten.\u003c/p\u003e\n\u003ch2 id=\"alleine-meine-bits\"\u003eAlleine meine Bits!\u003c/h2\u003e\n\u003cp\u003eIch bin selbst nun auch nicht der allergrößte Fan von Meta und dem Rest aber ich muss sagen, dass ich die Panik als etwas fehlgerichtet ansehe. Ich bin natürlich auch nicht begeistert, dass meine Daten zu den großen Konzernen fließen, aber ich habe mich auch dazu entschieden diese Daten zu veröffentlichen. Eine Analogie dazu wäre sich auf einen Marktplatz zu stellen, um die eigene Meinung in die Welt zu schreien und sich dann zu ärgern, wenn jemand dies mitschreibt.\u003c/p\u003e\n\u003cp\u003eDas Konzept hat sich auch nicht verändert zu Facebook, Twitter \u0026amp; Co. Die Daten sind dort zwar in ihren eigenen Silos aber auch dort werden Daten an Werbepartner und Analysefirmen weitergeschickt, von öffentlichen Seiten abgegrast und anderweitig verarbeitet. Im Fediverse ist es nur offensichtlicher, dass die Daten weiter geschickt werden. Und das ist keine Kritik am Fediverse. Das ist das Kernprinzip des Fediverse.\u003c/p\u003e\n\u003ch2 id=\"social-private-media\"\u003eSocial Private Media\u003c/h2\u003e\n\u003cp\u003eWas ist nun die Lösung für das Problem. Meine Antwort: Es gibt keine. Zumindest nicht so wie viele das gerne hätten. Wir haben als Gesellschaft vergessen, dass es nicht immer gut ist sich auf den Marktplatz zu stellen und loszuschreien. Wir haben angefangen Unbekannten unsere Babyfotos zu zeigen, unseren Aufenthaltsort zu mitzuteilen, und unser innerstes preiszugeben. Alles, ohne uns wirklich klarzumachen, was die Implikationen davon sind. Teilweise waren sie uns verschleiert, teilweise haben wir sie ignoriert.\u003c/p\u003e\n\u003cp\u003eDie Probleme des Fediverse sind, genauso wie die Lösung, nicht neu. Wir müssen weniger über uns Preisgeben. Wir müssen uns bewusst sein, dass ein versendeter Toot genauso wie ein Instagram Post nach dem Absenden mehr in unserer Hand ist. Sie können verarbeitet, korreliert und zu einem persönlichen Profil gemacht werden. Dazu braucht es nicht einmal Threads von Meta. Das öffentliche Teilen von Daten ist inkompatibel mit einem Verlangen nach Kontrolle.\u003c/p\u003e\n\u003cp\u003eWir können versuchen die Rechte der Nutzer durch Gesetze zu stärken und die Verarbeitung von Daten schwerer zu machen, aber letztendlich bleibt auch ohne große böse Firmen eines gleich:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSocial Media ist nicht Private Media\u003c/strong\u003e\u003c/p\u003e\n",
      "date_published": "2023-07-04T00:00:00+00:00",
      "date_modified": "2023-07-04T18:44:11+02:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2021/09/16/neu-ist-immer-besser/",
      "url": "https://staging.cperrin.xyz/2021/09/16/neu-ist-immer-besser/",
      "title": "Neu ist immer besser (?)",
      "summary": "\u003cp\u003eIch muss etwas gestehen. Ich habe ein Problem. Ich bin mir nicht sicher, ob mein Problem einen Namen hat, also gebe ich ihm einen. Ich nenne es \u0026ldquo;Neoprogrammismus\u0026rdquo;. Was ist das? Nun am besten lässt sich das einer einem Beispiel klarmachen.\u003c/p\u003e\n\u003ch2 id=\"beispiel-1\"\u003eBeispiel 1\u003c/h2\u003e\n\u003cp\u003eIch kenne mich mittlerweile aus mehreren Projekten gut mit Python und Django aus bin aber mit JavaScript nicht so vertraut. Es gibt da ein neues Projekt, um APIs direkt aus dem Datenbankschema zu generieren, das komplett auf JavaScript setzt? Nehm ich!\u003c/p\u003e",
      "content_html": "\u003cp\u003eIch muss etwas gestehen. Ich habe ein Problem. Ich bin mir nicht sicher, ob mein Problem einen Namen hat, also gebe ich ihm einen. Ich nenne es \u0026ldquo;Neoprogrammismus\u0026rdquo;. Was ist das? Nun am besten lässt sich das einer einem Beispiel klarmachen.\u003c/p\u003e\n\u003ch2 id=\"beispiel-1\"\u003eBeispiel 1\u003c/h2\u003e\n\u003cp\u003eIch kenne mich mittlerweile aus mehreren Projekten gut mit Python und Django aus bin aber mit JavaScript nicht so vertraut. Es gibt da ein neues Projekt, um APIs direkt aus dem Datenbankschema zu generieren, das komplett auf JavaScript setzt? Nehm ich!\u003c/p\u003e\n\u003ch2 id=\"beispiel-2\"\u003eBeispiel 2\u003c/h2\u003e\n\u003cp\u003eJavaScript ist mir zwar nicht so geläufig aber CSS mag ich gerne. Um mein Leben dennoch zu erleichtern und best practices besser zu folgen, entscheide ich mich für ein CSS Framework. Nun gibt es in diesem Bereich eine Menge etablierte Frameworks, aber ich habe in einem Artikel kürzlich so mit dem halben Hirn gelesen, dass es da ein neues schlankes Framework gibt. Nimm lieber das!\u003c/p\u003e\n\u003ch2 id=\"was-ich-damit-sagen-will\"\u003eWas ich damit sagen will\u0026hellip;\u003c/h2\u003e\n\u003cp\u003eNeoprogrammismus kann uns alles betreffen denn die wenigsten von uns ist immun vor dem neusten \u0026ldquo;bling\u0026rdquo;. Es ist oft verlockend für das neue Projekt das neuste und \u0026ldquo;tollste\u0026rdquo; zu nutzen. Das muss auch nicht unbedingt etwas Schlechtes sein. Neue projekte machen manchmal Dinge besser oder haben eine Chance länger in der Zukunft noch Support zu erhalten.\u003c/p\u003e\n\u003cp\u003eMan darf aber dabei nicht vergessen, dass es möglicherweise einen Grund gibt, dass \u0026ldquo;älter Projekte\u0026rdquo; noch da sind und aktiv entwickelt werden. Es gibt möglicherweise auch gute Gründe, dass diese Projekte so funktionieren wie sie funktionieren. Dazu kommt noch, dass es mehr Zeit gab um ein Ökosystem darum zu bauen.\u003c/p\u003e\n\u003cp\u003eDie wichtigste Frage die ich mir stelle um, meinen Neoprogrammismus zu besiegen ist, ob ich etwas nur benutzen will, weil es neu oder trendy ist.\u003c/p\u003e\n",
      "date_published": "2021-09-16T00:00:00+00:00",
      "date_modified": "2022-02-03T19:01:24+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2020/02/20/neues-design-f%C3%BCr-den-blog/",
      "url": "https://staging.cperrin.xyz/2020/02/20/neues-design-f%C3%BCr-den-blog/",
      "title": "Neues Design für den Blog",
      "summary": "\u003cp\u003eDie Zeit der heruntergeladenen und angepassten Designs ist vorbei. Mein erstes eigenes Design erblickt das Licht der Welt. Ich nenne es cperrin-hugo-theme. Poetisch, oder?\u003c/p\u003e\n\u003cp\u003eAber das ist nicht das einzige neue. Ich habe mir ein eigenes, brandheißes und ultrakreatives Logo ausgedacht, um die Massen zum kreischen zu bringen.\u003c/p\u003e",
      "content_html": "\u003cp\u003eDie Zeit der heruntergeladenen und angepassten Designs ist vorbei. Mein erstes eigenes Design erblickt das Licht der Welt. Ich nenne es cperrin-hugo-theme. Poetisch, oder?\u003c/p\u003e\n\u003cp\u003eAber das ist nicht das einzige neue. Ich habe mir ein eigenes, brandheißes und ultrakreatives Logo ausgedacht, um die Massen zum kreischen zu bringen.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/2020/02/20/neues-design-f%C3%BCr-den-blog/logo.png\" alt=\"Neues Logo\"\u003e\u003c/p\u003e\n\u003cp\u003eMacht die Arbeit Sinn, wenn man bedenkt, wie viele Einträge ich seit Beginn des Blogs geschrieben habe? Ganz sicher nicht! Hat es Spaß gemacht? Joa. War es eine gute Möglichkeit nicht das zu tun, was ich tun sollte? Auf jeden Fall!!\u003c/p\u003e",
      "date_published": "2020-02-20T00:00:00+00:00",
      "date_modified": "2022-02-05T10:42:24+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2017/09/08/ansible-devops-leicht-gemacht/",
      "url": "https://staging.cperrin.xyz/2017/09/08/ansible-devops-leicht-gemacht/",
      "title": "Ansible: DevOps leicht gemacht",
      "summary": "\u003cp\u003eDas Problem ist schon etwas älter: Eine größere Anzahl von Servern muss auf aufgesetzt oder Homogenisiert werden am besten mit wenig Aufwand. Diese Problem wurde nun schon mehrfach gelöst. Sogenannte Orchestrierungs-Tools führen anhand von vordefinierten Anweisungen bestimmte Befehle auf mehreren System aus.\u003c/p\u003e\n\u003cp\u003eBeispiele für solche Tools sind \u003ca href=\"https://puppet.com/\"\u003ePuppet\u003c/a\u003e, \u003ca href=\"https://www.chef.io/\"\u003eChef\u003c/a\u003e oder \u003ca href=\"https://cfengine.com/\"\u003eCFEngine\u003c/a\u003e. Doch vor diese Vertreter haben für mich einen großen Nachteil: Sie benötigen für die Ausführung einen Client der auf der Gegenseite installiert werden muss.\u003c/p\u003e\n\u003cp\u003eHier kommt \u003ca href=\"https://www.ansible.com/\"\u003eAnsible\u003c/a\u003e ins Bild. Ansible nutzt für die Ausführung der Skripte oder Playbooks auf den Clients lediglich eine SSH-Verbindung.\u003c/p\u003e",
      "content_html": "\u003cp\u003eDas Problem ist schon etwas älter: Eine größere Anzahl von Servern muss auf aufgesetzt oder Homogenisiert werden am besten mit wenig Aufwand. Diese Problem wurde nun schon mehrfach gelöst. Sogenannte Orchestrierungs-Tools führen anhand von vordefinierten Anweisungen bestimmte Befehle auf mehreren System aus.\u003c/p\u003e\n\u003cp\u003eBeispiele für solche Tools sind \u003ca href=\"https://puppet.com/\"\u003ePuppet\u003c/a\u003e, \u003ca href=\"https://www.chef.io/\"\u003eChef\u003c/a\u003e oder \u003ca href=\"https://cfengine.com/\"\u003eCFEngine\u003c/a\u003e. Doch vor diese Vertreter haben für mich einen großen Nachteil: Sie benötigen für die Ausführung einen Client der auf der Gegenseite installiert werden muss.\u003c/p\u003e\n\u003cp\u003eHier kommt \u003ca href=\"https://www.ansible.com/\"\u003eAnsible\u003c/a\u003e ins Bild. Ansible nutzt für die Ausführung der Skripte oder Playbooks auf den Clients lediglich eine SSH-Verbindung.\u003c/p\u003e\n\u003cp\u003eDer beste Weg um die Einfachheit von Ansible zu demonstrieren ist ein kleines Beispiel, in dem eine Liste von Paketen über apt installiert wird. Zuerst legen wir die Grundstruktur an\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir ansible\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ansible\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlso nächstes müssen wir ein inventory anlegen, welches eine Liste von Servern und Gruppen ist, auf denen die Playbooks ausgeführt werden.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ansible/inventory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[group1]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eserver1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eserver2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eserver3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIn diesem Beispiel haben wir einen Gruppe namens \u003ccode\u003egroup1\u003c/code\u003e welche die Server 1-3 enthält.\u003c/p\u003e\n\u003cp\u003eAls nächstes müssen wir ein Playbook anlegen welches die Anweisungen für Ansible beinhaltet\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ansible/site.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ehosts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eall                \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Server wählen\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebecome\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003eyes\u003c/span\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"c\"\u003e# also sudo ausführen\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e                     \u003c/span\u003e\u003cspan class=\"c\"\u003e# Liste von Tasks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall packages\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Name für den Task\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eapt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e                   \u003c/span\u003e\u003cspan class=\"c\"\u003e# APT-Modul nutzen\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ items }}\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Name des Pakets.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epresent      \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Status des Pakets\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith_items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c\"\u003e# Loop mit einer Liste. Füllt {{ items }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogram1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogram2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogram3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDieses Playbook installiert die Programme \u003ccode\u003epropgram1-3\u003c/code\u003e über apt.\u003c/p\u003e\n\u003cp\u003eUm dies Playbook müssen wir nur noch ausführen mit\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eansible-playbook site.yml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFalls man keine SSH-Key Authentifizierung ingerichtet hat muss man noch die Option \u003ccode\u003e-k\u003c/code\u003e anhängen. Um sich mit einem anderen Nutzer als dem momentan angemeldeten Nutzer zu authentifizieren muss die Option \u003ccode\u003e-u \u0026lt;username\u0026gt;\u003c/code\u003e genutzt werden.\u003c/p\u003e\n\u003cp\u003eDas war auch schon alles. Ansible sollte sich nun per SSH mit allen Servern verbinden und die gelisteten Pakete installieren. Falls die Pakete schon installiert sind wird Ansible diese einfach überspringen.\u003c/p\u003e\n\u003cp\u003eAnsible hat mittlerweile eine \u003ca href=\"https://docs.ansible.com/ansible/latest/collections/index.html\"\u003eriesige Anzahl von Modulen\u003c/a\u003e zur Auswahl die es einem ermöglichen Ansible in unterschiedlichsten Anwendungsfällen zu nutzen.\u003c/p\u003e",
      "date_published": "2017-09-08T00:00:00+00:00",
      "date_modified": "2022-02-05T14:54:41+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2017/01/02/seafile-owncloud-nur-besser/",
      "url": "https://staging.cperrin.xyz/2017/01/02/seafile-owncloud-nur-besser/",
      "title": "Seafile: OwnCloud, nur besser",
      "summary": "\u003cp\u003eWer meine \u003ca href=\"https://staging.cperrin.xyz/2012/08/13/owncloud-dropbox-zum-selber-hosten/\"\u003eBeitrag zu Owncloud\u003c/a\u003e gelesen hat, wird wissen, dass ich danach strebe meine Daten, nach möglichkeit nicht bei Dropbox\u0026amp;Co abzulegen. In der vergangenheit war OwnCloud da die beste und einfachste Lösung, aber seit einiger Zeit nun gibt es eine alternative die sich sehen lassen kann: \u003ca href=\"https://seafile.com\"\u003eSeafile\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSeafile bietet kostenlose Sync Clients für jede gängige Plattform an (Windows, Linux, macOS, Android, iOS).\u003c/p\u003e\n\u003cp\u003eIm Hintergrund arbeitet die, in Python geschriebene, Anwendung in zwei Teilen. Die \u003ccode\u003eseafile\u003c/code\u003e Anwendung, steuert das Speichern und Synchronisieren der der Daten. Hierbei wird ein Dateisystem auf der Basis von git genutzt, was bedeutet, dass Standardmäßig alle Dateien versioniert sind. Der andere teil ist der \u003ccode\u003eseahub\u003c/code\u003e, der die Weboberfläche zu Seafile bietet.\u003c/p\u003e",
      "content_html": "\u003cp\u003eWer meine \u003ca href=\"https://staging.cperrin.xyz/2012/08/13/owncloud-dropbox-zum-selber-hosten/\"\u003eBeitrag zu Owncloud\u003c/a\u003e gelesen hat, wird wissen, dass ich danach strebe meine Daten, nach möglichkeit nicht bei Dropbox\u0026amp;Co abzulegen. In der vergangenheit war OwnCloud da die beste und einfachste Lösung, aber seit einiger Zeit nun gibt es eine alternative die sich sehen lassen kann: \u003ca href=\"https://seafile.com\"\u003eSeafile\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSeafile bietet kostenlose Sync Clients für jede gängige Plattform an (Windows, Linux, macOS, Android, iOS).\u003c/p\u003e\n\u003cp\u003eIm Hintergrund arbeitet die, in Python geschriebene, Anwendung in zwei Teilen. Die \u003ccode\u003eseafile\u003c/code\u003e Anwendung, steuert das Speichern und Synchronisieren der der Daten. Hierbei wird ein Dateisystem auf der Basis von git genutzt, was bedeutet, dass Standardmäßig alle Dateien versioniert sind. Der andere teil ist der \u003ccode\u003eseahub\u003c/code\u003e, der die Weboberfläche zu Seafile bietet.\u003c/p\u003e\n\u003cp\u003eAus meiner Sicht hat Seafile den großen vorteil, dass es nicht in PHP geschrieben ist. Man muss PHP sehr quälen um ihm eine funktionalität wie OwnCloud zu entlocken. Das macht sich in der Performanz bemerkbar. Ebenso ist die Trennung von der Weboberfläche und des Sync-Servers vorteilhaft. Sync-Clients sprechen direkt mit dem Sync-Server und die Webseiteite ist nur ein weiterer Sync-Client.\u003c/p\u003e\n",
      "date_published": "2017-01-02T00:00:00+00:00",
      "date_modified": "2019-02-04T13:29:08+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2016/05/19/umzug-auf-hugo-und-neue-domain/",
      "url": "https://staging.cperrin.xyz/2016/05/19/umzug-auf-hugo-und-neue-domain/",
      "title": "Umzug auf Hugo und neue Domain",
      "summary": "\u003cp\u003eIch habe jetzt lange einen Wordpress Blog gehütet und selten etwas gepostet. Dabei ist immer wieder aufgefallen, wie langsam Wordpress doch ist. Außerdem benötige ich PHP und eine Datenbank um alles am laufen zu halten. Dies, gekoppelt mit der Tatsache, dass es immer wieder Sicherheitslücken in Wordpress gab, hat mich dazu gebracht eine Alternative zu suchen.\u003c/p\u003e\n\u003cp\u003eDa ich nicht viel Dynamik in meiner Webseite brauche, habe ich mich nach einem Generator für statische Seiten umgesehen und bin dabei auf \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e gestoßen.\u003c/p\u003e",
      "content_html": "\u003cp\u003eIch habe jetzt lange einen Wordpress Blog gehütet und selten etwas gepostet. Dabei ist immer wieder aufgefallen, wie langsam Wordpress doch ist. Außerdem benötige ich PHP und eine Datenbank um alles am laufen zu halten. Dies, gekoppelt mit der Tatsache, dass es immer wieder Sicherheitslücken in Wordpress gab, hat mich dazu gebracht eine Alternative zu suchen.\u003c/p\u003e\n\u003cp\u003eDa ich nicht viel Dynamik in meiner Webseite brauche, habe ich mich nach einem Generator für statische Seiten umgesehen und bin dabei auf \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e gestoßen.\u003c/p\u003e\n\u003cp\u003eHugo ist eine in Go geschrieben Anwendung, die aus Markdown-Dateien und Templates statische HTML-Dateien generiert. Diese liefere ich nur noch mit einem Nginx aus und habe einen schönen Blog ohne PHP und MySQL. Dank Disqus muss ich nicht einmal auf eine Kommentar-Funktion verzichten.\u003c/p\u003e\n\u003cp\u003eUm mir mein Leben noch etwas leichter zu machen Benutze ich \u003ca href=\"https://gogs.io\"\u003eGogs\u003c/a\u003e und \u003ca href=\"https://drone.io/\"\u003eDrone.io\u003c/a\u003e um meinen Blog automatisch bauen und auf den Server kopieren zu lassen. Dazu benutze ich folgende \u003ccode\u003e.drone.yml\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebuild:\r\n  production:\r\n    image: publysher/hugo\r\n    commands:\r\n      - hugo --destination=\u0026lt;production_source\u0026gt;\r\n    when:\r\n      branch: master\r\n  staging:\r\n    image: publysher/hugo\r\n    commands:\r\n      - hugo --destination=\u0026lt;staging_source\u0026gt; --buildDrafts=true --buildFuture=true --baseUrl=\u0026lt;staging_url\u0026gt;\r\n\r\npublish:\r\n  rsync:\r\n    host: \u0026lt;server\u0026gt;\r\n    user: \u0026lt;user\u0026gt;\r\n    source: \u0026lt;staging_source\u0026gt;\r\n    target: \u0026lt;staging_target\u0026gt;\r\n    recursive: true\r\n  rsync:\r\n    host: \u0026lt;server\u0026gt;\r\n    user: \u0026lt;user\u0026gt;\r\n    source: \u0026lt;production_source\u0026gt;\r\n    target: \u0026lt;production_target\u0026gt;\r\n    recursive: true\r\n    when:\r\n      branch: master\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDas sorgt dafür, dass jeder push in mein Gogs repo, eine build auslöst und eine Produnktions- und ein Staging-Version auf den Server lädt. Ist ja fast schon Magie.\u003c/p\u003e\n\u003cp\u003eUm das ganz noch abzurunden, habe ich mir eine neue und persönlichere Domain besorgt. Mein Blog wird zukünftig unter \u003ca href=\"https://cperrin.xyz\"\u003ehttps://cperrin.xyz\u003c/a\u003e zu finden zu sein\u003c/p\u003e",
      "date_published": "2016-05-19T00:00:00+00:00",
      "date_modified": "2022-02-03T18:43:53+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2016/05/13/pammysqltools-libnss-mysql-und-pam-mysql-user-%C3%BCber-die-shell-verwalten/",
      "url": "https://staging.cperrin.xyz/2016/05/13/pammysqltools-libnss-mysql-und-pam-mysql-user-%C3%BCber-die-shell-verwalten/",
      "title": "PAMMySQLTools: libnss-mysql und pam-mysql user über die shell verwalten",
      "summary": "\u003cp\u003eDurch meine Arbeit stand ich vor dem Problem, dass wir Nutzer Zentral über MySQL authentifizieren wollten. Dies ist an sich kein Problem dank \u003cem\u003elibnss-mysql\u003c/em\u003e und \u003cem\u003epam-mysql\u003c/em\u003e, doch leider mangelt es an Programmen um die Nutzer sinnvoll zu verwalten.\u003c/p\u003e\n\u003cp\u003eDeshalb habe ich nun Tools dafür geschrieben die die Linuxprogramme \u003ccode\u003euser{add,mod,del}\u003c/code\u003e und \u003ccode\u003egroup{add,mod,del}\u003c/code\u003e imitieren und diese als \u003ca href=\"https://github.com/cperrin88/PAMMySQLTools\"\u003ePAMMySQLTools\u003c/a\u003e auf \u003ca href=\"https://pypi.python.org/pypi/PAMMySQLTools\"\u003ePyPI\u003c/a\u003e veröffentlicht.\u003c/p\u003e",
      "content_html": "\u003cp\u003eDurch meine Arbeit stand ich vor dem Problem, dass wir Nutzer Zentral über MySQL authentifizieren wollten. Dies ist an sich kein Problem dank \u003cem\u003elibnss-mysql\u003c/em\u003e und \u003cem\u003epam-mysql\u003c/em\u003e, doch leider mangelt es an Programmen um die Nutzer sinnvoll zu verwalten.\u003c/p\u003e\n\u003cp\u003eDeshalb habe ich nun Tools dafür geschrieben die die Linuxprogramme \u003ccode\u003euser{add,mod,del}\u003c/code\u003e und \u003ccode\u003egroup{add,mod,del}\u003c/code\u003e imitieren und diese als \u003ca href=\"https://github.com/cperrin88/PAMMySQLTools\"\u003ePAMMySQLTools\u003c/a\u003e auf \u003ca href=\"https://pypi.python.org/pypi/PAMMySQLTools\"\u003ePyPI\u003c/a\u003e veröffentlicht.\u003c/p\u003e\n\u003ch1 id=\"installation\"\u003eInstallation\u003c/h1\u003e\n\u003cp\u003eDank \u003ccode\u003epip\u003c/code\u003e muss man nur den Befehl\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip install pammysqltools\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ebzw\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip3 install pammysqltools\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eausführen um die Tools zu installieren. Dadurch, werden folgende Programme installiert:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emyuseradd\u003c/li\u003e\n\u003cli\u003emyusermod\u003c/li\u003e\n\u003cli\u003emyuserdel\u003c/li\u003e\n\u003cli\u003emygroupadd\u003c/li\u003e\n\u003cli\u003emygroupmod\u003c/li\u003e\n\u003cli\u003emygroupdel\u003c/li\u003e\n\u003cli\u003emyimportusers\u003c/li\u003e\n\u003cli\u003emyimportgroups\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDie \u003ccode\u003emyuser*\u003c/code\u003e und \u003ccode\u003emygroup*\u003c/code\u003e Tools sind größtenteils nach dem Vorbild der Linuxprogramme aufgebaut und verhalten sich größtenteils gleich.\u003c/p\u003e\n\u003cp\u003eDie Tools \u003ccode\u003emyimportusers\u003c/code\u003e und \u003ccode\u003emyimportgroups\u003c/code\u003e importieren die Benutzer aus der \u003ccode\u003e/etc/passwd\u003c/code\u003e und \u003ccode\u003e/etc/groups\u003c/code\u003e bzw. \u003ccode\u003e/etc/shadow\u003c/code\u003e und \u003ccode\u003e/etc/gshadow\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFür eine Übersicht die Argumente kann einfach \u003ccode\u003e--help\u003c/code\u003e angehangen werden.\u003c/p\u003e\n\u003cp\u003eBeispiel: myuseradd\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ myuseradd --help\nUsage: myuseradd [OPTIONS] LOGIN\n\nOptions:\n  -b, --basedir BASE_DIR          base directory for the home directory of the\n                                  new account\n  -c, --comment COMMENT           GECOS field of the new account\n  -d, --home-dir HOME_DIR         home directory of the new account\n  -e, --expiredate EXPIRE_DATE    expiration date of the new account\n  -f, --inactive INACTIVE         password inactivity period of the new\n                                  account\n  -g, --gid GROUP                 name or ID of the primary group of the new\n                                  account\n  -G, --groups GROUPS             list of supplementary groups of the new\n                                  account\n  -k, --skel SKEL_DIR             use this alternative skeleton directory\n  -K, --key KEY=VALUE             override /etc/login.defs defaults\n  -M, --no-create-home / -m, --create-home\n                                  do not create the user\u0026#39;s home directory\n  -U, --no-user-group / -N, --user-group\n                                  do not create a group with the same name as\n                                  the user\n  -o, --non-unique                allow to create users with duplicate (non-\n                                  unique) UID\n  -p, --password PASSWORD         encrypted password of the new account\n  -r, --system                    create a system account\n  -s, --shell SHELL               login shell of the new account\n  -u, --uid UID                   user ID of the new account\n  --config CONF_PATH              path to the config file for this tool\n  --help                          Show this message and exit.\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"konfiguration\"\u003eKonfiguration\u003c/h1\u003e\n\u003cp\u003eUm die Verbindung zur Datenbank und die Benennung der Tabellen und Spalten anzupassen muss die Datein \u003ccode\u003e/etc/pam_mysql_manager.conf\u003c/code\u003e nach \u003ca href=\"https://github.com/cperrin88/PAMMySQLTools/blob/master/conf/pam_mysql_manager.conf\"\u003ediesem Schema\u003c/a\u003e angelegt werden. Alternativ kann der Pfad zur Konfigurationsdateien auch mit dem argument \u003ccode\u003e--config\u003c/code\u003e übergeben werden. Für alle Optionen die hierbei nicht angegeben werden, sind die Werte in der Beispieldatei der Defaultwert.\u003c/p\u003e\n\u003cp\u003eSobald alles eingestellt wurde kann es los gehen.\u003c/p\u003e\n\u003ch1 id=\"beispiele\"\u003eBeispiele\u003c/h1\u003e\n\u003cp\u003eBenutzer anlegen:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ myuseradd testuser\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eShell ändern:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ myusermod -s /bin/zsh testuser\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGruppen ohne passwörter importieren:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ mygroupimport -i\n\u003c/code\u003e\u003c/pre\u003e",
      "date_published": "2016-05-13T00:00:00+00:00",
      "date_modified": "2019-02-04T13:29:08+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2012/12/21/carp-haproxy-high-availability-f%C3%BCr-anf%C3%A4nger/",
      "url": "https://staging.cperrin.xyz/2012/12/21/carp-haproxy-high-availability-f%C3%BCr-anf%C3%A4nger/",
      "title": "CARP \u0026 HAProxy: High-Availability für Anfänger",
      "summary": "\u003cp\u003eDas Themengebiet der High-Availability im Webbereich ist oft kompliziert, groß, und schwer zu fassen. Das muss es aber nicht sein, dank CARP und HAProxy. Die Verbindung dieser beiden Techniken ermöglicht es anfragen auf mehrere Server zu verteilen und dabei das Single-Point-of-Failure Problem zu umgehen. Dafür brauchen wir nur mindestens 2 Rechner mit FreeBSD (oder einem anderen BSD System mit CARP unterstütung), die im gleichen Subnetz stehen und etwas Zeit zur Einrichtung folgender Software:\u003c/p\u003e",
      "content_html": "\u003cp\u003eDas Themengebiet der High-Availability im Webbereich ist oft kompliziert, groß, und schwer zu fassen. Das muss es aber nicht sein, dank CARP und HAProxy. Die Verbindung dieser beiden Techniken ermöglicht es anfragen auf mehrere Server zu verteilen und dabei das Single-Point-of-Failure Problem zu umgehen. Dafür brauchen wir nur mindestens 2 Rechner mit FreeBSD (oder einem anderen BSD System mit CARP unterstütung), die im gleichen Subnetz stehen und etwas Zeit zur Einrichtung folgender Software:\u003c/p\u003e\n\u003ch1 id=\"haproxy\"\u003eHAProxy\u003c/h1\u003e\n\u003cp\u003eHAProxy ist ein Reverse TCP Proxy mit Load-Balancing Funktionalität. Er verteilt die Last auf mehrere (Backend-)Server und erkennt wenn einer von ihnen nicht mehr erreichbar ist. HAProxy kann sowohl für das Balancing von MySQL-Anfragen als auch für HTTP-Requests genutzt werden. Ich konzentriere mich hier ausschließlich auf das letztere.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDie Installation erfolgt am einfachsten über den Ports-Tree\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/ports/net/haproxy\nmake install clean\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDies kompiliert und installiert HAProxy auf dem System.\u003c/p\u003e\n\u003ch2 id=\"konfiguration\"\u003eKonfiguration\u003c/h2\u003e\n\u003cp\u003eDie Konfigurationsdatei für HAProxy liegt unter \u003ccode\u003e/usr/local/etc/haproxy.conf\u003c/code\u003e. Ein Ansatzpunkt für eine funktionierende Konfiguration könnte folgendes sein\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003eglobal\n        daemon\n        maxconn 256\n\ndefaults\n        mode http\n        timeout connect 5000ms\n        timeout client 5000ms\n        timeout server 5000ms\n        stats enable\n\nfrontend http-in\n        option httplog\n        log global\n        default_backend servers\n\nbackend servers\n        server server1 server1.example.com:8080 check\n        server server2 server2.example.com:8080 check\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"carp\"\u003eCARP\u003c/h1\u003e\n\u003cp\u003eCARP steht für \u0026ldquo;Common Address Redundancy Protocol\u0026rdquo;. Es ermöglicht, dass wenn ein eine IP-Adresse nicht mehr erreichbar ist, automatisch von einem anderen Host übernommen werden kann. Voraussetzung hierfür ist, dass alle Computer im gleichen Netzwerksegment stehen, da CARP via Broadcast arbeitet.\u003c/p\u003e\n\u003ch2 id=\"installation-1\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eAb FreeBSD 9.0 ist CARP standardmäßig aktiviert. Bei älteren Versionen muss entweder der Support in den Kernel einkompiliert werden oder das Kernelmodul aktiviert werden mit dem Eintrag.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003eif_carp_load=\u0026#34;YES\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ein der Datei \u003ccode\u003e/boot/loader.conf\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"konfigurationsdateien\"\u003eKonfigurationsdateien\u003c/h2\u003e\n\u003cp\u003eDie Konfiguration von CARP ist relativ simpel. Als erstes wird ein Master-Server Konfiguriert. Dieser hält standardmäßig die IP.\u003c/p\u003e\n\u003cp\u003eDafür müssen wir ein CARP Interface erstellen un konfigurierten. Im Laufenden Betrieb nutzen wir dafür\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eifconfig carp0 create\nifconfig vhid 1 pass \u0026lt;passwort\u0026gt; 10.10.0.1/16\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDas Passwort und die vhid-Nummer müssen auf allen Backup-Systemen gleich sein. Damit diese Konfiguration auch bei einem Neustart noch funktioniert, ergänzen wir die \u003ccode\u003e/etc/rc.conf\u003c/code\u003e um folgende Zeilen\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003ecloned_interfaces=\u0026#34;carp0\u0026#34;\nifconfig_carp0=\u0026#34;vhid 1 pass \u0026lt;passwort\u0026gt; 10.10.0.1/16\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAuf den Backup-Systemen wird das CARP-Interface auf ähnlich weise erstellt nur, dass das Argument \u0026ldquo;adskew\u0026rdquo; eingefügt wird:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003ecloned_interfaces=\u0026#34;carp0\u0026#34;\nifconfig_carp0=\u0026#34;vhid 1 advskew 100 pass \u0026lt;passwort\u0026gt; 10.10.0.1/16\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eJe höher der Wert hinter \u0026ldquo;advskew\u0026rdquo; desto niedriger die Priorität falls das Haupt-System ausfällt.\u003c/p\u003e",
      "date_published": "2012-12-21T00:00:00+00:00",
      "date_modified": "2020-02-20T15:48:59+01:00"
    },
    {
      "id": "https://staging.cperrin.xyz/2012/08/13/owncloud-dropbox-zum-selber-hosten/",
      "url": "https://staging.cperrin.xyz/2012/08/13/owncloud-dropbox-zum-selber-hosten/",
      "title": "Owncloud: Dropbox zum selber hosten",
      "summary": "\u003cp\u003eDropbox ist einer der praktischsten Werkzeuge die mir bei meiner Täglichen Arbeit helfen. Ob nun Daten einfach nur synchronisieren oder sogar mit anderen Teilen. Mit ein paar Clicks ist das möglich.\u003c/p\u003e\n\u003cp\u003eLeider hat das ganze einen gravierenden Nachteil: Meine Daten liegen nicht mehr bei mir! Zwar werden die Daten in Dropbox laut eigener Aussage verschlüsselt, trotzdem kann man sich NIE sicher sein was mit eigenen Daten geschehen mag.\u003c/p\u003e\n\u003cp\u003eFür dieses Dilemma gibt es nun eine Lösung: \u003ca href=\"http://owncloud.org/\"\u003eOwncloud\u003c/a\u003e\u003c/p\u003e",
      "content_html": "\u003cp\u003eDropbox ist einer der praktischsten Werkzeuge die mir bei meiner Täglichen Arbeit helfen. Ob nun Daten einfach nur synchronisieren oder sogar mit anderen Teilen. Mit ein paar Clicks ist das möglich.\u003c/p\u003e\n\u003cp\u003eLeider hat das ganze einen gravierenden Nachteil: Meine Daten liegen nicht mehr bei mir! Zwar werden die Daten in Dropbox laut eigener Aussage verschlüsselt, trotzdem kann man sich NIE sicher sein was mit eigenen Daten geschehen mag.\u003c/p\u003e\n\u003cp\u003eFür dieses Dilemma gibt es nun eine Lösung: \u003ca href=\"http://owncloud.org/\"\u003eOwncloud\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOwncloud ist eine Open Source PHP-Anwendung um einen eigenen Dropbox ähnlichen Service anzubieten. Mit Owcloud ist es ein leichtes die volle Kontrolle über seine Daten zu behalten ohne einen großen Mehraufwand.\u003c/p\u003e\n\u003cp\u003eDie Installation ist Kinder leicht und benötigt nicht einmal zwingend die Installation eines MySQL-Servers. Standardmäßig wird SQLite verwendet. Die Installation lässt sich in zwei einfache Schritte aufteilen:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWebserver-Konfiguration: Dafür gibt es auf der Owncloud-Website für viele Server vorlagen\u003c/li\u003e\n\u003cli\u003eOwncloud Setup: Das Setup von Owncloud besteht aus EINER Seite. Man muss lediglich einen Admin-Account anlegen und nach Wunsch einen MySQL server angeben.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eFertig!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMittlerweile gibt es auch für fast jede Plattform (Linux, Mac, Windows, Andoid, iOS) einen Sync-Client.\u003c/p\u003e\n\u003cp\u003eOwncloud will jedoch mehr sein als ein einfacher Dropbox-Ersatz. Hier ein paar Features:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eKalender\u003c/li\u003e\n\u003cli\u003eMusic Player für abgelegte Musik\u003c/li\u003e\n\u003cli\u003eKontakte\u003c/li\u003e\n\u003cli\u003eBildergalerie\u003c/li\u003e\n\u003cli\u003eVerschlüsselung der Dateien auf dem Server\u003c/li\u003e\n\u003cli\u003eEinbindung von Dropbox, GDrive, usw. in die eigene Owncloud\u003c/li\u003e\n\u003cli\u003eAmpache/WebDAV/CalDAV/CardDAV-Server\u003c/li\u003e\n\u003cli\u003ePlugin-Schnittstelle\u003c/li\u003e\n\u003cli\u003eLDAP-Auth\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOwncloud ist auf jeden Fall einen Blick wert und ist mittlerweile eine wirklich brauchbare Alternative zu Dropbox und Co.\u003c/p\u003e",
      "date_published": "2012-08-13T00:00:00+00:00",
      "date_modified": "2020-02-20T15:48:59+01:00"
    }
  ]
}
