staging.inyokaproject.org

16. April 2021

Als Edward Snowden 2013 mit seinen Enthüllungen die Globale Spionage- und Überwachungsaffäre auslöste, gelang es der Open Source-Bewegung irgendwie auf diesen Zug aufzuspringen und sich als Lösung zu präsentieren. Was für ein Mythos!

Ich hatte das Thema schon wieder ein bisschen aus dem Blickfeld verloren. Dankenswerterweise brachte mich eine Ergänzung unter meinem Artikel zu Custom ROMs wieder darauf. Ein paar Grundgedanken habe anschließend schon in der Empfehlung zu einer privaten Risikoanalyse festgehalten. Wer wirklich glaubt, staatliche Überwachung wäre sein größtes Problem, hat eine verkürzte Risikoanalyse betrieben. In diesem Artikel möchte ich mich trotzdem vor allem auf den Aspekt Überwachung konzentrieren.

Das Thema ist gewaltig und füllt ganze Handbücher. Hier können nur einige Aspekte angerissen werden und diese stehen vielleicht etwas inkonsistent nebeneinander. Trotzdem wollte ich das hier mal thematisieren, um mit dieser Grundannahme „Open Source schützt vor Überwachung“ aufzuräumen.

Tracking durch Firmen ungleich staatliche Überwachung

Es ist schon extrem schwer, Datenschutz gegenüber den global agierenden IT-Konzernen mit ihrer umfassenden (Telemetrie-)Datenerhebung durchzusetzen. Das liegt einfach daran, dass man diesen Konzernen nicht so einfach aus dem Weg gehen kann. Dazu gibt es am Beispiel Google eine sehr empfehlenswerte Analyse.

Konzerne wie Google arbeiten aber nur im Rahmen ihrer Möglichkeiten. Manchmal vielleicht in rechtlichen Graubereichen, aber sicher nie offen illegal. Sie können Daten erheben, sie können Dritte dazu bewegen, Daten für sie zu erheben, sie können Firmen aufkaufen, um an Daten zu kommen oder sie können sich am schnöden Datenhandel beteiligen. Nutze ich die Dienste einer Firma nicht und bewege mich sehr umsichtig im Netz, habe ich gute Chancen, mein digitales Profil bei dieser Firma klein zu halten. Wie klein, ist wieder abhängig von der Firma. Google und Facebook haben vermutlich trotzdem Daten. Kleinere Unternehmen vielleicht tatsächlich nicht.

Wirklich interessant ist aber der Irrglaube, dass man mit Open Source den Überwachungsprogrammen der Geheimdienste entgehen kann. Die Grunde für diesen Irrglauben bildet das PRISM-Programm. Denn Teil der durch Snowden offen gelegten Dokumente Überwachung war auch PRISM und wir wissen, dass US-Firmen in einem gewissen Maße Daten an die Geheimdienste weitergeben (müssen). Open Source Software wie Linux ist mit diesen Firmen weniger verwoben als beispielsweise Windows oder macOS. Das war es aber schon.

Datenerhebung durch Firmen ist nicht das gleiche wie staatliche (Massen-)Überwachung und sollte auch nicht argumentativ vermischt werden.

Operationen zur Massenüberwachung

Jeder, der irgendwie im Jahr 2013 dem Mythos „Open Source hilft gegen Überwachung“ aufgesessen ist, sollte sich noch einmal den entsprechenden Wikipedia-Artikel zu den Enthüllungen von 2013 (ist auch schon wieder eine Weile her!) durchlesen. Wir wissen dadurch, dass die Geheimdienste mehrerer Staaten unter anderem folgende Maßnahmen zur Überwachung durchführen:

  • Die NSA betreiben ein Rechenzentrum, das theoretisch groß genug ist um die Kommunikation der Weltbevölkerung zu speichern. Es gibt bekannte Programme um den Telefonverkehr kompletter Länder mitzuschneiden.
  • Die Geheimdienste der Five Eyes schneiden den Datenverkehr direkt an den Seekabeln mit.
  • Mehrere Daten wie z. B. Frankreich oder Brasilien speichern in großem Umfang die Metadaten der Internetnutzung und Kommunikation der Bevölkerung.
  • In Deutschland lauscht der BND am Frankfurt Internetknoten DE-CIX.
  • Die NSA nutzt hortet Sicherheitslücken und nutzt diese gezielt aus. WannaCry war sicher nur ein Beispiel von vielen.

Diese Liste ließe sich fast endlos fortführen. Und das ist mehrheitlich der Stand von vor 2013, also mittlerweile mindestens 8 Jahre her. Eine Ewigkeit bei dem Tempo der aktuellen Entwicklung. Es umfasst auch nicht die chinesischen und russischen (semi-)staatlicher Cyberoperationen und deren Überwachungsprogramme. Es handelt sich dabei auch nur um die automatisierte Massenüberwachung der Menschheit und keine gezielten Aktivitäten gegen einzelne Individuen, bei denen – nach allem was wir an Informationen haben – Aufwand und Möglichkeiten noch einmal deutlich ansteigen.

Die alleinige Fokussierung auf PRISM ist also eine extreme Verkürzung.

Und diesem allumfassenden Überwachungsprogramm der besten Geheimdienste der Welt entgehe ich wirklich, indem ich ein Open Source-Betriebssystem nutze? Ernsthaft? Wer das glaubt, hat die Fähigkeit der Dienste und Dimension dieser Programme nicht ansatzweise begriffen. Er hat zudem ein idealisiertes Bild freier Software, das einem Realitätscheck nicht stand hält.

Warum sollte quelloffene Software vor Überwachung schützen? Die Argumentation dafür basiert auf ideologischen Scheuklappen und Fehlannahmen.

Allgemeine (Fehl-)Annahmen

1. Es geht nicht um dein Gerät

Automatisierte Massenüberwachung bedeutet nicht, dass Tausende Mitarbeiter sich händisch auf jedes Gerät einloggen und dort Kamera und Mikrofon aktivieren wie in einem schlechten Film. Dein Gerät interessiert niemanden. Folglich interessiert dein System auch niemanden. Es ist egal, ob du Linux, FreeBSD, macOS oder Windows nutzt.

Die Datenströme sind interessant und hier gibt es Unterschiede zwischen den Systemen. Das hängt aber massiv von der individuellen Konfiguration ab. Auch macOS oder Windows lassen eine erhebliche Reduktion des Datenabflusses zu und auch Linux lässt sich als wahre Datenschleuder betreiben.

2. Daten fallen bei den Diensten an

Wirkliche Datenmengen fallen bei den genutzten Diensten an. E-Mail, Videokommunikation, Cloud-Dienstleister – die Liste ließe sich endlos fortführen. Diese Datenströme sind auch im Fokus der automatisierten Überwachung. Es ist streng genommen egal was diese Dienste für Software vorgeben zu nutzen. Wir können es nicht nachvollziehen.

Wir kennen auch nicht die internen Qualitätsstandards, die politische Ausrichtung des Dienstes und ob das Land, in dem der Dienst betrieben wird, über irgendwelche legalen oder illegalen Maßnahmen Druck auf den Dienstbetreiber ausüben. Selbst deutsche Gesetze haben hier Überraschungen, als Stichwort sei hier die Vorgaben zur Ausleitung von Daten für E-Mail Anbieter genannt.

Der kleine Anbieter mit primär Open Source Software im Einsatz ist hier in keiner stärkeren Position gegenüber den staatlichen Behörden als Microsoft oder Apple. Er ist bestenfalls nicht so sehr im Fokus, aber das kann sich auch schnell ändern.

Die Reduktion der genutzten Dienste und die Reduktion der erzeugten Daten sind hier die Lösung.

3. Verschlüsselung, Verschlüsselung, Verschlüsselung

Wirklich relevant ist gute und aktuelle Verschlüsselung. Das war 2013 so und ist 2021 so. Zumindest sofern man noch nicht gänzlich der pessimistischen Sicht verfallen ist, dass besonders fähige Geheimdienste wie die NSA auch diese schon längst knacken können.

Verschlüsselung ist kein exklusives Vorrecht von Open Source und die wirkliche Gefahr geht hier nicht von fehlender Verschlüsselung, sondern durch schlechte Umsetzung aus. Zentrale Bibliotheken des Open Source-Ökosystems haben hier in der Vergangenheit nicht geglänzt. Es gibt auch genug Mischsysteme, wo grundsätzlich proprietäre Dienste auf quelloffene Krypto-Bestandteile setzen.

Es gibt somit keinen belastbaren Grund, dass freie Betriebssysteme hier prinzipiell im Vorteil wären.

Mythen über Open Source

1. Die Einsehbarkeit des Codes sagt nichts über die Qualität

Offen einsehbarer Quellcode gilt in vielen Kreisen als Synonym für sicher und vertrauenswürdig. Im Zuge der Debatte um Projekte wie die Corona Tracing App oder die Luca App hat sich das vermutlich nochmal verstärkt.

Freie quelloffene Software und ihre Entwicklungsprinzipien sind ganz sicher nett für einen vertrauenswürdigen und integren Code. Es können halt mehr Leute rein gucken und man vermeidet dadurch vielleicht doofe Fehler und schlechte Sicherheitskonzepte. Also durchaus Punkte, an denen Geheimdienste ansetzen könnten. Das ist ein Pluspunkt für quelloffene Software, den man nicht leugnen kann.

Guter Code und gute Sicherheitskonzepte sind aber kein Exklusivrecht von freier Software, auch Entwickler proprietärer Software können das. Das sollte man nicht pauschal in Abrede stellen. Es sind ja sogar oft die gleichen Menschen, die mal für freie Software beisteuern und mal für ein proprietäres Projekt arbeiten.

2. Es geht nicht um Hintertüren

Das Kernproblem ist hier aber ein Mythos. Warum sollte die Code-Einsicht denn bei der Frage staatlicher Überwachung so zentral sein? Wer glaubt, freie Software hilft gegen die Geheimdienste, sitzt der alten Verschwörungserzählung auf, diese würden heimlich Hintertüren in Software einbauen. Nach allem was wir an Informationen haben, ist das für die Dienste aber überhaupt nicht notwendig.

Denn wie wir oben bei den Überwachungsprogrammen gesehen haben, geht es primär um Infrastrukturen und diese unterliegen sowieso staatlicher Regulierung. Hier spielt Überwachung durchaus eine Rolle. Es geht also selten um die Betriebssysteme selbst.

Auf Ebene der Betriebssysteme und Software nutzen die Geheimdienste genaue Kenntnisse der Systeme und insbesondere das Horten von Sicherheitslücken. Für Letzteres hatten wir in den vergangenen Jahren genug Belege. Sicherheitslücken machen nicht halt vor freier Software.

Die Verschwörungserzählung der Hintertür befeuert letztlich den Mythos „Open Source hilft gegen Überwachung“ und schafft damit einen weiteren Mythos.

3. Die Grenzen der Transparenz

An dem Punkt kommt immer jemand, der sagt, dass man halt bei proprietärer Software nicht nachvollziehen kann, wie diese funktioniert und nur freie Projekte wären unabhängig. Argumentativ stehen dahinter zwei riesige Illusionen und eine Unterschlagung: Es ist die Illusion des einsehbaren Quellcodes, der Weltgemeinschaft „Open Source Community“ und die Behauptung der totalen Intransparenz proprietärer Software.

Die Einsehbarkeit freier Software beschränkt sich auf den zur Verfügung gestellten Code. Niemand kann mit Sicherheit sagen ob dieser auch wirklich zum Einsatz kommt, oder ob der Dienst nicht eine modifizierte Variante verwendet. Das gilt für den großen Konzern ebenso wie für den Wohnzimmer-Admin. Denn – wie oben schon gesagt – die Daten fallen bei den Diensten an.

Die Weltgemeinschaft „Open Source Community“ existiert zudem nicht oder nur als Idee. Jeder Entwickler hat eine Staatsangehörigkeit und viele Projekte haben festgelegte Rechtsformen und Registrierungen. Sie müssen sich ebenso den Gesetzen ihrer Herkunftsstaaten unterwerfen wie jede andere proprietäre Firma auch.

Diese beiden Illusionen ergänzt eine Unterschlagung. Befürworter freier Software zeichnen ein besonders negatives Bild der Analysemöglichkeiten proprietärer Software. Diese ist zwar sicherlich nicht so gut wie bei quelloffener Software, aber es ist ein Mythos, dass proprietäre Software alles machen könnte.

Zusammengefasst

Natürlich gibt es Software mit guten Sicherheitskonzepten und es gilt auch weiterhin, Daten, die nicht anfallen, können nicht abgegriffen werden. Es ist auch keine schlechte Idee Daten nicht frei Haus ins Internet zu stellen, weil die automatisierte Massenüberwachung primär auf den weltweiten Datenverkehr abzielt. Angriffe auf den einzelnen Anwender und seine Daten sind natürlich nicht die Regel.

Weil viele Anbieter proprietärer Software gleichzeitig massiv Datenerhebung betreiben (siehe oben) und diese quasi „auf die Reise“ schicken, sind diese oftmals keine gute Idee.

Das bedeutet aber nicht, dass proprietäre Software zwangsläufig schlechte Konzepte hat und durchweg nicht datensparsam funktioniert. Es bedeutet auch nicht, dass jeder Dienst im Umfeld der „Open Source Community“ automatisch super wären. Es kommt immer auf den Einzelfall an.

Noch mal zur Erinnerung: Wir haben es mit den größten jemals da gewesenen Überwachungsprogrammen zu tun, die von finanzstarken und fähigen Geheimdiensten verwirklicht werden. Wer wirklich glaubt, er könne sich davor mit dem Einsatz von Open Source Software und freien Systemen wie Linux oder AOSP-Android schützen belügt sich selbst.

Es gibt sicherlich hundert gute Gründe für freie Software und freie Systeme wie Linux oder AOSP. Den Schutz vor staatlicher Überwachung sollte man aber lieber aus der Liste streichen.

Eine gute Nachricht zum Schluss: Man steht sicher auch nicht schlechter da, wenn man Linux oder ein freies Android nutzt.

Der Artikel Open Source gegen Überwachung? erschien zuerst auf [Mer]Curius

14. April 2021

Wenn es um den sicheren Einsatz von Smartphones geht, kommen immer vermeintliche Experten um die Ecke, die in Customs ROMS auf AOSP-Basis die Lösung erblicken, weil sie als einzige nicht von einer großen Firma dominiert werden. Im Alltag ist das ein ziemlich mühseliges Unterfangen. Eine Wahrheit, die gerne unterschlagen wird.

Ich verwende Custom ROMs schon fast seit es sie gibt. Ursprünglich als primäres System, dann bin ich mit meinem Hauptgerät über ein BlackBerry Classic zum iPhone gekommen. Androids mit Custom ROM gab es dann nur noch als Zweitgerät. Dieses habe ich kürzlich ersetzt und dazu schon ein wenig geschrieben. Nach ein paar Monaten möchte ich hier das eher düstere Bild bestätigen. Es gibt Szenarien, da kann man ein Android mit Custom ROM nutzen. Es hat aber Limitationen und es ist nichts für die Allgemeinheit – noch nicht mal für eine technik-affine Zielgruppe. Die sinkenden Nutzungszahlen haben schon ihre Gründe.

Um diesen Artikel jetzt nicht unnötig kompliziert zu machen, lassen wir den kompletten Bereich des Hardware-Kaufs mal weg. Custom ROM-Support ist nämlich eine wackelige Geschichte geworden. Die von LineageOS offiziell unterstützte Geräteliste könnte in weiten Teilen auch der Bestellkatalog eines Technikmuseums sein.

Natürlich kann man auch direkt bei Google ein Pixel kaufen und bekommt an GrapheneOS mit Support von maximal drei Jahren, weil GrapheneOS nur für den Zeitraum des offiziellen Herstellersupports unterstützt wird. GrapheneOS ist zudem eine One-Man-Show, die jederzeit enden könnte. Die Lösung „Ich kaufe ein überteuertes Gerät von Google mit zu kurzem Supportzeitraum, weil ich die Politik des Konzerns falsch finde.“ stimmig zu finden fällt mir persönlich eher schwer.

Aber lassen wir das wirklich beiseite und nehmen wir mal an, man hat ein halbwegs aktuelles Gerät, das nicht von Google stammt und eine lebhafte Entwickler-Community vorweisen kann. In meinem Fall ist das ein Samsung Galaxy S10. Es gibt da aber noch ein paar andere Modelle (allerdings mit stetig abnehmender Tendenz).

Offiziellen LineageOS-Support gibt es nicht und selbst wenn es ihn gäbe, kann der jederzeit spontan enden. Das funktioniert nicht wie bei Debian, wo der Support für ein einmal veröffentlichtes Release garantiert ist, sondern Maintainer können jederzeit abspringen. Das S9 ist beispielsweise gerade einfach so aus der Liste verschwunden. Zusammen mit vielen anderen Geräten.

Auf XDA-Developers gibt es zwar viele Custom ROMs, aber fast alle kann man vergessen. XDA-Developer finden nämlich mehrheitlich SELinux und Geräteverschlüsselung ein Hindernis für das hemmungslose Basteln am System (oder ihnen fehlt das Knowhow). Das ist absolut legitim, wenn mein Fokus auf der Modifizierbarkeit liegt, aber die Stoßrichtung vieler Empfehlungen für Custom ROMs kommt aus der Reihe der Google-Gegner und Datenschützer. Hier muss der Aluhut irgendwelche Funktionen des Gehirns beeinträchtigen, wenn man es als einen Gewinn an Sicherheit betrachtet, ein Gerät mit sich rumzutragen, das jederzeit bei Verlust von einem Dritten ohne spezielles Knowhow ausgelesen werden kann.

Natürlich gibt es auch tolle und fähige Entwickler, die gute Custom ROMs (meist auf LineageOS-Basis) veröffentlichen. Nur meistens sind das Projekte eines einzelnen Entwicklers oder bestenfalls ganz kleiner Entwicklerteams. Die verfügbare Zeit bei so einem ehrenamtlich betreuten Projekt schwankt halt stark – was niemand den Entwicklern zum Vorwurf machen kann – oder die Entwickler verlieren plötzlich das Interesse, weil sie privat ein neues Gerät nutzen. Andere ROMs suggerieren mehr offiziell unterstützte Geräte, aber guckt man da mal unter die Haube, ist das meistens eine ähnlich halbseidene Basis. Und plötzlich verwendet man dann als Anwender ein Custom ROM, dessen Sicherheitspatch-Level auf Dezember 2020 steht. Ich spare mir jetzt das Bild mit dem Aluhut, es sollte jedem klar sein, dass das nicht gut ist.

Wenn es gut läuft, springt ein anderer Entwickler in die Bresche. Ein Wechsel von einem Projekt zum Nächsten ist aber nicht einfach so möglich, sondern Android muss komplett neu installiert und alle Daten neu eingespielt werden. Als Nutzer kann man hier nur hoffen, dass der neue Entwickler lange am Ball bleibt, weil man ansonsten in wenigen Monaten wieder neu installieren darf.

Nun ist eine aktuelle ROM nicht alles. Moderne Smartphones haben viel Firmware und auch hier gibt es (bei guten Herstellern) Fehlerbehebungen und Sicherheitsaktualisierungen. Anwender der Herstellerbetriebssysteme aktualisieren diese einfach über die normalen Updates mit, aber das geht bei Custom ROMs nicht. Wenn man als Anwender also eine aktuelle Firmware haben will (Achtung erst einmal natürlich umfassend recherchieren, ob das sich überhaupt mit den Custom ROMs verträgt) darf man mehr oder minder vertrauenswürdige Distributoren bemühen. Das variiert je nach Hersteller, bei Samsung greifen viele auf Sammobile zurück.

Dort lädt man ein Archiv für die eigene Version herunter. Entweder mit dubiosen Downloadtools, dem langsamen Free-Download oder man zahlt für Premium. Im ganzen Wust an unterschiedlichen Versionen (die meisten Hersteller werfen zig Varianten ihrer Smartphones mit Dutzend Marketing-Namen auf den Markt) muss man natürlich die richtige Variante finden. Das Archiv muss man entpacken, weil man ja keine ganze Hersteller-ROM flashen will. Die einzelnen Dateien mit den richtigen Befehlen via Tools wie heimdal oder adb dann im richtigen Modus auf das Smartphone flashen. Nicht vergessen natürlich drei Kreuze, ein Ave Maria und fünf Mal um die eigene Achse drehen, um das Gerät auch wieder starten zu lassen.

Das Prozedere wiederholt man dann alle paar Monate und erzählt fröhlich im Freundeskreis, dass Custom ROMs die Lösung aller Probleme sind. Wer dieses Nutzungsverhalten normal findet, hat aber schon lange nicht mehr über den Tellerrand geblickt.

Denn dann empfiehlt man für sicherheitsbewusste Anwender als Daily Driver ein iPhone. Das kriegt nämlich auch so Updates, hat einen Hersteller, der nicht sein Geld mit hemmungsloser Datensammlung/-auswertung verdient und ist hinsichtlich der Sicherheit den Geräten der meisten Android-Anwendern meilenweit voraus. Denn realistischerweise ist wegen oben geschilderte Problem selbst ein Custom ROM meist veraltet oder hat irgendwelche Sicherheitsdefizite, weil man als Anwender eben doch nicht immer Zeit für die umfassende Pflege hat. Dann ist der Sicherheitsgewinn eher marginal.

Custom ROMs sind nett als Zweitgerät, für den IT-Spieltrieb oder für eng begrenzte Nutzungsszenarien. Wer aber ernsthaft glaubt, dass sie in ihrer jetzigen Form eine Alternative für eine breitere Öffentlichkeit (und damit meine ich alles was über den XDA-Anwenderkreis hinaus geht) hat den Bezug zum Nutzungsverhalten der Mehrheit schon lange verloren.

Der Artikel Custom ROMs im Alltag – Installieren und flashen in Dauerschleife erschien zuerst auf [Mer]Curius

13. April 2021

Mit Common Voice stellt Mozilla den weltweit größten öffentlichen Datensatz menschlicher Stimmen bereit – kostenlos und für jeden nutzbar. Zum Datensatz beitragen kann jeder. Nun hat Mozilla eine Partnerschaft mit Nvidia angekündigt, in deren Rahmen Nvidia 1,5 Millionen Dollar in Common Voice investieren wird.

Der Markt für Spracherkennung wird von den ganz großen Namen kommerzieller Anbieter dominiert: Amazon, Apple, Google, Microsoft. Darum hat Mozilla im Jahr 2017 das Projekt Common Voice gestartet. Mit Common Voice versucht Mozilla, eine kostenlose Alternative zu etablieren, zu der jeder beitragen kann und die jedem zur Verfügung steht. Denn nach Ansicht von Mozilla sollte diese Technologie für jeden zugänglich sein und nicht den großen Anbietern vorbehalten sein. Mehr als 164.000 Menschen weltweit haben bereits zu Common Voice beigetragen. Das Ergebnis sind über 9.000 Stunden Sprach-Daten in 60 verschiedenen Sprachen.

Mozilla hat nun eine Partnerschaft mit Nvidia bekannt gegeben, in deren Rahmen Nvidia 1,5 Millionen Dollar in Common Voice investieren wird. Erklärtes Ziel ist die Demokratisierung und Diversifizierung der Entwicklung von Sprachtechnologie.

Die Investition soll das Wachstum von Common Voice beschleunigen, die Einbindung von mehr Gemeinschaften und Freiwilligen fördern sowie die Anstellung neuer Mitarbeiter ermöglichen. Nvidia möchte Common Voice zum Entwickeln vortrainierter Sprachmodelle nutzen, welche die Vielfalt an Menschen und Stimmen widerspiegeln soll, die das Internet ausmachen, und diese Sprachmodelle wiederum kostenfrei zur Verfügung stellen.

Der Beitrag Nvidia investiert in Mozilla Common Voice erschien zuerst auf soeren-hentzschel.at.

Für mich war lange ein großer Nachteil an WeeChat, dass ich im Gegensatz zu Thunderbird keine Desktop-Benachrichtigungen erhalten habe, wenn ich angepingt wurde. Eine Lösung dazu habe ich im ArchWiki gefunden.

Ich habe mich gegen die Lösung mit einem Plugin entschieden, da dass die Sache doch kompliziert hätte, was in diesem Punkt nicht nötig ist. Beide Lösungen benötigen libnotify um die Benachrichtigungen anzuzeigen.

Also sprach Zarathustra:

sudo apt-get install libnotify-bin

bzw.

pacman -S libnotify

Danach öffnet man WeeChat und gibt folgenden “Befehl” in WeeChat ein:

/set trigger.trigger.beep.command "/print -beep;/exec -bg notify-send -i '/usr/share/icons/hicolor/32x32/apps/weechat.png' 'IRC Notification' "${tg_tag_nick}: ${tg_message_nocolor}""

Bei Laptops mit weniger Arbeitsspeicher kann Zram Wunder bewirken. Zram erstellt einen komprimierten Arbeitsspeicher. Wenn man will, dass sich ZRam perfekt in Systemd integriert, ist Systemd-Zram ein guter Fork, der sich auch sehr einfach unter Arch (AUR) und unter Debian, Ubuntu etc. installieren lässt.

Installation

Installation unter ArchLinux

Die Installation erfolgt unter Arch am Besten mithilfe des AURs, kann allerdings auch manueller erfolgen Click!. Ich will hier allerdings nur die Installation mithilfe des AURs beschreiben. (Ohne AUR-Helfer, wie z.B. yay oder trizen)

mkdir -p ~/aur && cd ~/aur
git clone https://aur.archlinux.org/systemd-zram.git && cd systemd-zram

Nun erfolgt das Bauen des Paketes:

makepkg -s

Danach kann mit su in den Root-Account gewechselt werden und das Paket mit folgendem Befehl installiert werden:

pacman -U $PWD/systemd-zram-*.pkg.tar.zst

Dieser Schritt weicht natürlich ab, wenn man sudo installiert hat oder su als Alias su -l hat. Aber dann sollte man auch wissen, wie man das macht.

WICHTIG: Bei der Installation über das AUR wird man (genauso wie bei allen folgenden Methoden) nicht automatisch über Updates informiert!!

Installation unter Debian

Unter Debian, Ubuntu etc. kann systemd-zram auch installiert werden.

Man klont das Git-Repo (git clone https://github.com/mdomlop/systemd-zram.git) und führt danach folgende Befehle aus:

make debian_pkg
sudo dpkg -i systemd-zram_*.deb

Installation unter anderen Systemen

Die Installation kann natürlich auch mithilfe des klassischen make && make install erfolgen.

Benutzung

Der Service kann wie gewohnt mit

systemctl enable systemd-zram --now

aktiviert werden und mit systemctl gestartet bzw. beendet werden.

Wie gesagt, komprimiert zRam einen Teil des Arbeitsspeichers und erledigt dies mit unterschiedlichen Algorithmen. Der aktuell verwendete Algorithmus wird, wird durch den Inhalt der Datei /sys/block/zram0/comp_algorithm angezeigt. In dieser stehen auch alle anderen möglichen Algorithmen.

cat /sys/block/zram0/comp_algorithm

ergibt dann zum Beispiel

[lzo] lzo-rle lz4 lz4hc 842 zstd 

Der aktuell verwendete Algorithmus steht also in [] und ist im Moment lzo. Einen Vergleich der möglichen Algorithmen findet man unter https://github.com/mavam/compbench.

Einen anderen Algorithmus kann man in der Datei /lib/systemd/system/systemd-zram.service einstellen - dort muss der Wert Environment=COMP_ALGORITHM=lzo angepasst werden.

Wann nützt zRam?

Wenn man 64GB RAM hat, bringt zRAM wahrscheinlich keinen großen, merkbaren Unterschied. Je weniger RAM man aber hat, umso größer sind die Vorteile von zRAM. Allerdings kann zRAM auch bei viel Arbeitsspeicher Vorteile bringen, wenn man zum Beispiel gerade sehr arbeitsspeicherintensive Sachen wie Virtualisierung macht.

Mehr Swap?

Wenn man zRAM nutzt, wird dieser als Swap-Speicher angezeigt, weshalb man auch mithilfe von

swapon -s

überprüfen kann, ob der zRAM aktiviert ist. Den “alten” Swap jedoch nicht entfernen, er wird zum Beispiel noch für den Ruhezustand benutzt!

12. April 2021

Nach dem Update auf Nextcloud 21 gab es das Problem, dass die CRON Jobs nicht mehr liefen und der OCC Befehl “sudo -u www-data ./occ db:add-missing-indices” zur Erstellung der fehlenden Indizes auch nicht mehr funktionierte. Ein Aufruf brachte lediglich das Ergebnis “killed” bzw “Getötet". Was so viel heißt wie: Abgebrochen und nicht durchgeführt.

Lösung
Wenn eine Nextcloud mit APCU konfiguriert ist, dann benötigt Nextcloud 21 in der PHP Konfiguration unter /etc/php/7.4/cli/conf.d/20-apcu.ini oder /etc/php/8.0/cli/conf.d/20-apcu.ini eine weitere Zeile, die einfach unten angehängt wird, die folgendermaßen aussieht

apc.enable_cli=1

 

Die Lösung des Problems stammt von  hier.

 

 

 

 

11. April 2021

  1. Proprietäre Softwareperlen für Linux Teil I: SoftMaker Office
  2. Proprietäre Softwareperlen für Linux Teil II: moneyplex
  3. Proprietäre Softwareperlen für Linux Teil III: Master PDF Editor
  4. Proprietäre Softwareperlen für Linux Teil IV: VueScan

Linux und die Idee der freien Software sind eng verwoben. Proprietäre Software kann zwar theoretisch für Linux vertrieben werden, das ideologische Umfeld und die geringe Verbreitung haben hier aber kein großes Ökosystem entstehen lassen. Einige prominente Ausnahmen möchte ich hier kurz vorstellen. Im vierten Teil: VueScan von Hamrick.

Ich habe bereits 2014 meine Arbeitsweise komplett digitalisiert. Sowohl was den privaten Papierkram betrifft als auch meine wissenschaftliche Tätigkeit. Das Prinzip ist denkbar einfach: Alles was an Papier reinkommt, jage ich durch einen Einzugscanner (immer noch der gleiche Brother Dokumentenscanner) und speichere es auf meinem System in einer simplen Dateistruktur. Auf eine umfangreiche DMS-Lösung verzichte ich bewusst, weil man sich damit einem gewaltigen Vendor-Lock-in-Risiko aussetzt. Eine gute Dateistruktur, PDF + OCR und eine mächtige Suchfunktion auf dem Desktop (Spotlight und Baloo machen einen guten Job) reichen völlig aus.

2020 war ich für diesen Ansatz aus zweierlei Gründen unglaublich dankbar. Im April schlossen im ersten Lockdown auch alle wissenschaftlichen Bibliotheken und seitdem ist der Besuch in Bibliotheken je nach Bundesland erheblich eingeschränkt. Ich hatte alle relevante Literatur privat gescannt und konnte einfach weiterarbeiten. Im Oktober ging ich dann unter die Berufspendler und bei zwei Wohnsitzen ist es sehr praktisch, wenn man alle relevanten Unterlagen immer auf dem Notebook dabei hat (umso mehr braucht es starke Verschlüsselung).

VueScan

Schwache Alternativen

Scannen unter Linux ist insgesamt einfacher als 2014. Manuelle Bearbeitung irgendwelcher udev-Richtlinien und ständige Treiberprobleme sind nicht mehr so an der Tagesordnung wie damals. Ansonsten sind die Fortschritte aber marginal.

Mancher mag sich jetzt denken: Wozu braucht es noch eine Scanner-Software für Linux? Und ja, der Sachverhalt ist auf gewisse Art sehr traurig. Linux hat alles, was es für eine gute Scan-Lösung braucht. Eine ungewöhnlich einheitliche Grundlage (sane), tolle freie Lösungen wie tesseract für OCR und gute Werkzeuge für Grafikmanipulation.

Nur bleibt es eben bei diesen Einzellösungen. Die KDE-Lösung Skanlite ist im letzten Jahrtausend stecken geblieben, das gilt ebenso für xsane und die GNOME-Alternative SimpleScan folgt der GNOME-Philosophie (hält den Nutzer also für einen Idioten, den man nicht mit Optionen überfordern darf). GScan2PDF ist zwar theoretisch sehr mächtig, aber ich habe es nie geschafft, damit gute OCR-Ausgaben hinzubekommen. Gleiches gilt für Paperwork.

Um mit Linux zu scannen, braucht man also mehrere Tools. Sane und Treiber, eine Scan-Anwendung, eine OCR-Lösung, eine PDF-Bearbeitung. Das ist nicht unmöglich, aber für den täglichen Einsatz viel zu kompliziert und zeitaufwendig. Oder man nimmt eben VueScan von Hamrick.

Manche mögen mir wieder eine negative Sicht auf die Möglichkeiten freier Software vorwerfen, aber mit dieser Meinung scheine ich nicht alleine zu sein:

Leider sind Scannerprogramme unter Linux nicht vergleichbar zu den Programmen, die man unter Windows kennt. Es fehlen durchweg wichtige – professionelle – Funktionen (z.B. Entrastern oder Staub/Fleckenentfernung).

ubuntuusers Wiki – Scanner

Funktionen

VueScan spielt seine Stärken gleich doppelt aus. Es ist von Sane unabhängig und unterstützt unfassbar viele Geräte. VueScan wird deshalb gerne beworben, wenn es um die Unterstützung von Geräten geht, die schon lange keinen Hersteller-Support mehr bekommen und für die keine Treiber mehr zur Verfügung gestellt werden.

VueScan hat aber auch sehr viele Funktionen. Die Professional Edition unterstützt als Kernfunktionen:

  • Flachbett und Dokumenteneinzug.
  • Duplex
  • OCR
  • Optimierung für Fotos

Hinzu kommen ungeahnte Möglichkeiten zur Feinjustrierung. Als Beispiel kann hier ein Screenshot der erweiterten Einstellungen dienen:

Diese muss man aber nicht nutzen, da VueScan bereits bei Standardeinstellungen sehr gute Ausgaben liefert.

VueScan nutzt für die Oberfläche Gtk2, wodurch es sich leidlich gut in moderne Desktopumgebungen integriert.

Ähnlich wie bei den anderen proprietären Softwarelösungen, die in dieser Serie vorgestellt werden, bin ich froh, VueScan nutzen zu dürfen. Ich mag Linux und arbeite gerne damit, aber wenn es in den semi-professionellen Office-Bereich geht, ist freie Software einfach oft unzureichend. Für Office, Scannen, Banking bin ich einfach dankbar, auf professionelle Software zurückgreifen zu können, die ein funktionierendes Geschäftsmodell haben und deren Entwickler diese langfristig pflegen.

Der Artikel Proprietäre Softwareperlen für Linux Teil IV: VueScan erschien zuerst auf [Mer]Curius

10. April 2021

Die MZLA Technologies Corporation hat mit Thunderbird 78.9.1 ein Update für seinen Open Source E-Mail-Client veröffentlicht.

Neuerungen von Thunderbird 78.9.1

Mit Thunderbird 78.9.1 hat die MZLA Technologies Corporation ein Update für seinen E-Mail-Client veröffentlicht. Dieses beinhaltet neben kleineren Fehlerbehebungen auch die Behebung von drei Sicherheitslücken in Zusammenhang mit OpenPGP.

Der Beitrag Thunderbird 78.9.1 veröffentlicht erschien zuerst auf soeren-hentzschel.at.

1 Einleitung

Ich nutze RMarkdown und RStudio schon seit längerem für statistische Auswertungen und Beispielrechnungen in der Lehre. Für meine Briefe und Rechnungen habe ich immer LaTeX verwendet.

Im Dezember habe ich dann dieses Video von Rob Hyndman gesehen:

https://www.youtube.com/watch?v=_D-ux3MqGug

…und dachte mir: das will ich auch!

Zu dieser Anleitung gibt es ein Github-Repo mit dem Template-Paket und der Rmd-Datei dieser Anleitung: https://github.com/produnis/RMarkdownMyStyle.

Außerdem ist der Arikel bei RPubs.com veröffentlicht, und dort etwas “hübscher” dargestellt, siehe https://rpubs.com/produnis/RMarkdownTemplates.

1.1 Vorwarnung

Diese Anleitung setzt voraus, dass Sie Ihre Briefe und Rechnungen bereits in LaTeX schreiben, bzw, dass eine Brief- oder Rechnungsvorlage in LaTeX vorliegt. In diesem Tutorial möchte ich zeigen, wie Sie Ihre LaTeX-Vorlagen als Templates in RMarkdown verfügbar machen können, um die Briefe im PDF-Format zu erzeugen. Das heisst, dass letztendlich Ihr RMarkdown wieder über LaTeX nach PDF kompiliert wird. LaTeX muss also installiert sein, und Sie müssen das gewünschte Layout bereits in LaTeX erstellt haben. Ebenso muss das bookdown-Paket installiert sein.

install.packages("bookdown")

Die Überführung nach Rmarkdowngeht am einfachsten, indem man sie als Templates in einem eigenen R-Paket abpeichert.

2 Ein eigenes R-Paket anlegen

Klicke in RStudio auf FileNew Project...

Wählen Sie R Package aus.

Abbildung 1: R-Package wählen

Geben Sie dem Paket einen Namen, z.B. MyStyle, und klicken Sie auf Create Project...

Abbildung 2: Packagenamen wählen

Im Arbeitsverzeichnis des neuen Projekts liegen nun die notwendigen Dateien und grundlegenden Paketordner, wobei wir das meister ignorieren können.

In DESCRIPTION können Sie eine Beschreibung des Pakets vornehmen. Wenn Sie das Paket eh nie veröffentlichen, können Sie sich diesen Schritt sparen.

Im Verzeichnis R werden alle Scriptdateien automatisch ausgeführt, sobald das Paket aktiviert wird. Dort hat RStudio bereits die Dummy-Datei hello.R angelegt. Die dort hinterlegte Funktion hello() steht also nach Aktivierung des Pakets zur Verfügung.

Das können wir direkt testen, indem wir das Paket “bauen und installieren”.

Klicken Sie im Datenfenster (rechter oberer Bereich) auf den Reiter Build.

Abbildung 3: Reiter Build

In diesem Bereich können Sie auf den Knopf Install and Restart klicken.

Abbildung 4: Paket installieren

Dadurch wird Ihr neues Paket installiert und automatisch per library(MyStyle) geladen. Sie können nun alle Funktionen Ihres Pakets in der R-Konsole aufrufen. Probieren wir also die Dummy-Funktion hello() aus, die in der Datei R/hello.R hinterlegt ist:

hello()

Immer dann, wenn Sie dem Paket neue Funktionen (oder Templates) hinzugefügt haben, können Sie es durch Klick auf Install and Restart aktualisieren.

2.1 Ein Template für Briefe anlegen

Templates fürRMarkdown müssen innerhalb des Pakets im Ordner inst/rmardown/templates/ vorliegen. Jedes Template erhält einen eigenen Unterordner, in welchem die erforderlichen Dateien abgelegt sind. Auch hier folgend die Dateien einer gewissen Struktur.

Mit der Funktion use_rmarkdown_template() aus dem Paket usethis können wir das “Skelett” des neuen Templates erzeugen. Beginnen wir mit der Briefvorlage. Das Template soll meinBrief heissen.

install.packages("usethis", dependencies = T)
usethis::use_rmarkdown_template(
  template_name = "meinBrief",
  template_dir = NULL,
  template_description = "Meine private Briefvorlage",
  template_create_dir = FALSE
)

Wie Sie sehen, wurden die Unterordner inst/rmardown/templates/meinbrief angelegt. Hier liegt die Datei template.yaml. Sie enthält die Informationen, die wir der use_rmarkdown_template()-Funktion übergeben haben.

name: meinBrief
description: >
   Meine private Briefvorlage
create_dir: FALSE

Hier müssen wir nichts ändern.

Im Unterordner skeleton liegt die Datei skeleton.Rmd. In ihr werden Beispieltexte und -code hinterlegt, die später beim Aufruf des Templates als Starttext erzeugt werden. Wir benutzen diese Datei, um unser Template zu testen und die benötigten Variablen zu hinterlegen. Wenn wir unser Template später in RStudio aus den Vorlagen auswählen, dann werden alle Dateien, die im Unterorder skeleton liegen, in das neu erstellte Projekt kopiert.

2.1.1 LaTeX Vorlage

Nehmen wir als Beispiel die folgende LaTeX-Vorlage für einen Brief. Das Beispiel ist lauffähig, wenn Sie eine Bilddatei mit dem Namen Unterschrift.png im selben Verzeichnis liegen haben.

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }
\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}   
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{Timm}
\newcommand{\myFamilyname}{Thaler}
\newcommand{\myStreet}{Absenderstr. 7}
\newcommand{\myTown}{47325 Schickensen}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
Prof. Dr. \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
+49 176 555 984 66\\%
timm@thaler.de\\[2mm]
ING DiBa\\
DE06 505 165 55 5555 4312 64\\[2mm]
Aktenzeichen:\quad\ 2021-4\\
\setkomavar{date}{\today} %datum im Absenderfeld 
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname} 
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{Dies ist der Betreff}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{Andrea Empfängerin\\
Schloss Schalkenstein\\ 
Adressatenstr. 23\\
22204 Briefkasten
}
%
\opening{Sehr geehrte Frau Empfängerin,}
%
\blindtext[1]

\closing{Mit freundlichen Grüßen,
}
\end{letter}
\end{document}  

Die Datei erzeugt folgendes PDF:

Abbildung 5: DF-Version des Briefs

Den -Code übertragen wir nun in unser Template. Hierfür muss im Ordner inst/markdown/templates/meinbrief der Unterordner resources angelegt werden. In diesem erzeugen wir die Datei meinbrief.tex und kopieren den LaTeX-Code hinein.

file.edit("inst/markdown/templates/meinbrief/resources/meinbrief.tex")
# kopiere nun den LaTeX Code hierhin.

Als nächstes kopieren wir die Bilddatei für die Unterschrift in den skeleton-Ordner. In unserem Beispiel heisst sie Unterschrift.png.

Abbildung 6: Datei Unterschrift.png

Ab jetzt wechseln wir immer zwischen den Dateien skeleton.Rmd und meinbrief.tex hin und her.

2.1.2 skeleton.Rmd und LaTeX-Datei anpassen

Schauen wir uns zunächst die Datei skeleton.Rmd an.

Hier löschen wir den Beispieltext und belassen nur die Kopfzeile

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

In der Kopfzeile werden Variablen vergeben. So hat z.B. Variable title derzeit den Wert Template Title, und date hat den Wert The Date.

Wir können uns dies zu nutze machen. In unserem LaTeX-Code sind all diese Variablen referenzierbar, wenn wir ihren Namen in Dollarzeichen einrahmen, also z.B. $title$. Wir können im Kopfbereich beliebige neue Variablen erzeugen und diese dann innerhalb der LaTeX-Vorlage nutzen.

Wir gehen also in die Datei meinbrief.tex, und ändern dort alle hardgecodeten Angaben (Name, Adresse, Telefonnummer, usw) in Variablen um. Diese Variablen tragen wir ebenfalls in die Datei skeleton.Rmd ein und hinterlegen dort die Werte.

Die Datei meinbrief.tex sieht danach z.B. so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\[2mm]
Aktenzeichen:\quad\ $myAktenzeichen$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Alle Angaben wurden durch Variablen ersetzt. Die Variable $body$ beinhaltet den gesamten Text des Markdown-Dokuments.

In der Datei skeleton.Rmd wurden die Variablen ebenfalls angelegt, und die Werte entsprechend zugeordnet:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
Betreff: Dies ist der Betreff
myAktenzeichen: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinbrief
---

dies ist ein Testbrief, um zu schauen, ob es auch in `RMarkdown` funktioniert.

Als letzte Angabe im Kopfbereich wird der output auf unser Template meinbrief im Paket MyStyle gesetzt.

2.1.3 Ausgabeformat bereitstellen

Jetzt sind wir fast schon fertig. Wir müssen noch das eben angegebene Ausgabeformat MyStyle::meinbrief verfügbar machen. Hierzu erstellen wir im Paketordner “R” die Datei formats.R. Sie wird bei der Aktivierung des Paketes automatisch ausgeführt und soll das Ausgabgeformat bereitstellen.

# erstelle Datei R/formats.R
file.edit("R/formats.R")

Sie erhält folgenden Inhalt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wie Sie sehen, verwenden wir letztendlich bookdown::pdf_document2 als Ausgabe.

2.1.4 Ausgabe kontrollieren

Jetzt können wir das Paket neu bauen und installieren, indem wir Install and Restart klicken.

Abbildung 7: Reiter Build

Wenn alles korrekt eingetragen wurde, können wir nun unsere Beispieldatei skeleton.Rmd knitten. Das erzeugt eine PDF-Datei im Unterordner skeleton (weil skeleton.Rmd dort liegt). Überprüfen Sie, ob alles so aussieht, wie Sie möchten. Ist alles gut, entfernen Sie die PDF-Datei und bauen Sie das Paket nocheinmal neu.

Fertig.

3 Paket als Vorlage nutzen

Ist das Paket installiert, steht das Template in RStudio zur Auswahl. Klicken Sie auf FileNew FileRMarkdown und wählen Sie “From Template”.

Abbildung 8: Template auswählen

Dort steht nun meinBrief zur Auswahl. Wenn Sie auf OK klicken, erhalten Sie den Beispielcode aus skeleton.Rmd sowie die Datei Unterschrift.png. Wenn Sie vergessen haben, die PDF-Datei Ihrer Testreihen zu entfernen, wird diese ebenfalls erzeugt.

4 weitere Templates erstellen

Auf diese Weise können wir beliebig weiterte Templates erstellen. Rob Hyndman hat für seine Fakultät z.B. Vorlagen für Abschlussarbeiten, Berichte und Klausuren erstellt, siehe https://github.com/robjhyndman/MonashEBSTemplates

Wir erzeugen in dieser Anleitung noch eine Vorlage für Rechnungen.

4.1 Vorlage für Rechnungen erzeugen

Für die Rechnungen-Vorlage bedienen wir uns bei unserem Brief und passen einige wenige Felder an.

Zunächst erzeugen wir wieder die Grundstruktur des Templates, welches diesmal meineRechnung heissen soll.

usethis::use_rmarkdown_template(
  template_name = "meineRechnung",
  template_dir = NULL,
  template_description = "Meine private Rechnungsvorlage",
  template_create_dir = FALSE
)

In den Ordner inst/markdown/templates/meinerechnung/skeleton/ kopieren wir zunächst die Datei Unterschrift.png. Dann öffnen wir die Datei skeleton.Rmd und entfernen alles bis auf den Kopfbereich.

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

Jetzt erstellen wir den Unterordner inst/markdown/templates/meinerechnung/resources/ und darin die Datei meinerechnung.tex.

Die Datei öffnen wir nun, und kopieren den Inhalt unserer Brief-Vorlage hinein.

file.edit("inst/markdown/templates/meinerechnung/resources/meinerechnung.tex")
# kopiere nun den LaTeX Code hierhin.

Jetzt nehmen wir einige Anpassungen vor, z.B. ersetzen wir das alte Aktenzeichen durch eine Rechnungsnummer. Auch fügen wir unsere Steuernummer hinzu.

Die LaTeX-Datei sieht danach so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\
Str-Nr. $myStrNr$\\[2mm]
Rechnungsnummer:\quad\ $myRechnungsnummer$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{9cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Die Variablen übertragen wir in die Datei skeleton.Rmd, die dann so aussieht:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---

Um das Ergebnis testen zu können, müssen wir das Ausgabeformat MyStyle::meinerechnung verfügbar machen. Hierfür ergänzen wir im Unterordner R in der Datei formats.R wie folgt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

# mache output "meinerechnung" verfügbar
meinerechnung <- function(...) {
  template <- system.file("rmarkdown/templates/meinerechnung/resources/meinerechnung.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wenn Sie jetzt das Paket neu bauen und installieren, sollte das knitten der Datei skeleton.Rmd schon funktionieren, und eine PDF-Datei ausspucken.

Die Rechnungsvorlage kann nun wie folgt erweitert werden:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---


für die erbrachten Leistungen erlaube ich mir wie folgt in Rechnung zu stellen:



|  **Datum** |                 **Posten**                          | **Betrag**|
|------------|-----------------------------------------------------|----------:|
| 29.06.2021 | Zauberschow für Kinder in der KiTa Regenbogenland   |     300,01|
|            |                                                     |           |
|            |                                         Nettobetrag |     300,01|
|            |                      Umsatzsteuerfrei gem. §19 UstG |       0,00|
|            |                                    **Gesamtbetrag**:| **300,01**|




Bitte überweisen Sie den Betrag unter Angabe der Rechnungsnummer auf mein Konto bei der ING DiBa
mit der IBAN *DE06 505 165 55 5555 4312 64*.

Ich bedanke mich für Ihren Auftrag und verbleibe

Wenn Sie jetzt knitten, sieht die PDF-Datei skeleton.pdf so aus:

Abbildung 9: fertiges PDF-Dokument

Jetzt können Sie noch weitere Anpassungen vornehmen. Wenn Sie fertig sind, entfernen Sie die PDF-Datei skeleton.pdf und bauen und installieren Sie das Paket neu. Ab jetzt steht es in RStudio als Vorlage zur Verfügung.

Klicken Sie auf FileNew FileRMarkdown und wählen Sie “From Template”.

Abbildung 10: Vorlagen

5 noch mehr Templates

Noch weitere Templates bietet unter anderem das R-Paket rticles.

install.packages("rticles")

Nach einem Neustart von RStudio stehen die Templates bereit.

6 Weiterführende Links

1 Einleitung

Ich nutze RMarkdown und RStudio schon seit längerem für statistische Auswertungen und Beispielrechnungen in der Lehre. Für meine Briefe und Rechnungen habe ich immer LaTeX verwendet.

Im Dezember habe ich dann dieses Video von Rob Hyndman gesehen:

https://www.youtube.com/watch?v=_D-ux3MqGug

…und dachte mir: das will ich auch!

Zu dieser Anleitung gibt es ein Github-Repo mit dem Template-Paket und der Rmd-Datei dieser Anleitung:
https://github.com/produnis/RMarkdownMyStyle.

Außerdem ist der Arikel bei RPubs.com veröffentlicht, und dort etwas „hübscher“ dargestellt, siehe https://rpubs.com/produnis/RMarkdownTemplates.

1.1 Vorwarnung

Diese Anleitung setzt voraus, dass Sie Ihre Briefe und Rechnungen bereits in LaTeX schreiben, bzw, dass eine Brief- oder Rechnungsvorlage in LaTeX vorliegt. In diesem Tutorial möchte ich zeigen, wie Sie Ihre LaTeX-Vorlagen als Templates in RMarkdown verfügbar machen können, um die Briefe im PDF-Format zu erzeugen. Das heisst, dass letztendlich Ihr RMarkdown wieder über LaTeX nach PDF kompiliert wird. LaTeX muss also installiert sein, und Sie müssen das gewünschte Layout bereits in LaTeX erstellt haben.
Ebenso muss das bookdown-Paket installiert sein.

install.packages("bookdown")

Die Überführung nach Rmarkdowngeht am einfachsten, indem man sie als Templates in einem eigenen R-Paket abpeichert.

2 Ein eigenes R-Paket anlegen

Klicke in RStudio auf File \(\rightarrow\) New Project...

Wählen Sie R Package aus.


Figure 2.1: R-Package wählen

Geben Sie dem Paket einen Namen, z.B. MyStyle, und klicken Sie auf Create Project...


Figure 2.2: Packagenamen wählen

Im Arbeitsverzeichnis des neuen Projekts liegen nun die notwendigen Dateien und grundlegenden Paketordner, wobei wir das meister ignorieren können.

In DESCRIPTION können Sie eine Beschreibung des Pakets vornehmen. Wenn Sie das Paket eh nie veröffentlichen, können Sie sich diesen Schritt sparen.

Im Verzeichnis R werden alle Scriptdateien automatisch ausgeführt, sobald das Paket aktiviert wird. Dort hat RStudio bereits die Dummy-Datei hello.R angelegt. Die dort hinterlegte Funktion hello() steht also nach Aktivierung des Pakets zur Verfügung.

Das können wir direkt testen, indem wir das Paket “bauen und installieren”.

Klicken Sie im Datenfenster (rechter oberer Bereich) auf den Reiter Build.


Figure 2.3: Reiter Build

In diesem Bereich können Sie auf den Knopf Install and Restart klicken.


Figure 2.4: Paket installieren

Dadurch wird Ihr neues Paket installiert und automatisch per library(MyStyle) geladen. Sie können nun alle Funktionen Ihres Pakets in der R-Konsole aufrufen. Probieren wir also die Dummy-Funktion hello() aus, die in der Datei R/hello.R hinterlegt ist:

hello()
## [1] "Hello, world!"

Immer dann, wenn Sie dem Paket neue Funktionen (oder Templates) hinzugefügt haben, können Sie es durch Klick auf Install and Restart aktualisieren.

2.1 Ein Template für Briefe anlegen

Templates fürRMarkdown müssen innerhalb des Pakets im Ordner inst/rmardown/templates/ vorliegen.
Jedes Template erhält einen eigenen Unterordner, in welchem die erforderlichen Dateien abgelegt sind. Auch hier folgend die Dateien einer gewissen Struktur.

Mit der Funktion use_rmarkdown_template() aus dem Paket usethis können wir das “Skelett” des neuen Templates erzeugen.
Beginnen wir mit der Briefvorlage. Das Template soll meinBrief heissen.

install.packages("usethis", dependencies = T)
usethis::use_rmarkdown_template(
  template_name = "meinBrief",
  template_dir = NULL,
  template_description = "Meine private Briefvorlage",
  template_create_dir = FALSE
)

Wie Sie sehen, wurden die Unterordner inst/rmardown/templates/meinbrief angelegt.
Hier liegt die Datei template.yaml. Sie enthält die Informationen, die wir der use_rmarkdown_template()-Funktion übergeben haben.

name: meinBrief
description: >
   Meine private Briefvorlage
create_dir: FALSE

Hier müssen wir nichts ändern.

Im Unterordner skeleton liegt die Datei skeleton.Rmd. In ihr werden Beispieltexte und -code hinterlegt, die später beim Aufruf des Templates als Starttext erzeugt werden. Wir benutzen diese Datei, um unser Template zu testen und die benötigten Variablen zu hinterlegen.
Wenn wir unser Template später in RStudio aus den Vorlagen auswählen, dann werden alle Dateien, die im Unterorder skeleton liegen, in das neu erstellte Projekt kopiert.

2.1.1 LaTeX Vorlage

Nehmen wir als Beispiel die folgende LaTeX-Vorlage für einen Brief.
Das Beispiel ist lauffähig, wenn Sie eine Bilddatei mit dem Namen Unterschrift.png im selben Verzeichnis liegen haben.

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }
\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}   
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{Timm}
\newcommand{\myFamilyname}{Thaler}
\newcommand{\myStreet}{Absenderstr. 7}
\newcommand{\myTown}{47325 Schickensen}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
Prof. Dr. \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
+49 176 555 984 66\\%
timm@thaler.de\\[2mm]
ING DiBa\\
DE06 505 165 55 5555 4312 64\\[2mm]
Aktenzeichen:\quad\ 2021-4\\
\setkomavar{date}{\today} %datum im Absenderfeld 
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname} 
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{Dies ist der Betreff}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{Andrea Empfängerin\\
Schloss Schalkenstein\\ 
Adressatenstr. 23\\
22204 Briefkasten
}
%
\opening{Sehr geehrte Frau Empfängerin,}
%
\blindtext[1]

\closing{Mit freundlichen Grüßen,
}
\end{letter}
\end{document}  

Die Datei erzeugt folgendes PDF:


Figure 2.5: PDF-Version des Briefs

Den LaTeX-Code übertragen wir nun in unser Template. Hierfür muss im Ordner inst/markdown/templates/meinbrief der Unterordner
resources angelegt werden. In diesem erzeugen wir die Datei meinbrief.tex und kopieren den LaTeX-Code hinein.

file.edit("inst/markdown/templates/meinbrief/resources/meinbrief.tex")
# kopiere nun den LaTeX Code hierhin.

Als nächstes kopieren wir die Bilddatei für die Unterschrift in den skeleton-Ordner. In unserem Beispiel heisst sie Unterschrift.png.


Figure 2.6: Datei Unterschrift.png

Ab jetzt wechseln wir immer zwischen den Dateien skeleton.Rmd und meinbrief.tex hin und her.

2.1.2 skeleton.Rmd und LaTeX-Datei anpassen

Schauen wir uns zunächst die Datei skeleton.Rmd an.

Hier löschen wir den Beispieltext und belassen nur die Kopfzeile

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

In der Kopfzeile werden Variablen vergeben. So hat z.B. Variable title derzeit den Wert Template Title,
und date hat den Wert The Date.

Wir können uns dies zu nutze machen. In unserem LaTeX-Code sind all diese Variablen referenzierbar, wenn wir ihren Namen in Dollarzeichen einrahmen, also z.B. $title$.
Wir können im Kopfbereich beliebige neue Variablen erzeugen und diese dann innerhalb der LaTeX-Vorlage nutzen.

Wir gehen also in die Datei meinbrief.tex, und ändern dort alle hardgecodeten Angaben (Name, Adresse, Telefonnummer, usw) in Variablen um. Diese Variablen tragen wir ebenfalls in die Datei skeleton.Rmd ein und hinterlegen dort die Werte.

Die Datei meinbrief.tex sieht danach z.B. so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\[2mm]
Aktenzeichen:\quad\ $myAktenzeichen$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Alle Angaben wurden durch Variablen ersetzt. Die Variable $body$ beinhaltet den gesamten Text des Markdown-Dokuments.

In der Datei skeleton.Rmd wurden die Variablen ebenfalls angelegt, und die Werte entsprechend zugeordnet:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
Betreff: Dies ist der Betreff
myAktenzeichen: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinbrief
---

dies ist ein Testbrief, um zu schauen, ob es auch in `RMarkdown` funktioniert.

Als letzte Angabe im Kopfbereich wird der output auf unser Template meinbrief im Paket MyStyle gesetzt.

2.1.3 Ausgabeformat bereitstellen

Jetzt sind wir fast schon fertig. Wir müssen noch das eben angegebene Ausgabeformat MyStyle::meinbrief verfügbar machen.
Hierzu erstellen wir im Paketordner “R” die Datei formats.R. Sie wird bei der Aktivierung des Paketes automatisch ausgeführt und soll das Ausgabgeformat bereitstellen.

# erstelle Datei R/formats.R
file.edit("R/formats.R")

Sie erhält folgenden Inhalt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wie Sie sehen, verwenden wir letztendlich bookdown::pdf_document2 als Ausgabe.

2.1.4 Ausgabe kontrollieren

Jetzt können wir das Paket neu bauen und installieren, indem wir
Install and Restart klicken.


Figure 2.7: Reiter Build

Wenn alles korrekt eingetragen wurde, können wir nun unsere Beispieldatei skeleton.Rmd knitten. Das erzeugt eine PDF-Datei
im Unterordner skeleton (weil skeleton.Rmd dort liegt). Überprüfen Sie, ob alles so aussieht, wie Sie möchten. Ist alles gut, entfernen Sie die PDF-Datei und bauen Sie das Paket nocheinmal neu.

Fertig.

3 Paket als Vorlage nutzen

Ist das Paket installiert, steht das Template in RStudio zur Auswahl. Klicken Sie auf File \(\rightarrow\) New File \(\rightarrow\) RMarkdown und wählen Sie “From Template”.


Figure 3.1: Template auswählen

Dort steht nun meinBrief zur Auswahl. Wenn Sie auf OK klicken, erhalten Sie den Beispielcode aus skeleton.Rmd sowie die Datei Unterschrift.png. Wenn Sie vergessen haben, die PDF-Datei Ihrer Testreihen zu entfernen, wird diese ebenfalls erzeugt.

4 weitere Templates erstellen

Auf diese Weise können wir beliebig weiterte Templates erstellen. Rob Hyndman hat für seine Fakultät z.B. Vorlagen für Abschlussarbeiten, Berichte und Klausuren erstellt, siehe https://github.com/robjhyndman/MonashEBSTemplates

Wir erzeugen in dieser Anleitung noch eine Vorlage für Rechnungen.

4.1 Vorlage für Rechnungen erzeugen

Für die Rechnungen-Vorlage bedienen wir uns bei unserem Brief und passen einige wenige Felder an.

Zunächst erzeugen wir wieder die Grundstruktur des Templates, welches diesmal meineRechnung heissen soll.

usethis::use_rmarkdown_template(
  template_name = "meineRechnung",
  template_dir = NULL,
  template_description = "Meine private Rechnungsvorlage",
  template_create_dir = FALSE
)

In den Ordner inst/markdown/templates/meinerechnung/skeleton/ kopieren wir zunächst die Datei Unterschrift.png. Dann öffnen wir die Datei skeleton.Rmd und entfernen alles bis auf den Kopfbereich.

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

Jetzt erstellen wir den Unterordner inst/markdown/templates/meinerechnung/resources/ und darin die Datei meinerechnung.tex.

Die Datei öffnen wir nun, und kopieren den Inhalt unserer Brief-Vorlage hinein.

file.edit("inst/markdown/templates/meinerechnung/resources/meinerechnung.tex")
# kopiere nun den LaTeX Code hierhin.

Jetzt nehmen wir einige Anpassungen vor, z.B. ersetzen wir das alte Aktenzeichen durch eine Rechnungsnummer. Auch fügen wir unsere Steuernummer hinzu.

Die LaTeX-Datei sieht danach so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\
Str-Nr. $myStrNr$\\[2mm]
Rechnungsnummer:\quad\ $myRechnungsnummer$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{9cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Die Variablen übertragen wir in die Datei skeleton.Rmd, die dann so aussieht:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---

Um das Ergebnis testen zu können, müssen wir das Ausgabeformat MyStyle::meinerechnung verfügbar machen.
Hierfür ergänzen wir im Unterordner R in der Datei formats.R wie folgt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

# mache output "meinerechnung" verfügbar
meinerechnung <- function(...) {
  template <- system.file("rmarkdown/templates/meinerechnung/resources/meinerechnung.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wenn Sie jetzt das Paket neu bauen und installieren, sollte das knitten der Datei skeleton.Rmd schon funktionieren, und eine PDF-Datei ausspucken.

Die Rechnungsvorlage kann nun wie folgt erweitert werden:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---


für die erbrachten Leistungen erlaube ich mir wie folgt in Rechnung zu stellen:



|  **Datum** |                 **Posten**                          | **Betrag**|
|------------|-----------------------------------------------------|----------:|
| 29.06.2021 | Zauberschow für Kinder in der KiTa Regenbogenland   |     300,01|
|            |                                                     |           |
|            |                                         Nettobetrag |     300,01|
|            |                      Umsatzsteuerfrei gem. §19 UstG |       0,00|
|            |                                    **Gesamtbetrag**:| **300,01**|




Bitte überweisen Sie den Betrag unter Angabe der Rechnungsnummer auf mein Konto bei der ING DiBa
mit der IBAN *DE06 505 165 55 5555 4312 64*.

Ich bedanke mich für Ihren Auftrag und verbleibe

Wenn Sie jetzt knitten, sieht die PDF-Datei skeleton.pdf so aus:


Figure 4.1: fertiges PDF-Dokument

Jetzt können Sie noch weitere Anpassungen vornehmen. Wenn Sie fertig sind, entfernen Sie die PDF-Datei skeleton.pdf und bauen und installieren Sie das Paket neu. Ab jetzt steht es in RStudio als Vorlage zur Verfügung.

Klicken Sie auf File \(\rightarrow\) New File \(\rightarrow\) RMarkdown und wählen Sie “From Template”.


Figure 4.2: Vorlagen

5 noch mehr Templates

Noch weitere Templates bietet unter anderem das R-Paket rticles.

install.packages("rticles")

Nach einem Neustart von RStudio stehen die Templates bereit.

6 Weiterführende Links






















share this

1 Einleitung

Ich nutze RMarkdown und RStudio schon seit längerem für statistische Auswertungen und Beispielrechnungen in der Lehre. Für meine Briefe und Rechnungen habe ich immer LaTeX verwendet.

Im Dezember habe ich dann dieses Video von Rob Hyndman gesehen:

https://www.youtube.com/watch?v=_D-ux3MqGug

…und dachte mir: das will ich auch!

Zu dieser Anleitung gibt es ein Github-Repo mit dem Template-Paket und der Rmd-Datei dieser Anleitung: https://github.com/produnis/RMarkdownMyStyle.

Außerdem ist der Arikel bei RPubs.com veröffentlicht, und dort etwas “hübscher” dargestellt, siehe https://rpubs.com/produnis/RMarkdownTemplates.

1.1 Vorwarnung

Diese Anleitung setzt voraus, dass Sie Ihre Briefe und Rechnungen bereits in LaTeX schreiben, bzw, dass eine Brief- oder Rechnungsvorlage in LaTeX vorliegt. In diesem Tutorial möchte ich zeigen, wie Sie Ihre LaTeX-Vorlagen als Templates in RMarkdown verfügbar machen können, um die Briefe im PDF-Format zu erzeugen. Das heisst, dass letztendlich Ihr RMarkdown wieder über LaTeX nach PDF kompiliert wird. LaTeX muss also installiert sein, und Sie müssen das gewünschte Layout bereits in LaTeX erstellt haben. Ebenso muss das bookdown-Paket installiert sein.

install.packages("bookdown")

Die Überführung nach Rmarkdowngeht am einfachsten, indem man sie als Templates in einem eigenen R-Paket abpeichert.

2 Ein eigenes R-Paket anlegen

Klicke in RStudio auf FileNew Project...

Wählen Sie R Package aus.

Abbildung 1: R-Package wählen

Geben Sie dem Paket einen Namen, z.B. MyStyle, und klicken Sie auf Create Project...

Abbildung 2: Packagenamen wählen

Im Arbeitsverzeichnis des neuen Projekts liegen nun die notwendigen Dateien und grundlegenden Paketordner, wobei wir das meister ignorieren können.

In DESCRIPTION können Sie eine Beschreibung des Pakets vornehmen. Wenn Sie das Paket eh nie veröffentlichen, können Sie sich diesen Schritt sparen.

Im Verzeichnis R werden alle Scriptdateien automatisch ausgeführt, sobald das Paket aktiviert wird. Dort hat RStudio bereits die Dummy-Datei hello.R angelegt. Die dort hinterlegte Funktion hello() steht also nach Aktivierung des Pakets zur Verfügung.

Das können wir direkt testen, indem wir das Paket “bauen und installieren”.

Klicken Sie im Datenfenster (rechter oberer Bereich) auf den Reiter Build.

Abbildung 3: Reiter Build

In diesem Bereich können Sie auf den Knopf Install and Restart klicken.

Abbildung 4: Paket installieren

Dadurch wird Ihr neues Paket installiert und automatisch per library(MyStyle) geladen. Sie können nun alle Funktionen Ihres Pakets in der R-Konsole aufrufen. Probieren wir also die Dummy-Funktion hello() aus, die in der Datei R/hello.R hinterlegt ist:

hello()

Immer dann, wenn Sie dem Paket neue Funktionen (oder Templates) hinzugefügt haben, können Sie es durch Klick auf Install and Restart aktualisieren.

2.1 Ein Template für Briefe anlegen

Templates fürRMarkdown müssen innerhalb des Pakets im Ordner inst/rmardown/templates/ vorliegen. Jedes Template erhält einen eigenen Unterordner, in welchem die erforderlichen Dateien abgelegt sind. Auch hier folgend die Dateien einer gewissen Struktur.

Mit der Funktion use_rmarkdown_template() aus dem Paket usethis können wir das “Skelett” des neuen Templates erzeugen. Beginnen wir mit der Briefvorlage. Das Template soll meinBrief heissen.

install.packages("usethis", dependencies = T)
usethis::use_rmarkdown_template(
  template_name = "meinBrief",
  template_dir = NULL,
  template_description = "Meine private Briefvorlage",
  template_create_dir = FALSE
)

Wie Sie sehen, wurden die Unterordner inst/rmardown/templates/meinbrief angelegt. Hier liegt die Datei template.yaml. Sie enthält die Informationen, die wir der use_rmarkdown_template()-Funktion übergeben haben.

name: meinBrief
description: >
   Meine private Briefvorlage
create_dir: FALSE

Hier müssen wir nichts ändern.

Im Unterordner skeleton liegt die Datei skeleton.Rmd. In ihr werden Beispieltexte und -code hinterlegt, die später beim Aufruf des Templates als Starttext erzeugt werden. Wir benutzen diese Datei, um unser Template zu testen und die benötigten Variablen zu hinterlegen. Wenn wir unser Template später in RStudio aus den Vorlagen auswählen, dann werden alle Dateien, die im Unterorder skeleton liegen, in das neu erstellte Projekt kopiert.

2.1.1 LaTeX Vorlage

Nehmen wir als Beispiel die folgende LaTeX-Vorlage für einen Brief. Das Beispiel ist lauffähig, wenn Sie eine Bilddatei mit dem Namen Unterschrift.png im selben Verzeichnis liegen haben.

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }
\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}   
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{Timm}
\newcommand{\myFamilyname}{Thaler}
\newcommand{\myStreet}{Absenderstr. 7}
\newcommand{\myTown}{47325 Schickensen}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
Prof. Dr. \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
+49 176 555 984 66\\%
timm@thaler.de\\[2mm]
ING DiBa\\
DE06 505 165 55 5555 4312 64\\[2mm]
Aktenzeichen:\quad\ 2021-4\\
\setkomavar{date}{\today} %datum im Absenderfeld 
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname} 
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{Dies ist der Betreff}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{Andrea Empfängerin\\
Schloss Schalkenstein\\ 
Adressatenstr. 23\\
22204 Briefkasten
}
%
\opening{Sehr geehrte Frau Empfängerin,}
%
\blindtext[1]

\closing{Mit freundlichen Grüßen,
}
\end{letter}
\end{document}  

Die Datei erzeugt folgendes PDF:

Abbildung 5: DF-Version des Briefs

Den -Code übertragen wir nun in unser Template. Hierfür muss im Ordner inst/markdown/templates/meinbrief der Unterordner resources angelegt werden. In diesem erzeugen wir die Datei meinbrief.tex und kopieren den LaTeX-Code hinein.

file.edit("inst/markdown/templates/meinbrief/resources/meinbrief.tex")
# kopiere nun den LaTeX Code hierhin.

Als nächstes kopieren wir die Bilddatei für die Unterschrift in den skeleton-Ordner. In unserem Beispiel heisst sie Unterschrift.png.

Abbildung 6: Datei Unterschrift.png

Ab jetzt wechseln wir immer zwischen den Dateien skeleton.Rmd und meinbrief.tex hin und her.

2.1.2 skeleton.Rmd und LaTeX-Datei anpassen

Schauen wir uns zunächst die Datei skeleton.Rmd an.

Hier löschen wir den Beispieltext und belassen nur die Kopfzeile

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

In der Kopfzeile werden Variablen vergeben. So hat z.B. Variable title derzeit den Wert Template Title, und date hat den Wert The Date.

Wir können uns dies zu nutze machen. In unserem LaTeX-Code sind all diese Variablen referenzierbar, wenn wir ihren Namen in Dollarzeichen einrahmen, also z.B. $title$. Wir können im Kopfbereich beliebige neue Variablen erzeugen und diese dann innerhalb der LaTeX-Vorlage nutzen.

Wir gehen also in die Datei meinbrief.tex, und ändern dort alle hardgecodeten Angaben (Name, Adresse, Telefonnummer, usw) in Variablen um. Diese Variablen tragen wir ebenfalls in die Datei skeleton.Rmd ein und hinterlegen dort die Werte.

Die Datei meinbrief.tex sieht danach z.B. so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\[2mm]
Aktenzeichen:\quad\ $myAktenzeichen$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{11cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Alle Angaben wurden durch Variablen ersetzt. Die Variable $body$ beinhaltet den gesamten Text des Markdown-Dokuments.

In der Datei skeleton.Rmd wurden die Variablen ebenfalls angelegt, und die Werte entsprechend zugeordnet:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
Betreff: Dies ist der Betreff
myAktenzeichen: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinbrief
---

dies ist ein Testbrief, um zu schauen, ob es auch in `RMarkdown` funktioniert.

Als letzte Angabe im Kopfbereich wird der output auf unser Template meinbrief im Paket MyStyle gesetzt.

2.1.3 Ausgabeformat bereitstellen

Jetzt sind wir fast schon fertig. Wir müssen noch das eben angegebene Ausgabeformat MyStyle::meinbrief verfügbar machen. Hierzu erstellen wir im Paketordner “R” die Datei formats.R. Sie wird bei der Aktivierung des Paketes automatisch ausgeführt und soll das Ausgabgeformat bereitstellen.

# erstelle Datei R/formats.R
file.edit("R/formats.R")

Sie erhält folgenden Inhalt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wie Sie sehen, verwenden wir letztendlich bookdown::pdf_document2 als Ausgabe.

2.1.4 Ausgabe kontrollieren

Jetzt können wir das Paket neu bauen und installieren, indem wir Install and Restart klicken.

Abbildung 7: Reiter Build

Wenn alles korrekt eingetragen wurde, können wir nun unsere Beispieldatei skeleton.Rmd knitten. Das erzeugt eine PDF-Datei im Unterordner skeleton (weil skeleton.Rmd dort liegt). Überprüfen Sie, ob alles so aussieht, wie Sie möchten. Ist alles gut, entfernen Sie die PDF-Datei und bauen Sie das Paket nocheinmal neu.

Fertig.

3 Paket als Vorlage nutzen

Ist das Paket installiert, steht das Template in RStudio zur Auswahl. Klicken Sie auf FileNew FileRMarkdown und wählen Sie “From Template”.

Abbildung 8: Template auswählen

Dort steht nun meinBrief zur Auswahl. Wenn Sie auf OK klicken, erhalten Sie den Beispielcode aus skeleton.Rmd sowie die Datei Unterschrift.png. Wenn Sie vergessen haben, die PDF-Datei Ihrer Testreihen zu entfernen, wird diese ebenfalls erzeugt.

4 weitere Templates erstellen

Auf diese Weise können wir beliebig weiterte Templates erstellen. Rob Hyndman hat für seine Fakultät z.B. Vorlagen für Abschlussarbeiten, Berichte und Klausuren erstellt, siehe https://github.com/robjhyndman/MonashEBSTemplates

Wir erzeugen in dieser Anleitung noch eine Vorlage für Rechnungen.

4.1 Vorlage für Rechnungen erzeugen

Für die Rechnungen-Vorlage bedienen wir uns bei unserem Brief und passen einige wenige Felder an.

Zunächst erzeugen wir wieder die Grundstruktur des Templates, welches diesmal meineRechnung heissen soll.

usethis::use_rmarkdown_template(
  template_name = "meineRechnung",
  template_dir = NULL,
  template_description = "Meine private Rechnungsvorlage",
  template_create_dir = FALSE
)

In den Ordner inst/markdown/templates/meinerechnung/skeleton/ kopieren wir zunächst die Datei Unterschrift.png. Dann öffnen wir die Datei skeleton.Rmd und entfernen alles bis auf den Kopfbereich.

---
title: "Template Title"
author: "Your Name"
date: "The Date"
output: output_format
---

Jetzt erstellen wir den Unterordner inst/markdown/templates/meinerechnung/resources/ und darin die Datei meinerechnung.tex.

Die Datei öffnen wir nun, und kopieren den Inhalt unserer Brief-Vorlage hinein.

file.edit("inst/markdown/templates/meinerechnung/resources/meinerechnung.tex")
# kopiere nun den LaTeX Code hierhin.

Jetzt nehmen wir einige Anpassungen vor, z.B. ersetzen wir das alte Aktenzeichen durch eine Rechnungsnummer. Auch fügen wir unsere Steuernummer hinzu.

Die LaTeX-Datei sieht danach so aus:

\documentclass[DIN,
    fontsize=11pt,          % fontsize
    paper=a4,               % page size a4
    firsthead=on,           % display header on first page
    firstfoot=on,           % display footer on first page
    pagenumber=off,         % position of the page number
    parskip=half,           % Use indent instead of skip, half, false
    enlargefirstpage=on,    % more space on first page
    fromalign=locationright, % placement of name in letter head
    addrfield=on,           % address field for envelope with window, on or true
    subject=titled,         % placement of subject, beforeopening or titled
    foldmarks=on,          % print foldmarks
    numericaldate=off,      % display date in numbers only
    KOMAold]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
\usepackage{times}
% \usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{lastpage}
\usepackage[rgb]{xcolor}
\usepackage{hyperref}
\hypersetup{%
    pdfborder=0 0 0,
    pdfauthor={},
    pdftitle={},
    pdfsubject={},
    pdfkeywords={},
    pdfpagemode={UseOutlines},
    bookmarksopen,
    pdfstartview={FitH},
    colorlinks,
    linkcolor={black},
    citecolor={black},
    urlcolor={blue}
  }

\urlstyle{same}

% Randbereiche mit geometry
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=20mm}

\usepackage{lastpage} % letzte Seite anzeigen
\usepackage{marvosym}
\usepackage{blindtext}

% speichere eigene Variablen für Werte, die häufig drankommen
\newcommand{\myFirstname}{$myFirstname$}
\newcommand{\myFamilyname}{$myFamilyname$}
\newcommand{\myStreet}{$myStreet$}
\newcommand{\myTown}{$myTown$}

% ---Angaben für das Absenderfeld--------
\setkomavar{fromname}{\flushright\normalfont\textbf{\myFirstname\ \myFamilyname}}
\setkomavar{signature}{\myFirstname\ \myFamilyname}
\setkomavar{fromaddress}{\flushright\normalfont\scriptsize%
$myGrade$ \myFirstname\ \myFamilyname\\
\myStreet\\\myTown\\%
$myTelefon$\\%
$myMail$\\[2mm]
$myBank$\\
$myIBAN$\\
Str-Nr. $myStrNr$\\[2mm]
Rechnungsnummer:\quad\ $myRechnungsnummer$\\
\setkomavar{date}{\today} %datum im Absenderfeld
Datum:\quad \today}
%---------------------------------------
\renewcommand*\familydefault{\sfdefault}

% Anordnung im Absenderfeld
\setkomavar{firsthead}{}
\setkomavar{location}{%
  \raggedleft
  \usekomavar{fromname}\\
  \usekomavar{fromaddress}
}

% Absender auch über dem Empfängeradressfeld
\setkomavar{backaddress}{\myFamilyname\ | \myStreet\ | \myTown}

% signatur mit Unterschrift
\setkomavar{signature}{\includegraphics[width=25mm]{Unterschrift.png}\\\myFirstname\ \myFamilyname}
%
% --------------kopf/fusszeile----------------
\usepackage{scrlayer-scrpage}
\clearmainofpairofpagestyles
\cfoot{\flushright\scriptsize\normalfont Seite \thepage\ von \pageref{LastPage} }
\RedeclarePageStyleAlias{empty}{scrheadings}
%----------------------------------------------
%
\setkomavar{date}{} % Datum wieder löschen
\setkomavar{subject}{$Betreff$}
\setlength{\parindent}{0pt}

% positionierung von Absender und Empfängerboxen
\makeatletter
  \@setplength{backaddrheight}{0pt}% because backaddress=off
  \@setplength{toaddrhpos}{2.5cm}%distance from left
  \@setplength{toaddrvpos}{5cm}%distance from top
  \@setplength{toaddrheight}{3.5cm}%height of the addressbox
  \@setplength{toaddrwidth}{10cm}% width of the addressbox
  \@addtoplength{locwidth}{45mm} % width of ABSENDERbox
  \@setplength{lochpos}{2cm}%distance from top
  \@setplength{locvpos}{32mm}%distance from top
  \@setplength{refvpos}{9cm}% Abstand des Haupttextes von top
\makeatother
%------------------------------------------------------------------------------------

\begin{document}
%
\begin{letter}{$anName$\\
$anZusatz$\\
$anStrasse$\\
$anOrt$
}
%
\opening{$opening$,}
%
$body$

\closing{$closing$,
}
\end{letter}
\end{document}

Die Variablen übertragen wir in die Datei skeleton.Rmd, die dann so aussieht:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---

Um das Ergebnis testen zu können, müssen wir das Ausgabeformat MyStyle::meinerechnung verfügbar machen. Hierfür ergänzen wir im Unterordner R in der Datei formats.R wie folgt:

# mache output "meinbrief" verfügbar
meinbrief <- function(...) {
  template <- system.file("rmarkdown/templates/meinbrief/resources/meinbrief.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

# mache output "meinerechnung" verfügbar
meinerechnung <- function(...) {
  template <- system.file("rmarkdown/templates/meinerechnung/resources/meinerechnung.tex",
                          package="MyStyle")
  bookdown::pdf_document2(...,
                          template = template
  )
}

Wenn Sie jetzt das Paket neu bauen und installieren, sollte das knitten der Datei skeleton.Rmd schon funktionieren, und eine PDF-Datei ausspucken.

Die Rechnungsvorlage kann nun wie folgt erweitert werden:

---
title: "Template Title"
author: "Your Name"
date: "The Date"
myFirstname: Timm
myFamilyname: Thaler
myStreet: Absenderstr. 7
myTown: 47325 Schickensen
myGrade: Prof. Dr.
myTelefon: +49 176 555 984 66
myMail: timm@thaler.de
myBank: ING DiBa
myIBAN: DE06 505 165 55 5555 4312 64
myStrNr: 313/5555/123
Betreff: RECHNUNG
myRechnungsnummer: 2021-4
anName: Andrea Empfängerin
anZusatz: Schloss Schalkenstein
anStrasse: Adressatenstr. 23
anOrt: 22204 Briefkasten
opening: Sehr geehrte Frau Empfängerin
closing: Mit freundlichen Grüßen
output: MyStyle::meinerechnung
---


für die erbrachten Leistungen erlaube ich mir wie folgt in Rechnung zu stellen:



|  **Datum** |                 **Posten**                          | **Betrag**|
|------------|-----------------------------------------------------|----------:|
| 29.06.2021 | Zauberschow für Kinder in der KiTa Regenbogenland   |     300,01|
|            |                                                     |           |
|            |                                         Nettobetrag |     300,01|
|            |                      Umsatzsteuerfrei gem. §19 UstG |       0,00|
|            |                                    **Gesamtbetrag**:| **300,01**|




Bitte überweisen Sie den Betrag unter Angabe der Rechnungsnummer auf mein Konto bei der ING DiBa
mit der IBAN *DE06 505 165 55 5555 4312 64*.

Ich bedanke mich für Ihren Auftrag und verbleibe

Wenn Sie jetzt knitten, sieht die PDF-Datei skeleton.pdf so aus:

Abbildung 9: fertiges PDF-Dokument

Jetzt können Sie noch weitere Anpassungen vornehmen. Wenn Sie fertig sind, entfernen Sie die PDF-Datei skeleton.pdf und bauen und installieren Sie das Paket neu. Ab jetzt steht es in RStudio als Vorlage zur Verfügung.

Klicken Sie auf FileNew FileRMarkdown und wählen Sie “From Template”.

Abbildung 10: Vorlagen

5 noch mehr Templates

Noch weitere Templates bietet unter anderem das R-Paket rticles.

install.packages("rticles")

Nach einem Neustart von RStudio stehen die Templates bereit.

6 Weiterführende Links

Anfang der Woche wurde das Webframework Django in Version 3.2 veröffentlicht. Der LTS-Release bringt einige Neuerungen, Breaking Changes und Abkündigungen von Funktionen mit.

Neuerungen

Die AppConfig ist seit vielen Versionen ein wichtiger Bestandteil von Django, um Projekte in Apps zu strukturieren. Die apps.py tritt in der normalen Entwicklung normalerweise eher in den Hintergrund, übernimmt aber entscheidende Aufgaben. Dies trifft insbesondere auf besonders austauschbare Applikationen zu. Wer eine default_app_config gesetzt hat, sollte allerdings bei Django 3.2 aufhorchen: Django 3.2 kann automatisch die AppConfig ermitteln, wenn in der App eine apps.py mit einer einzigen AppConfig existiert. Damit wird die nun veraltete Variable default_app_config nicht mehr benötigt.

Weiterhin lässt sich der standardmäßige Typ des Primärschlüssels ab sofort zentral anpassen. Ein Primarschlüssel wird automatisch mit dem Typ AutoField immer dann angelegt, wenn kein Feld mit primary_key=True in einem Model vorhanden ist. Sollte der Typ über die ganze App oder gar das ganze Projekt verändert werden, musste bisher jedes Model einzeln einen benutzerdefinierten Typ bereitstellen. Mit der globalen Einstellung DEFAULT_AUTO_FIELD sowie der anwendungsweiten Einstellung AppConfig.default_auto_field lässt sich das nun zentral ändern. Weiterhin wird für neu erstellte Projekte als automatischer Primärschlüsseltyp BigAutoField eingestellt, sodass die Primärschlüssel 64-bit statt bisher 32-bit große Integer speichern. Das ist besonders dann hilfreich, wenn von einem Model mehr als 2 Milliarden Instanzen abgespeichert werden sollen.

Die dritte große Änderung betrifft ebenfalls die Models: so ist es nun möglich, funktionelle Indizes über den positionsabhängigen Parameter *expressions anzulegen.

Der @admin.display-Dekorator ermöglicht es nun, für Property-Funktionen wie is_published direkt aus dem Model heraus die Darstellung auf der Adminoberfläche, die nun ein Dark Theme unterstützt, zu definieren. Weiterhin leitet die Adminoberfläche in jedem Fall unangemeldete Benutzer auf die Anmeldeseite weiter, um nicht durch Statusmeldungen (z. B. Not Found) Aufschluss über die Existenz von Objekten zu geben.

pymemcache wird nun ebenfalls unterstützt, sofern es in Version 3.4.0 installiert ist.

Das in Django 3.1 eingeführte JSONField besitzt nun auch mit JSONObject ein Pendant für Datenbankoperationen.

Wer einen Blog betreibt, kann mit Django besonders einfach RSS-Feeds für Models, hier konkret Artikel, erstellen, indem er auf das mitgelieferte django.contrib.syndication zurückgreift. Nun ist es möglich, mit item_comments direkt einen Link auf eine Kommentarsektion von Models zu spezifizieren, was in einigen RSS-Readern wie Tiny Tiny RSS an gesonderter Stelle angezeigt wird, um schneller in die Kommentare zu springen. Auf diese Änderung bin ich besonders stolz, weil ich sie selber beigetragen habe. ;)

Inkompatibilitäten

Die neue DatabaseFeatures.introspected_field_types ersetzt eine Reihe alter Features wie can_introspect_autofield, etc.

In der Adminoberfläche wird nun bei den Seiten ab 1 statt wie bisher ab 0 gezählt.

Abkündigungen

Die Unterstützung von PostgreSQL 9.5, MySQL 5.6 sowie PostGIS 2.2 wurde entfernt.

Verfügbarkeit

Django 3.2 unterstützt Python 3.9 bis 3.6. Die Unterstützung ist mindestens drei Jahre ab Veröffentlichung gewährleistet. Der vorherige LTS-Release 2.2 wird die Unterstützung nächstes Jahr im April 2022 verlieren.

Die Auflistung aller Änderungen samt Verweise und Codebeispiele ist in den Django 3.2 release notes verfügbar.

9. April 2021

Unter dem Namen Proton arbeitet Mozilla an einem neuen Design für Firefox. Mozilla hat die ersten – jedoch noch nicht alle! – Änderungen nun in der Nightly-Version von Firefox standardmäßig aktiviert.

Proton ist das neue Firefox-Design

Unter dem internen Projektnamen Proton arbeitet Mozilla an einem neuen Design seines Desktop-Browsers, welches mit Firefox 89 das Licht der Welt erblicken soll. Über Proton wurde auf diesem Blog weltweit als erstes berichtet.

Die Veröffentlichung von Firefox 89 ist derzeit für den 1. Juni 2021 geplant.

Standardmäßige Aktivierung in Firefox Nightly

Wer eine Nightly-Version von Firefox nutzt, wird schnell feststellen, dass Firefox anders als gewohnt aussieht. Dies liegt daran, dass Mozilla das neue Proton-Design standardmäßig aktiviert hat – zumindest teilweise. Was in der Berichterstattung anderer Websites fast vollständig untergeht, ist die Tatsache, dass Mozilla zwar den Schalter browser.proton.enabled aktiviert hat, Proton aber noch hinter weiteren Schaltern entwickelt wird, welche in einem gesonderten Artikel ausführlich behandelt werden. Beispielsweise sind die neuen Kontextmenüs für Windows 10 sowie Apple macOS und auch die neuen Tooltips für Tabs und Lesezeichen nach heutigem Stand noch nicht standardmäßig aktiviert. Im Laufe der kommenden Tage und Wochen werden auch die restlichen Teile von Proton aktiviert werden.

Erwähnt sei an dieser Stelle auch, dass selbst bei manueller Aktivierung aller Proton-Optionen das Design noch nicht dem finalen Ergebnis entspricht. So fehlen aktuell vor allem noch die neuen Icons, was natürlich einen wesentlichen Anteil am Design hat. Ab dem kommenden Nightly-Build, welcher heute erscheinen wird, werden die ersten neuen Icons Teil von Firefox Nightly sein. Aber auch hier gilt: Die Arbeiten sind noch nicht abgeschlossen. So sind erst einmal zwei Icon-Stile gemischt, was so natürlich nicht bleiben wird. Beispielsweise sind das Icon für den Tracking-Schutz oder zum Neuladen der Website noch alt, aber das Schloss-Symbol in der Adressleiste, die Zurück- und Vorwärtspfeile oder das Menü-Icon bereits neu. Auch hier werden die nächsten Tage und Wochen das Bild komplettieren.

Firefox Nightly: Proton-Design

Der Beitrag Proton-Design in Firefox Nightly (teilweise) aktiviert erschien zuerst auf soeren-hentzschel.at.

Die Veröffentlichung von Firefox 89 war ursprünglich für den 18. Mai 2021 vorgesehen. Nun hat Mozilla den Veröffentlichungstermin von Firefox 89 und allen nachfolgenden Versionen verschoben.

Mit Firefox 89 steht ein großes Update bevor. Zumindest optisch wird sich Firefox stark verändern, denn mit Proton steht ein neues Firefox-Design in den Startlöchern. Wer bereits darauf wartet, muss sich allerdings noch etwas länger gedulden als bisher angenommen.

Mozilla wird wie geplant am 20. April 2021 Firefox 88 veröffentlichen und Firefox 89 dann die Beta-Phase erreichen. Statt wie üblich vier Wochen wird die Beta-Phase von Firefox 89 allerdings sechs Wochen dauern.

Als Termin ausgedrückt bedeutet dies, dass Firefox 89 nun aller Voraussicht nach am 1. Juni 2021 erscheinen wird. Alle weiteren Firefox-Versionen werden ebenfalls um zwei Wochen nach hinten geschoben. Der Release-Kalender dieser Seite ist bereits an die neuen Daten angepasst.

Der Beitrag Mozilla verschiebt Firefox 89 erschien zuerst auf soeren-hentzschel.at.

7. April 2021

Um die digitale Privatsphäre ist es schlecht bestellt. Auf kleine Fortschritte folgen meist viele Rückschritte. Doch wie wäre die Lösung? An dieser Frage scheiden sich die Geister und man sollte berücksichtigen, was zwischen den Zeilen mitschwingt.

Um den Datenschutz im Internet und die digitale Privatsphäre ist es schlecht bestellt. Die Aussage würde in Deutschland wohl nahezu jeder unterschreiben. Die einen stört es mehr, die anderen weniger, manche denken, sie haben nichts zu verbergen oder machen sich weniger Gedanken. Aber kaum jemand würde sich ernsthaft hinstellen und sagen: Alles perfekt!

Doch in der Frage der Lösungen scheiden sich die Geister. Das wird nur selten offen kommuniziert. Es ist der alte Widerspruch zwischen einer Reform des Systems und einem revolutionären Bruch.

Diejenigen auf der Reform-Seite glauben, dass man mit Gesetzen und einem Wandel der Unternehmenskulturen eine grundlegende Verbesserung erreichen kann. Sie sehen in Vorhaben, wie sie beispielsweise Apple zahlreich umsetzt, den Weg in eine Datenschutz-freundlichere Zukunft. Für Reformer kann auch ein Saulus zum Paulus werden, wenn er sein Geschäftsmodell umstellt. Staatliche Leitplanken und die Erkenntnis, dass immer größere Datenberge nicht zu mehr Gewinnen führen, sollten hier Besserung bringen.

Radikale Revolutionäre lehnen die Struktur des Internets, der digitalen Dienste und die dort agierenden Firmen, wie wir es aktuell vorfinden, radikal ab. Die meisten Revolutionäre halten die gegenwärtige zentrale Dienste-Struktur und App-Ökonomie für ein Grundübel, ohne deren Überwindung keine nachhaltige Privatsphäre möglich ist. Oftmals schwingt eine gehörige Portion Kapitalismuskritik mit (die Ironie wenn hoch bezahlte Informatiker Kapitalismuskritik üben lassen wir hier mal beiseite).

Ein kleines Beispiel dazu: Man konnte diesen Gegensatz sehr schön in den Artikeln rund um Signal in den letzten Wochen lesen. Signal ist ein erfolgreicher (der erfolgreichste?) sicherer Messenger. Er ist aber strukturell gewissermaßen ein Klon erfolgreicher proprietärer Messenger. Es nimmt was gut ist am bisherigen System und ersetzt die problematischen Bestandteile. Zentral konzipiert, mit einer geschlossenen Entwicklergruppe und ggf. wäre irgendwann sogar eine Kapitalisierung des Geschäftsmodells denkbar. Dummerweise (aus Sicht der Revolutionäre) war Signal aber immer sehr gut, sehr sicher und vor allem sehr erfolgreich. Vermutlich hat die App auch viele alten Diensten wie XMPP & Co Benutzer weggenommen. Aber die Fakten sprachen für die App und viele Revolutionäre mussten zähneknirschend Empfehlungen für Signal aussprechen.

Nach der Episode um den zeitweilig nicht verfügbaren Quellcode des Serverparts schießen sich manche nun mit komischen Argumenten auf Signal ein und verstärken die Empfehlungen für dezentrale, wirklich freie Alternativen. Der Revolutionär lässt gewissermaßen die Maske des Reformers fallen. Dies ist nur ein kleines Beispiel, aber es soll verdeutlichen wie sich der Unterschied in den Ansätzen in realen Empfehlungen und Perspektiven auswirkt.

Beide Seiten haben ihre Argumente. Ich persönliche stehe eher bei den Reformern, weil mir reale Erfolge wichtiger als die reine Lehre sind. Plakativ gesagt: Mit Debian würden wir meiner Meinung nach heute mit Linux heute noch da stehen, wo wir 2005 standen, Ubuntu hat uns dahin gebracht wo wir heute sind. Ich akzeptiere aber auch revolutionärere Ansätze, zumal solche in abgeschwächter Form manchmal als Reform zurückkommen. Ohne die Aufmerksamkeit für Datenschutz und digitale Privatsphäre, den viele Aktivisten ertrommelt haben, hätte Apple das schließlich kaum als Geschäftsmodell erkannt.

Wichtig ist, diese grundlegenden Annahmen zu berücksichtigen, wenn man sich zu den Themen Datenschutz und digitale Privatsphäre informiert. Sie prägen Empfehlungen, Sichtweisen und manchmal auch Bewertungen. Das ist menschlich, denn bei Konzepten, denen man wohlwollend gegenübersteht, drückt man lieber mal ein Auge zu und beim Gegenteil versucht man jedes Problem zu finden.

Der Artikel Reform oder Revolution – Wie ist die digitale Welt zu retten? erschien zuerst auf [Mer]Curius

6. April 2021

Wie ich bereits vor einigen Wochen berichtet habe, wurde Qt in Version 6 veröffentlicht. Dies hat auch Signalwirkung für eines der wichtigsten in Qt umgesetzten Projekte, KDE. Auch hier wird in den nächsten Monaten auf Qt 6 umgestellt.

Offene Fragen gab es bisher beim Support des auslaufenden Qt 5-Versionsstrangs, der die Grundlage für alle aktuellen KDE-Projekte bildet. Hier hat The Qt Company die Daumenschrauben angezogen (LinuxNews und ich berichteten) und den LTS-Support, der jetzt für die letzten Qt 5-Version 5.15 relevant werden würde, für die kommerziellen Kunden vorbehalten.

KDE kündigte heute nun an, eine eigene Qt 5 Patch Collection bereitzustellen, um den Übergang abzusichern.

Mit dieser Patch Collection werden Sicherheitsprobleme, Abstürze und Funktionsdefekte gelöst. Für die Entwicklung gelten gesonderte Bedingungen im Bezug auf die Verfahrensweisen für die Aufnahme von Patches, veröffentlicht wird aber weiterhin unter der gleichen Lizenz wie der von der Qt Open Source Edition. Releases wird es von dieser Patch Collection allerdings nicht geben. Die Repositories für die Patch Collection sind im KDE-eigenen GitLab verfügbar.

Ist man selber Entwickler von Qt 5-Anwendungen, sollte man im Hinterkopf haben, dass diese Patch Collection speziell auf KDE zugeschnitten ist. Ist der Umstieg auf Qt 6 bei KDE abgeschlossen, wird diese Patch Collection auch eingestellt. Wie aus der Pressemitteilung hervorgeht, zeigt der Hersteller von Qt Verständnis bei den Bemühungen. Man kann davon ausgehen, dass KDE trotz des Lizenztrubels in den letzten Monaten weiterhin gut im Kontakt mit The Qt Company steht. KDE betreibt eine spezielle Intermediärsorganisation mit der The Qt Company: die KDE Free Qt Foundation. Sie kümmert sich um Lizenzbelange und stellt sicher, dass weiterhin eine frei verfügbare Version von Qt für das KDE-Projekt zur Verfügung steht.

5. April 2021

Heute ist es nun soweit: das lang erwartete Urteil im Verfahren zwischen Google und Oracle ist gefallen. Im Kern ging es um die Einordnung von Application Programming Interfaces (API) und Copyright (hier: Fair Use) in einem speziellen Fall.

Google hat für Android in früheren Versionen auf Java-APIs zurückgegriffen, die von Sun Microsystems entwickelt wurden, das von Oracle 2009 aufgekauft wurde. Oracle sah sich in seinen Rechten verletzt, Google argumentiert, dass die ursprüngliche Nutzung unter Fair Use fällt. Zwischenzeitlich hat Google auf eine rechtlich sicherere Variante umgestellt und nutzt nicht mehr das originale API.

Die Frage, inwiefern APIs urheberrechtlich geschützt werden können, ging schon durch mehrere Gerichtsinstanzen. Während zwei District-Gerichte für Google urteilten, hat der Federal Circuit beide Urteile aufgehoben. Der Supreme Court hat nun als letzte Instanz die finale Entscheidung getroffen. In einer 6:2-Entscheidung wurde heute mitgeteilt, dass Googles Nutzung der APIs unter Fair Use fiel.

Die heutige Entscheidung ist wegweisend für Open Source-Projekte, weil eine Entscheidung für Oracle einschneidende Konsequenzen im Bezug auf Interoperabilität von Programmen hätte – einer Gefahr, der sich die Richter bewusst waren, wie aus dem Statement hervorgeht. Wired hat sich dies vor einigen Jahren schon einmal angesehen und angeführt, dass auch Linux mit der POSIX-API Probleme bekommen hätte. Diese Entscheidung ist allerdings auch kein Freifahrtschein, da es in dieser Instanz nicht mehr um die Schutzfähigkeit von APIs generell ging, sondern eher um die Zugänglichkeit von Fair Use in diesem speziellen Fall. Das Fair Use-Prinzip beschränkt sich auf das US-Urheberrecht.

Wer sich weiter zu dem Thema informieren möchte, kann sich das Dokument vom Supreme Court, die Nachricht von CNN sowie den Artikel von Wikipedia zu dem gesamten Fall in allen Facetten durchlesen.

4. April 2021

In diesem Tutorial stelle ich einen einfachen Leitfaden für Meetings vor, dann gehe dann mit euch einmal quer durch die Opensource Webkonferenz Software Big Blue Button und erzähle ein wenig Etwas zu den verschiedenen Optionen und Möglichkeiten.

 

 

LibreOffice findest du hier https://de.libreoffice.org/

Einfacher Leitfaden für Online Meetings & Schulungen

Vorbereitung

  1. Agenda und Ablauf festlegen

  2. Zeit bestimmen

  3. Informative Einladungen verschicken

  4. Hinweise auf die Regeln des Meetings wie z.B. Bitte Headsets benutzen, bitte stumm schalten, wer nicht spricht, Kameras nicht notwendig, Telefone bitte aus, bitte pünktlich sein.



Meeting Vorbereitung

  1. 5-10 Minuten vorher online sein

  2. Benötigte Materialien (Präsentationen) hochladen

  3. Eventuell benötigter Text in die gemeinsamen Notizen kopieren

  4. Einstellungen für den Raum nochmal überprüfen



Meeting Start

  1. Präsent sein, mit den Teilnehmern reden (Smalltalk)

  2. z.B. nach 5 Minuten mit dem Meeting starten / Teilnehmerliste runter laden

  3. Wer schreibt das Protokoll in den gemeinsamen Notizen? Oder alle?

  4. Noch mal der Hinweis auf die Regeln und dann die Agenda abarbeiten



Meeting Ende

  1. Notizen speichern / runter laden

  2. Meetingprotokoll an alle Teilnehmer verschicken

  3. Ergebnisse dokumentieren

 

 

 

 

 

3. April 2021

Im Rahmen des von der Europäischen Union geförderten Bergamot Projects arbeitet Mozilla daran, eine Übersetzungsfunktion für den Browser zu entwickeln – und das vollständig ohne Online-Komponente wie Google Translate. Die Bergamot-Erweiterung für Firefox kann nun getestet werden.

Bergamot Project: Website-Übersetzung im Browser

Bereits im Oktober 2019 berichtete ich über das Bergamot Project. Zur Erinnerung:

Hintergrund des Ganzen ist das von der Europäischen Union geförderte Bergamot Project, in dessen Rahmen Mozilla mit der University of Tartu (Estland), der University of Sheffield (England), der University of Edinburgh (Schottland) und der Charles University (Tschechien) kollaboriert, um eine vollständig clientseitige Funktion zur maschinellen Übersetzung von Websites für den Browser zu entwickeln.

Die clientseitige Durchführung der Übersetzung soll einerseits der Privatsphäre dienen, da kein Datenriese wie Google involviert ist, andererseits aber auch die Verbreitung von Sprachtechnologie in Europa fördern, und zwar in Bereichen, welche Vertraulichkeit erfordern und wo es dementsprechend keine Option ist, die Übersetzung in der Cloud durchzuführen.

Das Bergamot Project ist mit drei Millionen Euro durch die Europäische Union gefördert und auf drei Jahre ausgelegt. Damit das Projekt auch über die drei Jahre hinaus einen langfristigen Effekt hat, wird die Übersetzungsfunktion in Firefox integriert und alle Technologien, welche im Rahmen des Bergamot Projects entstehen, als Open Source veröffentlicht.

Bergamot-Erweiterung 0.3 für Firefox

Wer neugierig ist, kann die aktuelle Version 0.3 der Firefox-Erweiterung testen. Diese Version erlaubt Übersetzungen aus dem Spanischen sowie aus dem Estnischen ins Englische und umgekehrt, sowie vom Englischen ins Deutsche (allerdings nicht umgekehrt). Weitere Sprachen werden bisher nicht unterstützt und da die entsprechenden Sprach-Modelle derzeit noch direkt mit der Erweiterung gebündelt sind statt zur Laufzeit heruntergeladen zu werden, kommt die Erweiterung in der aktuellen Version auf eine Dateigröße von 124 MB.

Das Laden der Sprachmodelle kann beim ersten Mal noch zwischen zehn und 30 Sekunden dauern, weitere Übersetzungen in die Zielsprache sind dann wesentlich schneller. Bei der Übersetzung selbst schafft Bergamot aktuell zwischen 500 und 600 Wörter pro Sekunde.

Bergamot 0.3 für Firefox

Installation der Bergamot-Erweiterung für Firefox

Derzeit benötigt es noch einige Vorbereitungen, um die Bergamot-Erweiterung für Firefox testen zu können. Dies ist dem frühen Entwicklungs-Stand geschuldet und wird in der Zukunft natürlich weniger kompliziert werden.

Zur Installation wird momentan noch eine Nightly-Version von Firefox benötigt. In dieser Nightly-Version müssen mehrere Einstellungen in about:config vorgenommen werden:

  • xpinstall.signatures.dev-root – Dieser Schalter muss manuell als Boolean-Schalter angelegt werden, falls noch nicht vorhanden, und auf true gesetzt werden.
  • xpinstall.signatures.required – Wer noch weitere Erweiterungen installiert hat, muss diesen Schalter auf false und die Signatur-Pflicht für Erweiterungen damit deaktivieren, weil xpinstall.signatures.dev-root auf true ansonsten verursacht, dass alle anderen installierten Erweiterungen deaktiviert werden.
  • browser.proton.enabled – Dieser Schalter muss auf true gesetzt werden, da die Bergamot-Erweiterung für das kommende Proton-Design von Firefox gestaltet ist. Dieser Schalter ist seit dem Nightly-Builld vom 08.04.2021 standardmäßig aktiviert und muss nicht länger von Hand aktiviert werden.
  • browser.proton.infobars.enabled – Wer das Proton-Design bereits testet und diesen Schalter angelegt hat, muss sicherstellen, dass dieser auf false steht, weil die Übersetzungs-Leiste in der aktuellen Nightly-Version mit diesem Schalter auf true nicht funktional ist. Wer diesen Schalter gar nicht erst angelegt hatte, kann diesen Schritt komplett überspringen. Diese Anpassung ist seit dem Nightly-Build vom 06.04.2021 nicht länger notwendig.
  • dom.postMessage.sharedArrayBuffer.bypassCOOP_COEP.insecure.enabled – Dieser Schalter muss auf true gesetzt werden. Das ist eine temporäre Maßnahme und wird in Zukunft nicht mehr notwendig sein.

Nach diesen Vorbereitungen und einem Neustart von Firefox, damit die soeben durchgeführten Änderungen wirksam sind, kann die Erweiterung über diesen Link installiert werden. Anschließend muss noch sichergestellt werden, dass die Ausgangs-Sprache in den Spracheinstellungen von Firefox nicht auftaucht. Wenn in einem deutschsprachigen Firefox beispielsweise sowohl Deutsch als auch Englisch angegeben sind, erscheint auf einer englischsprachigen Website auch keine Übersetzungs-Leiste. Hierfür muss Englisch zunächst entfernt werden.

Spracheinstellungen Firefox

Fazit

Auch wenn die einmalige Einrichtung derzeit noch etwas kompliziert ist, zeigt Bergamot bereits beeindruckende Ergebnisse. Zur Erinnerung: Für die Übersetzung von Websites findet keinerlei Datenübertragung an Google oder einen anderen Übersetzungs-Dienst statt, die Übersetzung erfolgt vollständig im Browser. Ausgehend von den großen Fortschritten in den letzten Wochen kann man gespannt sein, welche Verbesserungen die nächsten Versionen bringen werden. Auch eine Version für andere Browser ist geplant, der Fokus der Entwicklung liegt derzeit aber vollständig auf der Version für die native Integration in Firefox. Feedback zur Erweiterung kann den Entwicklern auf GitHub mitgeteilt werden.

Der Beitrag Maschinelle Übersetzungen ohne Cloud: Bergamot-Erweiterung für Firefox kann getestet werden erschien zuerst auf soeren-hentzschel.at.

Vergangenes Jahr habe ich meinen Tower-PC generalüberholt und mit frischer Hardware bestückt. Dieses Jahr möchte ich meine beiden ThinkPads (T410 und X201) durch aktuelle Hardware ablösen.

Das neue Gerät soll folgende Anforderungen erfüllen:

  • 100% Linux-Kompatibilität – Ich möchte auf dem Gerät Debian, RHEL, Fedora, Ubuntu LTS oder evtl. auch mal ganz was neues betreiben. Da möchte ich natürlich nicht für Hardware bezahlen, die ich anschließend nicht nutzen kann.
  • Lange Akkulaufzeit >7 Std. – Damit ich mit dem Gerät auf dem Sofa, im Garten, im Büro oder auch mal im Auto arbeiten kann, ohne nach wenigen Stunden an eine Steckdose gefesselt zu sein.
  • Gute Tastatur – Dies ist ein sehr subjektiver Punkt. Ich liebe die ThinkPad-Tastaturen. Die alten mehr, als die neuen. Ich hasse hingegen die Tastaturen aus der Dell Latitude Reihe.
  • Leise Lüfter – Wenn mehrere Prozesse schwere Arbeit verrichten, muss die Hardware selbstverständlich gekühlt werden. Wenn mich das Gerät allerdings bei der Internetrecherche und dem Schreiben von Texten bereits permanent anbläst und die Lüfter heulen lässt, nervt mich dies extrem.
  • Virtualisierung – Ich arbeite viel mit virtuellen Maschinen und zukünftig auch vermehrt mit Containern. Das neue Gerät soll nicht meinen Hypervisor ersetzen, aber für Testzwecke schon mal 2-3 VMs parallel starten können. Daher sind 8 Threads und mindestens 32 GB RAM Pflicht.
  • 1 TB Festplattenspeicher – Denn darunter wird der Platz nur wieder erschreckend schnell knapp.

Bisher habe ich mich in den Online-Shops von TUXEDO Computers und Lenovo umgesehen und die beiden folgenden Geräte ins Auge gefasst

TUXEDO Pulse 14

Ich hab das TUXEDO Pulse 14 Gen 1 wie folgt konfiguriert:

  • Display: Full-HD (1920×1080) IPS matt | 100% sRGB
  • RAM: 64 GB (2x 32 GB) 3200 MHz CL22 Samsung
  • CPU: AMD Ryzen 7 4800H (8x 2,9-4,2 GHz, 8 Cores, 16 Threads, 12 MB Cache, 45 W TDP)
  • Festplatte: 1 TB Samsung 980 Pro (NVMe PCIe 4.0)
  • WLAN & Bluetooth: Intel Wifi AX200 & Bluetooth 5.1
  • LAN: 1x Gigabit LAN/Netzwerk RJ45
  • Weitere Anschlüsse
    • 1x USB 3.2 Gen1 Typ-C (DisplayPort: nein; Power Delivery/DC-IN: ja, mind. 20V/4.5A)
    • 2x USB 3.2 Gen1 Typ-A
    • 1x USB 2.0 Typ-A
    • 1x HDMI 2.0 inkl. HDCP (4k UHD@60Hz / 2k FHD@120Hz)
    • 1x 2-in-1 Kopfhörer/Headset (Kopfhörer & Mikrofon)
    • 1x HD Webcam / Kamera inkl. Mikrofon
  • Preis: ca. 1489 EUR

Das ist in meinen Augen bereits eine gute Ausstattung zu einem fairen Preis. Nur bin ich skeptisch, ob mir die Tastatur gefallen wird und ich mich daran gewöhnen kann, keinen TrackPoint mehr zu haben.

Ist unter euch evtl. ein ehemaliger ThinkPad-User, welcher nun ein TUXEDO sein Eigen nennt und etwas zur Tastatur und dem Touchpad sagen mag? Und auch wenn ihr kein ThinkPad-User seid, freue ich mich über euer Feedback.

ThinkPad P14s Gen 1

Das ThinkPad P14s Gen 1 käme mit folgender Konfiguration in Frage:

  • Display: 35,6 cm (14,0″) FHD (1.920 x 1.080), IPS, entspiegelt, 300 cd/m², Multitouch, schmale Ränder
  • RAM: 32 GB DDR4 3.200 MHz (16 GB verlötet + 1 x 16 GB SODIMM gesteckt)
  • CPU: AMD Ryzen 7 PRO 4750U Prozessor (8 Kerne, 16 Threads, 8 MB Cache, bis zu 4,10 GHz)
  • Festplatte: 1 TB SSD, M.2 2280, PCIe 3.0 x4/PCIe 4.0 x4, NVMe, OPAL 2.0-fähig, TLC
  • WLAN & Bluetooth: Intel Wi-Fi 6 AX200 (2×2) WLAN, Bluetooth 5
  • LAN: 1x Gigabit LAN/Netzwerk RJ45
  • Weitere Anschlüsse
    • 2 x USB-A 3.2* (Gen 1) (1 Always-on)
    • 2 x USB-C 3.2 (Gen 2)
    • 1x HDMI 2.0
    • 1x 2-in-1 Kopfhörer/Headset (Kopfhörer & Mikrofon)
    • MicroSD-Kartenleser (UHS-II)
    • 1x Infrarot- und 720p-HD-Kamera mit Mikrofon
  • Sonstiges: Das System ist Red Hat Linux zertifiziert und das Gehäuse ist spritzwassergeschützt
  • Preis: ca. 1459 EUR

Die Akkulaufzeit beträgt nach MobileMark 2014 bis zu 13,25 Std. und nach MobileMark 2018 bis zu 10,5 Std. Das sagt mir persönlich erstmal gar nichts, da ich beide Benchmarks nicht kenne. Davon ab mag sich die reale Laufzeit im Wirkbetrieb, gerade unter Linux, völlig anders darstellen. Wie sind eure Erfahrungen mit der Akkulaufzeit von aktuellen ThinkPads unter Linux? Weicht diese stark von den Angaben ab?

Wer die Wahl hat, hat die Qual

Da sitze ich nun vor meinem altgedienten T410 und kann mich nicht entscheiden. Die Preise beider Geräte liegen sehr nahe beieinander. Bei TUXEDO bekomme ich die doppelte Menge RAM fürs Geld. Bei Lenovo bekomme ich eine gute Tastatur und meinen geliebten TrackPoint.

Bevor ich mich entscheide, werde ich das Web wohl noch nach ein paar Testberichten umgraben. Falls ihr welche kennt, freue ich mich über eure Hinweise.

Für welches Gerät würdet ihr euch denn entscheiden? Und warum?

Wenn ihr Geräte von anderen Herstellern kennt, die obige Anforderungen erfüllen und eine vergleichbare Ausstattung bieten, freue ich mich ebenfalls, wenn ihr Hinweise darauf in den Kommentaren verlinkt.

Euch allen noch ein frohes Osterfest.

1. April 2021

Unter dem Namen Proton arbeitet Mozilla an einem neuen Design für Firefox, welches Mitte Mai Premiere feiern wird. Dieser Artikel gibt ein Update zum aktuellen Stand der Entwicklung.

Proton ist das neue Firefox-Design

Unter dem internen Projektnamen Proton arbeitet Mozilla an einem neuen Design seines Desktop-Browsers, welches mit Firefox 89 das Licht der Welt erblicken soll. Über Proton wurde auf diesem Blog weltweit als erstes berichtet.

Die Veröffentlichung von Firefox 89 ist derzeit für den 18. Mai 2021 geplant.

Neue und entfernte Optionen seit dem letzten Update

Anfang März wurde auf diesem Blog das letzte Update zum kommenden Proton-Design von Firefox gegeben. In der Zwischenzeit hat sich eine ganze Menge getan. Eine ausführliche Vorstellung des Designs wird es im Mai, kurz vor der Veröffentlichung von Firefox 89 geben. Dieser Artikel legt wieder den Fokus auf die Optionen zum Testen des aktuellen Standes. Denn das neue Design wird hinter verschiedenen Optionen entwickelt, ehe es für alle Nutzer standardmäßig aktiviert werden wird.

Entfernte Optionen

Die temporär eingeführten Themes Proton Light sowie Proton Dark gibt es nicht länger. Die darin entwickelten Farbanpassungen sind nun Bestandteil des regulären hellen respektive dunklen Themes.

Die folgenden Schalter in about:config existieren nicht länger und sind mittlerweile Bestandteil des Hauptschalters (browser.proton.enabled): browser.proton.toolbar.enabled, browser.proton.tabs.enabled.

Neue Optionen

Dafür gibt es seit dem letzten Update auch wieder eine ganze Reihe neuer Schalter, nämlich: browser.aboutwelcome.design, browser.proton.infobars.enabled, browser.proton.modals.enabled, browser.tabs.secondaryTextUnsupportedLocales, widget.macos.native-context-menus sowie widget.macos.respect-system-appearance.

Was sowohl die bereits bekannten als auch die neuen Schalter bewirken, wird im folgenden Abschnitt erklärt.

Proton in Firefox Nightly aktivieren

Voraussetzung ist die Verwendung einer Nightly-Version von Firefox. Falls nicht explizit anders angegeben, handelt es sich bei den nachfolgend genannten Schaltern immer um Boolean-Schalter, welche auf den Wert true zu setzen sind.


browser.proton.enabled – Dies ist der Hauptschalter für Proton und einer der wenigen, die bereits standardmäßig vorhanden sind. Die meisten Schalter müssen vom Anwender von Hand angelegt werden. Alles, was derzeit hinter einem der weiteren Proton-Schalter entwickelt wird, wird zu einem späteren Zeitpunkt über diesen Schalter zugänglich gemacht werden. Update 08.04.2021: Dieser Schalter ist ab sofort standardmäßig aktiviert. Außerdem sind alle anderen Schalter mittlerweile standardmäßig vorhanden und müssen nicht länger manuell angelegt werden.


browser.aboutwelcome.design – Hinter diesem Schalter wird die Einführungstour für neue Nutzer implementiert, welche unter about:welcome aufrufbar ist. Zur Aktivierung muss dieser Schalter den Inhalt proton erhalten. Update 14.04.2021: Diese Änderungen sind nun hinter dem Hauptschalter implementiert.

browser.proton.contextmenus.enabled – Hinter diesem Schalter wird das neue Kontextmenü-Design für Windows 10 implementiert. Update 10.04.2021: Dieser Schalter ist ab sofort standardmäßig aktiviert.

browser.proton.doorhangers.enabled – Hinter diesem Schalter werden Änderungen an den sogenannten Doorhanger-Panels implementiert. Als Doorhanger-Panels werden in Firefox die Dialoge bezeichnet, welche eine Interaktion seitens des Nutzers erfordern, beispielsweise für die Installation von Add-ons, die Standortfreigabe für die Geolocation-API, die Berechtigungsfreigabe für Kamera und / oder Mikrofon für WebRTC-Kommunikation oder das Speichern von Passwörtern. Update 10.04.2021: Dieser Schalter ist ab sofort standardmäßig aktiviert.

browser.proton.infobars.enabled – Hinter diesem Schalter werden Änderungen an den Informationsleisten (beispielsweise bei blockierten Popups) implementiert. Update 11.04.2021: Dieser Schalter existiert nicht länger, die Änderungen sind nun hinter dem Hauptschalter implementiert.

browser.proton.modals.enabled – Hinter diesem Schalter werden Design-Änderungen an den Modal-Dialogen implementiert. Update 15.04.2021: Dieser Schalter ist ab sofort standardmäßig aktiviert.

browser.proton.places-tooltip.enabled – Hinter diesem Schalter werden die neuen Tooltips für Tabs und Lesezeichen implementiert.

browser.proton.urlbar.enabled – Hinter diesem Schalter werden Änderungen an der Adressleiste implementiert. Update 10.04.2021: Dieser Schalter existiert nicht länger, die Änderungen sind nun hinter dem Hauptschalter implementiert.

browser.tabs.secondaryTextUnsupportedLocales – Anders als bei den anderen Schaltern handelt es sich hierbei um eine Text-Option, welche auch nach Veröffentlichung von Firefox 89 weiter bestehen wird. Wird diese Liste mit dem Sprachkürzel der verwendeten Firefox-Version erweitert (z.B. ,de für einen deutschsprachigen Firefox), dann zeigt Firefox die Beschriftung von Tabs mit aktiver Medienwiedergabe nicht zweizeilig an.

widget.macos.native-context-menus – Dieser Schalter muss zusätzlich zu browser.proton.enabled auf true gesetzt werden, um die neuen nativen Kontextmenüs auf Apple macOS zu aktivieren.

widget.macos.respect-system-appearance – Dieser Schalter muss aktiviert werden, um bei Verwendung des Dark Modes von Apple macOS ein vollständiges dunkles Firefox-Theme zu erhalten.


(browser.proton.toolbar.version) – Wer in about:config sucht, wird noch diesen Schalter finden. Dabei handelt es sich um einen internen Schalter, der keine Relevanz für das Testen von Proton besitzt und ignoriert werden kann.

Standardmäßige Aktivierung von Proton in Firefox Nightly

Mozilla plant die standardmäßige Aktivierung der Haupteinstellung in Firefox Nightly für den 6. April. Dies schließt nicht die übrigen genannten Schalter ein, so dass es bis zu einer vollständigen standardmäßigen Aktivierung von Proton in Firefox Nightly noch etwas länger dauern kann. Da Firefox 89 am 19. April die Beta-Phase erreichen wird, sollte allerdings nicht viel später als an diesem Tag zumindest der Großteil von Proton standardmäßig aktiviert sein.

Feedback an Mozilla geben

Natürlich darf an dieser Stelle nicht der obligatorische Hinweis fehlen: Der aktuelle Stand repräsentiert noch nicht das fertige Design. In den nächsten Wochen wird sich noch einiges tun.

Wer Feedback an Mozilla geben möchte, hat dazu mehrere Möglichkeiten wie den Raum #Proton auf chat.mozilla.org oder ein Thema im offiziellen Nightly-Forum von Mozilla zu eröffnen. In beiden Fällen erfolgt die Kommunikation natürlich in englischer Sprache.

Der Beitrag Proton: April-Update zum kommenden Firefox-Design erschien zuerst auf soeren-hentzschel.at.

Heise berichtet mal wieder tatkräftig über die Bemühungen des deutschen Staates und seiner Gliederungen in Richtung Open Source zu wechseln. So manche Schlussfolgerung folgt dabei wohl dem Wunsch des Autors und den entsprechenden Schlagworten für die Suchmaschine.

Ich hatte heute Morgen erst die Hoffnung, einem Aprilscherz zu erliegen, aber nachdem ich den dortigen Links gefolgt bin, verfestigt sich der Eindruck, dass es keiner ist.

Heise beginnt seinen Artikel mit dem Aufhänger:

Microsoft dürfte es in Dortmund künftig deutlich schwerer fallen, in der Verwaltung zu fensterln.

heise – Raus aus dem „proprietären Zeitalter“: Dortmund setzt weitgehend auf Open Source

Mal abgesehen vom Preis für das älteste Wortspiel überhaupt: Ich kann im Protokoll gar nichts von Windows lesen und Linux kommt auch nicht vor. Das gilt ebenso für die Anhänge zur Digitalisierung.

Die Stadt Dortmund trifft im Rahmen einer umfassenden Digitalisierungsstrategie den sinnvollen Beschluss, wo immer möglich auf Open Source zu setzen. Dabei setzt man Datenschutz, Datensicherheit und digitale Souveränität als obligatorisch voraus. Das ist toll und es ist immer schön, wenn sich eine Stadt mit solchen Themen befasst und hier Pläne macht.

Wo möglich“ ist eine dehnbare Definition und sagt meiner Ansicht nach gar nichts über den künftigen Einsatz von Windows aus. Das Gleiche gilt für den Passus nach dem von der Verwaltung entwickelte oder beauftragte Software als Open Source der Allgemeinheit zur Verfügung gestellt wird. Ohne hier böse unken zu wollen, aber das dürften im Fall einer deutschen Großstadt mit klammen Kassen vermutlich ein paar kleinere Projekte nicht überschreiten.

Der Beschluss zeigt deshalb vor allem auch wie weit hier noch der Weg ist.

Folgende Passagen aus dem Protokoll werden von Heise nicht erwähnt (Hervorhebungen von mir)

6. Die Stadtverwaltung fokussiert sich in ihrer kurzfristigen Planung auf die Umsetzung der bundesrechtlichen Vorgaben zur Digitalisierung und auf sogenannte „Quick wins“, also unaufwändige Maßnahmen, die einen zügigen und unmittelbaren Effekt für die Bürger*innen haben.

7. Mit Blick auf Dortmund über die Stadtverwaltung hinaus, dient das Memorandum zur Digitalisierung 2020 bis 2025 dazu, hauptsächlich den Breitbandausbau, die Digitalisierung der Schulen und den Smart-City-Prozess zu begleiten und zu beschleunigen. Die Roadmap hat ein Projekt vorzusehen, das Smart City voranbringt. […]

Niederschrift (öffentlich) über die 3. Sitzung des Rates der Stadt am 11.02.2021

Wie man da Linux rauslesen kann, entzieht sich mir komplett.

Gerade bei Heise sollte man doch wohl wirklich wissen, dass Linux und Windows keine Synonyme für Open Source und Proprietär sind. Diese Verkürzung des Sachverhalts auf ein LiMux-ähnliches Szenario ist nah dran an einer Verfälschung der Beschlusslage.

Es ist natürlich klar, dass die FSFE das als Erfolg feiert, es handelt es sich schließlich um eine Lobby-Organisation für Open Source und der Beschluss der Stadt Dortmund geht in die richtige Richtung. Jenseits der absurden Linux/Windows-Geschichte sind da tolle Projekte und gute Ansätze gelistet.

Von einem journalistischen Medium würde ich aber erwarten, dass es ein wenig ernst zu nehmende Recherche betreibt. Es ist meiner Meinung nach peinlich, wenn ein Blog wie linuxnews einen Artikel verfasst, der den Sachverhalt deutlich besser darstellt. Und selbst dort ist man der Lobbyarbeit von DoFOSS aufgesessen. Eine „Beweislastumkehr“ gibt es bei öffentlichen Ausschreibungen nicht und die Begründungspflicht entfiel bisher auch nicht beim Einsatz von Microsoft-Produkten.

Es ist wirklich bedauerlich, dass die IT-Berichterstattung in Deutschland so unfassbar an Qualität verliert. Blogs und Twitterfeeds können das meiner Meinung nach nicht ersetzen, da Journalismus nicht umsonst ein Beruf mit einer festgelegten Ausbildung ist. Blogger und Privatpersonen in sozialen Netzwerken unterliegen auch viel weniger Pflichten bei der Recherche (eine Podcast-Empfehlung zu diesem Thema ist die Folge 89 von Rechtsbelehrung).

Daher halte ich es für wirklich wichtig, dass man sich auch zu IT-Themen über diese Portale hinaus bei seriösen Nachrichten-Seiten mit guten Redakteuren im digitalen Bereich wie beispielsweise SPIEGEL Netzwelt oder ZEIT ONLINE digital informiert. Ansonsten könnte man einer verzerrten Wahrnehmung der Realität erliegen.

„Ist das noch Journalismus oder kann das weg?“ – Zumindest aus Lesezeichen und RSS-Feeds kann man es bald entfernen.

Oder habe ich hier irgendeinen Punkt übersehen?

Dortmund pilotiert übrigens gerade Microsoft Teams und setzt sonst auf Cisco WebEx. Steht im gleichen Protokoll wie die Open Source Strategie. Noch Fragen?

Der Artikel Ist das noch Journalismus oder kann das weg? erschien zuerst auf [Mer]Curius

29. März 2021

Die MZLA Technologies Corporation hat eine Partnerschaft mit dem E-Mail-Anbieter Mailfence angekündigt. Ab sofort ist es möglich, direkt aus Thunderbird heraus eine E-Mail-Adresse bei Mailfence zu registrieren. Doch das ist erst der Anfang der Partnerschaft.

Wie MZLA angekündigt hat, ist man eine Partnerschaft mit dem auf Privatsphäre spezialisierten E-Mail-Anbieter Mailfence eingegangen. Was bedeutet das für den Nutzer? Dieser kann sich ab sofort direkt aus Thunderbird heraus eine E-Mail-Adresse bei Mailfence registrieren. Diese Möglichkeit gab es bisher ausschließlich mit gandi.net, Thunderbirds bislang einzigem kommerziellen Partner.

Mailfence in Thunderbird

Doch dabei soll es nicht bleiben. Neben diversen Anleitungen, welche geschrieben worden sind, um das Optimum aus Mailfence in Thunderbird herauszuholen, sollen Mailfence-Nutzer in naher Zukunft auch von der automatischen Synchronsiation ihrer Kontakte, Kalender und E-Mails profitieren können.

Der Beitrag MZLA kündigt Partnerschaft mit Mailfence an erschien zuerst auf soeren-hentzschel.at.

Auf unserem Server werkelt ein postfix / Dovecot Gespann.

Die Konfiguration von Postfix ist über Jahre immer verfeinert worden.

Seit ein paar Jahren hatte ich ein zusammen gezimmertes Script, welches mir eine Übersicht über diese Thematik lieferte.

Häßlich, aber funktionell.

Gestern habe ich mich hingesetzt und das Script überarbeitet. Weg von einer notdürftigen Grafik und hin zu einer dedizierten Seite, die mehr Informationen bietet.

 

Nicht mehr ganz so häßlich und informativer.

Meine Spam Blocklisten sind:

reject_rbl_client cbl.abuseat.org,
reject_rbl_client dnsbl.inps.de,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,      
reject_rbl_client dul.dnsbl.sorbs.net,      
reject_rbl_client ix.dnsbl.manitu.net,     
reject_rbl_client dnsbl.inps.de, 
reject_rbl_client rbl.iprange.net,
reject_rbl_client fresh.spameatingmonkey.net,
reject_rbl_client dnsbl-3.uceprotect.net,
 
 
Hinweis, da die Grafik zur Verwirrung führte, hier der Original Link.
 

http://rootgemeinschaft.de/geblockter-spam.html

Wenn jemand Interesse an dem Script hat, bitte melden, ich kann es auch hier im Blog zum Download bereit stellen.

Updatehttp://zockertown.de/s9y/index.php?serendipity[subpage]=downloadmanager&thiscat=7&file=62

Das Script muss etwas an die eigenen Verhältnisse angepasst werden. (Pfad zur Target Html Datei)

(Das Script ist ein Vorläufer.)

 

 

 

 

Auf den Git-Server des PHP-Projekts wurden gestern zwei verdächtige Commits (1, 2) hochgeladen. Das lässt vermuten, dass ein Teil der Infrastruktur rund um den Git-Dienst des Projekts angegriffen wurde.

Das Team ermittelt noch den genauen Hergang, hat allerdings als Konsequenz festgelegt, GitHub anstatt der eigenen Infrastruktur zu nutzen. Das umfasst auch den Einsatz der dort angesiedelten Organisation anstatt des eigenen Autorisierungssystems karma.

In diesem Zusammenhang ist es spannend und erschreckend, wie es live aussieht, wenn bösartiger Code eingeschleust wird. Der erste Commit schleust eine Remote Code Execution-Lücke ein, die über einen zusätzlichen Header HTTP_USER_AGENTT (sic) angesprochen werden kann. Auch beim zweiten Commit wird besagter Header in Verbindung mit der eval-Funktion angesprochen. Besonderes Augenmerk ist hierbei auf die Commit-Header zu legen, die die Änderungen tarnen sollen. So ist dies auch noch einmal ein Appell, Code Reviews einzusetzen – und auch bei Standard-Commit-Messages genau hinzuschauen.

Diese Lücken wurden zeitnah entfernt. Es betrifft "nur" den Entwicklungszweig, sollte allerdings keinen Weg in einen Release gefunden haben.