planet.debianforum.de

der Planet der debianforum.de-Benutzer

Zum Inhalt


 
 
 

20.03.2023

Joerg Kastning (Tronde)

Ansible: Seafile Professional Edition in Rootless-Podman-Umgebung bereitstellen

Wer diesen Blog regelmäßig liest, kann den Eindruck gewinnen, es sei mein Hobby, Ansible-Rollen zu schreiben, mit denen von mir genutzte Web-Anwendungen auf Servern bereitgestellt werden können. Dieses Mal habe ich es mit Seafile getan und möchte in diesem Beitrag darüber berichten.

Was ist Seafile?

Seafile ist eine Sync&Share- bzw. Private-Cloud-Lösung ähnlich wie Nextcloud, ownCloud oder TeamDrive. Auf mich erweckt Seafile den Eindruck, als wenn der Schwerpunkt jedoch auf der Synchronisation und dem Teilen von Dateien liegt und damit genau meinem Suchmuster entspricht.

Seafile gibt es in einer Community und einer Professional Edition. Die Professional Edition darf mit bis zu drei Benutzern kostenlos verwendet werden.

Für weiterführende Informationen wird auf die Seiten des Herstellers und den Wikipedia-Artikel verwiesen.

Was ist das Ziel?

Nun, es gibt nicht das eine Ziel. Ich habe mit diesem kleinen Wochenendprojekt folgende Ziele verfolgt:

  • Beschäftige dich mit Ansible.
  • Beschäftige dich mit der Collection Containers.Podman.
  • Beschäftige dich mit rootless Podman.
  • Deploye Seafile Professional Edition in einer rootless-Podman-Umgebung, um es als Sync&Share-Lösung nutzen zu können.

Die Vorgehensweise

Zuerst habe ich mich informiert, ob es Container-Images für Seafile gibt und ob entsprechende Installationswege in der Dokumentation beschrieben sind. Meine Recherche förderte folgende Treffer zutage:

  • Installation of Seafile Server Professional Edition with Docker
  • Seafile with podman

Ansible-Rollen haben eine einheitliche Struktur. Mit dem Befehl ansible-galaxy role init ansible_role_deploy_seafile_with_rootless_podman habe ich das Grundgerüst für meine Rolle erstellt. Anschließend habe ich die notwendigen Dateien {defaults,meta,tasks,vars}/main.yml mit Inhalt gefüllt und nicht benötigte Verzeichnisse wie handlers gelöscht. Mir ist dabei wichtig, dass alle notwendigen Parameter über Variablen definiert werden, die in defaults/main.yml zu finden sind. In vars/main.yml befinden sich hingegen nur Variablen, welche intern von der Rolle verwendet werden und vom Benutzer nicht explizit gesetzt werden sollen. So lässt sich die Rolle leicht wiederverwenden, um verschiedene Seafile-Instanzen auf dem gleichen Host oder in unterschiedlichen Umgebungen zu deployen.

Bevor ich die Rolle zum ersten Mal auf meinen Server angewendet habe, habe ich sie mit yamllint und ansible-lint geprüft und vorhandene Warnungen und Fehler behoben. Allerdings lassen sich mit den Lint-Werkzeugen und der Option --syntax-check nicht alle Fehler im Vorfeld finden. Da mir ein zweites Augenpaar fehlte, habe ich die letzten Tippfehler erst durch die Verwendung des Ansible Playbook Debugger gefunden.

Das Ergebnis

Das Ergebnis findet ihr auf:

  • Codeberg.org: Tronde/ansible_role_deploy_seafile_with_rootless_podman
  • GitHub: Tronde/ansible_role_deploy_seafile_with_rootless_podman
  • Ansible Galaxy: Tronde/deploy_seafile_with_rootless_podman

Unter allen drei URLs könnt ihr meine Rolle herunterladen. Es ist damit möglich, eine lauffähige Seafile Pro Instanz bereitzustellen. Ein Test auf Idempotenz und ob diese Rolle auch zur Aktualisierung einer bestehenden Umgebung genutzt werden kann, steht noch aus.

Ihr seid herzlich eingeladen, die Rolle bei Interesse zu testen. Ich freue mich über Rückmeldungen zur Rolle und Dokumentation (Readme.md).

Ich habe das Deployment bisher nur auf Debian Buster getestet. Daher freue ich mich besonders über Rückmeldungen, wenn ihr die Rolle erfolgreich auf anderen Plattformen angewendet habt. Dann kann ich die entsprechenden Angaben für Ansible Galaxy ergänzen.

Eure Rückmeldungen nehme ich in den Kommentaren zu diesem Beitrag, per E-Mail oder in meinem neuen Matrix-Kanal #my-it-brain:matrix.org entgegen.

Fragen an meine Leser*innen

Ich interessiere mich für Themen rund um Ansible und Podman und frage mich, wie dies bei euch aussieht. Daher freue ich mich, wenn ihr in den Kommentaren oder gern auch per E-Mail und Chat folgende Fragen beantworten mögt:

  • Verwendet ihr Ansible für Software-Deployments?
  • Kennt ihr Podman und nutzt ihr es im privaten und/oder beruflichen Umfeld?
  • Findet ihr die Nutzung von Ansible zur Bereitstellung von Software auf (rootless) Podman sinnvoll? Oder bevorzugt ihr andere Bereitstellungsverfahren?

Ich freue mich auf eure Antworten.

von Jörg Kastning am 20.03.2023 06:00


15.03.2023

Joerg Kastning (Tronde)

Erfahrungsbericht zu den Chemnitzer Linux-Tagen 2023

Endlich sind wieder Chemnitzer Linux-Tage vor Ort in der Karl-Marx-Stadt. Für mich beginnen diese schon Wochen vorher, wenn die Vorfreude auf dieses Ereignis einsetzt.

Wenn dieser Erlebnisbericht veröffentlicht wird, ist die Konferenz leider schon wieder vorbei. Wie es war, erfahrt ihr im nun folgenden Text.

Anreise

Nach der Vorfreude kommt die Anreise. Bisher bin ich immer mit dem Auto nach Chemnitz gefahren. Von meinem Wohnort aus war ich regelmäßig nach 3,5-4,5 Std. im Hotel, inkl. Pause, Tanken, Essen und Erleichtern.

Ich mag Autofahrten. Ich kann während der Fahrt entspannen, meine Musik so laut hören, wie ich mag und muss keine anderen Menschen neben mir dulden. Es ist für mich eine komfortable Art zu reisen. Einziger Nachteil, ich kann während der Fahrt nicht arbeiten, bloggen, etc.

Da mich diesmal mein Umweltgewissen plagte und ich die Zeit besser nutzen wollte, habe ich meine Reise mit der Bahn geplant. Um nicht ganz so unkomfortabel zu reisen, habe ich 1. Klasse gebucht. Kann man frühzeitig planen und Sparpreisangebote nutzen, ist der Preis gegenüber der 2. Klasse durchaus gerechtfertigt, zumal die Sitzplatzreservierung schon mit inbegriffen ist.

Ganz ohne Auto geht es dennoch nicht. Da ich den ersten Fernverkehrsbahnhof mit dem ÖPNV erst nach 1-1,5 Std. erreicht hätte, bin ich in 40 Min. mit dem Auto zum nächsten kostenlosen Park&Ride-Parkplatz gefahren und von dort mit der Stadtbahn weiter zum Hauptbahnhof. Hier ging meine Reise mit 7 Minuten Zugverspätung weiter. Bei einer geplanten Umstiegszeit von 8 Minuten sah ich meinen Anschlusszug schon ohne mich fahren. Doch auf unsere Bahn ist Verlass. Auch der Anschlusszug hatte Verspätung, sodass ich wie geplant mit diesem weiterreisen konnte.

In Leipzig wurde es dann auch nochmal kurz hektisch, da für den Umstieg nur 4 Minuten verblieben. Für derartige Sprints bin ich definitiv zu unsportlich. Doch auch hier habe ich den Anschluss noch erreicht und traf in einem sehr vollen RE auf die ersten CLT-Teilnehmerinnen und Teilnehmer. So verging auch die letzte Stunde der Anreise wie im Flug.

Insgesamt war die Anreise sehr entspannt, bequem und angenehm. WLAN funktionierte im ICE und IC durchgängig und ich konnte so mobil arbeiten.

Die Chemnitzer Linux-Tage 2023

Nun habe ich der Anreise soviel Raum gewidmet und weiß gar nicht, was ich groß über die Veranstaltung selbst schreiben soll. Dies ist vielleicht noch dem tollen Gefühl geschuldet, die Community endlich mal wieder vor Ort getroffen zu haben.

Laut Resümee der Veranstalter kamen rund 3000 Besucherinnen und Besucher zur Veranstaltung. Somit gab es reichlich Gelegenheit zum Fachsimpeln, Netzwerken und es einfach mal zu genießen, unter normalen Menschen zu sein.

Am Samstag habe ich zwei Vorträge besucht:

  • Booten mit Feenstaub mit A. Niemann und
  • Register und Makros in Vim J. Bundesmann.

Mehr war nicht drin. Denn es war einfach zu schön, alte Bekannte wiederzutreffen und neue Nerds kennenzulernen. Nach drei Jahren Pause war mir dies ein Fest.

Das Bild zeigt Mitglieder der Red Hat Accelerators und Ubuntuusers Community vor dem Ubuntu Stand auf den Chemnitzer LInux-Tagen 2023.Gruppenfoto mit Mitgliedern der Red Hat Accelerators und Ubuntuusers Community vor dem Ubuntu-Stand auf den Chemnitzer Linux-Tagen 2023.

Im Laufe des Tages haben Dirk, Sujeevan und ich noch unseren Gemeinschaftsvortrag geprobt. Wir konnten während des Tages bereits auffällig oft vernehmen, dass etliche Personen diesen unbedingt hören wollten. Bloß keinen Druck aufkommen lassen. ;-)

Die Samstagabendveranstaltung fand in diesem Jahr in der Mensa statt, welche schräg gegenüber dem Hörsaalgebäude liegt. In meinen Augen war es eine gute Entscheidung, das Abendprogramm hierhin zu verlegen. Hier konnte man gemütlich zusammensitzen und ein wenig essen, trinken und plaudern. Das Essen war übrigens großartig!

Nur die Musik passte meiner Meinung nach nicht so recht zum Publikum. Statt Gesang mit musikalischer Begleitung auf dem Flügel hätte ich mir eher ein paar Arcade-Sounds aus 8-Bit-Midi-Prozessoren gewünscht.

Am Sonntag hatte ich die Ehre, um 10:00 Uhr einen der ersten Vorträge des Tages zu halten. Der Raum war voll, die Moderation spitze (Danke Henning) und auch die kleine Live-Demo hat geklappt. Im Anschluss konnte ich noch einige Fragen zu Ansible beantworten und durfte positives Feedback entgegennehmen. Lieben Dank an meine Hörerinnen und Hörer. Es war mir ein Fest, vor euch sprechen zu dürfen.

Viel Zeit zum Ausruhen gab es nicht, denn um 13:00 Uhr erläuterten Dirk, Sujeevan und ich, warum man nicht in der IT arbeiten sollte und warum wir es trotzdem tun. Ich glaube, das Publikum im gut gefüllten Hörsaal V5 hatte Spaß mit uns. :-)

Auch nach diesem Vortrag durften wir einiges an positivem Feedback entgegennehmen und haben Fragen beantwortet. Ich wiederhole mich gern: „Es war mir auch diesmal ein Fest.“ :-)

Fazit

Danke an das Veranstaltungs-Team der Chemnitzer Linux-Tage für die Ausrichtung dieser großartigen Veranstaltung und auch allen Besucherinnen und Besuchern, dass sie diese Konferenz zu einem der schönsten Community-Treffen in Deutschland machen. Ich freue mich schon heute auf ein Wiedersehen im nächsten Jahr!

Dank der Deutschen Bahn habe ich die Rückreise nicht entspannt im Zug, sondern in einem Mietwagen zurückgelegt. Doch dieses Ärgernis soll das schöne Wochenende nicht trüben.

Wie hat euch die Veranstaltung insgesamt gefallen? Welche Vorträge oder Workshops habt ihr besucht und wie fandet ihr sie? Schreibt mir eure Erfahrungen gern in die Kommentare oder hinterlasst einen Link zu eurem Erfahrungsbericht. Dann freue ich mich. :-)

von Jörg Kastning am 15.03.2023 07:06


08.03.2023

Bernd Dau (whisper)

stadia Controller unter Linux

Ja, ich hatte neugierigerweise Stadia gebucht und mal kurz ausprobiert. Damals gab es den Stadia Contoller als Bundle, das hatte ich mir geschnappt.

Nun ist Stadia beendet worden, den Controller kann man behalten, das Geld gab es zurück.

Spielen geht ja bei den Steam Spielen einwandfrei.

Nachteilig ist (besser: war) nur, dass man den Controller per USB verbinden musste.

Dann gab es Mitte Januar die Meldung, dass man den Controller zu einem bluetoothfähigen Controller zu machen.

Leider nur mit einem Windows Rechner.

Heute habe ich nochmal geschaut, jetzt wird auch Linux unterstützt. Und der Support bis Ende des Jahres 2023 verlängert.

Hat prima funktioniert, deshalb kurz die Notizen:

Udev Regel anlegen

Beim Debian bookworm ging das einwandfrei, sudo natürlich weg gelassen, da ich das nicht installiert habe.

Dann Anleitung befolgt.

Fertig, klappt super. Danke Google!

Hier noch die Funktionen und Belegung des Controllers.

Lange war ich auf der Suche, wie man den Akku Füllstand des Controllers anzeigen kann.

Die Lösung: Das ist bereits vorhanden, nur mit den Vorgabeeinstellungen nicht so leicht zu erkennen. 

Wie links dargestellt, habe ich nun für die shell das Transparent Theme ausgewählt, nun ist nicht nur der Akku Ladezustand deutlich besser lesbar!

von bed (nospam@example.com) am 08.03.2023 16:29


28.02.2023

Daniel Gestl (mcdaniels)

Digitale Abhängigkeit: Sorgenfrei mit Opensource Software – ganz ohne Patchday

Jeden zweiten Dienstag im Monat ist Microsoft Patchday. Aufgrund dessen, dass ich auch verschiedenste Microsoft Produkte supporte, fiebere ich diesem Tag immer wieder aufs Neue entgegen. Genau genommen befindet man sich in der Klemme. Warum? Naja… Klar… Der Patchday ist dazu da, um teilweise gravierende Sicherheitslücken in MS Produkten zu schließen. Jeder Admin ist angehalten, ... Weiterlesen

von Daniel am 28.02.2023 20:37


ZTE MC801A Router mit externen 5G Antennen auf die Sprünge helfen

An sich wollte ich 5G noch nicht nutzen. Nachdem ich aber ein Martyrium mit meinem ehemaligen Anbieter (Drei) hinter mich gebracht hatte (Vorspiegelung falscher Tatsachen, Verkauf von Produkten, die gar nicht zur Verfügung stehen etc.) und nun beim Mitbewerb  gelandet bin, hab ich mir  einen 5G Tarif geleistet. Mit im Paket ist ein ZTE MC801A.  ... Weiterlesen

von Daniel am 28.02.2023 16:23


27.02.2023

Bernd Dau (whisper)

Thunderbird Junk Ordner bereinigen / Bayes Script wieder aktiv

Ich habe meinen Junk Ordner aufgeräumt und die Aufbewahrungszeit auf 60 Tage beschränkt.

Warum schreibe ich das?

Um es mir zu merken und darauf hinzuweisen, das auf dem rootserver ein Script läuft, welches die Spam/Junk Ordner scannt und mittels spamassisin den Bayes Filter füttert.

Leider war das Script seit einiger Zeit inaktiv, als mir das heute affiel habe ich das Script etwas angepasst und fiel über die Größe meines Junk Ordners, der war bei >1100 Messages. Den Mist braucht man ja nun wiklich nicht zu lange aufheben...

von bed (nospam@example.com) am 27.02.2023 17:06


25.02.2023

Sabine Becker (AtariFrosch)

Spaß mit Videos in Firefox

Ich bin ja immer noch dabei, mein Piwigo-Upload-Verzeichnis zu fixen. Heute war ich mal an den Videos. Sollte ja einfach sein: Passend umbenennen (re-encoded sind sie schon), hochladen, Rechte anpassen. Bei denselben MP4-Dateien, die mplayer lokal einwandfrei abspielen kann, spielt mir der Player von Piwigo jedoch nur den Ton ab, das Bild bleibt schwarz.

Im Gegensatz zu Fotos kann man Videos in Piwigo nicht einfach über das Aktualisierungs-Plugin erneuern, also direkt in Piwigo neu hochladen, ohne den Datenbank-Eintrag zu ändern. Ich müßte diese Medien statt dessen ganz löschen und komplett neu anlegen. OK, in einem Fall habe ich das mal versucht. Ergebnis: Der Piwigo-Player merkt jetzt, daß da ein Video ist, kann es aber nicht abspielen. Begründung: „The media playback was aborted due to a corruption problem or because the media used features your browser did not support.“

Das heißt: Ich muß wohl sämtliche Videos neu re-encoden, weil da wohl eine veraltete MP4-Version vorliegt oder so. Und: Schuld ist nicht Piwigo, wie ich erst dachte, sondern Firefox.

Es darf ja nicht langweilig werden im Hause Frosch, ne. 😒

Erster Verdacht: Da ich das mit Videos aus dem HTC Desire von 2013 versucht habe, könnte es sein, daß die damals verwendete Encoding-Software, avidemux, da ein veraltetes Format erzeugt hat, das Firefox in der hier eingesetzten Version 102.4.0esr nicht mehr kennt. Testweise habe ich nämlich mal eins dieser Videos direkt lokal in Firefox geladen. Firefox zeigt mir zwar den Video-Player an, startet das Video aber nicht. Auf der Konsole sagt er mir:

Medien-Ressource file:///data/fotos/HTC-Desire/videos/2013/20131026-swuhd-alex.mp4 konnte nicht dekodiert werden, Fehler: Error Code: NS_ERROR_DOM_MEDIA_DECODE_ERR (0x806e0004)
Details: virtual mozilla::MediaResult mozilla::FFmpegAudioDecoder<58>::DoDecode(mozilla::MediaRawData*, uint8_t*, int, bool*, mozilla::MediaDataDecoder::DecodedData&): FFmpeg audio error:-1094995529

Ja hey, Firefox, frag doch mal den mplayer, der weiß, wie's geht. 😒

OK, nutzen wir mal das mit dieser Vernetzung:

Hey @firefox, why can't Firefox play an older mp4 video with which mplayer has no problems?

OS: Devuan Beowulf
Kernel: Linux 5.10.0-20-amd64
Firefox 102.4esr
Video is from an HTC Desire, re-encoded with avidemux, in Oct. 2013

Derweil versuchte ich, das Video in der Roh-Version im Firefox abzuspielen. Und siehe da: Das geht! Hat nur einen Haken: In der Roh-Version ist das Video gedreht. Der mplayer spielt es dann auch gedreht ab. Firefox scheint das zu merken und dreht es sich zurecht. Nächster Versuch: Das Video im Roh-Format in Piwigo laden. Das Video-Plugin von Piwigo kann ja Videos drehen.

Und siehe da: Das Video in der unbearbeiteten Version kann mit Bild und Ton abgespielt werden, und es wird sogar korrekt im Portrait-Format dargestellt, allerdings übergroß. Eigentlich hat es eine Auflösung von nur 640 x 480 px. Jetzt wird es, obwohl die Qualität sowieso schon, ähm, suboptimal ist, auf etwa die dreifache Größe aufgeblasen. Ich habe hier 1200 px in der Senkrechten, und das Video geht in der Höhe – eigentlich also 480 px – darüber hinaus.

@silberhaeckse meinte, mir fehlten vier Firefox-Updates, der sei schon bei 102.8. Mein apt update heute war aber ohne Ergebnis geblieben. Und selbst wenn: Es geht ja nicht nur darum, daß es bei mir abspielt. Die Videos sind öffentlich, sollen also von beliebigen Browsern abgespielt werden können.

Also mußte kdenlive ran. Ich nahm zum Test das Video, das ich im Oktober 2013 in Heidelberg aufgenommen hatte, wo Alex nach einer Stop-Watching-Us-Demo auf dem Marktplatz eine Rede gehalten hatte. Das HTC Desire kann zwar nur um 5 fps, das heißt, so richtig „Video“ ist das nicht mit weniger als fünf Bildern pro Sekunde, aber primär kam es da ja auf den Ton an. Und ich dachte einklich, ich hätte kdenlive zumindest ansatzweise kapiert; nun haben sie nach dem letzten größeren Update schon wieder so viel geändert, daß ich erstmal eine Viertelstunde brauchte, allein um mein Logo da reinzuprökeln.

Und weil ich schon dabei war, ließ ich kdenlive das Video auch gleich mal noch nach WEBM rendern und war überrascht, daß die Datei hinterher um mehr als die Hälfte kleiner war als die MP4-Datei – bei (zumindest in mplayer) gleicher Qualität:

20131026-160310-hd.mp4              │ 51035K│Feb 25 16:33
20131026-160310-hd.webm             │ 23467K│Feb 25 16:38
20131026-swuhd-alex.mp4             │ 35442K│Okt 27  2013
VID_20131026_160310.mp4             │ 74051K│Okt 26  2013

Die dritte Datei ist die von avidemux erzeugte, alte Version, und die vierte ist das Original, wie es vom Smartphone kam. Daß ich diesmal ein Logo eingebunden hatte (PNG; 50 x 50 px), kann die Größendifferenz zwischen der von kdenlive und der von avidemux erzeugten Version nicht erklären, denn die Auflösung insgesamt ist jeweils identisch. Ich hatte zwar in kdenlive die Farben ein wenig verstärkt, weil das Ganze etwas blaß aussah, aber auch das sehe ich nicht als Grund für die Größendifferenz.

Firefox ist lokal mit der WEBM-Version einverstanden, also hab ich die mal in Piwigo hochgeladen. Ergebnis: Das Video wird abgespielt, aber wieder auf dreifache Größe aufgeblasen. Ich fürchte, daran kann ich jetzt nicht mal eben was ändern. Ich bin immerhin froh, daß das Abspielen wieder geht.

ToDo: Alle mit avidemux gerenderten Videos nochmal editieren und encoden, diesmal nach WEBM, in der ursprünglichen Version aus Piwigo löschen, neu hochladen, Meta-Daten neu eingeben.

Ich könnte ja sonst Langeweile bekommen, ne …

von Atari-Frosch am 25.02.2023 15:57


21.02.2023

Sabine Becker (AtariFrosch)

Och, DHL … lernt Ihr mal?

DHL hat es wieder getan: Eine Änderung vorgenommen, über die man erst informiert wird, wenn man mit dem Smartphone in der Hand vor der Packstation steht und wegen der Änderung seine Sendung nicht abholen kann.

So stand ich vorhin vor der Packstation, als mich die App darüber informierte, daß ich mich nach einem Update „aus Sicherheitsgründen“ erneut in der App authentifizieren muß, bevor ich weitermachen kann. Offenbar geht DHL davon aus, daß Menschen da ein merkbares Paßwort benutzen oder es zumindest immer auswendig wissen, wenn man es nur alle paar Jahre mal braucht. Weiß man doch, daß Paßwörter meistens „123456“ lauten, das wird man sich ja wohl merken können.

Also bin ich jetzt wieder ohne meine Sendung nach Hause geschlappt. Am PC neuen Browser-Tab geöffnet, DHL aufgerufen, Login. Da geht ein kleineres Fenster auf und sagt mir: „Error displaying information“. Ja danke auch! Ja, JavaScript ist eingeschaltet.

Das ist ja nu nicht das erste Mal, daß ich ohne meine Sendung wieder nach Hause gehen mußte. Im August 2020 stand ich eines Tages mit meinem älteren Smartphone vor der Packstation, und die App wollte erstmal ein Update machen, um mir dann zu sagen, das Update ginge auf diesem älteren Smartphone nicht. Auch da hatte DHL es nicht notwendig gehabt, diese Tatsache vorher zu kommunizieren. Haben gefälligst alle ein aktuelles Smartphone zu haben, ne?

Morgen soll noch eine Sendung in dieselbe Packstation für mich kommen. Bin mal gespannt, ob ich mich bis dahin einloggen kann oder ob ich DHL wieder direkt „belästigen“ muß und es dann wieder eine Woche dauert, bis ich meine Sendungen endlich bekomme. Gut, daß es in beiden Fällen nichts Verderbliches ist.

Große Firmen und Kommunikation, ey …

von Atari-Frosch am 21.02.2023 14:20


04.01.2023

Lars Moelleken (voku1987)

Legacy Codebase: A Love Story

Legacy Codebase: A Love Story

After some years, working with a > 10 years old legacy PHP codebase, I can truly say: you can escape the legacy codebase and introduce whatever is helpful, in a well-maintained system.

Here are 5 important steps that I have done:

  • Custom error handling: Reporting notices for developers, report bad “assert” calls in the dev container, report bad indexes, reporting wrong code usage, …
  • Autocompletion for everything: classes, properties, SQL queries, CSS, HTML, JavaScript in PHP (e.g. via /* @lang JavaScript */ in PhpStorm), …
  • Static-Code Analysis: Preventing bugs is even better than fixing bugs, so just stop stupid bugs and use types in your code.
  • Automate the refactoring: With tools like PHP-CS-Fixer or Rector you can not only fix your code one time, you can fix any future wrong usage of the code.
  • Do not use strings for code: Just use constants, classes, properties, … use something that can be processes by your static-code analysis and something where you will have autocompletion.

Here are 5 additional steps that I already introduce:

  • Sentry: External error collecting (aggregating) tool + custom handler to see e.g. IDs of every Active Record object.
  • Generics: via PHPDocs + autocompletion via PhpStorm
  • No “mixed” types: Now we use something like, e.g. “array<int, string>” instead of “array”.
  • PSR standards: e.g. PSR-15 request handler, PSR-11 container, PSR-3 logger, …
  • Code Style: One code style to rule them all, we use PHP-CS-Fixer and PHP-Code-Sniffer to check / fix our code style for all ~ 10,000 PHP classes.

Here is what helped me mostly while working with old existing code.

First rule, first: 🥇 think or / and ask someone in the team

Analyzing: Here are some things that helped my analyzing software problems in our codebase.

  • Errors: Better error handling / reporting with a custom error handler, with all relevant information.
  • Understandable logging: Hint, you can just use syslog for medium-sized applications.
  • Grouping errors: Displaying and grouping all the stuff (PHP / JS / errors + our own custom reports) into Sentry (https://sentry.io/), now you can easily see how e.g. how many customers are effected from an error.
  • git history: Often new bugs were introduced with the latest changes (at least in often used components), so that good commit messages are really helpful to find this changes. (https://github.com/voku/dotfiles/wiki/git-commit-messages)
  • Local containers: If you can just download the application with a database dump from yesterday, you can analyze many problems without touching any external server.
  • Linux tools: mytop, strace, htop, iotop, lsof, …
  • Database tools:  EXPLAIN [SQL], IDE integration / autocompletion, …

Fixing: Here are some tricks for fixing existing code more easily.

  • IDE: PhpStorm with auto-completion and suggestions (including results from static analysis)
  • auto-code-style formatter: (as pre-commit hook) is also helpful because I do not need to think about this anymore while fixing code 
  • git stuff: sometimes it can also be helpful to understand git and how to revert or cherry-pick some changes

Preventing: Here are some hints how you can prevent some bugs.

  • custom static analysis rules: http://suckup.de/2022/07/php-code-quality-with-custom-tooling-extensions/
  • root cause: fixing the root cause of a problem, sometimes this is very hard because you need to fully understand the problem first, bust mostly spending this time is a good investment
  • testing: writing a test is always a good idea, at least to prevent the same problem

Job: If you now would like to work with this codebase (PHP 8 | MySQL 8 | Ubuntu), please contact me and take a look at this job offer: https://meerx.de/karriere/softwareentwickler-softwareentwicklerin/

von voku am 04.01.2023 01:45


03.01.2023

Lars Moelleken (voku1987)

What have I learned so far in my job?

What have I learned so far in my job?

I will start a new job next month (02-2023), so time to recap, I’m going to describe what I’ve learned so far.

me: Lars Moelleken |
> Assistant for business IT
> IT specialist for system integration
> IT specialist for application development

What did I learn as IT specialist for system integration?

– You only learn as much as you want to learn.

In contrast to school / technical college, I could and had to teach and work on many things myself during the training. And you quickly realize that you only learn as much as you want. Once you’ve understood this, you’re happy to sit down and learn whatever you want. For example, local or online courses, go to meetups or conferences. Worry about your skill because if you do something, you should do it right.

“An investment in knowledge still pays the best interest.” – Benjamin Franklin

– No panic!

What you learn pretty quickly as a sysadmin is “keep calm” and think first – then act. Hasty actionism does not help and usually even damages. Before you act, you should first obtain some information yourself (information from log files, hardware status, system status, …) so that you really know how to fix the error.

– Unix & command line <3

If you haven’t worked with a Unix operating system before, you unfortunately don’t know what you’re missing out on. If you want or have to use Windows for whatever reason, you can nowadays still use some of the advantages of Linux via WSL (Windows Subsystem for Linux). Leave your own comfort zone and trying out new operating systems helps to understand your computer better overall. At this point, I would have recommended “Arch Linux” as sysadmin, but today I would choose something that needs less maintaining.

One should also become familiar with the command line if you want to increase your productivity rapidly. For example, you should take a closer look at the following commands: e.g. find / grep / lsof / strace

– Read the official documentation.

It is often better to read the official documentation of the thing (hardware || software) you are currently using. While you start programming or learn a new programming language / framework, we often use stackoverflow.com and quickly finds answers and code examples, but the “why” and “how” is usually neglected. If you look at the specification / documentation first, you not only solve this problem, you also understand the problem, and maybe you will learn how to solve similar problems.

– Always make a backup (never use “sudo” drunken).

Some things you have to learn the hard way, apparently installing “safe-rm” was part of it for me!

apt-get install safe-rm

“Man has three ways of acting wisely. First, on meditation; that is the noblest. Secondly, on imitation; that is the easiest. Thirdly, on experience; that is the bitterest.” – (Confucius)

– Be honest with customers, employees and yourself.

Be honest with customers, especially when things go wrong. If the customer’s product (e.g. server) fails, then offer solutions and no excuses and solve the problem, not the question of blame. No one is helped by pointing the finger at colleagues or customers, not at the server, not at the customer and ultimately not at yourself.

– Ask questions if you don’t understand something.

Don’t talk to customers about something you don’t understand, not knowing something (especially in training) is fine, but then ask a colleague before you talk to a customer about it!

– Think about what you are doing (not only at work).

If you question things and think about your work and what you do, then you can develop personally. Question critical, for example, whether you should really order from Amazon, or should you rather order the book directly from the publisher? What is the advantage for the author and do I have any disadvantages? Should we use Nagios or rather Icinga directly? Question your work and critically evaluate whether this is really a good / safe / future-oriented solution.

If you are not sure yourself or your perspective is too limited (because you only know this one solution, for example), then you should acquire new knowledge, research other solutions or “best practices” and discuss the topic with others.

– Use Google correctly …

1. When searching an issue, look for the error message in quotes: “Lars Moelleken”

2. You can limit the result to special URLs: inurl:moelleken.org

3. Sometimes it’s helpful to find only specific files: filetype:txt inurl:suckup.de

> There are even more tricks that can help you in your daily work, just Google for it:

Full example: intitle:index.of mp3 “Männer Sind Schweine” -html -htm -php

What did I learn as IT specialist for application development?

– You never stop learning…

When you start to deal with web programming (HTML, CSS, JS, PHP, …), you don’t even know where to start. There is so much to learn, and this feeling accompanies you for some time (years) until you recognize recurring concepts. However, the advantage in web programming is that many different things have common APIs or at least can be combined. I can write a class in PHP that creates data attributes for my HTML, which I can read out with JavaScript to design them accordingly using CSS classes. But it stays the same, you never stop learning, and that’s also what’s so exciting about this job.

– Try to write code every day. (but set yourself a LIMIT)

Even if the boss isn’t in the office today, and you don’t have any more tasks, then write some code, if you’re sitting on the couch at home (and no new series is running on Netflix), then write or read some code and if you’re on vacation, you’re on vacation!

Here is an interesting link from “John Resig” (jQuery):
http://ejohn.org/blog/write-code-every-day/

– Think in modules and packages…

If you write software every day, you don’t want to code the same functionality (e.g. database connection, send e-mail or error logging …) multiple times for different projects (and remember, mostly you don’t want to code standard functions yourself). Therefore, every programmer should think in modules and design an application in different, preferably interchangeable parts. Often, the system can then also be expanded better, since there is already an interface for modules that can be used. The independence and decoupling of program parts also has the advantage that side effects from different places in the source code are further avoided. In addition, one should minimize the coupling of the corresponding modules, otherwise one gains nothing from modules.

There are already package managers for almost everything in web development. e.g.:
– Frontend (css, js): npm
– Backend (php): composer

– Open-Source-Software

If you are already working with modules and packages, you can publish them as an OSS project + run tests via GitHub actions + code coverage + at least a small amount of documentation. For these reasons alone, publishing as open source is worthwhile. The code quality also increases (in my experience), since the source code is released to the public and therefore more or less conscious attention is paid to the code quality.

The moment when you get your first pull request for your software or code together with someone from Israel, Turkey and the USA is priceless.

At some point, you would like to have the same advantages of OSS in your daily work because often, there is no package (code is directly added into the existing code), no tests (even not for bugs) and no documentation. So, possibly, you have now collected enough arguments to convince your boss to publish some package from your code at work.

– Git & Good

I don’t know how people can work with the PC without version control. I even use “git” for smaller private projects or for configuration files. The following are some advantages, but the list can certainly be extended with a few more points:

– changes can be traced (git log, git blame)
– changes can be undone (git revert, git reset)
– changes can be reviewed by other employees
– employees can work on a project at the same time (git commit, git pull, git push)
– development branches (forks) can be developed simultaneously (git checkout -b , git branches)

– Use GitHub and learn from the best.

GitHub itself is not open-source, but there has been an unofficial agreement to use the platform for open-source projects. You can therefore find many good developers and projects there, and you can learn a lot just by reading the source code / changes. Especially because you can understand and follow the development of the projects: How do others structure your code? How do others write their “commit” messages? How much code should a method contain? How much code should a class contain? Which variable names are better to avoid? How to use specific libraries / tools? How do others test their code? …

– try { tests() }

Especially when you write tests for your own code, you catch yourself testing exactly the cases that you have already considered, so you should test the corresponding functionality with different (not yet considered) input. Here are some inputs for testing: https://github.com/minimaxir/big-list-of-naughty-strings

Hint: We should add another test whenever an error occurred, so that already fixed error does not come back to use.

– Automate your tests.

Unit tests, integration tests and front-end tests only help if they are also executed, so you should deal with automated tests at an early stage and also run them automatically when the source code changes. Where and when these tests are run also determines how effective these tests ultimately are. As soon as you have written a few tests, you will understand why it is better not to use additional parameters for methods and functions, since the number of tests increases exponentially.

– Deployment is also important.

As soon as you work with more than one developer on a project, or the project will become more complex, you want to use some kind of deployment. As in application development, often the simplest solution is also here a good starting point: e.g. just pull the given changes into a directory and change the symlink from the existing source directory so that you can switch or rollback all files easily. PS: And you properly never need to write database-migration rollbacks, I never used them.

– Understanding concepts is more important than implementing them.

Understanding design patterns (programming concepts) not only helps in the current programming language, but can mostly be applied to other programming languages ​​as well.

Basic concepts (classes, objects, OOP, functions, ORM, MVC, DDD, unit tests, data binding, router, hooks, template engine, …) can be found in many frameworks / programming languages ​​and once you have understood the terms and concepts, it is no longer that difficult to use new / different frameworks. And you can see different strengths and weaknesses of these frameworks and tools: “If you only have a hammer as a tool, you see a nail in every problem.”

– Solving problems also means understanding customers.

Design patterns are part of the basic equipment, but you should always ask yourself: Which problem is actually supposed to be solved with the given solution? If necessary, you can find an even more elegant / simpler solution. And sometimes the customer actually wants something thoroughly different, he just doesn’t know it yet or someone has misunderstood the customer.

– Solving problems also means understanding processes.

But it is just as important to understand why a certain feature is implemented, and otherwise you are programming something that is either not needed or used at all. One should therefore understand the corresponding task before implementation and even before planning in the overall context.

project-swing-tree

– Spread code across multiple files.

Use one file for a class, use one file for CSS properties of a module or a specific page, use a new file for each new view. Dividing the source code into different files / directories offers many advantages, so the next developer knows where new source code should be stored and you can find your way around the source code faster. Many frameworks already provide a predefined directory structure.

– Readability comes first!

The readability of source code should always come first, since you or your work colleagues will have to maintain or expand this code in the future.

YouTube’s videos about “Clean Code”: https://www.youtube.com/results?search_query=%22Clean+Code%22&search_sort=video_view_count

Best Practices: http://code.tutsplus.com/tutorials/top-15-best-practices-for-writing-super-readable-code-net-8118

– Good naming is one of the most difficult tasks in programming.

It starts with the domain name / project name, goes through file names, to directory names, class names, method names, variable names, CSS class names. Always realize that others will read this and need to understand it. Therefore, you should also avoid unnecessary abbreviations and write what you want to describe.

We want to describe what the function does and not how it is implemented.

⇾ Incorrect: sendMailViaSwiftmailer(), sendHttpcallViaCurl(), …
⇾ Correct: mail->send(), http->send(), …

Variables should describe what they contain and not how they are stored.

⇾ Incorrect: $array2use, $personsArray, …
⇾ Correct: $pages, $persons, …

Summary: Describe what the variable/method/function/class is, not how it is implemented: https://github.com/kettanaito/naming-cheatsheet

Programming less bad PHP

Weniger schlecht PHP programmieren

– Save on comments (at least inline)…

Good comments explain “why” and not “what” the code is doing, and should offer the reader added value that is not already described in the source code.

Sometimes it makes sense to add some “what” comments anyway, e.g. for complicated regex or some other not optimal code that needs some hints.

Examples of inline comments:

bad code:

// Check if the user is already logged in if ( isset ( $_SESSION['user_loggedin']) && $_SESSION['user_loggedin'] > 1 ) { ... }
       

slightly better code:

// check if the user is already logged-in 
if ( session ( 'user_loggedin' ) > 1 ) { ... }
      

better code:

if ( $user->isLoggedin === true ) { ... }     

… and another example …

bad code:

// regex: email 
if (! preg_match ( '/^(.*<?)(.*)@(.*)(>?)$/' , $email ) { ... }
    

better code:

define ( 'EMAIL_REGEX_SIMPLE' , '/^(.*<?)(.*)@(.*)(>?)$/' ); 

if (! preg_match ( EMAIL_REGEX_SIMPLE , $email ) { ... }    

– Consistency in a project is more important than personal preferences!

Use the existing code and use given functions. If it brings benefits, then change / refactor the corresponding code, but then refactor all places in the project which are implemented in this way.

Example: If you have formerly worked without a template system and would like to use one for “reasons”, then use this for all templates in the project and not just for your current use case; otherwise, inconsistencies will arise in the project. For example, if you create a new “Email→isValid()” method, then you should also replace all previous RegEx attempts in the current project with the “Email” class; otherwise inconsistencies will arise again.

Read more about the topic:

– “Be consistent [and try to automate this process, please]!” http://suckup.de/2020/01/do-not-fear-the-white-space-in-your-code/

– “Why do we write unreadable code?”
http://suckup.de/2020/01/do-not-fear-the-white-space-in-your-code/

– A uniform code style has a positive effect on quality!

As in real life, if there is already rubbish somewhere, the inhibition threshold to dump rubbish there drops extremely. But if everything looks nice and tidy, then nobody just throws a “randumInt() { return 4; }” function on the floor.

It also helps to automate some refactoring because the code looks everywhere the same, you can also apply the same e.g. PHP-CS-Fixer and you do not need to think about every different coding style.

– Use functional principles & object-oriented concepts.

A pure function (“Pure Functions”) only depends on its parameters and with the same parameters it always returns the same result. These principles can also be considered in OOP and create so-called immutable classes (immutable class).

https://en.wikipedia.org/wiki/Pure_function
https://de.wikipedia.org/wiki/Object-oriented_programming
https://en.wikipedia.org/wiki/Immutable_object

– Please do not use global variables!

Global variables make testing difficult because they can cause side effects. Also, it’s difficult to refactor code with global variables because you don’t know what effects these changes will have on other parts of the system.

In some programming languages ​​(e.g. JavaScript, Shell) all variables are global and only become local with a certain keyword (e.g. in the scope of a function or a class).

– Learn to use your tools properly!

For example, if you’re writing code with Notepad, you can dig a hole with a spoon, which is just as efficient. Learn keyboard shortcuts for your programs and operating system! Use an IDE, e.g. from JetBrains (https://www.jetbrains.com/products.html) and use additional plugins and settings.

Modern IDEs also give hints/suggestions on how to improve your code. For example, for PHP, you can use PhpStorm + PHPStan and share the global IDE Inspections settings in the team.

– Performance?

In nearly every situation you don’t have to worry too much about performance, as modern programming languages ​​/ frameworks support us and with common solutions; otherwise the motto is “profiling, profiling… profiling”!

– Exceptions === Exceptions

You should not use exceptions to handle normal errors. Exceptions are exceptions, and regular code handles the regular cases! “Use exceptions only in exceptional circumstances” (Pragmatic Programmers). And nearly under no circumstances you should “choke off” exceptions, e.g. by trivially catching several exceptions.

– Finish your work

You should finish what you started. For example, if you need to use “fopen()” you should also use “fclose()” in the same code block. So, nobody in the team needs to clean up your stuff after he / she uses your function.

– Source code should be searchable [Ctrl + F] …

The source code should be easy to search through, so you should avoid using string nesting + “&” with Sass, for example, and also avoid using PHP functions such as “extract()”. Whenever variables are not declared, but created as if by magic (e.g. using magic methods in PHP), it is no longer so easy to change the source text afterward.

Example in PHP: (bad)

extract ( array ( 'bar' => 'bar' , 'lall' => 1 )); 
var_dump ( $bar ); // string 'bar' (length=3)      

Example in Sass: (bad)

. teaser { 
  font - size : 12px ; 

  & __link { 
    color : rgb ( 210 , 210 , 22 ); } }
  

Sass Nesting (code style): https://github.com/grvcoelho/css#nesting

– Program for your use case!

A big problem in programming is that you have to try to think and program in a generalized way so that you can (easily) expand the source code if new requirements are added or you can (easily) change it.

What does project sometimes look like? → A customer orders 10,000 green apples from a farm, changes his order to 10,000 red apples the morning before delivery and when these are delivered, the customer would prefer 10,000 pears and would like to pay for them in 6 months.

And precisely for this reason you should only write the source code that is really required for the current use case because you can’t map all eventualities anyway and the source code is unnecessarily complicated.

– KISS – Keep it simple, stupid.

One should always keep in mind that the source code itself is not that valuable. The value only arises when other developers understand it and can adapt / configure / use it for the customer or themselves. This should be kept in mind during programming so that a solution can be implemented as comprehensibly and “simply” as possible. And if I don’t need to use a new class or nice design pattern for the current problem, I probably shouldn’t. However, this does not mean that you should throw all good intentions overboard and use global variables / singletons everywhere. However, if a simple solution already does the job, go for that one.

A good example of what not to do is the JavaScript DOM Selector API. Not exactly nice to read or write…

Bad: (DOM Selector via JS)

document.getElementsByTagName ( "div" ) 
document.getElementById ( "foo" ) 
document.getElementsByClassName ( "bar" ) 
document.querySelector ( ".foo" ) 
document.querySelectorAll ( "div.bar" )

Better: (DOM Selector via jQuery)

$( "div" ) 
$( "#foo" ) 
$( ".bar" ) 
$( ".foo" ) 
$( "div.bar" )

– DRY – Don’t Reap Yourself.

Repetitions / redundancies in the source text or in recurring work arise relatively quickly if people do not communicate with each other. But also unintentionally due to errors in the software design because you don’t have a better idea or don’t think you have time for it.

improve

To avoid repetition, make your solution easy to find and easy to use. So that other devs will use it instead of re-creating a solution.

– The will to learn and understand something new is more important than previous knowledge.

If you can already program ActionScript (Flash), for example, but are not willing to learn something new, then previous knowledge is of no use because “The only constant in the universe is change.” – Heraclitus of Ephesus (about 540 – 480 BC).

– Read good books and magazines.

Books I have read: https://www.goodreads.com/user/show/3949219-lars-moelleken
Free Books: https://github.com/vhf/free-programming-books/blob/master/free- programming-books.md
books for programmers: http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read

– Follow other programmers on Twitter / GitHub / dev.to / YouTube / Medium / …

It sometimes helps to motivate yourself, to write e.g. a blog post or testing some new stuff, if you know some people how has the same interest, so just follow some of them online, there are many excellent developers out there, and they share their knowledge and tricks mostly for free. :)

– Listen to podcasts & subscribe to RSS feeds / newsletters & watch videos, for example from web conferences

To find out about new technologies, techniques, standards, patterns, etc., it is best to use different media, which can be consumed in different situations. An interesting podcast on “Frontend Architecture” before falling asleep or a video on “DevOps” while preparing lunch, reading a book on the tram in the morning entitled “Programming less badly” … to name just a few examples.

Podcasts: https://github.com/voku/awesome-web/blob/master/README.md#-audio-podcast
github is awesome: https://github.com/sindresorhus/awesome
and there is more: https://github.com/jnv/lists

– Attend Meetup’s & web conferences and talk to other developers.

Meetups are groups of people who meet regularly and talk about things like Python, Scala, PHP, etc. Usually, someone gives a lecture on a previously agreed topic.

⇉ http://www.meetup.com/de-DE/members/136733532/

Web conferencing is fun. Point. And every developer / admin should visit them because you get new impressions and meet wonderful people. Some conferences are expensive, but here you should contact your employer, if necessary, the company will take care of it. And there are also really cheap conferences.

– Post answers at quora.com || stackoverflow.com || in forums || your blog…

To deal with a certain topic yourself and to really understand it, it is worth doing research and writing a text (possibly even a lecture) that others can read and criticize and thus improve.

– Don’t stay at work for so long every day; otherwise nobody will be waiting for you at home!

With all the enthusiasm for the “job” (even if it’s fun), you shouldn’t lose sight of the essential things. Again, something I had to learn the hard way. :-/

von voku am 03.01.2023 23:55


20.12.2022

Dominik Kupschke (bommi)

IKEv2 / IPsec Site-to-Site VPN Fortinet FortiGate OpenBSD

This is a step-by-step tutorial to set up a site-to-site VPN between a Fortinet FortiGate and a OpenBSD VPN-Gateway. The Key Exchange will be done using IKEv2 and both sites are using static ip-addresses on their wan interfaces. I typically use the strongest possible cryptographic algorithms between the two sites / vendors in my tutorials. […]

von Dominik Kupschke am 20.12.2022 22:34


18.12.2022

Dominik Kupschke (bommi)

IKEv2 / IPsec Site-to-Site VPN Fortinet FortiGate Mikrotik RouterOS

This is a step-by-step tutorial to set up a site-to-site VPN between a Fortinet FortiGate and a Mikrotik RouterOS. The Key Exchange will be done using IKEv2 and both sites are using static ip-addresses on their wan interfaces. I typically use the strongest possible cryptographic algorithms between the two sites / vendors in my tutorials. […]

von Dominik Kupschke am 18.12.2022 22:31


24.10.2022

Christian Imhorst (immi)

PowerShell und Jupyter Notebooks unter Linux in VS Code

Jupyter Notebook ist eine Open Source-Webanwendung, mit der man Dokumente erstellen und teilen kann, die Live-Code, mathematische Gleichungen, Visualisierungen von Daten und beschreibenden Text enthalten können. Ein Jupyter Notebook ist ein praktisches Werkzeug für die interaktive Erstellung von Präsentationen, um Code, dessen Ausführung und daraus resultierende Daten darzustellen. Die meisten Jupyter Notebooks laufen mit Python, man kann aber auch andere Sprachen benutzen, z.B. aus dem .NET-Umfeld wie C# oder auch PowerShell. Jupyter Notebooks laufen im Browser, es gibt mit Jupyter eine sehr schöne Erweiterung für VS Code. Und um die Notebooks noch um die .NET-Sprachen zu erweitern, kann man auch gleich noch die Erweiterung .NET Interactive Notebooks aus dem Marketplace von VS Code installieren.

Damit man überhaupt Jupyter Noteboos erstellen kann, wird das entsprechende Python-Modul benötigt:

python3 -m pip install --upgrade pip
python3 -m pip install jupyter

Um ein Jupyter Notebook im Browser zu starten, gibt man dann einfach jupyter notebook im Terminal ein. Im VS Code reicht es dagegen, eine neue Datei mit der Endung .ipynb zu erstellen und man kann loslegen und den beschreibenden Text mit Markdown erstellen und den Code in Python. Um eine Sprache aus dem .NET-Framework zu verwenden, muss natürlich .NET unter Linux installiert sein und für PowerShell am besten die neuste Version.

Wenn das erledigt ist, und die Befehle dotnet für .NET und pwsh für die PowerShell über die Pfad-Variable erreichbar sind, wird noch das Microsoft.dotnet-interactive-Paket benötigt, ein Befehlszeilen-Tool für die interaktive Programmierung mit C# oder PowerShell, inklusive Unterstützung für Jupyter Notebooks:

dotnet tool install --global Microsoft.dotnet-interactive

Anschließend führt man den folgenden Befehl aus, um dotnet-interactive zum Jupyter Notebook hinzuzufügen:

dotnet interactive jupyter install

Jetzt kann man im VS Code Jupyter Notebooks erstellen und PowerShell Cmdlets ausführen. Allerdings muss man darauf achten, dass der Kernel des Notebooks unter .NET Interactive läuft (also nicht Python) und der Programm-Code als „PowerShell (.NET Interactive)“ ausgeführt wird, so wie in der Abbildung:

Das schöne an .NET-Interactive als Kernel für Jupyter Notebooks ist, dass noch weitere Sprachen unterstützt werden, so dass man neben PowerShell auch Code-Blöcke in C#, JacaScript oder auch SQL erstellen kann.

von Christian Imhorst am 24.10.2022 17:11


14.09.2022

Christian Imhorst (immi)

VirtualBox in openSUSE installieren

Damit dein Einstieg in VirtualBox reibungslos verläuft und openSUSE Leap sich nicht beschwert, dass noch etwas fehlt, kannst du diese paar einfachen Schritte befolgen. Dafür installiert man zunächst alle wichtigen Pakete, die VirtualBox benötigt. Das geht mit YaST oder in der Konsole mit diesem Einzeiler:

sudo zypper install virtualbox virtualbox-host-source kernel-devel kernel-default-devel

sudo zypper install virtualbox virtualbox-host-source kernel-devel kernel-default-devel

Wenn die Installation abgeschlossen ist, werden die Kernelmodule kompiliert, die VirtualBox benötigt, um ein Gastsystem auf deiner openSUSE auszuführen:

sudo vboxconfig

sudo vboxconfig

Anschließend musst du noch deinen Benutzer zur Gruppe der VBOXUSERS hinzufügen:

sudo usermod -a -G vboxusers $USER

sudo usermod -a -G vboxusers $USER

Damit die Änderung mit deinem Benutzer und der Gruppe wirksam werden, musst du dich einmal vom System ab- und wieder anmelden. Dann kannst du mit VirtualBox in openSUSE Leap starten.

von Christian Imhorst am 14.09.2022 16:34


26.08.2022

Christoph Langner (Chrissss)

Gnome bittet seine User um Hilfe

Open-Source-Projekte verzichten in der Regel auf Telemetrie, also auf integrierte Funktionen, die das Verhalten der Nutzer analysieren und an den Hersteller übermitteln. Der Einsatz solcher Funktionen dient meist weniger dazu, den Nutzer zu überwachen, eher erhoffen sich die Software-Unternehmen Ansatzpunkte für Verbesserungen zu finden oder das Marketing nutzt die gesammelten Daten, um dem Nutzer individualisierte Angebote unterbreiten zu können. Ab Werk dürfen solche Funktionen eigentlich heute nicht mehr aktiv sein. Ohne Zustimmung des Nutzers dürfen Programme nicht nach Hause funken, doch bei proprietären Anwendungen ist es schwer, das Verhalten zu überprüfen.

Ab und an brauchen aber auch Open-Source-Projekte Informationen zur Nutzung Ihrer Software. So bittet etwa Ubuntu den Nutzer einmlig nach der Installation Daten zum System zu sammeln zu dürfen und diese anonymisiert an Canonical zu senden. Welche Informationen dabei erhoben werden, zeigt das Tool vor dem Datenversand an. Denselben Weg möchte nun auch Gnome mit Gnome Info Collect gehen. Das Programm soll nicht als feste Komponente Teil von Gnome werden, sondern zeitlich begrenzt als optional installierbares Paket zum Einsatz kommen. Hinweise zur Installation unter einer Vielzahl von Distributionen liefert die Gitlab-Seite des Projekts.

Die Aktion ist befristet angelegt, daher verzichtet Gnome auch darauf, ein Tool mit grafischer Oberfläche zu bauen oder die Funktion gar in die Einstellungen der Desktopumgebung zu integrieren. Gesammelt werden auch keine arg persönlichen Daten, sondern hauptsächlich Informationen zum System, der Distribution, der installierten Software und ein paar grundlegende Gnome-typische Konfigurationen. Etwa ob Dateifreigaben eingerichtet wurden, die Remote-Desktop-Funktion genutzt wird oder ob der User die dynamischen Workspaces — eine Besonderheit von Gnome — nutzt. Damit die Daten nicht mehrfach erfasst werden, erstellt das Programm eine gehashte Maschinen-ID.

$ gnome-info-collect
The following information will be sent to the GNOME project:

**Operating system**              Arch Linux
**Hardware vendor**               TUXEDO
**Hardware model**                TUXEDO InfinityBook S 17 Gen6
**Flatpak installed**             True
**Flathub enabled**               True
**Installed apps**
'jpico', 'org.gnome.Weather', 'org.gnome.gedit', 'darktable', 'org.gnome.Logs', 'lstopo', 'tuxedo-control-center', 'firefox', 'org.gnome.Music',
[...]
desktop', 'qvidcap', 'cups', 'dropbox', 'org.inkscape.Inkscape', 'org.gnome.Calculator'
**Favourited apps**
'google-chrome', 'org.gnome.Evolution', 'com.gexperts.Tilix', 'org.gnome.Calendar', 'org.gnome.Nautilus', 'org.gnome.Software'
**Online accounts**
None
**File sharing**                  inactive
**Remote desktop**                inactive
**Multimedia sharing**            inactive
**Remote login**                  inactive
**Workspaces only on primary**    True
**Workspaces dynamic**            True
**Number of users**               1
**Default browser**               Google Chrome
**Enabled extensions**
'Vitals@CoreCoding.com'
**Unique ID**                     ###

This information will be collected anonymously and will be used to help improve the GNOME project.

Upload information? [y/N]: y
Uploading...
Status 200: Data received successfully

Complete! Thank you for helping to improve GNOME.

von Christoph Langner am 26.08.2022 13:33


19.08.2022

Christoph Langner (Chrissss)

Ab nach Augsburg, ab zu Tuxedo

Wie einige von euch ja sicherlich wussten, habe ich die letzten Jahre für die nach ein paar Jahren eingestellte Android User und danach für die Magazine Linux User und Raspberry Pi Geek gearbeitet. In früheren Jahren gab es für die Zeitschriften mit der Linux New Media, später umbenannt in Medialinx einen eigenen Verlag (zusammen mit dem Linux Magazin). Inzwischen sind die Publikationen bei Computec Media untergekommen, wo unter anderem die PC Games, die PC Games Hardware und aber auch Golem entstehen — letzteres als ausgegliederte Firma in Berlin. Ich für meinen Teil war über 10 Jahren im Verlagswesen unterwegs. Eine tolle Zeit, die aber durchaus einige Wechsel nach sich zog.

Nach über 10 Jahren bei der Linux User und Raspberry Pi Geek hat sich so einiges angesammelt.

Mit Ende Juli habe ich nun aber meine Zelte bei der Linux User und RasPi Geek in München abgebrochen und bin zu Tuxedo Computers nach Augsburg gezogen. Nicht physisch, da bleibe ich im gemütlichen Heilbronner Home-Office, doch zumindest für die ersten zwei Wochen war ich im Hauptquartier der neuen Firma. In Zukunft gestalte ich dort zusammen mit dem Marketing-Team den Online-Auftritt und begleite Projekte, die sich noch im Aufbau befinden. Im Team steckt übrigens auch Ferdinand Thommes, der mit seinen LinuxNews schon seit Jahren eine super verlässliche Informationsquelle rund um Linux und Open-Source-Software ist.

Was mich während meines Einstiegs bei Tuxedo wirklich überrascht hat: Hier verkauft man nicht nur Linux, sondern lebt es wirklich. Praktisch alle Teile der Firma arbeiten mit oder basieren auf freier Software. Auf den Firmenrechnern läuft das auch an die Kunden ausgelieferte Tuxedo OS auf Basis von Ubuntu. Mails richtet sich jeder Mitarbeiter selbst ein, also entweder Thunderbird, Evolution oder K9 auf dem Handy. Alternativ gibt es Roundcube als Webmailer, wenn man unterwegs mal kein E-Mail-Programm zur Hand an. Für die unverbindliche Kommunikation gibt es Rocket.Chat auf PC und Smartphone und für Telefon-/Video-Konferenzen BigBlueButton. Den Einsatz von Nextcloud als Cloudspeicherdienst brauche ich gar nicht weiter zu erwähnen.

Auch beim für Endkunden gedachten kommerziellen Angebot MyTUXEDO handelt es sich um eine NextCloud-Instanz. Bugs, Issues und Aufgaben werden über Gitlab gemanagt und natürlich ist Tuxedo auch auf „Open-Source“-freundlichen Social-Media-Portalen wie Mastodon vertreten. Fehlt nur noch, dass auf der kleinen Flotte von E-Fahrzeugen auch noch ein Linux als Navi bzw. Mediacenter laufen würde — so weit ist es jedoch noch nicht. Ich glaube nicht, dass die Leasing-Bank begeistert wäre, wenn die Autos mit einem offenen Bootloader und alternativem Betriebssystem zurückgeben werden würden, falls es denn möglich wäre, die Autos zu patchen.

Wir lesen uns, euer Christoph

Mit den E-Autos von Tuxedo fällt man im Straßenbild sicherlich auf.
Der Tuxedo-Tower in Augsburg: Die Firma residiert im 12. Stock, hoch über Augsburg.

von Christoph Langner am 19.08.2022 09:00


14.06.2017

Vinzenz Vietzke (vinz)

Mein XFCE Desktop im Juni 2017

Es wird Zeit, mal wieder meinen Desktop zu zeigen und wie ich ihn für mich angepasst habe. Sean hat das hier mit Xubuntu gemacht, ich übernehme die übersichtliche Struktur gerne.
Das Gerät ist ein ThinkPad x220 mit i5-2520M und 16GB RAM, einer 120GB Samsung 840 SSD, “gemoddetem” BIOS und 9-Zellen/73,3Wh Nachbauakku.

Konfiguration

  • Desktop
    • Distribution: Debian Testing (Stretch)
    • Desktopumgebung: Xfce
    • Window Manager: Xfwm4
  • Themes
    • GTK: Arc-Grey-Darker (GitHub)
    • Window Manager: Arc-Grey-Darker (GitHub)
    • Icons: Arc Limon (GitHub)
    • Cursors: Adwaita
    • Firefox: Arc-Darker (GitHub)
  • Schriften
    • Standard: Lato Regular 10
    • Window Manager: Lato Bold 10
    • Monospace: Monospace Regular 10
  • Wallpaper: Incense Stick in balinese rainforest (CC0, Artem Beliaikin)
  • Panel Plugins
    • Whisker-Menü (Homepage)
    • Benachrichtigungsfläche
    • Energieverwaltung
    • PulseAudio Plugin
    • Orage-Uhr
  • Programme im Tray
    • Audacious
    • Gajim
    • Liferea
    • Nextcloud Client (HowTo)
    • Redshift
    • Thunderbird (plus Firetray)

 

Tipps & Tricks

  • Symbol des Whisker-Menü auf debian-emblem-white setzen (siehe Screenshot)
  • Desktopsymbole deaktivieren
  • Panel: Alpha auf 85% setzen
  • Fensterknöpfe: Knopfbeschriftungen anzeigen deaktivieren, Griff anzeigen deaktivieren, Flache Knöpfe aktivieren (siehe Screenshot)
  • Super Key auf das Whiskermenu legen (ksuperkey installieren)
  • In der Fensterverwaltung unter “Anordnung der Knöpfe” alle außer Schließen entfernen.

 

Mehr Screenshots

von vinzv am 14.06.2017 00:10


04.05.2012

Thorsten Sperber (TRex)

Windows ist doof, Linux funktioniert nicht

Momentan kommen mir im debianforum [1] immer öfter Menschen unter die Nase, die fast, aber nicht ganz auf das Schema linux-ist-nicht-windows [2] passen. Sie wissen, dass Linux anders ist, sie wollen es nicht alle wie Windows bedienen, aber sie haben ihre schlechten Windowsgewohnheiten noch nicht vergessen/abgelegt. Eigentlich schade, denn sie verpassen die Hälfte. Als Hilfesuchende punkten sie auch nicht, denn sie gehen Probleme nach Windows-Art an: Beschreibe das Verhalten, hoffe, dass das jemand kennt und eine Lösung dafür hat. Unter Windows gehts halt nicht anders...hoffentlich ergiebige Fehlermeldung ("Vorgang fehlgeschlagen") mit Vorgeschichte ("Programm XY installiert", "Windows Updates durchgeführt", ..) in Google suchen oder Forum posten und auf Leidensgenossen hoffen, die das Problem gelöst haben.

In den meisten open source Programmen gibt es irgendeine Art von Logging oder (Debug-)Ausgaben. Dazu führt man das Programm auf einem Terminal aus, ruft es anders auf oder schaut in der Logging-Datei der X-Session (ausgehend davon, dass es sich um ein grafisches Programm handelt), in der Regel zu finden in ~/.xsession-errors oder für SLIM in /var/log/slim.log. Dort gibt es dann ganz viele Informationen, die zielführend für eine Lösung sind. Ich behaupte ja nicht, dass da steht "du musst noch libbanana-2.4 installieren", und wenn derjenige mit dem Problem mit den Informationen nichts anfangen kann (weil sie zu technisch sind), dann gibts andere, die es können.

Bis es sich rumgesprochen hat, werd ich wohl öfters darauf hinweisen.

Für die meisten grafischen Programme:
~/.xsession-errors
Für Serverdienste:
/var/log/syslog
Für Kernelfragen und Treiberprobleme:
/var/log/kern.log /var/log/messages

Und die meisten Programme, grafisch als auch nicht grafisch (und letztere besonders) haben eine Ausgabe auf dem Terminal, auf dem sie ausgeführt werden. Es wäre doch durchaus hilfreich, sowohl verursachendes Kommando als auch die Ausgabe dazu (abzüglich empfindlicher Daten, die sind erkennbar als solche zu zensieren) unverfälscht zu sehen.

Und diese Dateien (die in /var/log/ sind übrigens nur als root lesbar, also entweder ein root-Terminal öffnen oder sudo vor den Befehl setzen) werden am besten mit Hilfe von tail -f Datei gelesen (was die Ausgabe weiterlaufen lässt), woraufhin die fehlerverursachende Aktion wiederholt wird oder mit less komplett geöffnet. tail ohne -f zeigt einfach bloß die letzten 10 Zeilen an.

Damit wäre das hoffentlich vom Tisch. Das soll übrigens kein rant sein, sondern ein fester Schubser in die richtige Richtung, in Zukunft selbst Lösungen zu finden. Bei Windows hat man doch auch viel Durchhaltevermögen ;) Und neu installieren muss man bei $linuxdistribution auch nicht sonderlich oft.

Und ein letzter Hinweis: solange man nichts gekauft oder bezahlt hat, gibt es auch keinen "Anspruch". Das schließt auch "schließlich ist das doch ein Hilfeforum, ihr müsst mir helfen" ein. Das ist Freizeit, die wir "opfern", meist, weil es uns Spaß macht zu helfen oder wir dabei selbst noch lernen (gemeinsames Problemlösen). Entsprechend schwach ist die Motivation, eine nur schwach oder garnicht recherchierte Frage zu beantworten oder "Hausaufgaben" zu erledigen, die man wahlweise schnell zusammengesucht oder nachgelesen hat. Da hagelts dann schnell ein genervtes RTFM.

Update: falsche Datei angegeben, danke an up ausm dfde

[1]http://debianforum.de
[2]http://www.felix-schwarz.name/files/opensource/articles/Linux_ist_nicht_Windows/

von Thorsten am 04.05.2012 13:20


30.10.2016

Jürgen Braun (jaybe)

Frankfurt Marathon

Rückblick: 25.10.2015 findet der Frankfurt Marathon statt, ich sitze gespannt vom Fernseher als Arne Gabius zu einem neuen deutschen Rekord läuft und finde es sehr interessant und spannend, zugleich aber auch verrückt und unmöglich, dies selbst einmal zu absolvieren. Einige Tage später wird der Termin für 2016 auf Facebook veröffentlicht und ich klicke auf „interessiert mich“, einfach um den Termin nicht zu verpassen, absolut ohne den Hauch eines Gedankens daran, dort vielleicht selbst zu starten. Entsprechend verblüfft reagiere ich auf beim nächsten Lauftraining auch auf die Frage eines Trainingspartners „Und, schon angemeldet“? Ich? Nein, das traue ich mir nicht zu. Andere schon: „Komm, bei Deinem Training, ein paar lange Läufe noch zur Vorbereitung, ist das kein Problem“. Soll ich wirklich? Könnte das klappen? Warum eigentlich nicht. Am 06.12.2015 war ich dann so weit:

Lieber Jürgen Braun,
vielen Dank für Deine Anmeldung zum Frankfurt Marathon 2016. Hier befinden sich alle wichtigen Daten und Angaben zu Deiner Anmeldung.

Die Bestätigungsmail des Veranstalters war da. Es kann los gehen…

Die Vorbereitung ist gut gelaufen, bei Lauftipps.ch habe ich mir einen Trainingsplan erstellen lassen, an den ich mich zumindest in den letzten 7 Wochen vor dem Wettkampf zu 100% gehalten habe. Die Wochen davor fanden noch Wettkämpfe in der Hessischen Triathlon-Liga statt und ich war noch eine Woche im Urlaub, hier musste ein wenig improvisiert und lange Läufe durch schnelle 10km im Wettkampf werden.

Nach meinen Problemen im Frühjahr mit ISG und Schienbeinkante achtete ich sehr auf irgendwelche Zeichen meines Körper und tatsächlich, drei Wochen vorm Wettkampf, am Ende des längsten Laufes über 33km waren sie da, Rückenschmerzen 🙁 Wie würden wohl im Wettkampf die noch ausstehenden 9km zu bewältigen sein, lies sich der Wettkampf überhaupt erfolgreich beenden? Durch die Erfahrung aus dem Frühjahr, war eigentlich klar, dass es vermutlich das ISG bzw. die Lendenmuskulatur sein muss, also wurde in der verbleibenden Zeit noch mehr Wert auf Übungen zur Rumpfstabilisierung gelegt.

Sonntag, 30.10.2016; Es ist so weit. Der Frankfurt Marathon steht an und ich stehe am Start.

Es ist frisch, vielleicht 7 oder 8°, jedoch bei strahlend blauem Himmel. Ich fühle mich gut vorbereitet, habe vier Gels für die Verpflegung dabei, plane mit einer Zielzeit von 3:45:00 h, also einem Schnitt von 5:20 min/km. Dann geht es los, ich starte mit einem Laufpartner aus dem Verein, doch er hat sich wohl umentschieden und will doch schneller als die 3:45:00 ins Ziel, nach ca. 2,5 km verabschiede ich mich und lasse ihn laufen, suche mir selbst mein Wohlfühltempo, das sich bei ca. 5:10 min/km einpendelt. Ich genieße die Atmosphäre an der Strecke, die Zuschauer – einige erkenne ich, als sie meinen Namen rufen – Marina und André, Cornell, Wolfgang, Thomas, …

WhatsApp Image 2016-10-30 at 12.38.51

Bis km 30 fühlt es sich gut an, sehr gut sogar, ich muss mich bremsen um nicht schneller zu werden, ich brauche die Kraft noch am Ende. Dann fängt es an, etwas zäher zu werden, bei km 35 stehen meine Frau und meine beiden Töchter, Ihre Rufe spornen mich an, noch 7km, ich versuche schneller zu werden, muss den Versuch aber aufgeben, noch 6km, noch 5km, ich hangle mich von km-Schild zu km-Schild, ab wann soll ich alles geben, sind 3:40:00 noch möglich? Plötzlich kommt Frank auf die Strecke gelaufen „Jürgen, Du hast es gleich geschafft. Du siehst etwas angestrengt aus, bist Du etwa gelaufen?“ :-D, spornt mich nochmals an und wünscht mir viel Erfolg. Ich beschleunige nochmals etwas und gebe alles was geht. Dann der Einlauf in die Festhalle, die Musik, die vielen Menschen, die Lichter, ich krame das #meinerstermarathon Band aus der Tasche, recke es in die Höhe und überquere die Ziellinie. GESCHAFFT!

Ich bin völlig außer Atem, langsam bewege ich mich in den Verpflegungsbereich, dehne Oberschenkel und Waden. Dann die Finisher-Medallie, 42,195 km in einer Zeit von 3:41:10. Ich bin sehr zufrieden, die Zielzeit unterboten, komplett durchgelaufen ohne Gehpausen (außer beim Trinken) und keine Schmerzen in den Gelenken oder der Muskulatur, auch der Rücken hat problemlos mitgemacht.

Im Verpflegungsbereich dann ein paar Becher Iso-Getränke, ein paar Apfelstückchen gegessen, etwas Mohnkuchen, alkoholfreies Weizenbier, mit den Vereinskollegen getroffen und abgeklatscht, dann zur Familie die mich schon freudig und stolz erwarten. Auf dem Weg zur S-Bahn merke ich schon, dass das Gehen etwas schwer fällt, Treppen steigen unangenehm ist und das Aufstehen nach dem Sitzen etwas länger dauert als sonst. Aber wie lautet der Spruch:

„Der Schmerz vergeht, der Stolz bleibt“


von jaybe am 30.10.2016 14:45


20.06.2020

Gerrit Kruse (MrGerardCruiz)

CentOS mit unklarem Supportstatus

LTS Distributionen sind für mich das Maß der Dinge. Lange Produktlaufzeiten, wenig Wartungsaufwand und hohe Funktions- und Laufzeitstabilität sind nicht nur im Servereinsatz wichtig. Trotz hunderter Distributionen gibt es nur wenige LTS-Varianten (siehe: Linux - Eine sichere Basis). Mit CentOS steht hier ein weiteres Projekt vor dem Ausfall.

Natürlich sind Arch, Manjaro, Tumbleweed und wie sie alle heißen tolle Projekte und für den individuellen Desktopeinsatz gut geeignet. Ich glaube auch gerne, dass viele nie oder nur extrem selten Probleme bei Updates haben. Sie taugen aber kaum für den wartungsarmen Masseneinsatz, wo der Anwender nicht selbst die Administration übernehmen kann oder will.

Es braucht diese ständigen Updates eigentlich auch nicht. Linux auf dem Desktop ist im Wartungsmodus (siehe auch: Kein Ubuntu 20.04 Test). Ob ich nun GNOME Shell 3.32 oder 3.28 verwende macht weder funktional, noch von der Stabilität einen Unterschied. Das gleiche gilt für Plasma, LibreOffice und viele weitere Projekte. Relevant sind über eine lange Laufzeit lediglich neue Treiber für neue Hardware (entweder über massive Kernel-Modifikation durch den Distributor oder neue Kernel-Versionen) und neue Browser-Versionen.

Ich habe deshalb - sofern der Anwender mit GNOME klar kam - CentOS auch für den Desktop immer gemocht. 10 Jahre Ruhe am System sind einfach eine Hausnummer. Im Serverbereich dürfte CentOS neben Ubuntu LTS und Debian ebenfalls für viele eine maßgebliche Rolle spielen.

Wie Michael Kofler in seinem Blog aber zu recht thematisiert fällt CentOS 8 inzwischen für den Produktiveinsatz eigentlich aus. 71 und 48 Tage ohne Updates sind indiskutabel. Das Projekt scheint hier leider auch nicht willens oder fähig etwas zu ändern.

Im LTS Bereich wird es jetzt eng. Die sehr lange Supportdauern von 10 Jahren bietet nun nur noch SLED gegen eine - preislich allerdings vollkommen akzeptable - Subscription. Wer mit circa 3-5 Jahren leben kann hat noch Debian, openSUSE Leap und Ubuntu LTS zur Auswahl. Viel ist das nicht mehr. Gegebenenfalls muss man sich wirklich mit Oracle Linux beschäftigen, auch wenn sich dabei alle Nackenhaare aufstellen.


Bilder:
Einleitungsbild und Beitragsbild von von mohamed Hassan via pixabay

"

von Gerrit (postfach@curius.de) am 20.06.2020 11:27


09.07.2017

Bjoern Schiessle (BeS)

Welcome to my new Homepage

Finally I moved my homepage a a complete static page powered by Hugo. Here I want to document some challenges I faced during the transition and how I solved them.

Basic setup

As already said I use Hugo to generate the static sites. My theme is based on Sustain. I did some changes and uploaded my version to GitLab.

I want to have all dependencies like fonts and JavaScript libraries locally, so this was one of the largest changes to the original theme. Further I added a easy way to add some share buttons to a blog post, like you can see at the end of this article. The theme also contains a nice and easy way to add presentations or general slide shows to the webpage, some examples can be seen here. The theme contains a example site which shows all this features.

Comments

This was one of the biggest challenges. I had some quite good discussion on my old blog powered by Wordpress so I don’t want to lose this feature completely. There are some solutions for static pages but non of these are satisfying. For example Staticman looks really promising. Sadly it only works with GitHub. Please let me know if you know something similar which doesn’t depend on GitHub.

For now I decided to do two things. By default I add a short text at the end of each article to tell people to send me a e-mail if they want to share or discuss their view on the topic. Additionally I can add to the meta data of each posts a link to a Friendica post. In this case the link will be added at the end of the article, inviting people to discuss the topic on this free, decentralised and federated network. I have chosen Friendica because it allows users to interact with my blog posts not only with a Friendica account but also with a Diaspora, GNU Social, Mastodon or Hubzilla account. If you have a account on one of these networks and want to get updates about new blog posts in order to participate in conversations around it, follow this Friendica account. I also created a more detailed description for people new to the world of free social networking.

Deployment

After all the questions above where answered and a first version of the new webpage was in place, I had to find a easy way to deploy it. I host the source code of my homepage on GitLab which has a nicely integrated CI service which can be used to deploy the webpage on any server.

Therefore we need to add a CI script called .gitlab-ci.yml to the root of the repository. This script needs to contain following (please adjust the paths):

image: publysher/hugo

before_script:
  - apt-get update
  - apt-get --yes --force-yes install git ssh rsync
  - git submodule update --init --recursive

pages:
  script:
  - hugo
  - mkdir "${HOME}/.ssh"
  - echo "${SSH_HOST_KEY}" > "${HOME}/.ssh/known_hosts"
  - echo "${SSH_PRIVATE_KEY}" > "${HOME}/.ssh/id_rsa"
  - chmod 700 "${HOME}/.ssh/id_rsa"
  - rsync -hrvz --delete --exclude=_ public/ schiesbn@schiessle.org:/home/schiesbn/websites/schiessle.org/htdocs/
  artifacts:
    paths:
    - public
  only:
  - master

We need to create a ssh key-pair to deploy the webpage. For security reasons it is highly recommend to create a ssh key used only for the deployment.

The variables SSH_HOST_KEY and SSH_PRIVATE_KEY need to be set at GitLab in the CI settings. SSH_PRIVATE_KEY contains the private ssh key which is located in the ~/.ssh directory.

To get the right value for SSH_HOST_KEY, we run ssh-keyscan <our-webpage-host>. Once we executed that command, we should see something similar to schiessle.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtwsSpeNV.... Let’s copy this to the SSH_HOST_KEY value in our GitLab settings.

Finally we need to copy the public ssh key to the .ssh/authorized_keys file on the web-server to allow GitLab to access it.

Now we are already done. The next time we push some changes to the Github repository GitLab will build the page and sync it to the web-server.

Using the private key stored in the GitLab settings allows everyone with access to the key to login to our web-server. Something we don’t want. Therefore I recommend to limit the ssh key to only this one rsync command from the .gitlab-ci.yml file. In order to do this, we need to find the exact command send to the web-server by adding -e'ssh -v' to the rsync command.

Executing the rsync command with the additional option should result in something like:

debug1: Sending command: rsync --server -vrze.iLsfxC --delete . /home/schiesbn/websites/schiessle.org/htdocs/

we copy this command to create following .ssh/authorized_keys entry:

command="rsync --server -vrze.iLsfxC --delete . /home/schiesbn/websites/schiessle.org/htdocs/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Sf/PDty0d0SQPg9b+Duc18RxPGaBKMzlKR0t1Jz+0eMhTkXRDlBMrrkMIdXJFfJTcofh2nyklp9akUnKA4mRBVH6yWHI+j0aDIf5sSC5/iHutXyGZrLih/oMJdkPbzN2+6fs2iTQfI/Y6fYjbMZ+drmTVnQFxWN8D+9qTl49BmfZk6yA1Q2ECIljpcPTld7206+uaLyLDjtYgm90cSivrBTsC4jlkkwwYnCZo+mYK4mwI3On1thV96AYDgnOqCn3Ay9xiemp7jYmMT99JhKISSS2WNQt2p4fVxwJIa6gWuZsgvquP10688aN3a222EfMe25RN+x0+RoRpSW3zdBd

Now it is no longer possible to use the private key, stored at GitLab to login to the web-server or to perform any other command than this specific rsync command.

Interesting observation

I run this static webpage now for a few weeks. During this weeks I got quite some email from people interested in some topic I write about in my blog. This are not new blog articles, but posts which where already online for quite some time. Somehow it looks like more people find this articles after the transition to a static site. Maybe search engines rate the static site higher than the old Wordpress page? I don’t know, maybe it is just a coincidence… but interesting.

von Björn Schießle (bjoern@schiessle.org) am 09.07.2017 09:04


08.04.2018

Gerrit Kruse (MrGerardCruiz)

Datenabfluss bei Facebook - Eine Nachbetrachtung

Bild von geralt via pixabay / Lizenz: CC0 Creative Commons

Facebook hatte jüngst mit schlechter Presse zu kämpfen. Länder- und medienübergreifend artikulierte sich massive Kritik an der Praxis wie dort mit Daten umgegangen wird. Manche Journalisten sehen darin die größte Krise in der nicht mehr ganz so jungen Geschichte des sozialen Netzwerks. Die Aktienmärkte sahen das vergangene Woche nicht unähnlich wenn man sich die Entwicklung des Kurses von Facebook anschaut.

Viele Datenschützer konnten sich eine gewisse Häme nicht verkneifen. Gehört umfassende Kritik an Facebook doch zum Standard-Repertoire von datenschutzbewussten Menschen (und solchen, die sich dafür halten). Die empfohlene Lösung war dann natürlich wie erwartet radikal. Verlasst endlich Facebook schallte es aus allen Kommentarspalten und Blogs.

In der Printausgabe der Süddeutschen Zeitung konnte man dazu vergangene Woche einen schönen Vergleich lesen. Sinngemäß ging es darum, dass die Aufforderung Facebook zu verlassen, weil man mit der Datenhandhabung moderner IT-Unternehmen unzufrieden ist, genau so erfolgversprechend ist wie das Essen einzustellen, weil man mit der Lebensmittelindustrie unzufrieden ist. Konsequent aber letztlich aussichtslos weil es an der Lebenswirklichkeit vorbei geht.

Genau dies beschreibt den Einfluss der Datenschützer auf das Verhalten der Masse. Radikal, konsequent und weitestgehend ignoriert, da wirklichkeitsfern. Bei diesem Thema und bei vielen anderen auch.

Es ist keineswegs so, dass Facebook das Verlangen für sein Produkt erst bei den Menschen wecken musste. Etwas was man den Silicon Valley Firmen gerne nachsagt. In einer hochgradig mobilen Gesellschaft bedient Facebook einfach ein Bedürfnis. Es vereinfacht soziale Vernetzung über große Zeiträume und Distanzen einfach enorm, viele Menschen leben halt nicht mehr in einer Welt, in der man alle Freunde im Vereinslokal trifft. Ein Verlassen des sozialen Netzwerks ist daher für viele Anwender mit einem nicht unerheblichen sozialen Einschnitt verbunden. Das betrifft nicht nur die Selbstdarsteller auf der Timeline, sondern eben auch die Gruppen und den Messenger.

Außerdem ist ein großer Trugschluss, dass man Facebook einfach den Rücken kehren kann. Man muss auch alle zugehörigen Dienste, am bekanntesten darunter sind sicher WhatsApp und Instagram, verlassen und trotzdem kann Facebook über die Vernetzung mit unzähligen Internetseiten - der Like-Button macht es möglich - noch ein Profil erstellen.

Letztlich übt man sich zwar in digitaler Selbstverstümmelung, erzielt aber nicht mal den erwünschten Effekt.

Zielführender sind da sicher Maßnahmen wie der kürzlich vorgestellte Mozilla Facebook Container. Er ermöglicht Teilhabe aber kontrolliert ein bisschen besser, was Facebook außerhalb des Netzwerks noch über einen sammeln kann. Viele weitere Maßnahmen wie ein Mehr-Browser-Konzept, sinnvoll ausgewählte Addons und reflektierte Handhabung des Netzwerks können es Facebook erschweren unerwünscht Daten zu sammeln.

Keine dieser Maßnahmen hätte den Datenabfluss von Facebook an Dritte verhindern können. Es ist auch nicht die Aufgabe des Bürgers paranoid seine Aktivitäten gegenüber den IT-Giganten zu verschleiern, sondern die Politik muss die Daten der Bürger entschieden gegen Missbrauch schützen und Verstöße hart bestrafen. Dafür kann der Bürger an der Wahlurne stimmen. Einfach mal bei der Wahl den Digitalthemen mehr Priorität einräumen, anstatt in den Kommentarspalten gegen Facebook zu wettern. Die deutsche Regierung ist nämlich keineswegs so rigoros im Datenschutz, wie sie sich jetzt medial gibt.

von Cruiz (mailer@curius.de) am 08.04.2018 13:05


01.02.2009

Bjoern Schiessle (BeS)

An awesome event is over: KDE 4.2 Release Party and Fellowship Meeting at Stuttgart

At Friday, 30.Jan.09 we had a joint event between KDE and the Fellowship of the Free Software Foundation Europe (FSFE) and it was simply awesome! Beside a lot of KDE and FSFE people we had a lot of visitors and at the end we were about 40 people! All interested in KDE 4.2 and Free Software.

At the beginning Frederik started with an introduction and showed all the new and cool things in KDE 4.2. After that i gave a talk about the work of FSFE, especially in 2008, explained the role of the Fellowship for FSFE and highlighted some cool activities from our Fellows. My slides can be found here (German). I think i could attract some people and would be really happy to see some new faces at our next Fellowship meeting (probably somewhen in March). If you don’t want to miss it, subscribe to our mailing list for South Germany.

After my talk we made a small break and than Frank continued with a very interesting talk about the KDE community and how to get involved as a developer, writer, artist or user. Last but not least Sven talked about the new version of Amarok and what we can expect from the new release.

This was the official part. Now the party started and we had a lot of fun and many interesting discussions between KDE developers and users, FSFE Fellows and all the other people who joined us at this evening. We also discussed some possible activities for the Fellowship Group Stuttgart. Some Fellows seems to be quite interested in the topic “Free Software in school and education”. I also think that this is a really important topic. Remember, the pupils from today are the decision makers from tomorrow.

As it becomes later a small group of people survived. One of them was Martin Konold, a KDE Developer from the very first days of KDE. He told us a lot of interesting and funny stories about the beginning of KDE and the development of the Free Software desktop.

At 2:30 at night a great event was over. I really want to thank Frederik for his great help in organising this event and all the other KDE people who helped to make this event that awesome! It was a lot of fun and a great cooperation between KDE and FSFE people! Looking forward for the next opportunity to organise such a great event!

More pictures can be found here.

von Björn Schießle (bjoern@schiessle.org) am 01.02.2009 16:30


02.03.2019

Marco Laspe (rockiger)

Cross-plattform Apps mit Electron und React Teil 2

Im letzten Teil haben wir eine Electron-Anwendung geschrieben, die auf der GTK-Demo-App basiert. Wir haben die grundsätzliche Struktur der Anwendung erstellt und die Funktionalität, die die Anwendung bereitstellt hinzugefügt.

In diesem Teil möchten wir nur nun die Optik der Anwendung entsprechend anpassen. Dazu werden wir als Erstes herausfinden, auf welchem Betriebssystem und mit welchem Fenstermanager die Anwendung läuft.

Ausgestattet mit dieser Information werden wir dann das jeweilige passende Stylesheet laden, um die Anwendung nativ aussehen zu lassen.

Das Ziel ist es nicht, dass die Anwendung 100 % so aussieht, wie eine Anwendung, die mit dem Window-Toolkit des Betriebssystems geschrieben ist. Unser Ziel ist es, dass die Anwendung mit vertretbarem Aufwand so aussieht, dass sie nicht als Fremdkörper wahrgenommen wird.

In welcher Umgebung läuft die App?

Und herauszufinden, in welcher Umgebung die App läuft, müssen wir eine kleine Javascript-Abfrage beim Start der Anwendung einbauen. Mit dieser Laden wird dann, damit wir ein spezifisches Stylesheet laden können.

Dazu öffnen wir die index.html-Datei, laden style.css für plattformunabhängige Styles und fügen folgendes Javascript ein.

<link rel="stylesheet" type="text/css" href="./styles/style.css">
  <script type="text/javascript"> 
    let cssUrl = '';
    if (process.platform === 'linux') {
      const execSync = require('child_process').execSync;
      const theme = execSync('gsettings get org.gnome.desktop.interface gtk-theme').toString().toLowerCase()
      
      if (theme.includes('adwaita')) {
        cssUrl = 'adwaita.css'
      } else if (theme.includes('arc')) {
        cssUrl = 'arc.css'
      } else if (theme.includes('OSC') || theme.includes('mac')) {
        cssUrl = 'mac.css';
      } else if (theme.includes('win')) {
        cssUrl = 'win.css';
      }
      
    } else if (process.platform === 'darwin') {
        cssUrl = 'mac.css';
    } else if (process.platform === 'win32') {
        cssUrl = 'win.css';
    }
    if (cssUrl) {
        document.write('<link rel="stylesheet" type="text/css" href="./styles/'+ cssUrl +'">');
        }
  </script>

Dabei nutzen wir die process-Bibliothek von NodeJS und schauen als Erstes auf welchem Betriebssystem wir uns befinden. Befinden wir uns auf einem Mac- oder einem Windows-Rechner, nutzen wir die CSS-Datei mac.css oder win.css.

Für den Fall, dass wir uns auf einem Linux Rechner befinden haben wir noch eine kleine Besonderheit eingebaut: Wir führen mit NodeJS eine Kommandozeilen-Abfrage durch, die uns den Namen des aktuellen Themes zurückgibt. Dementsprechend verwenden wir nun die passende CSS-Datei.

Die Auswahl des Themes lässt sich beliebig erweitern, da ich persönlich das Arc-Theme verwende, werden wir uns auf dieses konzentrieren. An dieser Stelle muss jeder selbst entscheiden, mit wie viel Aufwand er Linux-User zu unterstützen möchte. Ich könnte mir vorstellen, dass ein Theme für Ubuntu-Nutzer auch noch sinnvoll wäre. Dies könnte eine gute Übung sein.

Cross-platfform Styling

Um nun ein plattform-gerechtes Styling der Einzelkomponenten zu kreieren, müssen wir diverse CSS-Dateien anlegen. Dazu erstellen wir den Ordner styles im src-Verzeichnis. Für jede angegebene CSS-Dateien müssen wir nun eine anlegen.

Als Erstes entfernen wir jegliche Inline-Styles aus unseren Komponenten. Sonst können wir diese nur mühsam überschreiben.

Im neu geschaffenen styles-Verzeichnis legen wir nun die Datei style.css an. In diese Datei kommen alle Style-Informationen, die wir vorher inline eingefügt hatten. Für die Farben legen wir CSS-Variablen fest. 

:root{
    --fg_color: #5c7080;
    --text_color: #182026;
    --bg_color: rgb(245, 248, 250);
    --borders: rgb(206, 217, 224)
}

#Layout {
    display: flex;
    flex-direction: column;
    height: 100vh;
}

.bp3-button { cursor: default; }

#TextField {
    height: 100%;
    flex-grow: 1;
    overflow: auto;
    border: none;
    resize: none;
    outline: none;
}

#StatusBar {
    background-color: var(--bg_color); 
    border-top: 1px solid var(--borders);
    color: var(--text_color);
    height: 50px;
    padding: 12px;
}

Das hat den Vorteil, dass man nur durch den Austausch der Farben schon unterschiedliche Themes erstellen kann. Soweit so gut. 

Um nun das Arc-Theme nachzubauen, benötigt man nur wenige Zeilen CSS. Zumindest für unsere Beispielanwendung.

Als Erstes überschreiben wir die CSS-Variablen für die verwendeten Farben. Dann passen wir noch Details der einzelnen Komponenten an.

:root {
    --window_bg: #e7e8eb;
    --window_fg: hsla(222, 18%, 39%, 0.8);
    --button_hover_bg: #fdfdfd;
    --button_hover_border: #D1D3DA;
    --selected_bg_color: #5294e2;
    --selected_fg_color: #ffffff;
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 5px;
    height: 40px;
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
}
.bp3-button.bp3-minimal:hover {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 38px;
    padding: 10px;
}

Das Ergebnis sieht wie folgt aus:

Das Gleiche machen wir noch für das MacOS- und für das Windows-Theme. Wir brauchen dafür jeweils nur wenige Zeilen CSS.

:root {
    --window_bg: #e7e8eb;
    --window_fg: hsla(222, 18%, 39%, 0.8);
    --button_hover_bg: #fdfdfd;
    --button_hover_border: #D1D3DA;
    --selected_bg_color: #5294e2;
    --selected_fg_color: #ffffff;
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 5px;
    height: 40px;
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
}
.bp3-button.bp3-minimal:hover {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 38px;
    padding: 10px;
}
:root {
    --window_bg: #fffff;
    --window_fg: #000000;
    --button_hover_bg: #cce8ff;
    --button_hover_border: #0078d7;
    --selected_bg_color: #cce8ff;
    --selected_fg_color: #000000;
    --bg_color: #ffffff;
    --borders: rgba(16, 22, 26, 0.1);
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 10px;
    height: 40px;
    box-shadow: 0 0 0 1px var(--borders);
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
    border-radius: 0;
}
.bp3-button.bp3-minimal:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 45px;
    padding: 15px;
}

Fairerweise muss man dazu sagen, dass alle drei Theme ohne Gradienten auskommen und somit nur wenig Änderungen brauchen. Das Gnome Standard-Theme Adwaita nachzubauen, wäre deutlich aufwendiger.

Du findest den Source-Code für dieses Tutorial auf Github: https://github.com/rockiger/electron-react-example

Im nächsten Teil werden wir das Menü der gtk3-demo-application nachbauen und noch ein wenig Feinschliff betreiben.

Created with Dictandu

von Marco am 02.03.2019 22:38


04.07.2018

(Meillo)

2018-07-05

2018-07-05



A new ssh login attack wave after the previous one had ended ...




http://marmaro.de/lue/        markus schnalke <meillo@marmaro.de>

04.07.2018 22:00


29.09.2014

Martin Dosch (Dogge)

Code-Schnippsel: Backup über SSH mit rsync

Hier mal mein aktuelles Backup-Script mit dem ich aktuell sehr zufrieden bin. Ich hatte das ganze schon mal hier angerissen aber mittlerweile hat sich doch einiges getan. War mein Backup-Script zu Beginn einfach nur ein Befehl, der täglich mein Home mittels rsync über SSH auf meinen Server kopiert und dabei die alte Version überschrieben hat, so ist das ganze deutlich komplexer und flexibler. Mittlerweile sichere ich mein /home/, mein /etc/, mein /root/ und mein /usr/local/.

29.09.2014 00:00


07.08.2013

Martin Dosch (Dogge)

loco loco

Ich habe mal schnell in 10 Minuten ein simples Wallpaper gebastelt. Der Witz beruht darauf, dass loco sowohl die Kurzform für Lokomotive ist, als auch ein umgangssprachlicher Begriff für “irre” oder “verrückt”. {.aligncenter .size-medium .wp-image-247 width=“600” height=“428”} In voller Größe ist es bei DeviantArt zu bewundern. Das Wallpaper steht, wie eigentlich alles was ich verbreche, unter der CC-BY-SA.

07.08.2013 00:00


02.12.2019

(c3f2o)

Bundesparteitag der AfD, 30.11.- 1.12 2019 in Braunschweig

Der Parteitag der AfD in Braunschweig war ein Wahlparteitag, der vor allem von der Neubesetzung des Bundesvorstands gekennzeichnet war. Mit der Wahl der Bundessprecher Jörg Meuthen und Tino Chrupalla hat sich die vom bisherigen Vorstand favorisierte Lösung durchgesetzt. Trotz einiger Aufregungen im Vorfeld aufgrund überraschender Kandidaturen verlief er– im Vergleich zu zahlreichen vorangegangenen Parteitagen – eher in ruhigen Bahnen.

Der neugewählte Vorstand der Partei dokumentiert den noch einmal gewachsenen Einfluss des faschistischen „Flügels“, ohne jedoch einen Durchmarsch dieser Richtung zu markieren. Ganz wie von Björn Höcke angekündigt, hat der „Flügel“ seine Position in der Partei ausgebaut. Das zeigt sich nicht nur in der Besetzung von Vorstandsposten mit „Flügel“-Leuten, sondern auch daran, dass Neoliberale wie Alice Weidel in Absprache mit der völkischen Rechten gute Ergebnisse erzielten und damit nun auch von diesem Teil der Partei abhängen. Vertreter einer (im Auftreten) eher gemäßigten, konservativ-bürgerlichen Politik, wie der Berliner Landesvorsitzende Georg Padzderski oder die Bundestagsabgeordneten Kay Gottschalk und Roland Hartwig, wurden dagegen beim Parteitag – auch ob ihrer kritischen Äußerungen zu Höcke und zum „Flügel“ – abgestraft und nicht wieder gewählt.

Als Botschaft nach außen sollte vom Parteitag die Bereitschaft zur Übernahme von Regierungsverantwortung ausgehen. Gauland, Meuthen und Chrupalla schworen die Delegierten darauf ein, schon bald für eine solche Übernahme von Verantwortung bereit sein zu müssen. Unter welchen Bedingungen die AfD dazu bereit ist, blieb allerdings offen und ist umstritten. Dennoch hat sich hier eine Veränderung der verbalen Positionierung ergeben, denn noch vor zwei Jahren äußerte sich Gauland mehr als skeptisch zum Thema Regierungsverantwortung.

Da über Inhalte beim Parteitag nicht geredet wurde bleibt weiterhin unklar, für welche Politik die AfD jenseits von Nationalismus und Rassismus steht. Nach wie vor liegen keinen Konzepte für die Sozialpolitik vor und auch in den meiste anderen Politikbereichen hat die AfD bis heute keine konkreten, umsetzbaren Vorstellungen entwickelt. Für eine Partei, die einen Großteil ihres Selbstbewusstseins aus der Abgrenzung gegenüber „machtgeilen Altparteien“ zieht, ist das bemerkenswert, denn ganz offensichtlich setzt die Partei Regierungsmacht vor Inhalte.

Mit dem Rückzug Alexander Gaulands aus der Parteiführung und seiner Wahl zum Ehrenvorsitzenden hat die AfD eine vorsichtige Neuverteilung innerparteilicher Machtpositionen eingeläutet. Allerdings wird Gauland als Fraktionsvorsitzender im Bundestag weiterhin die zentrale Figur der AfD bleiben und den Kurs der Partei maßgeblich mitbestimmen.

Der neu gewählte Bundesvorstand der AfD
Bundessprecher: Prof. Dr. Jörg Meuthen
Bundessprecher: Tino Chrupalla
Stellvertretende Bundessprecherin: Dr. Alice Weidel
Stellvertretender Bundessprecher: Stephan Brandner
Stellvertretende Bundessprecherin: Beatrix von Storch
Bundesschatzmeister: Klaus-G. Fohrmann
Stellvertretender Bundesschatzmeister: Carsten Hütter
Schriftführer: Joachim Kuhs
Beisitzer: Dr. Sylvia Limmer
Beisitzer: Andreas Kalbitz
Beisitzer: Jochen Haug
Beisitzer: Stephan Protschka
Beisitzer: Dr. Alexander Wolf
Beisitzer: Joachim Paul

Situation der AfD vor dem Parteitag

Der Parteitag stand am Ende eines Wahlzyklus seit der Bundestagswahl 2017, der für die AfD weitgehend erfolgreich verlief, wenngleich die Ergebnisse der drei Landtagswahlen in Ostdeutschland im Herbst 2019 darüber hinwegtäuschen, dass die AfD nicht überall die von ihr selbst hochgesteckten Erwartungen erfüllen konnte.

Trotz der zurückliegenden Erfolge ist die Partei nicht zur Ruhe gekommen:die Radikalisierungsspirale, durch sich die Gesamtpartei immer weiter in die völkische Ausrichtung des „Flügels“ bewegt , dreht sich weiter. Während der „Flügel“ in den meisten ostdeutschen Landesverbänden klar tonangebend ist, sind zahlreiche westdeutsche Landesverbände bis zur Arbeitsunfähigkeit zerstritten. In Bayern, Baden-Württemberg, Schleswig-Holstein und NRW gab bzw. gibt es heftige Auseinandersetzungen zwischen „Flügel“-Leuten und Anhängern einer stärker national-liberalen Ausrichtung. Eindeutig sind die Versuche des „Flügels“, seinen Einfluss auch in Westdeutschland auszudehnen und die Partei insgesamt auf seine Linie zu bringen. Zugute kommt den „Flügel“-Leuten dabei, dass die Gegenseite keine vergleichbare Organisation aufweist.

Insofern war die Ankündigung von Höcke beim Kyffhäusertreffen im Sommer 2019, der Bundesvorstand werde in der bisherigen Zusammensetzung nicht weiter bestehen und er werde sich der Sache persönlich annehmen, als Kampfansage zu verstehen und wurde auch so verstanden. Höcke ist eine strategische Vorgehensweise offenbar fremd, er bevorzugt die medialen Paukenschläge. Auch deshalb gilt vielen Andreas Kalbitz inzwischen als der bessere und für den Einfluss des „Flügels“ wichtigere Stratege. Jedenfalls rief Höckes Angriff auf den Bundesvorstand massiven Widerstand hervor, bis hin zu einem offenen Brief. Unter der Überschrift „Die AfD ist und wird kein Björn-Höcke-Partei!“ erklärten 100 Mandats- und Funktionsträger der Partei ihren Widerspruch zum Machtanspruch Höckes, darunter jedoch nur wenige Prominente.

Folge dieses ungeschickten Vorgehens war die mühsame Suche nach einem Kandidaten für die Nachfolge von Gauland, der sowohl auf Zustimmung im „Flügel“ stößt, als auch vom gemäßigteren Teil der Partei akzeptiert wird. Mit Tino Chrupalla aus Sachsen scheint eine solche Person gefunden worden zu sein. Wenig bekannt, wenig exponiert ist Chrupalla bisher nirgends angeeckt und kann von den beiden größeren Lagern der Partei mit eigenen Erwartungen verbunden werden. In der Außendarstellung versucht die Partei, ihn als ‚einfachen Handwerker aus dem Volk‘ darzustellen, der den gesunden Menschenverstand der ‚normalen‘ Leute vertrete. Unproblematisch ist Chrupalla allerdings keineswegs: den NS-Begriff der ‚Umvolkung‘ erklärte er im ZDF-Interview auf dem Parteitag für „nicht rechtsextrem“ und im Hinblick auf seine Unterstützung durch den Flügel erklärte er nur „lagerübergreifend Positionen vertreten“ zu wollen.

Wahl der neuen Bundessprecher

Von Jörg Meuthen stand lange schon fest, dass er erneut für den Posten eines Bundessprechers kandidieren wollte. Trotz seiner Anbiederung an die „Flügel“-Leute und seiner Besuche beim Kyffhäusertreffen wird Meuthen nach wie vor als Gegner der Völkischen in der Partei angesehen. Tatsächlich ist es aber seine marktradikale Haltung in sozialpolitischen Fragen und die Orientierung auf eine Annäherung an die Union, die ihm die Ablehnung dieses Teils der Partei einbringt. So wurde mit der Bundestagsabgeordneten Nicole Höchst eine eigene Kandidatin des „Flügels“ ins Rennen geschickt, die im Bundestag mit einem rabiaten Antifeminismus und einem für diesen Teil der Partei üblichen antimuslimischen Rassismus aufgefallen war. Nicht die Abwahl Meuthens sondern die Verhinderung eines zu guten Ergebnisses für ihn, scheint das Ziel hinter diesem Manöver gewesen zu sein.

Mit Wolfgang Gedeon warf einer der selbst innerhalb der AfD umstrittensten Parteimitglieder seinen Hut in den Ring. Der offene Antisemitismus Gedeons führte dann auch in Braunschweig dazu, dass ein Teil der Delegierten bei seiner Bewerbungsrede den Raum verließ oder ihm die rote (Abstimmungs)Karte zeigte. Offener Antisemitismus gilt in der AfD nach außen als Tabu. Antisemitische Agitation wird aber – wie etwa die „Anti-Soros“-Äußerungen auf allen Ebenen zeigen – nach wie vor in der gesamten Partei ausgelebt.

In diesem Bewerberfeld fiel es Meuthen nicht schwer sich mit einem Ergebnis von 69,2 % gegenüber 24,8 % für Nicole Höchst und 3,8 % für Wolfgang Gedeon durchzusetzen. Damit erzielte er, trotz seiner klaren Abgrenzung in der Bewerbungsrede von einer weiteren Rechtsverschiebung der Partei, ein nur unwesentlich schlechteres Ergebnis als vor zwei Jahren. Offensichtlich will der Teil der Partei, der nicht offenin die Strukturen des „Flügels“ eingebunden ist, Ruhe, Kontinuität und ein verbal gemäßigtes Auftreten nach außen, für das Meuthen steht, ohne damit den Einfluss der extremen Rechten in der Partei entscheidend einzudämmen.

Nach der Ankündigung Alexander Gaulands, nicht mehr für die Parteispitze kandidieren zu wollen, wurde der Bundestagsabgeordnete Tino Chrupalla von Gauland und dem Vorstand als Nachfolger aufgebaut und ins Spiel gebracht. Mit dem Bundestagsabgeordneten Gottfried Curio hatte kurzfristig und völlig überraschend ein rhetorisch geschickter und medial innerhalb der AfD und ihres Umfeldes äußerst präsenter Abgeordneter seine Kandidatur für den Kovorsitz neben Meuthen angekündigt. Curio ist der schlimmste Hetzer der AfD im Bundestag, ein Abgeordneter, der noch in jeder Rede die Grenzen der Volksverhetzung auslotet. Inhaltlich auf der völkischen Linie des „Flügels“ ist er formal jedoch nicht Mitglied dieser Strömung. Dennoch hätte die Wahl Curios das innerparteiliche Gefüge bedenklich ins Schwanken gebracht, weshalb Gauland bis zuletzt eine Kandidatur offenließ. Als dritte Kandidatin bewarb sich Dina Guth, Landes- und Fraktionsvorsitzende in Niedersachsen, um die Nachfolge Gaulands. Guth wird eher dem national-liberalen Teil der Partei zugeordnet.

Trotz der schwächsten Bewerbungsrede unter den drei Kandidierenden wurde Chrupalla gewählt. Allerdings erst in einer Stichwahl gegen Curio, die er mit 54,5 % zu 41,2 % für sich entschied. Ganz offensichtlich haben die von Gauland mit dem Flügel getroffenen Absprachen zumindest soweit gehalten, dass Chrupalla gewählt wurde – wenn auch mit einem knappen Ergebnis. Mit Alice Weidel (76,5 %, ohne Gegenkandidat), Stephan Brandner (61,9 % gegen Albrecht Glaser 21,7 % und Uwe Junge 15 %) und Beatrix von Storch (51 %, in der Stichwahl gegen Stephan Protschka 46,2 %) wurden Bundestagsabgeordnete aus allen Teilen der Partei zum ersten, zweiten und dritten Stellevertreter/in gewählt.

Mit der Wahl der engen Führungsspitze hat die AfD bewiesen, dass sie in Nichts eine tatsächliche Alternative zu den anderen Parteien ist. Die Trennung von Amts- und Mandatsträgern, wie sie früher mal von den Grünen betrieben wurde, hat es bei der AfD nie gegeben. Neben Meuthen, der im EP sitzt, sind ausschließlich Bundestagsabgeordnete in den engen Führungskreis gewählt worden. Mit Stephan Brandner – der demonstrativ für seine Abwahl als Vorsitzender des Rechtsausschusses entschädigt werden sollte – hat der „Flügel“ einen eigenen Mann und mit Chrupalla einen Vertrauten dort platziert. Als Beisitzer wurden Sylvia Limmer (Europaabgeordnete aus Bayern), Andreas Kalbitz (Fraktionsvorsitzender Brandenburg), Jochen Haug (MdB), Stephan Protschka (MdB), Alexander Wolf (Fraktionsvorsitzender Hamburg und Mitglied der extremen rechten Burschenschaft Danubia) und Joachim Paul (MdL Rheinland-Pfalz, verzichtete wegen Kontakten zur NPD erst kürzlich auf die Kandidatur zum Landesvorsitzenden) gewählt. Kalbitz, der trotz klarer Nazivergangenheit mit 50,3 % gegen Kay Gottschalk gewann, konnte seinen Posten verteidigen. Neben ihm sind auch Stephan Protschka, Alexander Wolf und Joachim Paul der Parteirechten zuzuordnen, womit dieser Teil der Partei seinen Einfluss ausbauen konnte. Pazderski, Gottschalk und Hartwig als mehr oder weniger klare Vertreter einer gemäßigteren Linie wurden nicht wieder in den Bundesvorstand gewählt.

Keine inhaltlichen Debatten

Inhaltlich gab es im Vorfeld bzw. in den Anträgen zum Parteitag wenig Spannendes. Resolutionen zum Wiedereinstieg in die Atomkraft und zur Ächtung des Sozialismus sollten verabschiedet werden. Die meisten Parteitagsanträge bezogen sich auf das Thema Schiedsgerichte. Mit diesem Instrument wird der innerparteiliche Richtungskampf häufig geführt und jede Seite versucht, es der anderen aus der Hand zu schlagen. Ein Antrag plädierte gleich dafür, dass jedes Vorstandsmitglied, das einen schlussendlich erfolglosen Ausschlussantrag unterstützt, seinen Posten verliert – eine übliche Methode der Völkischen, sich gegen Kritik und Widerstand zu verwahren. Die Forderung, das Verursacherprinzip bei finanziellen Verfehlungen im Zusammenhang mit Parteispenden einzuführen, zielte klar auf Meuthen und Weidel, die der Partei durch die Annahme illegaler Spenden hohe Strafzahlungen eingebrockt haben. Schließlich gab es den Vorschlag, die Unvereinbarkeitsliste zu streichen, mit der die Mitgliedschaft von organisatorisch zuordnenbaren Nazis verhindert werden sollte. Das wäre in der Tat sinnvoll, denn die Liste ist ein einziges Feigenblatt, um das sich in der Realität niemand in der Partei schert. Spätestens mit der Person Kalbitz wurde deutlich, dass in der AfD auch Karriere machen kann, wer sein politisches Leben im engen Umfeld der extremen Rechten verbracht hat. Warum sollte die Partei auch jemanden für ein politisches Vorleben bestrafen, das er inhaltlich ohne jeden Wandel in der AfD fortsetzen kann?

Zwar wurden alle inhaltlichen Anträge nicht behandelt aber die Wahl von z.B. Kalbitz hat gezeigt, dass die Unvereinbarkeitsliste, an der Meuthen nach eigener Aussage beim Parteitag, unbedingt
festhalten will, tatsächlich nur eine kosmetische und keine inhaltliche Rolle in der AfD spielt. Der immer wieder verschobene „Sozialparteitag“ der AfD soll nach bisherigem Stand in der ersten
Jahreshälfte 2020 stattfinden.

von admin am 02.12.2019 12:32


07.12.2019

Malte Kiefer (beLI3VeR)

Threema Lizenzen zu verschenken

Wie in den letzten Jahren werde ich auch dieses Jahr wieder Threema Android Lizenzen verschenken. Dieses Jahr werde ich 5 Lizenzen verschenken. Dazu erhalten die Gewinner oder Glücklichen von mir einen Lzenzschlüssel, mit dem sie auf der Webseite von Threema dann den Android Client nach Eingabe des Lizenzschlüssel herunterladen können.

Es ist nicht möglich, damit Threema vom PlayStore sondern nur aus dem Threema Store herunterzuladen.

Teilnahme

Die Teilnahme ist ganz einfach. Die ersten 5 Nutzer die mich via XMPP / Jabber anschreiben wird (pr3ach3r@trashserver.net) und die folgenden Fragen richtig beantworten kann:

1.) Aus welchem Land kommt Threema? 2.) Was bedeuten die 3 grünen Punkte bei einem Threema Kontakt? 3.) Was ist der Threema Safe?

Ich freue mich auf eure Einsendungen. Ich möchte festhalten ich stehe in keine Zusammenhang mit Threema. Ich kaufe die Lizenzen zum vollen Preis und dieses soll auch keine Werbaktion für mich oder Threema sein. Ich will nur einen kleinen Teil zu mehr Datenschutz und Sicherheit beitragen.

von Malte Kiefer (malte.kiefer@mailgermania.de) am 07.12.2019 00:00


18.01.2019

(thoys)

Sprachassistenten und Datenschutz

https://www.heise.de/newsticker/meldung/Datenkraken-im-Wohnzimmer-Ist-die-Privatsphaere-noch-zu-retten-4270545.html

Momentan werden sämtliche (fast) Spracheingaben an die Hersteller übermittelt und dort verarbeitet. Dieser Artikel zeigt, dass es auch anders gehen könnte.

von Timotheus am 18.01.2019 21:01


07.03.2018

(Meillo)

2018-03-08

2018-03-08



If you want PCRE on the command line but your  grep(1)  does  not
offer  `-P'  (*not* offering it is what it *should* do!), you can
use this one:

     perlgrep() {
             perl -e 'my $re = shift; print grep { /$re/ } <>;' "$@"
     }

[0]



Discovered  some interesting facts about the GIF format.  [1] You
*are* able to use more than 256 colors, just not within one block
...  but  you can use multiple blocks for building True Color GIF
images!


[0]  https://debianforum.de/forum/viewtopic.php?f=34&t=168942#p1167421
[1]  https://debianforum.de/forum/viewtopic.php?f=29&t=168943&p=1167436#p1167436


http://marmaro.de/lue/        markus schnalke <meillo@marmaro.de>

07.03.2018 23:00


24.08.2014

Marco Scholtyssek (marco_s)

SRF02 ultrasonic sensor with STM32F4-Discovery

This blog has been moved: http://scholtyssek.org/blog/2014/08/24/srf02-ultrasonic-sensor-with-stm32f4-discovery/

The SRF02 Ultrasonic range finder is a ultrasonic distance sensor, which is a transceiver with only one membrane. That's practical, because the sensor is very small and so it is perfect for small sized hardware applications. It detects distances from 16 to 6000 cm. The Sensors needs a 5 V source, so it can be directly connected to many microcontroller. It communicates through serial interface or through i²c bus (also I2C bus called). The following article describes how to connect and use the sensor with a STM32F4 through I2C. The databus is very handy because it needs only two wires (SDA and SCL) for communication. SDA is the data wire and SCL is the clock. Components can be distinguished by a unique I2c address. In this example there are four SRF02 sensors on one bus. The configuration of the address will be described too. The I2C master is a ARM based STM32F4-Discovery (STM32F407VG) controller.





SRF02 Basics

The SRF02 measures distances with ultrasonic signals. Therefore the sensor sends a short echo impulse through the membrane and afterwards it detects the reflection of the signal. The sensor also measures the time. The speed of sonic is constant, so the distance can be calculated with the time between sending the signal and detecting the reflection. This procedure is called time-of-flight. 
The SRF02 must not be calibrated, this was already done by the manufacturer. The sensor provides three different units which can be configured. The following table shows the configurations for the different configuration:

address function
0x50 measured data in inch
0x51 measured data in cm
0x52 measured data in microseconds
0x56 fake range mode (inch)
0x57 fake range mode (cm)
0x58 fake range mode (microseconds)
0xA0 1. sequence to set the I2C address
0xA5 2. sequence to set the I2C address
0xAA 3. sequence to set the I2C address

Setting an unique I2C address

The addresses of the sensors are transferred as hexadecimal bytes. Initially, every sensor has the same address 0xE0. If there is only one sensor on the bus, there is no need to change the address, but if there are a few of these sensors, the address has to be changed to an unique one. The new address has to be transferred to the command register of the sensor (0x00). To change the address, the sensor has to get into a mode, where it receives and saves the new address. So, there are three control bytes (1. - 3 sequence) which has to be transmitted. The new address will stay saved on the sensor, even if it's switched off.
The sensor shows it's address while starting. There is a LED, which flashes the saved address with short impulses. When the sensor is switched on, is flashes the LED once (long impulse). After this, the sensor flashes the address as short impulses. For example, with the address 0xE0 the sensor will not give short impulses, but with the address 0xF0 it will flash eight times. The mapping of the addresses and the signals can be found in the following table:


address flashes
0xE0 0
0xE2 1
0xE4 2
0xE6 3
0xE8 4
0xEA 5
0xEC 6
0xEE 7
0xF0 8
0xF2 9
0xF4 10
0xF6 11
0xF8 12
0xFA 13
0xFC 14
0xFE 15

In the repository (project: SRF02_example) there is an implementation to change the sensor address. Because of the fact that the all of the SRF02 sensors have the same initial address, it is necessary to change the address successively. The address change can be done with the function setSensorI2CAddress(). The function requires only the current and the new I2C address. An example implementation looks like this:

#include "SRF02.h"

int main(int argc, char **argv) {
uint8_t address = 0x00;
initSRF02();
while(1){
initUltrasonicSensorI2C(SENSOR1_ADDRESS);
setSensorI2CAddress(SENSOR1_ADDRESS, 0xF0);
}
}


Connect the sensor with STM32F4

The example code in the repository shows how to configure and connect the sensor with the STM32F4 controller. It can be found in the directory SRF02_example. The project uses four sensors in total. First the I2C bus is initialized with the function initSRF02(). After this, every sensor gets initialized by a call of initUltrasonicSensorI2C() which expect the sensor's I2C address. This function sets the measured unit additionally. Then the distance can be measured by the readDistance() function. The following code snippet is an example implementation to read the distance by one sensor:


#include "SRF02.h"

uint16_t distance[4];
uint16_t minimumRange[4];

int main(int argc, char **argv) {
uint8_t address = 0x00;
initSRF02();

/* receive sensor data */
while (1) {
initUltrasonicSensorI2C(
SENSOR1_ADDRESS);
distance[i] = readDistance(SENSOR1_ADDRESS);
}
}

Anhang

datasheet

supplier: exp-tech






von Anonymous (noreply@blogger.com) am 24.08.2014 20:37


10.08.2010

Marco Laspe (rockiger)

Feiner Tropfen für Ubuntu-User

Neulich habe ich einen Wein für Ubuntu-User gefunden. Leider war der Laden schon geschloßen. Demnächst wird es aber eine Weinprobe geben :). Und € 9,99 ist ja auch nicht übertrieben. Prost!

von Marco am 10.08.2010 07:52


18.01.2013

Vinzenz Vietzke (vinz)

Tor und Tor-Browser in Fedora 17/18 installieren

Jamie Nguyen hat Tor und Tor-Browser für Fedora paketiert. Um diese Pakete über sein Repository zu bekommen, installiert ihr euch entweder das Release-Package oder macht das von Hand:

wget https://jamielinux.com/pub/jamielinux-tor-release.noarch.rpm
yum install ./jamielinux-tor-release.noarch.rpm

Danach installiert ihr alle nötigen Pakete, aktiviert und startet Tor. Alle Pakete sind GPG-signiert.

yum install tor tor-browser tor-browser-selinux
systemctl enable tor.service
systemctl start tor.service

Optional könnt ihr mit "tor-browser-selinux" die Unterstützung für SELinux installieren.

von vinzv am 18.01.2013 09:52


22.01.2018

Jörg Kruse (4A4B)

PHP 7.1: [] operator not supported for strings

Ein Upgrade auf PHP 7.0 konnte bei älteren Scripten mitunter einiges an Anpassungsarbeiten verursachen, wenn dort z.b. noch die veraltete MySQL-Schnittstelle verwendet wurde. Auch PHP 7.1 beinhaltet einige abwärtsinkompatiblen Änderungen, so dass auch hier ein Testen vor dem Upgrade angesagt ist. Ein Fehler, der mir inzwischen häufiger untergekommen ist, ist die Initiierung eines Arrays mit einem leeren String. In PHP 7.1 kann dies nun dazu führen, dass das betreffende PHP-Script nicht weiter ausgeführt wird:


<?php

$foo = '';

$foo[] = 'bar';

Wird mit [] ein erstes Element hinzugefügt, löst dieses in PHP 7.1 einen Fatal Error aus:

PHP Fatal error: Uncaught Error: [] operator not supported for strings

Wenn $foo dagegen weiter oben, wie es sich gehört, als Array initiiert wird, verschwindet die Fehlermeldung:


<?php

$foo = array();

$foo[] = 'bar';

von Jörg am 22.01.2018 19:56


25.07.2017

Christian Schmitt (slater)

WTF

16 Grad C im Juli!???!

von Slater am 25.07.2017 09:02


17.02.2018

(c3f2o)

Sören Kohlhuber: „Nach dem Sturm“

Mit „Nach dem Sturm“ legt der Journalist und Fotograf Sören Kohlhuber sein drittes Buch über aktuelle Nazibewegungen in Deutschland vor. Auf 226 Seiten berichtet Kohlhuber über diverse Nazidemos in den Bundesländern Thüringen, Sachsen Anhalt, Brandenburg, Berlin und Mecklenburg Vorpommern aus dem Jahre 2016. Ebenso betrachtet wird der „Tag der Deutschen Zukunft“ in Dortmund.

Kohlhuber geht in seinem dritten Buch, ebenso wie in den ersten beiden, dem Phänomen der rassistischen Aufmärsche in Ostdeutschland nach, besucht aber auch wieder jährlich stattfindende Aufzüge wie z.B. das sogenannte
„Heldengedenken“ in Dessau oder den Demminer Naziaufmarsch am 8. Mai.

Mit etwas Abstand zu den Hochzeiten der Jahre 2015/16 lässt sich resümieren, die mehr an rassistischen Aufmärschen dürfte sich erst mal erledigt haben. Jedoch zeigen Aufmärsche wie in Cottbus am 20.1.18, dass es nach wie vor einen großen rassistischen Nährboden gibt, der es bei ausreichender Skandalisierung schafft, mehrere Tausend Menschen zu mobilisieren, um gegen Geflüchtete und Andersdenkende mobil zu machen und eben diese spontanen Großaufmärsche zeigen, da gebe ich Sören recht, der deutsche Antifaschismus hat seine Wehrhaftigkeit verloren.

Zu Recht kritisiert er den Charakter von einigen zivilgesellschaftlichen Protestformen, z.B. in Form von Spendenläufen etc.. Und ja bei Naziaufmärschen geht es den Nazis immer um Deutungshoheit über ein bestimmtes Gebiet, einer Bestimmten Stadt oder Viertels und genau diese Deutungshoheit gilt es ihnen streitig zu machen, sie ihnen zu nehmen, egal ob in der Rigaer Str. in Berlin, im brandenburgischen Beeskow oder oder oder…

Während die Berichte zu den 14 von ihm besuchten Aufmärschen in gewohnter Manier daher kommen, also etwas zur Geschichte der Stadt/Region, kleiner Einblick in die Linke Szene Vorort und sich dann dem Tagesgeschehen gewidmet wird, enthält das Buch auch einen interessanten Einblick in das Berliner/Brandenburg Demogeschehen, in dem Szenen und Strukturen wie Bärgida-, Pogida und auch die Brandenburgerprovinz betrachtet wird, in der bis heute regelmäßige wöchentliche oder monatliche Rassisten bzw. Nazidemonstrationen stattfinden. Vielen Dank für den lohnenden Einblick.

Dann ist da nach wie vor das von ihm und vielen anderen kritisierte „wer es nicht mal in der eigenen Stadt (Berlin) schafft, sich zu bewegen, von dem kann man eine Reise in die Prärie auch nicht erwarten.“ Ich denke dieses Problem wird sich auch zukünftig nicht aufbrechen lassen, auch wenn es hier und da Erfolgserlebnisse gibt. Die linken Szene-Partys in den urbaneren Städten sind für viele junge Aktivist*innen attraktiver, als sich in der Prärie blicken zu lassen um dort Nazis und Rassist*innen aufzuzeigen, dass sie hier nichts zu suchen haben und dass AfD und Co. hier nichts zu melden haben. Gegrüßt seien an der Stelle alle die sich immer wieder in die Prärie begeben und dort Linke und antifaschistische Strukturen supporten, all jene die wichtige Recherchearbeit leisten und alle die sich nicht vom rechten Terror einschüchtern lassen. Aufgeben ist keine Option, stay rude, stay rebel!

Das Buch bzw. Sören gibt sich den Anspruch den Aufstieg von Pegida, die Hochphase und die Wirkung der neuen Rechten aufzeigen zu wollen. Den Anspruch erfüllt es allemal. Wie es sich in den nächsten Jahren in diesem Bereich weiter entwickeln wird, werden wir abwarten müssen. Es gilt jedoch aufmerksam und Wachsam zu sein!

von admin am 17.02.2018 09:26


23.03.2020

(thoys)

Corona? Da gibts doch sicher was von Moodle

Dann folge ich doch mal dem Aufruf von Jürgen von BITBlokes und haue in die Tasten.
Ich bin Medieninformatiklehrer an einer einzügigen Privatschule und meine Coronaferien (achtung Sarkasmus) begannen folgendermaßen:

Am Freitag, den 13. März wurde klar, dass Präsenzunterricht an unserer Schule die nächsten Wochen nicht mehr stattfinden wird.

Freitag 13. März, ab 19 Uhr
Die Lernplattform Moodle (Learning Management Plattform) wurde aus anderen Gründen bereits auf unserem neuen Server installiert, jedoch in keiner Weise konfiguriert. Diese Arbeit stand nun an und es zeigt sich, dass keine Benutzer/innen, außer dem Admin, in Moodle registriert sind.
Fachlich: Keine LDAP-Anbindung an unsere bestehende Benutzerdatenbank.

Samstag 14. März
Die Konfiguration von Moodle stand im Vordergrund. Es ist nachvollziehbar, dass sich das Gefühl von „wir haben nur eine Chance“ im Bauch breit machte. Denn eine nicht funktionierende Plattform wäre nach wenigen Tagen so leer, wie unsere Schulgebäude.
Es findet eine Gesamtkonferenz statt, die Beschließt, dass Moodle offiziell zur Lernplattform wird.

Sonntag 15. März
Von nun an sind Mitglieder der Schüleradmins tatkräftig mit an Bord. Die Daten der Schüler/innen der Oberstufe und die Zugangsdaten der Lehrer/innen werden aufbereitet und in Tabellen übertragen, damit sie in Moodle eingefügt werden können.
Fachlich: CSV Dateien mit der richtigen Syntax erstellen.
Ohne die LDAP Anbindung haben wir keinen Zugriff auf aktuelle Passwörter des Schüler-Lehrer-Netzwerks. Zudem werden nur bestimmte Arten von Nachrichten von Moodle per Mail versendet, andere stranden im Postausgang. Mit viel Hirnschmalz, viel Einsatz und wenig Mittagessen wurden jedoch alle Probleme soweit gelöst oder umgangen, dass am Montag die Schüler/innen und Kolleginnen kommen können.
Stand jetzt: Die Plattform und die App, sowie die Bedienung per Browser funktionieren für Schüler/innen und Lehrer/innen. Alle, in der Oberstufenkonferenz besprochenen Kurse, sind angelegt und mit den entsprechenden Trainern (Ausdruck für Lehrer/innen in Moodle) versehen.

Montag 16. März
8:30 Uhr
Die Schüler/innen kommen. Jeweils eine Halbe klasse zur Installation und Einrichtung der App und die andere Hälfte zur Einführung in die Bedienung von Moodle am Computer. Nach einer halben Stunde werden die Gruppen getauscht und nach wieder eine halben Stunde kommt die nächste Klasse.
Was ist das eigentlich: Pause?

13:30 Uhr
Bis auf wenige Ausnahmen installierten alle Schüler/innen der Oberstufe die App, änderten ihr Passwort und lernten den rudimentären Umgang mit Moodle.

14:15 Uhr
Erste Schulung der Kolleg/innen.

17:45 Uhr
Vorstandssitzung – hier wurden im Vorgespräch und auch während des Sitzung mögliche Datenschutzbedenken durch Moodle in den Blick genommen. Da die Plattform auf unserem eigenen Server läuft und auch das Nachrichtensystem das eigene Haus nicht verlässt, deckt unser – in dieser Konferenz verabschiedete – allgemeines Datenschutz-Konzept alle datenschutzrechtlichen Bedenken ab.

Dienstag 17. März
Die ersten Schüler/innen starten in die Kurse, schreiben Nachrichten mit Fragen und geben erste Ergebnisse ab. Es scheint vieles zu funktionieren – Puh!
Eine zweite, gut besuchte Einführung für Lehrer/innen findet statt.
Kurse werden mit viel Fleiß von Lehrer/innen mit Inhalten befüllt und Schüler/innen arbeiten sich in die Plattform und die Inhalte ein.

Mittwoch 18. März
Verschnaufen von Seiten der Moodle-Verantwortlichen. Die Plattform läuft nicht perfekt, aber sie läuft so gut, dass sie genutzt werden kann. Ausschlafen!

Die Todo-Liste beinhaltet nun die Hilfestellung für Lehrer/innen und Schüler/innen und die Beschäftigung mit der Technik hinter Moodle. Backup, PHP- und andere Server-Einstellungen und die Konfigurationen der Plattform werden nun in Ruhe angegangen.

Donnerstag 19. März
Es läuft einfach.

Freitag 20. März
07:20 Uhr
„The service is not available. Please try again later.“
Das bedeutet so viel, wie die Hölle friert ein. Moodle ist down. Aber die Supportfirma das erste Mal in der Woche erreichbar. Schön ist, dass sie vor 10 Minuten noch ging, die Ausfallzeit ist also gering, wenn es jetzt schnell repariert wird. Bis ca. 12:30 Uhr.

Mal sehen, wie es weiter geht….

Bildquelle von Wikipedia: Von Moodle.org – https://moodle.org/logo/ https://moodle.org/logo/moodle-logo.svg, GPL, Link

von Timotheus am 23.03.2020 16:08


04.06.2020

Steffen Rumberger (inne)

Tripwire-Cronjob deaktivieren

Mitunter installieren Debianpakete Cronjobs in /etc/cron.*, um wiederkehrende Aufgaben auszuführen. Damit solch ein Cronjob (Script) ausgeführt wird, muss das Executable-Bit gesetzt sein. Entfernt man dieses, wird der Cronjob nicht mehr ausgeführt.

Mit dpkg-statoverride(1) kann man sich über Eigentümerschaft und Modus von Dateien hinwegsetzen und damit das Executable-Bit eines Cronjob entfernen:

dpkg-statoverride --add root root 644 /etc/cron.daily/tripwire

Der Vorteil von dpkg-statoverride(1) ist, dass die Hinwegsetzungen auch Paket-Aktualisierungen und -Neuinstallationen überdauern. Was sonst, bei durch die Paketverwaltung verwalteten Dateien, nicht der Fall ist.

Mit dpkg-statoverride --remove <path/to/file> kann man auf diese Weise selbst gesetzte Eigentümerschaft und Modus wieder entfernen und dpkg-statoverride --list listet alle Hinwegsetzungen auf.

PS: Ich habe dies für /etc/cron.daily/tripwire getan, da ich zwar Tripwire installiert habe, damit aber nicht das lokale System überwachen will. Sondern Tripwire nur nutze, um lokal ein anderes entferntes System zu überwachen (diesen Server hier) und mich die lokalen Tripwire Reports stören. Wofür der Cronjob da ist.
Zur Überwachung des entfernten Systems kopiere ich mittels SSH und rsync die Dateien und lasse dann Tripwire drüber laufen, wie im Linux Security Cookbook von O’Reilly gezeigt. Was auch gleichzeitig noch ein Backup sein kann…
Alternativ könnte man wohl auch die lokale Tripwire Policy entsprechend erweitern. Aber das will ich nicht, da mein Workflow etwas anders ist.

04.06.2020 17:10


24.03.2014

Manuel Kaderli (suntsu)

Be careful using ThreadStatic in Visual Studio unit tests

Given is a ThreadStatic field which is set to empty in the static constructor, and set by a public instance method:

    public class TestClass
    {
        [ThreadStatic] 
        private static string threadStaticValue;
        static TestClass()
        {
            threadStaticValue = "";
        }
        public void SetThreadStaticValue(string value)
        {
            threadStaticValue = value;
        }
        public string GetThreadStaticValue()
        {
            return threadStaticValue;
        }
    }

Now two unit tests check whether the threadStaticValue is set correct.

    [TestClass]
    public class ThreadStaticTest
    {
        [TestMethod]
        public void WithThreadStaticValueSetTest()
        {
            Debug.WriteLine("Thread id: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            TestClass tc = new TestClass();
            tc.SetThreadStaticValue("foo");
            Assert.AreSame(tc.GetThreadStaticValue(), "foo");
        }
        [TestMethod]
        public void WithThreadStaticValueNotSetTest()
        {
            Debug.WriteLine("Thread id: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            TestClass tc = new TestClass();
            Assert.AreSame(tc.GetThreadStaticValue(), "");
        }
    }

Those tests will fail(good) or pass(bad) depending of whether the test engine will reuse the same thread.

Executed a second time, the result could be different.

Solution:

  1. Don't use ThreadStatic at all
  2. Make sure the ThreadStatic fields are initialized correctly before using them

von suntsu (nospam@example.com) am 24.03.2014 11:28


13.11.2017

Christian Schmitt (slater)

Amazone Prime Video mit Linux Mint

Hej zusammen…

Ich habe heute mit meiner frischen installation von Linux Mint gekämpft… Prime Vido wollte nicht so wie ich es wollte…

Erst mal das was nicht geklappt hat:

Die ganzen Tips mit installiere HAL Lib über verschiedene wege…
Silverlight mit Wine…
Diverse Einstellung (hatten auch alle mit hal-libery zu tun)

Geholfen hat zum Schluss Mint selber!

Über das Start-Menü habe ich den Menüpunkt Multimedia ausgewählt. Dort wurde angeboten das Mint alles was Multimedia zu tun hat von alleine installiert… Jetzt läuft das mit Amazone Prime Video. Leider weiß ich nicht was alles am System jetzt geändert wurde von alleine… Mehdienwiedergabe, Rythmbox und VLC Player sind als einziges über das Multimedia Menü zusätzlich sichtbar und vorerst die einzigen Änderung die durchgeführt wurden.

Wenn ich noch was finde, was geädert wurde, werde ich es hier aktualisieren…

von Slater am 13.11.2017 19:00


20.03.2018

Stephan Tetzel (zefanja)

Wie man Check_MK aktualisieren kann

Zur Überwachung unserer IT-Infrastruktur verwenden wir OMD/Check_MK. Es lässt sich gut bedienen und wir haben den Status unserer Netzwerkkomponenten, Server, Drucker, etc. immer gut im Blick. Bis zuletzt haben wir noch die „old-stable“ Version verwendet (1.2.8), doch die CPU Auslastung stieg z.T. deutlich an, sodass es Zeit war, ein Upgrade auf die aktuelle stabile Version (1.4.0) vorzunehmen. Heute möchte ich zeigen, wie man Check_MK aktualisieren kann und was es dabei zu beachten gibt.

Check_MK aktualisieren

Mit Check_MK lassen sich mehrere Instanzen verwalten. Diese werden „sites“ genannt. Es ist möglich mehrere Versionen von Check_MK parallel zu installieren. Dabei kann jede Instanz eine der installierten Versionen verwenden. Das Softwareupgrade verhält sich also etwas anders, als man es vielleicht gewohnt ist.

Bevor wir unsere Instanz auf die neue Version upgraden können, müssen wir zuerst Check_MK aktualisieren. Dazu laden wir die aktuelle Version für Ubuntu 16.04 herunter (1.4.0).

$ wget https://mathias-kettner.de/support/1.4.0p26/check-mk-raw-1.4.0p26_0.xenial_amd64.deb

Danach müssen wir das Paket und evtl. fehlende Abhängigkeiten installieren:

$ sudo dpkg -i check-mk-raw-1.4.0p26_0.xenial_amd64.deb
$ sudo apt install -f

Nun können wir uns mit omd versions anzeigen lassen, ob die neue Version auch als Standard eingerichtet ist:

root@omd:~# omd versions
1.2.8p13.cre
1.4.0p26.cre (default)

Upgrade für OMD-Instanz durchführen

Die neue Version von Check_MK ist jetzt installiert, aber unsere „Site“, d.h. unsere Monitoring-Instanz verwendet noch immer die alte Version. Wir müssen also, neben Check_MK, auch diese noch aktualisieren. Dazu wechseln wir den Benutzer zu unserer Instanz mit

root@omd# su - meineInstanz

Zuerst stoppen wir unsere Instanz:

$ omd stop

Danach können wir das Update durchführen:

$ omd update

Bei der Durchführung des Upgrade bekommen wir einige Fragen gestellt, um Konflikte in der Konfiguration aufzulösen. Bei uns waren es v.a. Anpassungen von Dateirechten bei einigen Dateien. Hier kann man keine generelle Empfehlung geben, welche Antwort die richtige ist, aber so lange es sich nicht um eigene Anpassungen handelt, kann man i.d.R. die neue Version bzw. die neuen Dateirechte übernehmen.

Mit omd version können wir noch überprüfen, ob die aktuelle Version verwendet wird. Anschließend starten wir unsere Instanz wieder:

$ omd start

Wenn wir nun Check_MK im Browser aufrufen (https://monitoring.server/meineInstanz), kann es sein, dass wir folgende Warnung sehen:

Check_MK aktualiseren(c) https://mathias-kettner.de

Durch das Update sind natürlich auch die Plugins aktualisiert oder ersetzt worden. Im Laufe der nächsten Stunden wird es deshalb immer wieder Warnungen über nicht aktive bzw. veraltete Services geben. Check_MK warnt ebenfalls vor inkompatiblen Änderungen (siehe Bild). Mit einem Klick auf „Show unacknowledged incompatible werks“ können wir uns diese Änderungen anzeigen und mit einem weiteren Klick auf „Acknowlegde all“ akzeptieren.

Slack/Mattermost Plugin hinzufügen

Wir verwenden ein Plugin, dass uns im Falle eines Problems eine Nachricht in unseren Mattermost #monitoring Kanal schickt. Dies wurde beim Upgrade nicht mit übernommen, sodass noch etwas Handarbeit nötig ist. Das Plugin müssen wir an die richtige Stelle kopieren und die Rechte anpassen.

$ cp /opt/omd/versions/1.2.8p13.cre/share/check_mk/notifications/slack /opt/omd/versions/1.4.0p26.cre/share/check_mk/notifications/slack
$ chmod +x /opt/omd/versions/1.4.0p26.cre/share/check_mk/notifications/slack

Falls noch nicht vorhanden, müssen wir auch noch folgendes Paket installieren:

$ apt install python-requests

Nun taucht das Plugin wieder unter WATO → Notifications auf.

Check_MK Mattermost Slack

Fazit

Nach dem Upgrade läuft Check_MK wieder rund. Check_MK ist ein tolles Projekt und es hilft uns sehr unser Netzwerk, unsere Firewall und unsere Geräte im Blick zu behalten. So können wir oft Probleme erkennen, bevor jemand anderes sie bemerkt 🙂

Welche Software nutzt du zur Überwachung deiner IT-Infrastruktur?

1 Kommentar

Der Beitrag Wie man Check_MK aktualisieren kann erschien zuerst auf .:zefanjas:..

von zefanja am 20.03.2018 05:00


12.05.2018

Stephan Tetzel (zefanja)

Backup für LXD-Container

LXD ist ein Hypervisor für Linuxcontainer, den es seit einigen Versionen in Ubuntu gibt. Ein Linuxcontainer ist im Prinzip wie eine virtuelle Maschine, nur leichtgewichtiger. Wir verwenden LXD / LXC für viele unserer Anwendungen an der Schule. LXD lässt sich leicht bedienen und es gibt so einige Gründe, warum wir es verwenden. Heute möchte ich zeigen, wie man das Backup für LXD-Container machen kann.

1. Möglichkeit: lxc copy

Die einfachste Möglichkeit besteht darin, das man einen LXD-Container einfach auf einen anderen Rechner kopiert. Dazu braucht man einen zweiten LXD-Host, den man auf dem ersten als Remote hinzufügt.

$ sudo lxc remote add lxd2 192.168.1.50

lxd2 ist dabei der Name, den man dem zweiten LXD-Host geben wollen, gefolgt von der IP. Beim Setup des zweiten LXD-Hosts muss man darauf achten, dass er über das Netzwerk erreichbar ist und man muss auch ein Admin-Passwort vergeben. Dieses Passwort muss man eingeben, wenn man die Remote hinzufügen will.

Ist alles eingerichtet kann man sich z.B. alle Container auf der Remote anzeigen lassen:

$ lxc list lxd2:

Um nun ein Backup eines Containers zu machen, kopiert man ihn bzw. einen Snapshot auf die eben hinzugefügte Remote:

$ lxc snapshot my-container my-snapshot
$ lxc copy my-container/my-snapshot lxd2:my-backup

In umgekehrter Weise kann man den Container wieder auf dem ursprünglichen Host wiederherstellen.

$ lxc copy lxd2:my-backup my-container-restored

2. Möglichkeit: lxc export und lxc publish

Mit LXD kann man auch einen Container als komprimiertes Image exportieren und dann auf einem NAS, einem Offsite-Backup oder einem Cloud-Speicher sichern. Später können diese Images dann mit lxc import wieder importiert bzw. wiederherstellt werden.

Auf Github habe ich ein Skript gefunden, welches genau unsere Anforderungen erfüllt. Es exportiert den gewünschten Container und sichert ihn dann mit rclone (tolles Projekt!!!) auf einen Cloud-Speicher/NAS unserer Wahl.

Dazu muss man sich erst noch rclone installieren und einrichten. Ein Anleitung für die Installation und Pakete für alle Plattformen gibt auf der Projektwebseite. rclone unterstützt so ziemlich jeden Cloud-Speicher und Protokoll (ssh, webdav, …). Wir haben uns für ein Backup auf Google Drive entschieden, da wir da durch GSuite for Education unbegrenzten Speicherplatz haben 🙂

Ist rclone eingerichtet lädt man sich das Backup-Skript herunter, macht es ausführbar:

$ wget https://raw.githubusercontent.com/cloudrkt/lxdbackup/master/lxdbackup
$ chmod +x lxdbackup

Damit der Upload des Backups auch funktioniert muss man noch einige Parameter festlegen (v.a. RCLONETARGET).

$ nano lxdbackup
# Settings

# The target bucket or container in your Rclone cloudstorage 
RCLONETARGETDIR="lxdbackup" 
# Optional Rclone settings.
RCLONEOPTIONS=""
# Rclone target cloud used in your rlcone.conf
RCLONETARGET="my-remote"
# Directory were local images are stored before upload
WORKDIR="/tmp/lxdbackup"

Nun kann man das Skript mit folgendem Aufruf testen:

$ lxdbackup my-container

Wenn alles gut geht, sollten man sein Backup nach einiger Zeit (der Export eines Containers kann etwas dauern, je nach Größe) auf dem Speichern finden, den man in rclone konfiguriert hat.

Fazit

Bisher haben wir einfach den LXD-Host im Gesamten gesichert. Das reicht in der Regel aus, aber man verliert die Möglichkeit einzelne Container getrennt voneinander wiederherstellen zu können. Mit dem lxdbackup-Skript und der Kombination mit rclone haben wir nun viel mehr Möglichkeiten und können unsere Container sehr flexibel sichern. Mit Hilfe von Cronjobs haben wir das Backup automatisiert. Manche Container werden z.B. 2x am Tag gesichert, andere nur 1x in der Woche (und das nur, wenn keine Schulferien sind) – je nach Anwendungsfall.

2 Kommentare

Der Beitrag Backup für LXD-Container erschien zuerst auf .:zefanjas:..

von zefanja am 12.05.2018 02:44


24.08.2018

Jörg Kruse (4A4B)

WordPress: Hinweis auf Freischaltung von Kommentaren ohne Cookie

Vor zwei Jahren hatte ich festgestellt, dass WordPress einen Hinweis auf Freischaltung von Kommentaren nur dann anzeigt, wenn User beim Kommentieren eine E-Mail-Adresse angeben, die in einem Cookie gespeichert wird. Da ich im Zuge der DSGVO dieses Blog so angepasst habe, dass es weder Cookies speichert, noch im Kommentarformular eine E-Mail-Adresse abfragt, lasse ich nun einen Hinweis per JavaScript anzeigen.

In der comments.php habe ich hierzu oberhalb der freigeschalteten Kommentare einen leeren Absatz mit der ID „comment-unapproved“ stehen, der in der CSS-Datei mittels „display: none“ ausgeblendet ist:


<div id="comments">
<?php if ($comments) : ?>
    <h2>Kommentare</h2>
    <p id="comment-unapproved"></p>
    <?php foreach ($comments as $comment) : ?>
        <!-- ... -->
    <?php endforeach; ?>
<?php endif; ?>
</div>

#comment-unapproved {
  display: none;
  font-weight: bold;
  color: #933;
}

Die Weiterleitungs-URL nach Absenden eines Kommentars verweist im Anker auf die ID comment-{comment_ID}. Ist diese ID auf der Seite nicht vorhanden (da der Kommentar noch nicht freigeschaltet ist), dann fügt das folgende JavaScript den Hinweis in den leeren Absatz, blendet diesen mittels „display: block“ ein und ändert den Anker in der URL in „#comments“:


document.addEventListener("DOMContentLoaded", function() {
  if (window.location.hash) {
    var hash = window.location.hash;
    if (hash.substr(0, 9) == '#comment-' && ! document.getElementById(hash.substr(1))) {
      var notice = document.getElementById('comment-unapproved');
      notice.style.display = 'block';
      notice.textContent = 'Achtung: dein Kommentar muss erst noch freigegeben werden.';
      window.location.hash = '#comments';
    }
  }
});

Mit den Browsern, mit denen ich dies getestet habe (Firefox, Chromium, IE 11), funktioniert das soweit. Der Hinweis wird (unpassenderweise) auch angezeigt, wenn man gar nicht von WordPress weitergeleitet wurde, sondern eine nicht vorhandene ID manuell an die URL anhängt, von daher ist diese Lösung etwas „quick & dirty“. Aber dafür werden (die meisten) User nicht im Ungewissen darüber gelassen, was mit ihrem Kommentar geschieht.

von Jörg am 24.08.2018 13:44


08.05.2018

Malte Kiefer (beLI3VeR)

Kommentare mit Github

Ich bin ein großer Freund vom Datenschutz, leider unterstützt Hugo nur disqus, was alles andere als freundlich zum Datenschutz ist. Also gab es die letzten Monate nie eine Kommentar Funktion, das hat sich jetzt geändert.

Ich bin durch Zufall auf den Artikel von Don Williamson gestoßen, der es mir erlaubt eine Kommentar Funktion für meine Artikel durch Github anzubieten.

Konfiguration

Als erstes legen wir eine Datei comments.html im Ordner themes/THEME_NAME/layouts/partials/ mit folgenden Inhalt an:

<div id="gh-comments">
          <h2>Kommentare</h2>
              <div id="gh-comments-list"></div>
                  <a href="javascript:void(0)" id="gh-load-comments" class="btn" style="display:none">Load more comments</a>
</div>

   <script type="text/javascript" data-ghid="{{ $.Params.ghcommentid }}" src="{{ .Site.BaseURL }}js/github-comments.js"></script>

Als nächstes brauchen wir jetzt noch die JS Datei, die für uns die ganze Arbeit macht themes/THEME_NAME/static/js/github-comments.js mit folgenden Inhalt:

// use of ajax vs getJSON for headers use to get markdown (body vs body_htmml)
// todo: pages, configure issue url, open in new window?
//

var this_js_script = $('script[src*=github-comments]');


var ghid = this_js_script.attr('data-ghid');   
if (typeof ghid === "undefined" ) {
   var ghid = '0';
}

DoGithubComments(ghid);

var CurrentPage = 0;

function ParseLinkHeader(link)
{
    var entries = link.split(",");
    var links = { };
    for (var i in entries)
    {
        var entry = entries[i];
        var link = { };
        link.name = entry.match(/rel=\"([^\"]*)/)[1];
        link.url = entry.match(/<([^>]*)/)[1];
        link.page = entry.match(/page=(\d+).*$/)[1];
        links[link.name] = link;
    }
    return links;
}

function DoGithubComments(comment_id, page_id)
{
    var repo_name = "beli3ver/malte-kiefer.de";

    if (page_id === undefined)
        page_id = 1;

    var api_url = "https://api.github.com/repos/" + repo_name;
    var api_issue_url = api_url + "/issues/" + comment_id;
    var api_comments_url = api_url + "/issues/" + comment_id + "/comments" + "?page=" + page_id;

    var url = "https://github.com/beli3ver/malte-kiefer.de/issues/" + comment_id;

    $(document).ready(function ()
    {
        $.getJSON(api_issue_url, function(data) {
            NbComments = data.comments;
        });

        $.ajax(api_comments_url, {
            headers: {Accept: "application/vnd.github.v3.html+json"},
            dataType: "json",
            success: function(comments, textStatus, jqXHR) {

                // Add post button to first page
                if (page_id == 1)
                    $("#gh-comments-list").append("<a href='" + url + "#new_comment_field' rel='nofollow' class='btn'>Füge eine Kommentar hinzu</a>");

                // Individual comments
                $.each(comments, function(i, comment) {

                    var date = new Date(comment.created_at);

                    var t = "<div id='gh-comment'>";
                    t += "<img src='" + comment.user.avatar_url + "' width='24px'>";
                    t += "<b><a href='" + comment.user.html_url + "'>" + comment.user.login + "</a></b>";
                    t += " posted at ";
                    t += "<em>" + date.toUTCString() + "</em>";
                    t += "<div id='gh-comment-hr'></div>";
                    t += comment.body_html;
                    t += "</div>";
                    $("#gh-comments-list").append(t);
                });

                // Setup comments button if there are more pages to display
                var links = ParseLinkHeader(jqXHR.getResponseHeader("Link"));
                if ("next" in links)
                {
                    $("#gh-load-comments").attr("onclick", "DoGithubComments(" + comment_id + "," + (page_id + 1) + ");");
                    $("#gh-load-comments").show();
                }
                else
                {
                    $("#gh-load-comments").hide();
                }
            },
            error: function() {
                $("#gh-comments-list").append("Kommentarfunktion für diesen Beitrag nicht aktiviert!");
            }
        });
    });
}

Jetzt müssen die Links in der Datei angepasst werden. Ihr müsst eine eigne Repo anlegen bei Github und hier in der Datei anpassen. Achtung: Wir brauchen auch jQuery!. jQuery sollte umbedingt im <head></head> geladen werden.

Zum Schluss noch das Template für die Beitragsdatei anpassen (themes/THEME_NAME/layouts/_default/single.html) und den folgenden Teil for dem Aufruf des <footer></footer> Tags einfügen:

{{ partial "comments.html" . }}

Um jetzt die Kommentarfunktion zu nutzen, ein entsprechendes issue bei Github eröffnen, die ID merken. Wenn ihr dann einen neuen Beitrag erstellt, müsst ihr vor den "---" folgendes einfügen:

ghcommentid: ID

Und das wars, nun habt ihr und ich eine Kommentarfunktion.

CSP

Damit ihr diese Funktion mit CSP nutzen könnt, müssen folgende Einstellungen gesetzt sein:

img-src 'self' https://*.githubusercontent.com;
connect-src 'self' https://*.github.com

von Malte Kiefer (malte.kiefer@mailgermania.de) am 08.05.2018 00:00


24.06.2016

Helmut Roewer (Dunkelangst)

HKG✈KHH

Trip 35

Flight KA 450 from HKG to KHH

  • Flight 89: Hong Kong International Airport to Kaohsiung International Airport
  • Airbus A 330-300 – Dragonair
  • planed duration: 1h 25min
  • See also the itinerary to get an overview.

von Helmut am 24.06.2016 19:46


18.08.2010

Jürgen Braun (jaybe)

Android Tablet

Auch wenn ich den Hype um das Apple iPad nicht nachvollziehen kann (es funktioniert gut und sieht schick aus, ist mir aber zu teuer und bevormundet einen bei der Nutzung), so finde ich das Konzept eines Tablets doch ganz reizvoll. Wichtig ist jedoch, dass man sich über den Einsatzzweck klar wird. Für mich soll es keinen Ersatz für PC/Notebook/Netbook darstellen, sondern ein Gerät sein, mit dem man gemütlich auf der Couch seine Mails checken, in Foren stöbern, Facebook Nachrichten lesen, … also hauptsächlich Daten im Internet konsumieren kann.
Für 179.-€ war nun ein Tablet mit Android 2.1 angekündigt. Die Beschaffung gestaltete sich ein wenig schwierig und dauerte etwas länger, da das Gerät nicht wie angekündigt bereits montags erhältlich war, sondern erst eine Woche später als verfügbar gelistet wurde und bestellt werden konnte. In der Zwischenzeit waren auch erste Erfahrungsberichte von Benutzern aufgetaucht. Die Bandbreite war gewohnt groß und begann bei „der letzte Schrott“. Das folgende Fazit eines Benutzers ermutigte mich jedoch dazu, mir solch ein Gerät zu bestellen:

..ich sags mal ganz unverblümt
Das Ding ist nichts für Leute die den Ipad Killer erwartet haben und davon ausgehen das alles „out of the box“ für €179.- funktioniert..

Für alle anderen, die spaß an linux haben, lässt sich da sicher noch einiges machen bzw. fehlende funktionen nachrüsten.

Am Wochenende wurde das Gerät dann geliefert, die Inbetriebnahme musste jedoch bis Sonntag Abend warten.
Einloggen in das WLAN, Einrichten von Googlemail, Zugriff auf den eigenen Mailserver, Surfen im Web und die installierten Applikationen für Google Maps und YouTube funktionierten problemlos. Das Touch-Display lässt sich schwer bedienen, vor allem das Scrollen ist etwas umständlich, mit resistiver Technologie aber auch nur schwer umsetzbar, das funktioniert bei meinem Garmin-Navi aber auch nicht besonders.
Hardware

Billig wirkendes Plastik, vier Buttons auf der Gehäuserückseite für Zurück, Home, Suchen und Menü fühlen sich nicht besonders an und man muss sich die Position merken, da man sie nicht sieht.
Software

  • Browser: Eingabe über Touchscreen hakelig auch bei Verwendung des Eingabestiftes. Lädt und stellt die Webseiten recht flott dar.
  • Mail: Konfiguration von mehreren Mailservern möglich, Zugriff per POP3 oder IMAP
  • Google Maps: schnelle Darstellung der Karten, Layer für Satellitenbild und Wikipedia einblendbar. Bei Wikipedia werden „W“s eingeblendet, auf die man direkt klicken und Infos aus Wikipedia abrufen kann
  • Google Mail: direkte Verknüpfung mit meinem Google Mail Account, funktioniert einfach.
  • YouTube Player: direkte Verknüpfung mit meinem YouTube Account: Playlisten, Favoriten, … werden angezeigt. Suche ist möglich, Abspielen in voller Auflösung funktioniert sehr gut.
  • Android Market: Zuerst nicht gestartet, dann zwar gestartet, man konnte suchen und „installieren“, der Download kommt aber nicht zum Ende und es wird nichts installiert. Ein bekanntes Problem, es liegt wohl keine offizielle Google-ID vor.

Bisheriges Fazit: Wenn man nicht tippen muss, sondern sich auf Lesen/Sehen/Hören beschränkt, funktioniert das Tablet. Für die eingeschränkte mitgelieferte Software hätte ich es wohl nicht gekauft, ABER es gibt eine Seite mit Howtos, da wird erklärt, wie man das Gerät patchen, den Market aktivieren, auf alternative Markets umsteigen oder direkt die APKs installieren kann. Und wenn das dann funktioniert, kann es ein ganz brauchbares Gerät werden.


von jaybe am 18.08.2010 18:24


29.12.2011

Manuel Kaderli (suntsu)

Authenticate to smugmug with oAuth and c#

Some weeks ago, i tried to create a windows phone 7 smugmug app(photo browser). I had some problems with oAuth at the beginning, First, I tried the google oAuth implementation in c# with the result that the first request(AcquireRequestToken) worked, but the second request(AcquireAccessToken) failed with an invalid signature. Then i tried to implement it myself with the same result.

Even with the smugmug oAuth documentation, i found it quite hard to get it done. Some parts like the authorize parameters(public/full/read/modify) i had to figure out myself.

After some time, i found an c# oAuth class written for twitter access for cropperplugins.codeplex. With this code, i was at least able to get a proper AccessToken for smugmug. I've written a little demo application if someone else has the same problems.

To get this sample working, you only have to set you apiKey and secret. This sample will do: 1. Get a request token and a request token secret 2. Authorize the request token 3. With the request token secret, acquire a access token 4. This access token and access token secret are used for all further authentication, and should not expire until the user revokes them.

        private void AuthenticateSmugmug()
        {
            const string apiKey = "YOURAPIKEY";//apikey from your smugmug account
            const string secret = "YOUR_SECRET";//secret from your smugmug account

        Console.WriteLine("Create new instance of OAuth Manager");
        Manager manager = new Manager(apiKey, secret);

        Console.WriteLine("Aquire a request token from smugmug");
        OAuthResponse requestToken = manager.AcquireRequestToken("http://api.smugmug.com/services/oauth/getRequestToken.mg", "GET");

        string oauthToken = requestToken["oauth_token"];
        Console.WriteLine(string.Format("oauthToken: {0}", oauthToken));
        string oauthTokenSecret = requestToken["oauth_token_secret"];
        Console.WriteLine(string.Format("oauthTokenSecret: {0}", oauthTokenSecret));

        //Opens your default browser and authorize your request token
        //Parameters: Access=[Public|Full], Permissions=[Read|Add|Modify]
        System.Diagnostics.Process.Start(string.Format("http://api.smugmug.com/services/oauth/authorize.mg?oauth_token={0}&Access=Full&Permissions=Modify", oauthToken));

        Console.WriteLine("Please enter you credentials into the browser before continuing");
        Console.WriteLine("Press any key to continue...");
        Console.ReadLine();

        OAuthResponse accessToken = manager.AcquireAccessToken("http://api.smugmug.com/services/oauth/getAccessToken.mg", "GET", oauthTokenSecret);

        Console.WriteLine(string.Format("accessToken: {0}", accessToken["oauth_token"]));
        Console.WriteLine(string.Format("accessTokenSecret: {0}", accessToken["oauth_token_secret"]));
        Console.WriteLine("Press any key to quit the application");
        Console.ReadLine();
    }

This is the complete source code for the oAuth sample. It's c# written in Visual Studio 10: To get this sample working, just enter your Api Key and Secret. SmugmugOAuthSample.zip

von suntsu (nospam@example.com) am 29.12.2011 09:31


11.06.2020

Darian (thoys)

Projektstart – die Ausgangssituation

Am Anfang eines jeden Projekts muss man erst einmal schauen, was überhaupt Stand der Dinge ist. Also machen wir das mal und schauen, wo ich Funkverbindungen benutze, bevor ich starte, meine Funk-Bilanz zu reduzieren. Ich zeige euch meinen Arbeitsplatz und mein Zuhause. Denn an meinem Arbeitsplatz stehen zwar die meisten Geräte, aber mittlerweile nutze ich fast in jedem Raum ein Gerät, das einem den Alltag versüßt.

Mein Arbeitsplatz und mein Zuhause

Ich habe einen aufgeräumten Arbeitsplatz. Das brauche ich, sonst versinke ich im Chaos. Einiges ist noch mit Kabel verbunden, beispielsweise die Tastatur, die Maus und der Lautsprecher am Bildschirm.
An Funktechniken verwende ich:

  • DECT (Hausintern – Schnurlostelefon)
  • W-LAN (Hausintern – Daten vom Router)
  • Bluetooth (Nahbereich – Verbindungen zu Kopfhörern, Lautsprechern usw.)
  • 1G – 4G Mobilfunk (Fernbereich – Das durchgestrichene Flugzeug soll in diesem Fall die Verbindung zum Mobilfunkturm ohne Mobile Daten darstellen)
  • Mobile Daten (Fernbereich – Daten von Mobilfunktürmen)
Mein Arbeitsplatz und die verwendeten Funktechniken

Viele andere Geräte sind per Funk mit Sendern im Haus oder mit dem Funkturm verbunden. Es ist viel, aber es hält sich noch im Rahmen dessen, was heute als normal gilt – oder?

  1. An erster Stelle steht natürlich das Smartphone. Funkverbindung (4G) und Mobile Daten sind an. Für Zuhause ist das W-LAN und Bluetooth für den Kopfhörer aktiviert.
  2. Mein Smartphone und die genannten Verbindungen sind immer an – somit bin ich immer erreichbar.
  3. Das Handy von meinem Nebenjob ist alt aber funktioniert zum Telefonieren wunderbar und der Akku hält mehrere Tage – es kann ja auch nichts.
  4. Das Notebook ist per W-LAN mit dem Router zwei Stockwerte weiter unten verbunden, Bluetooth für die Kopfhörer und UMTS (3G).
  5. Das Tablet ist ebenfalls mit W-LAN verbunden und hat ab und zu Bluetooth an.
  6. Das Schnurlostelefon arbeitet mit DECT. Damit habe ich mich noch nicht weiter beschäftigt.
  7. Der Drucker ist ebenfalls per W-LAN eingebunden, er kann auch Bluetooth, aber das habe ich noch nie verwendet.
  8. Das W-LAN ist beim Router immer eingeschaltet.
  9. Ich habe einen Receiver für den Fernseher, der ebenfalls per W-LAN eingebunden ist.
  10. Die Musik kommt per Spotify.
  11. Ich habe ein Medienwiedergabegerät von Noxon, dies hat eine Antenne und auch W-LAN.
  12. Meine Internetgeschwindigkeit ist mit 50 Mbit/s ganz ordentlich für meine Gegend. Wenn ich schnelleres haben wollte, wäre das noch möglich. Den Stadtwerken sei dank, die Telekom hat nur 6 Mbit/s hinbekommen – abgesehen von Hybrid Tarifen, bei denen Kabel und 4G – Funk gemeinsam genutzt wird.
  13. Alle Programme, die auf dem Handy laufen (Messenger, soziale Medien und praktische Programme, wie der Bahn-Navigator) nutze ich ausschließlich auf dem Smartphone.
  14. Vor dem Fenster sehen wir in 150 Metern den nächsten Funkmast. Wir haben schnelles Internet per Mobile Daten.

Ich habe als 6 W-LAN Endgeräte, einen W-LAN Router, 4 Endgeräte mit Bluetooth und einen nahestenden Funkmast. Dazu zwei Geräte, die per Funkverbindung zum Funkturm Telefonieren und ein Schnurlostelefon.

Projektstart

Termin

Mein Plan ist, dass ich in zu allererst schaue, was ich durch Einstellungen von Geräten und durch kleine Verhaltsänderungen meinerseits machen kann.

Los gehts am 1. Juli.

Folgt mir per Mail oder RSS und sagt mein Projekt euren Freunden weiter. Je mehr Menschen mir Tipps geben können, umso besser. Und natürlich freue ich mich auf deine Meinung, denn manches wird ganz einfach und manches etwas… sagen wir, nicht-alltagstauglich werden.

Wie sieht’s bei euch so aus? Schreibt’s mir in die Kommentare!

-<-,–{@ Euer Darian

von Darian am 11.06.2020 07:09


29.01.2020

Steffen Rumberger (inne)

Adana Twins - 'My Computer feat. Glowal' (Official Video)

In this world of isolation.
A computer could rule the nation.

Become your planet preservation, your hands touch imagination.

29.01.2020 13:46


Willkommen!
Forum
Chat
Wiki/Tipps
Planet
Bildergalerie
Links
Twitter
dieses und jenes
Blogger
(BigOlly) (feed)
(Lord_Carlos und mweinelt) (feed)
(Meillo) (feed)
(Trurl) (feed)
(c3f2o) (feed)
(emge) (feed)
(thoys) (feed)
(trompetenkaefer) (feed)
Andre Nitschke (gnude) (feed)
Axel Hellinger (cryptolegal) (feed)
Beni Goll (Bennerl) (feed)
Bernd Dau (whisper) (feed)
Bert Radke (bert) (feed)
Bjoern Schiessle (BeS) (feed)
Christian Imhorst (immi) (feed)
Christian Schmitt (slater) (feed)
Christoph Langner (Chrissss) (feed)
Christoph Wickert (raoul) (feed)
Daniel Gestl (mcdaniels) (feed)
Darian (thoys) (feed)
Dominik George (Natureshadow) (feed)
Dominik Kupschke (bommi) (feed)
Dominik Pieper (nachtwandler) (feed)
Falk Husemann (josen) (feed)
Felix Schmeing (gimbar) (feed)
Gerrit Kruse (MrGerardCruiz) (feed)
Helmut Roewer (Dunkelangst) (feed)
Hendrik Richter (Hendi) (feed)
Holger Reinmann (codeaeffchen) (feed)
Jan Hauke Rahm (jhr-online) (feed)
Jochen Skulj (feed)
Jochen Welzel (jeff84) (feed)
Joerg Kastning (Tronde) (feed)
Jörg Kruse (4A4B) (feed)
Jürgen Braun (jaybe) (feed)
Lars Moelleken (voku1987) (feed)
Malte Kiefer (beLI3VeR) (feed)
Malte Schmidt (maltris) (feed)
Manuel Kaderli (suntsu) (feed)
Marc Nowak (TCA) (feed)
Marco Laspe (rockiger) (feed)
Marco Scholtyssek (marco_s) (feed)
Marco Scholtyssek (marco_s) (feed)
Marius M. M. (devilx) (feed)
Markus Matuszczak (konsumer) (feed)
Markus W. Kropp (Musix) (feed)
Martin Dosch (Dogge) (feed)
Mirko Weber (tylerD) (feed)
Nico Hartung (xyznico) (feed)
Oliver Groschopp (beetlefrosch) (feed)
Patrick Schmid (compr00t) (feed)
René Hering (ReneH) (feed)
Roman Hanhart (Thurgau) (feed)
Sabine Becker (AtariFrosch) (feed)
Sebastian Feltel (feltel) (feed)
Sebastian Moors (mauser) (feed)
Stefan J. Betz (encbladexp) (feed)
Steffen Moeller (smoe) (feed)
Steffen Rumberger (inne) (feed)
Stephan Tetzel (zefanja) (feed)
Sven S. (FearFactor) (feed)
Thorsten Sperber (TRex) (feed)
Tobias Dols (TobsenD) (feed)
Tom Karasek (Natas12) (feed)
Torsten Werner (bollin) (feed)
Viktor Bindewald (Vitei) (feed)
Vinzenz Vietzke (vinz) (feed)
posativ (feed)
Feeds
ATOM Feed
RSS 1.0 Feed
RSS 2.0 Feed
FOAF
OPML
Letztes Update
23.03.2023 08:31 (GMT+1)
Planetarium
Planet Debian
Planet Debian Administration
Planet Skolelinux
Planet Ubuntu
Planet RootForum
Planet symlink
Planet GNOME
Planet KDE
Planet Apache
Planet freedesktop.org
mehr ...
top
Zum Seitenanfang
Diese Webseite ist keine offizielle Webseite des Debian Projekts.
Haftungsausschluss und Impressum –Datenschutzrichtlinie – debianforum.de Verhaltensregeln

Powered by Planet Venus
Template entwickelt von Timo Salmen, basierend auf dem Debian Live Template, entwickelt von Christoph Haas.