commit 87538045b8875325a585c243e680828e752657d0 Author: Jörg Lohrer Date: Wed Apr 15 09:49:44 2026 +0200 hugo-archive: final state der hugo-seite (eingefroren) Dieser Orphan-Branch enthält den kompletten letzten Zustand der Hugo-basierten joerg-lohrer.de als Archiv. Keine Weiterentwicklung hier. Für die neue Nostr-SPA siehe branch 'main' bzw. 'spa'. Falls nötig wiederherstellbar via: git checkout hugo-archive hugo build rsync public/ auf all-inkl Co-Authored-By: Claude Opus 4.6 (1M context) diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..a14e377 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "WebFetch(domain:hzrd149.github.io)", + "Bash(git add:*)", + "Bash(git commit -m ':*)", + "Bash(git rm:*)", + "Bash(git commit:*)", + "Bash(git checkout:*)" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a3e68d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/.DS_Store \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..415a142 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/tailwind"] + path = themes/tailwind + url = https://github.com/tomowang/hugo-theme-tailwind.git diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md new file mode 100644 index 0000000..763e25b --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# joerglohrerde + +update \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000..30aed55 Binary files /dev/null and b/assets/.DS_Store differ diff --git a/assets/icons/.DS_Store b/assets/icons/.DS_Store new file mode 100644 index 0000000..6204e50 Binary files /dev/null and b/assets/icons/.DS_Store differ diff --git a/assets/icons/brand-bluesky.svg b/assets/icons/brand-bluesky.svg new file mode 100644 index 0000000..a11b516 --- /dev/null +++ b/assets/icons/brand-bluesky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/brand-mastodon.svg b/assets/icons/brand-mastodon.svg new file mode 100644 index 0000000..cb1ef41 --- /dev/null +++ b/assets/icons/brand-mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/brand-nostr.svg b/assets/icons/brand-nostr.svg new file mode 100644 index 0000000..a0c06e0 --- /dev/null +++ b/assets/icons/brand-nostr.svg @@ -0,0 +1,7 @@ + + + diff --git a/content/archives.md b/content/archives.md new file mode 100644 index 0000000..6fe9923 --- /dev/null +++ b/content/archives.md @@ -0,0 +1,6 @@ +--- +title: "Archive" +layout: "archives" +url: "/archives/" +summary: archives +--- \ No newline at end of file diff --git a/content/impressum.md b/content/impressum.md new file mode 100644 index 0000000..d0bab72 --- /dev/null +++ b/content/impressum.md @@ -0,0 +1,23 @@ +--- +layout: page +title: "Impressum" +date: "2013-01-01" +--- + +# Impressum +Angaben gemäß § 5 TMG + +Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Jörg Lohrer Austr.23 74239 Hardthausen Telefon: 07139-50897070 E-Mail: info.empeiria@gmail.com + +## Haftungsausschluss: +### Haftung für Inhalte +Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen. + +### Haftung für Links +Mein Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen. + +### Urheberrecht +Die durch den Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen jedoch nicht der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind sowohl für den privaten, als auch für den kommerziellen Gebrauch unter Namensnennung und der Creative Commons Lizenz [CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/deed.de) gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Solltest Du trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen. + +### Datenschutz +Die Nutzung meiner Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf meiner Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Deine ausdrückliche Zustimmung nicht an Dritte weitergegeben. Ich weise darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor. \ No newline at end of file diff --git a/content/posts/2013-02-07-premium-freemium-mium-mium-mium/index.md b/content/posts/2013-02-07-premium-freemium-mium-mium-mium/index.md new file mode 100644 index 0000000..9d1639a --- /dev/null +++ b/content/posts/2013-02-07-premium-freemium-mium-mium-mium/index.md @@ -0,0 +1,28 @@ +--- +layout: post +title: "Premium, Freemium, Mium mium mium" +description: Zur Produktion von sattmachenden Bildungsinhalten +image: my-very-hungry-caterpillar.jpg +cover: + image: my-very-hungry-caterpillar.jpg +tags: [ "OER", "Freemium", "MOOC" ] +date: "2013-02-07" +author: Jörg Lohrer +slug: "premium-freemium-mium-mium-mium" +lang: de +dir: ltr +--- + + +# Premium, Freemium, Mium mium mium + +Wer leckere Bildungsangebote macht, findet immer reichlich Abnehmer. Und im digitalen Zeitalter kann ein einzelnes Produkt dank der vorhandenen Replikatormaschinen unendlich vervielfacht konsumiert werden. Das ist kein Traum mehr, sondern längst cloudgewordene Wirklichkeit. + +Nun wird versucht über ein komplexes Rechtemanagement den Produzenten ein lukratives Einkommen zu sichern. Doch während im Dienstleitungssektor der Bildung die einen noch an Vertriebswegen tüfteln, sind die Teilnehmenden in den offenen und massiven Online-Kursen (MOOCs) schon einen Schritt weiter. Hier wird allmählich begriffen, dass nicht die Her- und Bereitstellung, Aufbereitung und didaktische Darbietung von Bildung sich in barer Münze auszahlt, sondern das vernetzende Lernen selbst, also der Prozess, die eigentliche Qualität darstellt, die ihr Geld wirklich wert wäre. + +![](my-very-hungry-caterpillar.jpg =240x) +Foto: [365.79 My very hungry caterpillar - Relly Annett-Baker](https://www.flickr.com/photos/fizzkitten/4454153264/) [CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/3.0/) + +Wo früher noch für ein Produkt bezahlt wurde, wird morgen ein Vorgang monetarisiert werden müssen. Übergangslösungen sind bezahlte Dienstleitungen, Werbeeinblendungen, Freischaltcodes, digitales Rechtemanagement oder Crowdfunding. Insgesamt zeigt sich zugleich, dass Geld immer weniger einen materialisierbaren Gegenwert erhält und sich somit eventuell die Substanz der Währung allmählich aufzulösen beginnt. Doch genausowenig wie man Geld essen kann, wird man von Bildung satt. Die Frage, die sich stellt, ist also keine geringere als die nach einer Kalibrierung der Geldfunktionen. +Gegenseitige Anerkennung, Verlässlichkeit und Loyalität, Kooperation und Ideenreichtum, Unterstützung und Feedback sind im Rahmen eines offenen Online-Kurses ohnehin unbezahlbar und treten verblüffenderweise da am stärksten auf, wo kein Geldtransfer im Spiel ist. Das zeigt einmal mehr, dass man sich die besten Dinge im Leben mit Geld eben gerade nicht kaufen kann. +Doch satt bin ich noch immer nicht. diff --git a/content/posts/2013-02-07-premium-freemium-mium-mium-mium/my-very-hungry-caterpillar.jpg b/content/posts/2013-02-07-premium-freemium-mium-mium-mium/my-very-hungry-caterpillar.jpg new file mode 100644 index 0000000..eb67205 Binary files /dev/null and b/content/posts/2013-02-07-premium-freemium-mium-mium-mium/my-very-hungry-caterpillar.jpg differ diff --git a/content/posts/2013-05-29-erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive/index.md b/content/posts/2013-05-29-erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive/index.md new file mode 100644 index 0000000..9d6ebf3 --- /dev/null +++ b/content/posts/2013-05-29-erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive/index.md @@ -0,0 +1,60 @@ +--- +layout: post +title: "Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven" +description: Artikel unter CC-BY Lizenz +author: Jörg Lohrer +tags: [ "Erlebnispädagogik", "Jugendliche" ] +date: "2013-05-29" +slug: "erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive" +lang: de +dir: ltr +--- + +# Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven + +Das +[![](http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&ASIN=3847400746&Format=_SL160_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=httpwwwjoergl-21)](http://ci-muenster.de/bookshop/artikel/buecher/Bildung-im-Kindes-und-Jugendalter/A40097_Handbuch_Jugend_2013.php) +**Handbuch Jugend – Evangelische Perspektiven**, welches 2013 erschienen ist, hat auf Seite 343-345 folgenden Artikel von mir zur Erlebnispädagogik abgedruckt. +[CC BY](http://creativecommons.org/licenses/by/2.0/de/) Jörg Lohrer + +## Erlebnispädagogik +### Ziele und Arbeitsformen +Erlebnispädagogik arbeitet mit einem pädagogischen Konzept zielorientiert und bevorzugt in der Natur oder dem naturnahen Raum vorrangig an der Förderung von Selbst- und Sozialkompetenzen. Dabei grenzt sich Erlebnispädagogik bewusst von ‚Nervenkitzel-Aktionismus‘ und der eskalierenden Suche nach dem Kick nach immer mehr und phantastischeren Erlebnissen ab. Die Förderung von Zutrauen in die eigenen Fähigkeiten, der Umgang mit Ängsten, das Erfahren und Überwinden von Grenzen, die Vemittlung von sozialen Kompetenzen können Zielsetzungen für erlebnispädagogische Maßnahmen in der evangelischen Jugendbildung sein. Dabei geht es auch immer um eine Erweiterung der eigenen Handlungskompetenzen zur Lebensbewältigung durch ein angstfreies Lernen in der Gruppe. + +Erlebnispädagogik arbeitet mit Wahrnehmungs- und Vertrauensübungen, Kooperations- und Problemlösungsaufgaben, abenteuerlichen Aktionen, persönlichen Herausforderungen und Grenzerfahrungen. Angebote und Maßnahmen mit erlebnispädagogischem Charakter sind zum Beispiel Kanu- und Fahrrad-Touren, Kletteraktionen, kooperative Abenteuerspiele, Natursensibilisierung, Trekkingtouren, Nieder- und Hochseilparcours oder Geocaching. + +Erlebnispädagogische Maßnahmen finden u.a. Anwendung im Bereich der Kooperation von Jugendverbandsarbeit und Schule, bei Klassenfahrten, der Präventionsarbeit, bei gruppendynamischen Prozessen, Mitarbeiterschulungen, der Entwicklung von Teamarbeit und in etlichen weiteren Praxisfeldern evangelischer Jugendbildung. + +Mit den Arbeitsprinzipien Respekt, Selbstbestimmung, Vertrauen, Kooperation, Verantwortung und Ganzheitlichkeit korrespondiert die Erlebnispädagogik mit dem Profil der evangelischen Jugendarbeit. Ebenso liegen Chancen in einer Verknüpfung von erlebnispädagogischen Aktionen mit einer erfahrungsbezogenen Verkündigung. Erlebnispädagogische Maßnahmen werden als Jugendbildungsveranstaltungen gefördert, wenn sozial-ökologische Inhalte und/oder politisch-kulturelle Schwerpunktthemen mit gesellschaftlichem Bezug im Mittelpunkt der Maßnahme stehen. + +### Entstehung, Prinzipien, Methoden +Der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) nennt weit in die Vergangenheit zurück reichende Wurzeln der Erlebnispädagogik. Als wichtige Autoren, auf die das Konzept vom handlungsorientierten Lernen zurückgeführt wird, werden Platon (427–347 v.Chr.), Rousseau (1712–1778), Pestalozzi (1746–1827) und schließ- lich Kurt Hahn (1886–1974) als ‚Urvater‘ der Erlebnispädagogik genannt. Ihre heutige Vielfalt und weite Verbreitung hat die Erlebnispädagogik allerdings erst im 20. Jahrhundert und schließlich in den letzten Jahrzehnten entwickelt. Erlebnispädagogik wird nicht nur im Bereich der Erziehung von Kindern und Jugendlichen angewandt, sondern findet inzwischen auch vielfältige Beachtung in der Arbeit mit nahezu allen Altersgruppen zu unterschiedlichen Problem- und Zielstellungen in der präventiven Kurzzeitpädagogik, der intensiven sozialpädagogischen Einzelbetreuung, im Rahmen der beruflichen Fort und Weiterbildung oder in Führungskräftetrainings (vgl. [www.bundesverband- erlebnispaedagogik.de](https://www.bundesverband-erlebnispaedagogik.de/)). + +Als Grundprinzipien können unter anderem benannt werden: Handlungsorientierung, Ganzheitlichkeit, Eigenverantwortung, Freiwilligkeit, Sicherheit und Nachhaltig- keit. Dabei sind die pädagogischen, kompetenz- und ressourcenorientierten Angebote der Erlebnispädagogik stets eingebettet in die aktuelle Rechtsgrundlage und (Bildungs-) Politik. + +Methodische Aspekte sind z.B.: der hohe Stellenwert des Erlebnisses und das Arbeiten mit erlebnispädagogischen Lernszenarien, nicht-alltäglichen Herausforderungen und Wagnissen, Einsatz verschiedener Medien und der Natur als bevorzugtem Lern- und Erfahrungsraum. +Neben einer zunehmende Gruppenselbststeuerung baut die Erlebnispädagogik auf Lern- und Wirkungsmodelle wie das Komfortzonenmodell, das metaphorische Modell, Aktions- und Reflexionswelle oder das FlowModell. +Erlebnispädagogik hat als Lernszenariotechnik zwar eine eigene Strukturlogik, dient jedoch ebenso als Methode im nicht genuin erlebnispädagogischen Kontext und entwickelt somit Reichweite, Relevanz und pädagogische Innovationskraft in Konfirmandenarbeit, Religionsunterricht und Gemeindepädagogik. + +### Aktuelle Fragestellungen und Entwicklungsperspektiven: Qualität und Wirkung +Als partizipatorisches Angebot setzt die Erlebnispädagogik auf das Prinzip der Freiwilligkeit und der selbstbestimmten Teilnahme. Unter dem Motto ‚challenge by choice‘ hat eine subjektorientierte Erlebnispädagogik stets zu gewährleisten, dass die Teilnehmenden den Grad ihrer Beteiligung und Verantwortungsübernahme selbst bestimmen können. Reiserechtliche Bestimmungen, Versicherung und Haftung sind daher aktuell handlungsleitendend bei der Erstellung von erlebnispädagogischen Angeboten und Konzeptionen. Hier gab es in den letzten Jahren zahlreiche Entwicklungen, die eine Qualitätssicherung der Mitarbeitendenbildung in Pädagogik und Sicherheitstechnik hinsichtlich geltender Kriterien voraussetzen und notwendig machen. Entsprechende Zusatzqualifikationen sollten daher immer mindestens durch die jeweiligen Fachsportverbände zertifizierbar sein. Mit dem [Gütesiegel „Qualität erlebnispädagogischer Programme und Angebote – Mit Sicherheit pädagogisch!“ (beQ)](https://www.bundesverband-erlebnispaedagogik.de/qualitaet/beq-qualitaetssiegel.html) hat der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) ein Zertifizierungsverfahren entwickelt, das ein bundeseinheitliches Qualitätsmanagement fördern will. + +Die Wirkungsforschung erlebnispädagogischer Lernarrangements untersucht deren Substanz, Akzeptanz und Nachhaltigkeit hinsichtlich ihrer Qualität von Konzept, Struktur, Prozess und Ergebnis. Studien konnten bislang Indizien für Impulse zur Kompetenzentwicklung nachweisen, die wissenschaftliche Evaluation gestaltet sich jedoch genauso komplex wie das Spektrum der erlebnispädagogischen Handlungsfelder und so fehlt es bislang an validen Studien, die das Wirkungspotenzial eindeutig beschreiben können. + +Im Kontext evangelischer Jugendbildung stellt sich bei der Verwendung erlebnispädagogischer Methoden immer auch die Frage nach einer Verknüpfung von christlichen Inhalten mit der handlungsorientierten Pädagogik. Die Assoziation von Natur und Schöpfung ist beispielsweise ebenso naheliegend wie die Reflexion von religiösen Erfahrungen in erlebnispädagogischen Lernsettings. Inwiefern sich dabei Unverfügbares inszenieren lässt, bleibt dabei ebenso eine Herausforderung, wie bei der oben beschriebenen Wirkungsforschung. In den vergangenen Jahren haben sich einige Konzepte zur Erprobung erlebnispädagogischer Methoden im christlichen Kontext entwickelt, die zunehmend auch theologisch und religionsdidaktisch reflektiert werden. Eine überregionale Organisation dieser Einzelinitiativen auf Bundesebene wäre der nächste Schritt hin zu einem evangelischen Profil erlebnispädagogischer Jugendbildungsarbeit. + +### Literatur +![](http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&ASIN=3866870493&Format=_SL160_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=httpwwwjoergl-21) +Großer, Achim/Oberländer, Rainer/Lohrer, Jörg/Wiedmayer, Jörg (2005/2011): Sinn gesucht – Gott erfahren. Erlebnispädagogik im christlichen Kontext (Band 1 (2005)/Band 2 (2011)). Stuttgart: Buch und Musik. +![](http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&ASIN=3497022934&Format=_SL160_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=httpwwwjoergl-21) +Heckmair, Bernd/Michl, Werner (2008): Erleben und Lernen. Einführung in die Erlebnispädagogik. München: Reinhardt. +![](http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&ASIN=3940562866&Format=_SL160_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=httpwwwjoergl-21) +Reiners, Annette (2007): Praktische Erlebnispädagogik. Augsburg: ZIEL. +![](http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&ASIN=3936369348&Format=_SL160_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=httpwwwjoergl-21) +Pum, Viktoria/Pirner, Manfred L./Lohrer, Jörg (Hrsg.) (2011): Erlebnispädagogik im christlichen Kontext. Dokumentation einer Tagung der Evangelischen Akademie Bad Boll, 2. bis 4. März 2009. Bad Boll: Evangelische Akademie. + +#### Links +- Bundesverband Individual- und Erlebnispädagogik e.V. (BE): [https://www.bundesverband-erlebnispaedagogik.de/](https://www.bundesverband-erlebnispaedagogik.de/) +- Fachportal für Erlebnispädagogik im christlichen Kontext des Evangelischen Jugendwerks in Württemberg: [https://www.ejwue.de/arbeitsbereiche/erlebnispaedagogik/](https://www.ejwue.de/arbeitsbereiche/erlebnispaedagogik/) +- Informationsdienst Erlebnispädagogik mit Literaturliste: [http://erlebnispaedagogik.de/](http://erlebnispaedagogik.de/) +- Bundesweite Klassenfahrten, Aus- und Weiterbildungsangebote der Gesellschaft zur Förderung der Erlebnispädagogik (GFE): [https://www.erlebnistage.de/](https://www.erlebnistage.de/) \ No newline at end of file diff --git a/content/posts/2017-10-23-telegram-octopi/index.md b/content/posts/2017-10-23-telegram-octopi/index.md new file mode 100644 index 0000000..4536549 --- /dev/null +++ b/content/posts/2017-10-23-telegram-octopi/index.md @@ -0,0 +1,32 @@ +--- +layout: post +title: "Telegram Bot für Octopi" +description: "Schnittstelle zwischen Telegram und OctoPrint" +image: octopi1.png +cover: + image: octopi1.png +tags: [ "Telegram", "Octopi", "Raspberry", "3DDruck" ] +date: "2017-10-23" +author: Jörg Lohrer +slug: "telegram-octopi" +lang: de +dir: ltr +--- + + + +Das [OctoPrint-Telegram-Plugin](http://plugins.octoprint.org/plugins/telegram/) schafft eine Schnittstelle zwischen Telegram und OctoPrint. +Hier die Anleitung auf Englisch: [https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md](https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md) + +Das dauert eine Weile: +![](octopi1.png) + + +Token eingeben: +![](octopi2.png) + +Heisst aber nicht, dass jetzt alles gleich klappt: +![](octopi3.png) + +Es müssen dem Benutzer noch die Rechte “Command” und “Notify” gegeben werden: +![](octopi4.png) \ No newline at end of file diff --git a/content/posts/2017-10-23-telegram-octopi/octopi1.png b/content/posts/2017-10-23-telegram-octopi/octopi1.png new file mode 100644 index 0000000..d57bed0 Binary files /dev/null and b/content/posts/2017-10-23-telegram-octopi/octopi1.png differ diff --git a/content/posts/2017-10-23-telegram-octopi/octopi2.png b/content/posts/2017-10-23-telegram-octopi/octopi2.png new file mode 100644 index 0000000..2a94249 Binary files /dev/null and b/content/posts/2017-10-23-telegram-octopi/octopi2.png differ diff --git a/content/posts/2017-10-23-telegram-octopi/octopi3.png b/content/posts/2017-10-23-telegram-octopi/octopi3.png new file mode 100644 index 0000000..d871f75 Binary files /dev/null and b/content/posts/2017-10-23-telegram-octopi/octopi3.png differ diff --git a/content/posts/2017-10-23-telegram-octopi/octopi4.png b/content/posts/2017-10-23-telegram-octopi/octopi4.png new file mode 100644 index 0000000..2c090b1 Binary files /dev/null and b/content/posts/2017-10-23-telegram-octopi/octopi4.png differ diff --git a/content/posts/2017-10-31-lutherkuerbis/index.md b/content/posts/2017-10-31-lutherkuerbis/index.md new file mode 100644 index 0000000..6d469f7 --- /dev/null +++ b/content/posts/2017-10-31-lutherkuerbis/index.md @@ -0,0 +1,46 @@ +--- +layout: post +title: "Lutherkürbis - Reformation an Halloween" +description: "Schablone und Bastelanleitung für einen Kürbis zur Reformation" +image: kuerbis-titelbild.jpg +cover: + image: kuerbis-titelbild.jpg +tags: [ "Lutherrose", "Reformation", "Halloween", "Luther" ] +date: "2017-10-31" +author: Jörg Lohrer +slug: "lutherkuerbis" +lang: de +dir: ltr +--- + + +# Lutherkürbis - Reformation an Halloween + +Das Symbol der Lutherrose ist auch heute noch in vielen Wappen enthalten und wird als Dekoelement genutzt ([Quelle: epd/imago](https://www.t-online.de/leben/familie/id_65982142/lutherrose-entstehung-und-bedeutung.html)) + +Aus einer [Fotovorlage der Lutherrose](https://duckduckgo.com/?q=lutherrose&t=h_&iax=images&ia=images) wird mit einem [Online-Konverter eine Schablone als verlustfrei skalierbare Vektorgrafik](https://image.online-convert.com/convert-to-svg) erzeugt: + +[![](lutherrose.png)](https://material.rpi-virtuell.de/wp-content/uploads/2018/10/Lutherrose.pdf) +[Lutherrose PDF-Vorlage](https://material.rpi-virtuell.de/wp-content/uploads/2018/10/Lutherrose.pdf) + +## Bastel-Anleitung +Einen Kürbis aufschneiden: +![](kuerbis-aufschneiden.jpg) + +entkernen und aushöhlen: +![](kuerbis-entkernen.jpg) + +Schablone aufbringen: +![](schablone-aufbringen.jpg) + +Ausschneiden: +![](kuerbis-ausschneiden.jpg) + +Mit Kerze oder elektrischem Licht ausstatten: +![](kuerbis-titelbild.jpg) + +Fertig! + +Diese Idee inklusive der Schablone steht unter [CC0-Lizenz](https://creativecommons.org/publicdomain/zero/1.0/deed.de). Du darfst das Werk kopieren, verändern, verbreiten und aufführen, sogar zu kommerziellen Zwecken, ohne um weitere Erlaubnis bitten zu müssen. +#### Weitere Quellen + * How to Make a Paper Cut-Out Luther Rose [YouTube](https://www.youtube.com/watch?v=b5FCaNZPU98) | [PDF](http://www.kellyklages.com/lutherrose.pdf) \ No newline at end of file diff --git a/content/posts/2017-10-31-lutherkuerbis/kuerbis-aufschneiden.jpg b/content/posts/2017-10-31-lutherkuerbis/kuerbis-aufschneiden.jpg new file mode 100644 index 0000000..b03134e Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/kuerbis-aufschneiden.jpg differ diff --git a/content/posts/2017-10-31-lutherkuerbis/kuerbis-ausschneiden.jpg b/content/posts/2017-10-31-lutherkuerbis/kuerbis-ausschneiden.jpg new file mode 100644 index 0000000..e418172 Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/kuerbis-ausschneiden.jpg differ diff --git a/content/posts/2017-10-31-lutherkuerbis/kuerbis-entkernen.jpg b/content/posts/2017-10-31-lutherkuerbis/kuerbis-entkernen.jpg new file mode 100644 index 0000000..ec743e0 Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/kuerbis-entkernen.jpg differ diff --git a/content/posts/2017-10-31-lutherkuerbis/kuerbis-titelbild.jpg b/content/posts/2017-10-31-lutherkuerbis/kuerbis-titelbild.jpg new file mode 100644 index 0000000..818714a Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/kuerbis-titelbild.jpg differ diff --git a/content/posts/2017-10-31-lutherkuerbis/lutherrose.png b/content/posts/2017-10-31-lutherkuerbis/lutherrose.png new file mode 100644 index 0000000..e4050fe Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/lutherrose.png differ diff --git a/content/posts/2017-10-31-lutherkuerbis/schablone-aufbringen.jpg b/content/posts/2017-10-31-lutherkuerbis/schablone-aufbringen.jpg new file mode 100644 index 0000000..95e533d Binary files /dev/null and b/content/posts/2017-10-31-lutherkuerbis/schablone-aufbringen.jpg differ diff --git a/content/posts/2019-03-26-Pflanzenschild-QR-Code/cura-plugin-change-filment-at-z.png b/content/posts/2019-03-26-Pflanzenschild-QR-Code/cura-plugin-change-filment-at-z.png new file mode 100644 index 0000000..a2a5b6d Binary files /dev/null and b/content/posts/2019-03-26-Pflanzenschild-QR-Code/cura-plugin-change-filment-at-z.png differ diff --git a/content/posts/2019-03-26-Pflanzenschild-QR-Code/index.md b/content/posts/2019-03-26-Pflanzenschild-QR-Code/index.md new file mode 100644 index 0000000..9185e87 --- /dev/null +++ b/content/posts/2019-03-26-Pflanzenschild-QR-Code/index.md @@ -0,0 +1,29 @@ +--- +layout: post +title: "Pflanzenschild mit QR-Code" +description: "Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen" +image: cura-plugin-change-filment-at-z.png +cover: + image: cura-plugin-change-filment-at-z.png +tags: [ "QR-Code", "3DDruck" ] +date: "2019-03-26" +slug: "Pflanzenschild-QR-Code" +author: Jörg Lohrer +lang: de +dir: ltr +--- + + +# Pflanzenschild mit QR-Code +Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen: +[](https://keremerkan.net/qr-code-and-2d-code-generator/) + +Dann noch mit Thingiverse ein Dreieck designen (80x40x1.4mm) und den QR-Code obendrauf: +[](https://www.tinkercad.com/embed/dcnCyqLFX1P?editbtn=1) + +Mit dem Cura-Plugin [Change Filament at Z](https://www.thingiverse.com/thing:2077884/#files) den 3D-Druck im Layer unterbrechen, wo ein Filament(Farb)-Wechsel stattfinden soll: +![](cura-plugin-change-filment-at-z.png) + +Et voilà: +[](https://twitter.com/joerglohrer/status/1110580168035176449) +![](qr-code-pflanzenschild.jpg) diff --git a/content/posts/2019-03-26-Pflanzenschild-QR-Code/qr-code-pflanzenschild.jpg b/content/posts/2019-03-26-Pflanzenschild-QR-Code/qr-code-pflanzenschild.jpg new file mode 100644 index 0000000..93541d9 Binary files /dev/null and b/content/posts/2019-03-26-Pflanzenschild-QR-Code/qr-code-pflanzenschild.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/01-immersion-wikipedia.jpg b/content/posts/2021-08-15-virtual-reality/01-immersion-wikipedia.jpg new file mode 100644 index 0000000..05f722a Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/01-immersion-wikipedia.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/02-mittelalterliche-kirche.jpg b/content/posts/2021-08-15-virtual-reality/02-mittelalterliche-kirche.jpg new file mode 100644 index 0000000..2bbe4a0 Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/02-mittelalterliche-kirche.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/03-avatare-erstellen.jpg b/content/posts/2021-08-15-virtual-reality/03-avatare-erstellen.jpg new file mode 100644 index 0000000..768810f Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/03-avatare-erstellen.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/04-aframe.jpg b/content/posts/2021-08-15-virtual-reality/04-aframe.jpg new file mode 100644 index 0000000..cf1d9cc Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/04-aframe.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/05-pupillendistanz.jpg b/content/posts/2021-08-15-virtual-reality/05-pupillendistanz.jpg new file mode 100644 index 0000000..a21301b Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/05-pupillendistanz.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/06-vr-adapter-3ddruck.jpg b/content/posts/2021-08-15-virtual-reality/06-vr-adapter-3ddruck.jpg new file mode 100644 index 0000000..9d30ac1 Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/06-vr-adapter-3ddruck.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/07-vive-straps-3ddruck.jpg b/content/posts/2021-08-15-virtual-reality/07-vive-straps-3ddruck.jpg new file mode 100644 index 0000000..9156c45 Binary files /dev/null and b/content/posts/2021-08-15-virtual-reality/07-vive-straps-3ddruck.jpg differ diff --git a/content/posts/2021-08-15-virtual-reality/index.md b/content/posts/2021-08-15-virtual-reality/index.md new file mode 100644 index 0000000..5ca51cc --- /dev/null +++ b/content/posts/2021-08-15-virtual-reality/index.md @@ -0,0 +1,327 @@ +--- +layout: post +title: "VR - Virtual Reality" +description: "Tutorials der Oculus Quest 2" +image: 04-aframe.jpg +cover: + image: 04-aframe.jpg +tags: [ "Immersion", "Präsenz", "Virtuelle Realität", "Sidequest", "Oculus", "Meta" ] +date: "2021-08-15" +author: Jörg Lohrer +slug: "virtual-reality" +lang: de +dir: ltr +toc: true +toc_label: "Inhaltsverzeichnis" +toc_icon: "vr-cardboard" +toc_sticky: "true" +--- + + +# VR - Virtual Reality + +# Ausschreibung Torsten & Jörg + +Ausgehend vom Lernbaustein [https://relilab.org/vr/](https://relilab.org/vr/) beschäftigen wir uns in diesem Workshop mit Immersion und praktischen Beispielen im Themenbereich VR/AR. Neben der Vermittlung von theoretischen Grundlagen besprechen wir die Einsatzmöglichkeit im Religionsunterricht am Beispiel einer Reihe zu Schöpfungsmythen. Darüber hinnaus bieten wir die Gelegenheit zu Erfahrungsaustausch, Diskussion und exemplarischen Erlebnismöglichkeiten in der virtuellen Realität. + + +# Theorie +## Immersion & Präsenz +[https://www.immersivelearning.institute/](https://www.immersivelearning.institute/) +[https://omnia360.de/blog/was-ist-immersion/](https://omnia360.de/blog/was-ist-immersion/) +[https://en.wikipedia.org/wiki/Immersive_learning](https://en.wikipedia.org/wiki/Immersive_learning) +![](01-immersion-wikipedia.jpg) +[https://www.sciencedirect.com/science/article/pii/S0360131519303276](https://www.sciencedirect.com/science/article/pii/S0360131519303276) +## Forschung +A Public Database of 360 Videos with Corresponding Ratings of Arousal and Valence +[https://vhil.stanford.edu/360-video-database/](https://vhil.stanford.edu/360-video-database/) + +[https://www.researchgate.net/publication/335733502_Getting_your_game_on_Using_virtual_reality_to_improve_real_table_tennis_skills](https://www.researchgate.net/publication/335733502_Getting_your_game_on_Using_virtual_reality_to_improve_real_table_tennis_skills) +> "Diese Studie ergänzt die spärliche, aber wachsende Literatur, indem sie den Transfer von Fertigkeiten aus der realen Welt durch Virtual Reality in einer sportlichen Aufgabe demonstriert." + +[https://mixed.de/vr-und-philosophie-youtuber-zeigt-ungewoehnliche-vr-apps/amp/](https://mixed.de/vr-und-philosophie-youtuber-zeigt-ungewoehnliche-vr-apps/amp/) +Der norwegische Forscher Joakim Vindenes unterhält einen Blog, Podcast und Youtube-Kanal, in denen er außergewöhnliche VR-Apps vorstellt und sich mit der philosophischen Dimension des Mediums auseinandersetzt. + +[https://www.youtube.com/watch?v=VY5HaEhUm2Q](https://www.youtube.com/watch?v=VY5HaEhUm2Q) +A look at what it would be like to plug into an infinite VR experience machine. + +## Religionen +[https://www.matrise.no/2019/06/hinduism-and-virtual-reality/](https://www.matrise.no/2019/06/hinduism-and-virtual-reality/) + +[https://www.matrise.no/2020/01/the-existential-problem-of-vr-existentialism/](https://www.matrise.no/2020/01/the-existential-problem-of-vr-existentialism/) + +## Empathie +[https://www.youtube.com/watch?v=L6m79wqNiMA&feature=youtu.be&t=150](https://www.youtube.com/watch?v=L6m79wqNiMA&feature=youtu.be&t=150) +> "VR is a storytelling vehicle, but it's an empathy vehicle." + +## Therapie +Feeling Good during the COVID19 Epidemic +Virtual Reality Can Help Us to Overcome the Psychological Burden of Coronavirus - [https://www.covidfeelgood.com/home](https://www.covidfeelgood.com/home) + +Die Verkörperung von Mitgefühl in der virtuellen Realität und ihre Auswirkungen auf Patienten mit Depressionen +[https://scitec-media.ch/2016/03/04/game-technologien-helfen-gegen-depressionen/](https://scitec-media.ch/2016/03/04/game-technologien-helfen-gegen-depressionen/) +[https://www.youtube.com/watch?v=GwxJVCESc-E](https://www.youtube.com/watch?v=GwxJVCESc-E) +[https://www.cambridge.org/core/journals/bjpsych-open/article/embodying-selfcompassion-within-virtual-reality-and-its-effects-on-patients-with-depression/](https://www.cambridge.org/core/journals/bjpsych-open/article/embodying-selfcompassion-within-virtual-reality-and-its-effects-on-patients-with-depression/1A1217651159D085145A7999CFFFF772) + + +## Theater +[https://www.brendanabradley.com/futurestages](https://www.brendanabradley.com/futurestages) + + +## Körperlichkeit +[https://www.matrise.no/2018/07/virtual-embodiment/](https://www.matrise.no/2018/07/virtual-embodiment/) +[https://www.matrise.no/2020/10/virtual-reality-depersonalization-derealization/](https://www.matrise.no/2020/10/virtual-reality-depersonalization-derealization/) + + +# Praxis +## Padlets +- [https://padlet.com/petiteprof79/xrinfo(https://padlet.com/petiteprof79/xrinfo)] XR-Info - Stephanie Wössner | CC BY-SA @petiteprof79 +- [https://padlet.com/strsa/ar](https://padlet.com/strsa/ar) Augmented Reality (AR) & 360°, (VR) | Gestartet von Tobias Erles (@Mr_Airless) und Sabine Strauss (@Sallythechin) beim Barcamp #wildcampen18, erweitert bei #wildcampen19 zusammen mit Jan Hartwig (@hartifical) +## Artikel +- [Virtual und Augmented Reality im Klassenraum? Ein Überblick bildungsrelevanter Angebote - Steffen Jauch am 16.10.2029 bei bpb](https://www.bpb.de/lernen/digitale-bildung/werkstatt/298516/virtual-und-augmented-reality-im-klassenraum-ein-ueberblick-bildungsrelevanter-angebote) + +## Unterricht +- Eine [Auswahl an Unterrichtsbeispielen mit Virtual Reality Szenarien](https://www.lmz-bw.de/medien-und-bildung/medienwissen/virtual-und-augmented-reality/virtual-reality-unterrichtsbeispiele/) von Stephanie Wössner [@petiteprof79](https://twitter.com/petiteprof79) + +## Communities +[https://educatorsinvr.com/](https://educatorsinvr.com/) + + + +# Religiöse Erfahrungsräume +## im Oculus Store +### Wander +[https://www.oculus.com/experiences/quest/2078376005587859/](https://www.oculus.com/experiences/quest/2078376005587859/) + +## Filme +[https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/(https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/)] + +## In Sidequest + +### Vanishing Grace +[https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo(https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo)] +> Vanishing Grace ist eine emotionale Reise über die Opfer, die wir bringen müssen, um unseren Platz in der Welt einzunehmen. +### Cubism +[https://sidequestvr.com/app/403/cubism-demo(https://sidequestvr.com/app/403/cubism-demo)] + +### Deism +> The virtual reality god simulator +[https://sidequestvr.com/app/85/deisim(https://sidequestvr.com/app/85/deisim)] + +### Liminal +[https://sidequestvr.com/app/1042/liminal](https://sidequestvr.com/app/1042/liminal) +Wählen Sie aus, wie Sie sich fühlen und was Sie leisten wollen: Ruhe, Energie, Schmerzlinderung und Ehrfurcht. + + +# 3D-Modelle +[https://sketchfab.com/3d-models/abandoned-warehouse-interior-scene-1d5285f2e0fd4211a27c8042496d5959#](https://sketchfab.com/3d-models/abandoned-warehouse-interior-scene-1d5285f2e0fd4211a27c8042496d5959#) + +![](02-mittelalterliche-kirche.jpg) +[CC BY-NC](https://creativecommons.org/licenses/by-nc/4.0/) Medieval Church, Calatrava la Nueva, Spain +Processed in Reality Capture from 76 Faro laser scans and 4100 photographs +[https://sketchfab.com/3d-models/medieval-church-calatrava-la-nueva-spain-171a047c08bc4dd588cca5ac744e8065](https://sketchfab.com/3d-models/medieval-church-calatrava-la-nueva-spain-171a047c08bc4dd588cca5ac744e8065) + +## Avatare + +## Erfahrungswelten: + +### 360 Grad Filme + - [Kölner Dom in 360°: Privatkonzert | WDR](https://www.youtube.com/watch?v=dMZfIUr0gEs) +Der Domchor gibt ein nächtliches Konzert – und der einzige Zuschauer bist du. Unter Leitung des Domkapellmeisters Professor Eberhard Metternich singt der Chor das Ave Maria von Franz Biebl in einer eher ungewöhnlichen Aufstellung. Und du stehst mittendrin. [https://dom360.wdr.de/privatkonzert-bei-nacht/](https://dom360.wdr.de/privatkonzert-bei-nacht/)] + - [INSIDE AUSCHWITZ - Das ehemalige Konzentrationslager in 360° | WDR +](https://www.youtube.com/watch?v=QwC5d75iTcA) + +### Anne Frank VR +[https://www.annefrank.org/](https://www.annefrank.org/de/uber-uns/was-wir-tun/unsere-publikationen/das-anne-frank-haus-virtual-reality/) + +### Within +[https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr(https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr)] +[https://account.altvr.com/channels/VRChurch(https://account.altvr.com/channels/VRChurch)] + + +# Programmierung +* [Learn VR Development: Tips, tricks, and guides to develop VR and AR applications](https://circuitstream.com/blog/programming-development-guides/) +* [Reddit - Learn Virtual Reality Development](https://www.reddit.com/r/learnVRdev/) + +## Mozilla Hubs +### Dokumentation [https://hubs.mozilla.com/docs/welcome.html(https://hubs.mozilla.com/docs/welcome.html)] + +### Vorlagen + +[https://v3l.de/relilabvr](https://v3l.de/relilabvr) (relilab-VR-Hub mit Videos, Bildern, ...) + +[https://hubs.mozilla.com/Av38AUU/detailed-tinted-room(https://hubs.mozilla.com/Av38AUU/detailed-tinted-room)] +[https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome(https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome)] + + +### Avatare erstellen + +### Mozilla Hubs - GLB +#### Online Dienst - Readyplayer +[https://twitter.com/joerglohrer/status/1388023150626099201](https://twitter.com/joerglohrer/status/1388023150626099201) +![](03-avatare-erstellen.jpg) + +[https://readyplayer.me/(https://readyplayer.me/)] + +Beispiel: ([CC BY-NC-SA - Wolfprint 3D](https://creativecommons.org/licenses/by-nc-sa/4.0/)) +[https://d1a370nemizbjq.cloudfront.net/10b05c49-593a-4616-82e9-adcea09aa66c.glb](https://d1a370nemizbjq.cloudfront.net/10b05c49-593a-4616-82e9-adcea09aa66c.glb) + +Hubs by Mozilla +* [Creating Custom Avatars](https://hubs.mozilla.com/docs/intro-avatars.html) +* [Advanced Avatar Customization](https://hubs.mozilla.com/docs/creators-advanced-avatar-customization.html) + +[http://tryquilt.io/](http://tryquilt.io/)] + + +[Blender files for AvatarBot](https://github.com/MozillaReality/hubs-avatar-pipelines/tree/master/Blender/AvatarBot) +[Creating an Avatar using Hubs components in Blender](https://youtube.com/playlist?list=PLCxaiaRxTL6-3pxUsfSa7lzKruGu5UEat) + +#### Online Editoren +[https://modelviewer.dev/editor/(https://modelviewer.dev/editor/)] + +#### Software +##### MakeHuman +[http://makehumancommunity.org/](http://makehumancommunity.org/) + +[https://www.youtube.com/watch?v=kQjp5DYsR_c&t=86s](https://www.youtube.com/watch?v=kQjp5DYsR_c&t=86s) + + + + +### Tutorials Altspace / Blender / Unity +[http://edvschwab.de/Altspace/Kurz%20Doku%20Blender.pdf](http://edvschwab.de/Altspace/Kurz%20Doku%20Blender.pdf) +[http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf(http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf)] + + + +## Sidequest +[https://sidequestvr.com/](https://sidequestvr.com/) +Installation: +[https://sidequestvr.com/setup-howto](https://sidequestvr.com/setup-howto) + + +[How to put custom songs onto Beat Saber on Oculus Quest](https://www.google.com/amp/s/www.androidcentral.com/how-put-custom-songs-beat-saber-oculus-quest%3famp) + + +## Aframe +![](04-aframe.jpg) +[https://codepen.io/joerglohrer/full/dyXQqWG](https://codepen.io/joerglohrer/full/dyXQqWG) +[https://aframe.io/](https://aframe.io/) +[https://www.codecademy.com/learn/learn-a-frame](https://www.codecademy.com/learn/learn-a-frame) +VR development within VR with Oculus Quest + Firefox Reality + Glitch + +[https://rocketvirtual.com/index.html](https://rocketvirtual.com/index.html) +[Where to begin with VR in a browser?](https://michael-mcanally.medium.com/where-to-begin-with-vr-in-a-browser-d818f713a8a8) +[https://www.reddit.com/r/WebVR/comments/equgdt/vr_development_within_vr_with_oculus_quest/](https://www.reddit.com/r/WebVR/comments/equgdt/vr_development_within_vr_with_oculus_quest/) + +[https://aframe-model-viewer.glitch.me/](https://aframe-model-viewer.glitch.me/) + + +[https://klausw.github.io/a-frame-car-sample/index.html](https://klausw.github.io/a-frame-car-sample/index.html) + + +## ThreeJS +[https://threejs.org/](https://threejs.org/) +[https://www.jesuisundev.com/en/understand-threejs/](https://www.jesuisundev.com/en/understand-threejs/) + +## ~~Tour Creator Google~~ +"Starting June 30, 2021, the Google Expeditions and Tour Creator [will no longer be accessible](https://support.google.com/tourcreator/?hl=en)." + + +## Unity +[https://unity.com/de/learn/get-started](https://unity.com/de/learn/get-started) + +# Optik +## Pupillendistanz (PD) messen - IPD (interpupillary distance) +[https://apps.apple.com/de/app/eyemeasure/id1417435049](https://apps.apple.com/de/app/eyemeasure/id1417435049) +Die kostenfreie App misst den Augenabstand auf 0,5 mm genau ab iPhoneX oder iPadPro +![](05-pupillendistanz.jpg) +Oder einfach mit Lineal: +[https://imgur.com/a/gyYKB](https://imgur.com/a/gyYKB) + + + +# Oculus Quest +## Tutorials +### Deutsch +[https://twitter.com/StubeDie](https://twitter.com/StubeDie) +### Englisch +#### Foren +[https://www.reddit.com/r/OculusQuest/](https://www.reddit.com/r/OculusQuest/) +[https://www.reddit.com/r/OculusQuest2/](https://www.reddit.com/r/OculusQuest2/) + + +## Streaming / Playthrough / Livecasting / OBS +[Oculus Quest Recording / Live Streaming Guide](https://bsaber.com/queststreamingguide/) +[How to stream on Twitch: the ultimate guide](https://restream.io/blog/ultimate-guide-to-twitch/) + +## File Transfer +3 different ways +https://www.youtube.com/watch?v=APbbuJF4Ma4 +https://www.android.com/filetransfer/ +[Wie übertrage ich Bilder oder Videos von meinem Computer auf mein Oculus Quest 2 oder Quest?](https://support.oculus.com/2255729571307786/) + +Facebook video downloader here - https://fbdown.net/ + + + +## Brillenträger +Sehstärke-Linsen Einsätze +https://mixed.de/vr-optiker-sehstaerke-linsen-test/ +- https://vroptiker.de/sehstaerke-linsen-einsaetze/oculus-quest2/ +- https://widmovr.com/product/oculus-quest-2-prescription-lens-adapters/ + +## Not to do +### Sonnenlicht in die Linse) +Sonnenlicht kann durch die Linsen gebündelt werden und das Display beschödigen. +### Linsen reinigen +### Grips - Handhalterungen +[https://www.youtube.com/watch?v=_52xWr_R4uM&feature=youtu.be&t=388](https://www.youtube.com/watch?v=_52xWr_R4uM&feature=youtu.be&t=388) + + +### Headstrap +#### VIVE DELUXE AUDIO STRAP +[https://www.vive.com/de/accessory/vive-deluxe-audio-strap/](https://www.vive.com/de/accessory/vive-deluxe-audio-strap/) + +FrankenQuest 2 +[https://uploadvr.com/frankenquest-2-quest-2/](https://uploadvr.com/frankenquest-2-quest-2/) +Adapter zum 3D-Druck: +[https://www.thingiverse.com/thing:4622970](https://www.thingiverse.com/thing:4622970) +Variante mit Kabelklemme (oben oder unten): +[https://www.thingiverse.com/thing:4628600/files](https://www.thingiverse.com/thing:4628600/files) +![](06-vr-adapter-3ddruck.jpg) +:::success +Druck skaliert auf 101% +::: +Install guide +Remove the Quest 2 straps following this guide: [https://www.youtube.com/watch?v=PejiYjR7_44&feature=youtu.be&t=110](https://www.youtube.com/watch?v=PejiYjR7_44&feature=youtu.be&t=110) +Snap the DAS onto the adaptor (pushing the round front section in first like in the picture). +Snap the adaptor onto Quest 2. +Use the velcro loop to attach the head strap to the headset. +![](07-vive-straps-3ddruck.jpg) + +Oculus Quest 2 Comfort Head Strap Mods! + + + +#### 3DDruck +Oculus Quest 2 Elite Strap_V2_NAVIDA DESIGN +[https://www.thingiverse.com/thing:4630780/files(https://www.thingiverse.com/thing:4630780/files)] +Oculus Link Cable Clip for Deluxe Audio Strap "DAS" +[https://www.thingiverse.com/thing:4666749](https://www.thingiverse.com/thing:4666749) + + +Überblick: +[https://www.youtube.com/watch?v=sUhMk19PVq4](https://www.youtube.com/watch?v=sUhMk19PVq4) +[https://www.youtube.com/watch?v=CN9fYlUGVtk](https://www.youtube.com/watch?v=CN9fYlUGVtk) + +### Lens Adaptor +#### Für Brillen +[https://www.thingiverse.com/thing:3653631(https://www.thingiverse.com/thing:3653631)] +Für Linsen +[https://www.thingiverse.com/thing:3642004(https://www.thingiverse.com/thing:3642004)] + + +Esimen Upgrade K3 + +### Batterie +[https://www.androidcentral.com/best-oculus-quest-battery-pack](https://www.androidcentral.com/best-oculus-quest-battery-pack) diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/01-json-import.png b/content/posts/2021-11-17-WordPress-Werkstatt/01-json-import.png new file mode 100644 index 0000000..a24e5d0 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/01-json-import.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/02-terminfelder.png b/content/posts/2021-11-17-WordPress-Werkstatt/02-terminfelder.png new file mode 100644 index 0000000..2d7be48 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/02-terminfelder.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/03-kategorien.png b/content/posts/2021-11-17-WordPress-Werkstatt/03-kategorien.png new file mode 100644 index 0000000..46ebce0 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/03-kategorien.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/04-termine-neu.png b/content/posts/2021-11-17-WordPress-Werkstatt/04-termine-neu.png new file mode 100644 index 0000000..c8dd592 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/04-termine-neu.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/05-php-storm.png b/content/posts/2021-11-17-WordPress-Werkstatt/05-php-storm.png new file mode 100644 index 0000000..4106246 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/05-php-storm.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/06-termine-listen.png b/content/posts/2021-11-17-WordPress-Werkstatt/06-termine-listen.png new file mode 100644 index 0000000..240a734 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/06-termine-listen.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/07-external-library.png b/content/posts/2021-11-17-WordPress-Werkstatt/07-external-library.png new file mode 100644 index 0000000..4305c96 Binary files /dev/null and b/content/posts/2021-11-17-WordPress-Werkstatt/07-external-library.png differ diff --git a/content/posts/2021-11-17-WordPress-Werkstatt/index.md b/content/posts/2021-11-17-WordPress-Werkstatt/index.md new file mode 100644 index 0000000..51d6c18 --- /dev/null +++ b/content/posts/2021-11-17-WordPress-Werkstatt/index.md @@ -0,0 +1,166 @@ +--- +layout: post +title: "WordPress Werkstatt PHP" +description: "Advanced Custom Fields und Formulareingaben" +image: 04-termine-neu.png +cover: + image: 04-termine-neu.png +tags: [ "ACF", "WordPress", "Formulare", "JSON", "Plugin" ] +date: "2021-11-17" +author: Jörg Lohrer +slug: "WordPress-Werkstatt" +lang: de +dir: ltr +--- + + +# WordPress Werkstatt PHP +Zunächst wird auf relilab.org das kostenfreie [Plugin ACF - Advanced Custom Fields](https://de.wordpress.org/plugins/advanced-custom-fields/) installiert und aktiviert. +Dies ermöglicht weitere individuelle Beitragsfelder für die Beiträge. +Nun kann manuell aktiviert oder eine Feldgruppe importiert werden - hier mittels [dieser JSON-Datei](#ACF-JSON-Export), die das abkürzt: +![](h01-json-import.png) +mit dem Ergebnis, dass unter allen WordPress-Beiträgen jetzt zwei Terminfelder erscheinen, die ausgefüllt werden können: +![](02-terminfelder.png) +Zudem gibt es neu eine Kategorie "Termine", die aktiviert werden kann mit Unterkategorien, die später Übersichtsseiten ermöglichen: +![](03-kategorien.png) +Jetzt wird das [Plugin relilab-termine](https://github.com/rpi-virtuell/relilab-termine) installiert und aktiviert +Nun kann mittels Shortcode ```[relilab_termine]``` eine Terminübersicht als WordPress-Block erzeugt werden: +![](04-termine-neu.png) + + +## JSON +#### ACF-JSON-Export: +```json= +[ + { + "key": "group_6193936e4f12c", + "title": "Termin", + "fields": [ + { + "key": "field_619393f8e62e0", + "label": "Startet am", + "name": "relilab_startdate", + "type": "date_time_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "display_format": "d.m.Y H:i", + "return_format": "Y-m-d H:i", + "first_day": 1 + }, + { + "key": "field_619394a3e62e1", + "label": "Endet am", + "name": "relilab_enddate", + "type": "date_time_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "display_format": "d.m.Y H:i", + "return_format": "Y-m-d H:i", + "first_day": 1 + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "post" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "left", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "acfe_display_title": "", + "acfe_autosync": "", + "acfe_form": 0, + "acfe_meta": "", + "acfe_note": "" + } +] + +``` + +## PHP +### Software +#### PHP-Storm +[https://www.jetbrains.com/de-de/phpstorm/](https://www.jetbrains.com/de-de/phpstorm/) + + +##### Shortcode zum Sprechen bringen +[https://developer.wordpress.org/reference/functions/add_shortcode/](https://developer.wordpress.org/reference/functions/add_shortcode/) +In PhpStorm +![](05-php-storm.png) +```add_shortcode( string $tag, callable $callback )``` + +alle Termine listen, die +[https://www.advancedcustomfields.com/resources/orde-posts-by-custom-fields/](https://www.advancedcustomfields.com/resources/orde-posts-by-custom-fields/) + +![](06-termine-listen.png) + + +PHP-Storm nutzt als External Library dann WordPress +![](07-external-library.png) + +### Plugin + +Unsere Funktion: +``` +/** +*Plugin Name: relilab Termine +*/ +add_shortcode('termine','termineAusgeben'); + +function termineAusgeben( $atts ) { + +$posts = get_posts(array( + 'post_type' => 'post', + 'posts_per_page' => -1, + 'category' => 'termine', + 'meta_key' => 'relilab_startdate', + 'orderby' => 'meta_value', + 'order' => 'DESC' +)); + + +// ob_start(); +global $post; +?> + + 192.168.178.132 + +### Auf dem Mac (oder PC) die Auflösung des Hosts verknüpfen +auf dem Mac ```sudo nano /etc/hosts``` die IP eintragen und moodle.local zuweisen: +![](02-hosts-eintragen.png) + + + +## Moodle Server auf Virtualbox vorbereiten +```sudo -i```wechselt auf root + +### SSH Zugriff ermöglichen +[Allow SSH root login on Ubuntu 20.04 Focal Fossa Linux](https://linuxconfig.org/allow-ssh-root-login-on-ubuntu-20-04-focal-fossa-linux) + +### Shellbefehle zur Installation: + +```shell= +sudo apt update && apt upgrade -y + +apt install mariadb-server +sudo apt install apache2 libapache2-mod-fcgid +sudo apt install php php-cli php-fpm php-json php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-intl php-xmlrpc php-soap +a2enconf php7.4-fpm + +sudo a2enmod actions fcgid alias proxy_fcgi setenvif + +a2dismod php7.4 +a2dismod mpm_prefork +a2dismod mpm_worker + +a2enmod mpm_event + +systemctl restart php7.4-fpm apache2 +``` + +### anlegen: /etc/apache2/sites-available/moodle.conf + +```shell= +############################ + + ServerName moodle.local + + ServerAdmin webmaster@localhost + DocumentRoot /var/www/moodle + + + SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/" + + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + +#################################################################### +``` +### Weitere Shellbefehle zur Installation: +```shell= +a2ensite moodle.conf +systemctl reload apache2 + +mkdir /var/www/moodle +echo '' > /var/www/moodle/info.php +```` + + +### host eintrag hinzufügen: "192.168.178.xxx moodle.local" + 192.168.178.xxx moodle.local + 192.168.178.xxx www.moodle.local +### im Browser öffnen: http://moodle.local/info.php +### maschine speichern und klonen + +## Anschließend IOMAD moodle installieren: +https://www.iomad.org/wp-content/uploads/2021/03/Iomad-Installation-Guide.pdf + + + +### Datenbank für moodle erzeugen via SSH: + +```shell= + +mysql + +CREATE DATABASE moodledb; +CREATE USER 'moodleowner'@'localhost' IDENTIFIED BY '$mdb2passwd'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON moodledb.* TO 'moodleowner'@'localhost'; +GRANT FILE ON *.* TO 'moodleowner'@'localhost'; + +quit +``` + + +### Installation iomad + +```shell= +cd /var/www/moodle +git clone https://github.com/iomad/iomad.git +cd iomad +git checkout -b myiomad origin/IOMAD_310_STABLE +mkdir /var/www/moodledata && chmod 777 /var/www/moodledata +``` +**ändern!!!**: ```/etc/apache2/sites-available/moodle.conf -> DocumentRoot /var/www/moodle/iomad``` + +```systemctl restart php7.4-fpm apache2``` + +### http://moodle.local aufrufen und config.php Datei mit Hilfe des Assistenten generieren lassen + +![](03-config generieren.png) + +**ändern!!!**: ```/moodle``` entfernen + +### config.php + +```shell= +dbtype = 'mariadb'; +$CFG->dblibrary = 'native'; +$CFG->dbhost = 'localhost'; +$CFG->dbname = 'moodledb'; +$CFG->dbuser = 'moodleowner'; +$CFG->dbpass = '$mdb2passwd'; +$CFG->prefix = 'mdl_'; +$CFG->dboptions = array ( + 'dbpersist' => 0, + 'dbport' => '', + 'dbsocket' => '', + 'dbcollation' => 'utf8mb4_general_ci', +); + +$CFG->wwwroot = 'http://moodle.local'; +$CFG->dataroot = '/var/www/moodledata'; +$CFG->admin = 'admin'; + +$CFG->directorypermissions = 0777; + +require_once(__DIR__ . '/lib/setup.php'); + +// There is no php closing tag in this file, +// it is intentional because it prevents trailing whitespace problems! +``` \ No newline at end of file diff --git a/content/posts/2022-02-16-Moodle-Iomad-Linux/title-gif.gif b/content/posts/2022-02-16-Moodle-Iomad-Linux/title-gif.gif new file mode 100644 index 0000000..f6c1d4f Binary files /dev/null and b/content/posts/2022-02-16-Moodle-Iomad-Linux/title-gif.gif differ diff --git a/content/posts/2022-03-19-OB-virtualcam/01-deutsche-tastatur-ubuntu.png b/content/posts/2022-03-19-OB-virtualcam/01-deutsche-tastatur-ubuntu.png new file mode 100644 index 0000000..af37db4 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/01-deutsche-tastatur-ubuntu.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/02-chrome-remote-desktop.png b/content/posts/2022-03-19-OB-virtualcam/02-chrome-remote-desktop.png new file mode 100644 index 0000000..a35e63b Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/02-chrome-remote-desktop.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/03-status-chrome-remote.png b/content/posts/2022-03-19-OB-virtualcam/03-status-chrome-remote.png new file mode 100644 index 0000000..7eeca4d Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/03-status-chrome-remote.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/04-remotezugriff.png b/content/posts/2022-03-19-OB-virtualcam/04-remotezugriff.png new file mode 100644 index 0000000..a35e63b Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/04-remotezugriff.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/05-systemctl-status.png b/content/posts/2022-03-19-OB-virtualcam/05-systemctl-status.png new file mode 100644 index 0000000..7eeca4d Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/05-systemctl-status.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/06-cannot-open-video-device.png b/content/posts/2022-03-19-OB-virtualcam/06-cannot-open-video-device.png new file mode 100644 index 0000000..2a69d0e Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/06-cannot-open-video-device.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/07-jetzt-v412-ctl.png b/content/posts/2022-03-19-OB-virtualcam/07-jetzt-v412-ctl.png new file mode 100644 index 0000000..5458b02 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/07-jetzt-v412-ctl.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/08-dummy-video-device.png b/content/posts/2022-03-19-OB-virtualcam/08-dummy-video-device.png new file mode 100644 index 0000000..e7a9d10 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/08-dummy-video-device.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/09-relilab-technical-host.png b/content/posts/2022-03-19-OB-virtualcam/09-relilab-technical-host.png new file mode 100644 index 0000000..37f64a5 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/09-relilab-technical-host.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/10-pin-remote-desktop.png b/content/posts/2022-03-19-OB-virtualcam/10-pin-remote-desktop.png new file mode 100644 index 0000000..d77aad4 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/10-pin-remote-desktop.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/11-keyboard-tastatur-umstellen.png b/content/posts/2022-03-19-OB-virtualcam/11-keyboard-tastatur-umstellen.png new file mode 100644 index 0000000..98ed150 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/11-keyboard-tastatur-umstellen.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/12-apps-verknuepfen.png b/content/posts/2022-03-19-OB-virtualcam/12-apps-verknuepfen.png new file mode 100644 index 0000000..37a264b Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/12-apps-verknuepfen.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/13-startvirtualcam.png b/content/posts/2022-03-19-OB-virtualcam/13-startvirtualcam.png new file mode 100644 index 0000000..2a96af3 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/13-startvirtualcam.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/14-OBS-deutsch-umstellen.png b/content/posts/2022-03-19-OB-virtualcam/14-OBS-deutsch-umstellen.png new file mode 100644 index 0000000..4806a6e Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/14-OBS-deutsch-umstellen.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/15-obs-mit-virtual-cam-starten.png b/content/posts/2022-03-19-OB-virtualcam/15-obs-mit-virtual-cam-starten.png new file mode 100644 index 0000000..2461000 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/15-obs-mit-virtual-cam-starten.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/16-startup-application.png b/content/posts/2022-03-19-OB-virtualcam/16-startup-application.png new file mode 100644 index 0000000..b91b554 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/16-startup-application.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/17-i-will-only-be-using-OBS.png b/content/posts/2022-03-19-OB-virtualcam/17-i-will-only-be-using-OBS.png new file mode 100644 index 0000000..e590784 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/17-i-will-only-be-using-OBS.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/18-video1920.png b/content/posts/2022-03-19-OB-virtualcam/18-video1920.png new file mode 100644 index 0000000..4457758 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/18-video1920.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/19-szenensammlung-importieren-OBS.png b/content/posts/2022-03-19-OB-virtualcam/19-szenensammlung-importieren-OBS.png new file mode 100644 index 0000000..8e3bda3 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/19-szenensammlung-importieren-OBS.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/20-chrome-einrichten.png b/content/posts/2022-03-19-OB-virtualcam/20-chrome-einrichten.png new file mode 100644 index 0000000..5da1aa6 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/20-chrome-einrichten.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/21-chrome-standard.png b/content/posts/2022-03-19-OB-virtualcam/21-chrome-standard.png new file mode 100644 index 0000000..2ce39a8 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/21-chrome-standard.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/22-chrome-anmeldung.png b/content/posts/2022-03-19-OB-virtualcam/22-chrome-anmeldung.png new file mode 100644 index 0000000..5081531 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/22-chrome-anmeldung.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/23-zoom-anmeldung.png b/content/posts/2022-03-19-OB-virtualcam/23-zoom-anmeldung.png new file mode 100644 index 0000000..44085eb Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/23-zoom-anmeldung.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/24-zoom-sprache-aendern.png b/content/posts/2022-03-19-OB-virtualcam/24-zoom-sprache-aendern.png new file mode 100644 index 0000000..e0df640 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/24-zoom-sprache-aendern.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/25-slides-emojis.png b/content/posts/2022-03-19-OB-virtualcam/25-slides-emojis.png new file mode 100644 index 0000000..c119850 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/25-slides-emojis.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/26-keyring-problem.png b/content/posts/2022-03-19-OB-virtualcam/26-keyring-problem.png new file mode 100644 index 0000000..4bc0b90 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/26-keyring-problem.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/27-startvirtualcam-verknuepft-OBS.jpg b/content/posts/2022-03-19-OB-virtualcam/27-startvirtualcam-verknuepft-OBS.jpg new file mode 100644 index 0000000..2ac47bb Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/27-startvirtualcam-verknuepft-OBS.jpg differ diff --git a/content/posts/2022-03-19-OB-virtualcam/28-shell-startup.png b/content/posts/2022-03-19-OB-virtualcam/28-shell-startup.png new file mode 100644 index 0000000..3b3b0e8 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/28-shell-startup.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/29-autostartordner.jpg b/content/posts/2022-03-19-OB-virtualcam/29-autostartordner.jpg new file mode 100644 index 0000000..d42eeda Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/29-autostartordner.jpg differ diff --git a/content/posts/2022-03-19-OB-virtualcam/index.md b/content/posts/2022-03-19-OB-virtualcam/index.md new file mode 100644 index 0000000..c6106a7 --- /dev/null +++ b/content/posts/2022-03-19-OB-virtualcam/index.md @@ -0,0 +1,229 @@ +--- +layout: post +title: "Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern" +description: "Via Konsole Instanz in aufsetzen, Desktop-Linux installieren, Apps einrichten und konfigurieren" +author: Jörg Lohrer +image: 29-autostartordner.jpg +cover: + image: 29-autostartordner.jpg +tags: [ "Ubuntu", "Google Remote Desktop", "OBS", "Zoom", "relilabtutorial" ] +date: "2022-03-19" +slug: "OB-virtualcam" +lang: de +dir: ltr +toc: true +toc_label: "Inhaltsverzeichnis" +toc_icon: "house-laptop" +toc_sticky: "true" +--- + + + +# Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern + +## Instanz erstellen auf [https://console.cloud.google.com/](https://console.cloud.google.com/) +- Name, Region und Zone auswählen +- E2 4 vCPU, 16GB Arbeitsspeicher - 0,17$ pro Stunde +- +- Betriebssystem Ubuntu 20.04 LTS + + +## Ubuntu Desktop auf Google Cloud Plattform installieren +[https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud](https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud) +[https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome](https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome) +[https://bytexd.com/install-chrome-remote-desktop-headless/](https://bytexd.com/install-chrome-remote-desktop-headless/) +[https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process](https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process) + + +### Via SSH/Terminal Update, Tasksel und Google Remote Desktop installieren: +```shell= +sudo apt update +sudo apt install --assume-yes wget tasksel +wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb +sudo apt-get install --assume-yes ./chrome-remote-desktop_current_amd64.deb +``` +### Cinnamon Desktop installieren +```shell= +sudo DEBIAN_FRONTEND=noninteractive \ + apt install --assume-yes cinnamon-core desktop-base dbus-x11 +``` +`sudo bash -c 'echo "exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d" > /etc/chrome-remote-desktop-session'` + +### Zusätzliche Einstellungen: +``` +sudo systemctl disable lightdm.service +``` +#### [Deutsche Tastatur in der Ubuntu-Konsole festlegen](https://praxistipps.chip.de/deutsche-tastatur-in-der-ubuntu-konsole-einrichten_28691): +``` +sudo dpkg-reconfigure keyboard-configuration +``` +![](01-deutsche-tastatur-ubuntu.png) +![](02-chrome-remote-desktop.png) + + + +### Optional: Google Chrome Browser installieren +```shell= +wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +sudo apt install --assume-yes ./google-chrome-stable_current_amd64.deb +``` + +## Chrome Remote Desktop konfiguieren und starten +[https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#configuring_and_starting_the_chrome_remote_desktop_service](https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#configuring_and_starting_the_chrome_remote_desktop_service +)) +Mit Google-Konto, das zur Remote-Stuerung benutzt werden soll, [https://remotedesktop.google.com/headless](https://remotedesktop.google.com/headless) aufrufen und den SSH-Befehl in der Konsole ausführen. 6-Stellige PIN festlegen. +![](04-remotezugriff.png) +Prüfen ob der Dienst ausgeführt wird: +``` +sudo systemctl status chrome-remote-desktop@$USER +``` +![](05-systemctl-status.png) + +### Instanzzeitplan festlegen +[https://rominirani.com/hands-on-guide-to-scheduling-vm-instances-to-start-and-stop-a079a50e16c6](https://rominirani.com/hands-on-guide-to-scheduling-vm-instances-to-start-and-stop-a079a50e16c6) + + +## OBS Installation + +[https://obsproject.com/wiki/install-instructions#ubuntumint-installation](https://obsproject.com/wiki/install-instructions#ubuntumint-installation) +``` +sudo apt install ffmpeg +sudo apt install v4l2loopback-dkms +sudo add-apt-repository ppa:obsproject/obs-studio +sudo apt update +sudo apt install obs-studio +``` + +### Problem: +Test mit `v4l2-ctl --list-devices` bringt Fehlermeldung: +> Cannot open device /dev/video0, exiting. +![](06-cannot-open-video-device.png) + + +### Lösung für virtuelle Kamera auf virtueller Maschine: +``` +sudo apt -y install v4l2loopback-dkms v4l2loopback-utils linux-modules-extra-$(uname -r) +``` +``` +sudo modprobe v4l2loopback +``` +Jetzt: +![](07-jetzt-v412-ctl.png) + +### Problem: Trotzdem nach jedem Reboot wird die virtuelle Kamera nicht geladen: +![](08-dummy-video-device.png) + +### Lösung v4l2loopback bei Start laden: +[https://askubuntu.com/questions/1245212/how-do-i-automatically-run-modprobe-v4l2loopback-on-boot](https://askubuntu.com/questions/1245212/how-do-i-automatically-run-modprobe-v4l2loopback-on-boot +) +``` +sudo nano /etc/modules +``` +hinzufügen: ```v4l2loopback``` + + + +## Zoom Installation +[https://support.zoom.us/hc/de/articles/204206269-IZoom-unter-Linux-installieren-oder-aktualisieren](https://support.zoom.us/hc/de/articles/204206269-IZoom-unter-Linux-installieren-oder-aktualisieren +) + +``` +sudo apt install gdebi +sudo apt update +sudo apt upgrade +``` +``` +sudo snap install zoom-client +``` + + +## Inbetriebnahme des Remote Desktop +### Verbindung zur VM-Instanz herstellen +Via [https://remotedesktop.google.com/access](https://remotedesktop.google.com/access) auf das Remote Gerät zugreifen.: +![](09-relilab-technical-host.png) +Sechsstelligen PIN eingeben: +![](10-pin-remote-desktop.png) + + +### Keyboard / Tastatur auf deutsch umstellen: +![](11-keyboard-tastatur-umstellen.png) +### Apps auf dem Desktop verknüpfen: +![](12-apps-verknuepfen.png) + +### OBS einrichten +#### OBS mit virtueller Kamera automatisch starten: +Rechtsklick auf die Verknüpfung und dann beim Startbefehl `--startvirtualcam` ergänzen. +![](15-obs-mit-virtual-cam-starten.png) +#### Beim Systemstart mit virtueller Kamera starten: +`startup Applications` wählen +![](16-startup-application.png) +ebenfalls `--startvirtualcam` ergänzen +![](15-obs-mit-virtual-cam-starten.png) + +#### Beim ersten Start von OBS +"I will only be using the virtual camera" wählen: +![](17-i-will-only-be-using-OBS.png) +In den Einstellungen die Sprache auf Deutsch umstellen: +![](14-OBS-deutsch-umstellen.png) +Videoauflösung auf 1920x1080 umstellen: +![](18-video1920.png) +Szenensammlung importieren +![](19-szenensammlung-importieren-OBS.png) +(Vorkonfigurierte Szenen für das relilab-Café [immer aktuell auf Github](https://github.com/rpi-virtuell/relilab/blob/main/zoom/relilab-cafe-obs-json.json)) + - [relilab-cafe-obs-json.json](https://raw.githubusercontent.com/rpi-virtuell/relilab/main/zoom/relilab-cafe-obs-json.json) + +### Google Chrome einrichten +#### Beim ersten Systemstart Password for new Keyring erstellen: +![](20-chrome-einrichten.png) +#### Chrome zum Standardbrowser machen +![](21-chrome-standard.png) +#### Google Chrome anmelden und Sync inkl. Lesezeichen aktivieren +![](22-chrome-anmeldung.png) + +### Zoom einrichten +#### Zoom-Account anmelden +![](23-zoom-anmeldung.png) +#### [Sprache ändern in Zoom](https://support.zoom.us/hc/de/articles/209982306-%C3%84nderung-der-Sprache-in-Zoom) +Zoom starten und dann das Zoom-Symbol rechts in der unteren Leiste mit Rechtsklick der Maus das Menü zur Sprachänderung aufrufen: +![](24-zoom-sprache-aendern.png) + +## Problemlösungen + +#### Problem - keine Emojis in den Slides +![](25-slides-emojis.png) +#### Lösung: [https://medium.com/@harshmaur/emojis-missing-from-chrome-in-ubuntu-9c25fe10867c](https://medium.com/@harshmaur/emojis-missing-from-chrome-in-ubuntu-9c25fe10867c) +``` +sudo apt-get remove fonts-noto-color-emoji +sudo apt-get install fonts-noto-color-emoji +``` +#### Problem - kein Font Yanone Kaffeesatz in den Slides +#### Lösung: [https://zoomadmin.com/HowToInstall/UbuntuPackage/fonts-yanone-kaffeesatz](https://zoomadmin.com/HowToInstall/UbuntuPackage/fonts-yanone-kaffeesatz) +``` +sudo apt-get update -y +sudo apt-get install -y fonts-yanone-kaffeesatz +``` + +#### Mögliches Problem +> GUI (Ubuntu Desktop) has its own security layer which blocks the root account from login. So, even we have a properly enabled root account with password, it does not work in GUI interface. +> ![](26-keyring-problem.png) +[https://askubuntu.com/questions/1192471/login-as-root-on-ubuntu-desktop](https://askubuntu.com/questions/1192471/login-as-root-on-ubuntu-desktop +) + +[https://www.computernetworkingnotes.com/linux-tutorials/how-to-enable-and-disable-root-login-in-ubuntu.html](https://www.computernetworkingnotes.com/linux-tutorials/how-to-enable-and-disable-root-login-in-ubuntu.html#:~:text=Enabling%20and%20disable%20root%20login%20in%20nutshell&text=Use%20the%20sudo%20%E2%80%93i%20passwd,root%20password%2C%20when%20it%20asks.&text=CLI%20%26%20GUI%20both-,Use%20the%20sudo%20%E2%80%93i%20passwd%20root%20command.,root%20password%2C%20when%20it%20asks) + + + +# Anstatt auf Cloud-Plattform mit Linux auf lokalem Windows-PC +### Autostart OBS inkl virtueller Kamera & Zoom +#### Vorbereiten OBS inkl Virtueller Kamera + +Hinzufügen von `--startvirtualcam` zur OBS-Verknüpfung: +![](27-startvirtualcam-verknuepft-OBS.jpg) + +open the start menu/tile thing and type in: +`Run` and hit enter. Then type in `shell:startup` +![](28-shell-startup.png) +Dann die Verknüpfungen in den Autostartordner kopieren: +![](29-autostartordner.jpg) + +Weitere Schritte wie oben diff --git a/content/posts/2022-03-19-OB-virtualcam/v412-ctl-fehlermeldung.png b/content/posts/2022-03-19-OB-virtualcam/v412-ctl-fehlermeldung.png new file mode 100644 index 0000000..2a69d0e Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/v412-ctl-fehlermeldung.png differ diff --git a/content/posts/2022-03-19-OB-virtualcam/virtueller-desktop-titelbild.jpg b/content/posts/2022-03-19-OB-virtualcam/virtueller-desktop-titelbild.jpg new file mode 100644 index 0000000..b87aa25 Binary files /dev/null and b/content/posts/2022-03-19-OB-virtualcam/virtueller-desktop-titelbild.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/16-Schneckennudeln.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/16-Schneckennudeln.jpg new file mode 100644 index 0000000..6e1a8cf Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/16-Schneckennudeln.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/Hefeteig-mit-Fuellung.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/Hefeteig-mit-Fuellung.jpg new file mode 100644 index 0000000..68cef76 Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/Hefeteig-mit-Fuellung.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/hefeschnecken-in-capelle-backform.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/hefeschnecken-in-capelle-backform.jpg new file mode 100644 index 0000000..d8d7359 Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/hefeschnecken-in-capelle-backform.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/index.md b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/index.md new file mode 100644 index 0000000..fcd3fa5 --- /dev/null +++ b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/index.md @@ -0,0 +1,59 @@ +--- +layout: post +title: "Jojos Schoko-Zimt-Schnecken" +description: "Rezept und Backanleitung" +author: Jörg Lohrer +image: schneckennudeln-titel.jpg +cover: + image: schneckennudeln-titel.jpg +tags: [ "Schneckennudel", "Hefeteig", "Schoko", "Zimt" ] +date: "2023-02-26" +slug: "jojos-schoko-zimt-schnecken" +lang: de +dir: ltr +--- + + +# Schoko-Schnecken + +## Hefeteig +**200g Milch** handwarm +**½ Pk Vanillezucker +60g Zucker +22g Hefe** +verrühren +**1 Ei Größe L** dazu +in der Teigknetmaschine +**120g Weizenmehl 405 +380g Dinkelmehl 630** +dazu und wenn es ein fester Teig ist +**5g Salz** zugeben +und +**60g Butter** kalt in Streifen schneiden und +5-10 Minuten einketen (-> Fenstertest) +danach Teig 30-60 Minuten ruhen/gehen lassen + +## Füllung +in der Zwischenzeit +**10g brauner Zucker +30g Rohrohrzucker +50g weißer Zucker +100g Butter +½ Pk Vanillezucker +2 Teelöffel Zimt +5 Teelöffel Kaba** +verkneten zu einer cremigen Masse + +Hefeteig ausrollen und mit der Füllung bestreichen +Nach Belieben noch **Raspel Schokolade** darauf verteilen +![](Hefeteig-mit-Fuellung.jpg) +einrollen, in 16 Stücke schneiden und in Kuchenform setzen: +![](16-Schneckennudeln.jpg) +Mit Frischhaltefolie abdecken und weitere ca. 30 Minuten gehen lassen, dann mit Eimilch abstreichen: +![](hefeschnecken-in-capelle-backform.jpg) +Backofen auf 220°Celsius Ober-/Unterhitze vorheizen. +In den Ofen und dabei auf 180° reduzieren. +Nach 10 Minuten auf 160° reduzien: +![](schneckennudeln-im-ofen.jpg) +weitere 25 Minuten backen oder bis eine Kerntemperatur von 92° erreicht ist. Fertig: +![](schneckennudeln-fertig.jpg) \ No newline at end of file diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-fertig.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-fertig.jpg new file mode 100644 index 0000000..6a7abc5 Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-fertig.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-im-ofen.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-im-ofen.jpg new file mode 100644 index 0000000..1495aba Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-im-ofen.jpg differ diff --git a/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-titel.jpg b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-titel.jpg new file mode 100644 index 0000000..23a439d Binary files /dev/null and b/content/posts/2023-02-26-jojos-schoko-zimt-schnecken/schneckennudeln-titel.jpg differ diff --git a/content/posts/2023-03-23-saemann/bild1-alternativ-saemann.jpeg b/content/posts/2023-03-23-saemann/bild1-alternativ-saemann.jpeg new file mode 100644 index 0000000..46cfe95 Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild1-alternativ-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild1-saemann.jpeg b/content/posts/2023-03-23-saemann/bild1-saemann.jpeg new file mode 100644 index 0000000..979b229 Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild1-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild2-alternativ-saemann.jpeg b/content/posts/2023-03-23-saemann/bild2-alternativ-saemann.jpeg new file mode 100644 index 0000000..57da9ab Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild2-alternativ-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild2-saemann.jpeg b/content/posts/2023-03-23-saemann/bild2-saemann.jpeg new file mode 100644 index 0000000..6a8f4b2 Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild2-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild3-saemann.jpeg b/content/posts/2023-03-23-saemann/bild3-saemann.jpeg new file mode 100644 index 0000000..ae08e42 Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild3-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild4-saemann.jpeg b/content/posts/2023-03-23-saemann/bild4-saemann.jpeg new file mode 100644 index 0000000..f2cdae1 Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild4-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/bild5-saemann.jpeg b/content/posts/2023-03-23-saemann/bild5-saemann.jpeg new file mode 100644 index 0000000..620c04e Binary files /dev/null and b/content/posts/2023-03-23-saemann/bild5-saemann.jpeg differ diff --git a/content/posts/2023-03-23-saemann/index.md b/content/posts/2023-03-23-saemann/index.md new file mode 100644 index 0000000..eec1660 --- /dev/null +++ b/content/posts/2023-03-23-saemann/index.md @@ -0,0 +1,98 @@ +--- +layout: post +title: "Das Gleichnis vom Sämann" +description: "erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle" +author: Jörg Lohrer +image: saemann-title.jpg +cover: + image: saemann-title.jpg +tags: [ "Gleichnis", "Jesus", "Bibel", "Sämann", "Eric Carle", "Midjourney", "ChatGPT", "Deepl" ] +date: "2023-03-23" +slug: "gleichnis-vom-saemann" +lang: de +dir: ltr +--- + +# Das Gleichnis vom Sämann +erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle + +### Bild 1: "Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung" + +![](bild1-saemann.jpeg) +alternativ: +![](bild1-alternativ-saemann.jpeg) +Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren. + + +### Bild 2: "Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen" +![](bild2-saemann.jpeg) +alternativ +![](bild2-alternativ-saemann.jpeg) +Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen. + + +### Bild 3: "Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens" + +![](bild3-saemann.jpeg) +Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden. + + +### Bild 4: "Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde" + +![](bild4-saemann.jpeg) +Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben. + +### Bild 5: "Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor" +![](bild5-saemann.jpeg) +Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat. + +--- + + +## Anleitung / Erstellung - The Making of +### 1. Geschichte erstellen mit [ChatGPT](https://chat.openai.com/)-4 +#### Screenshot +![](screen-chatgpt-saemann.png =x600) + + +#### Volltext +``` +Beschreibe mir die Geschichte vom Sämann aus der Bibel für einen 8-jähringen in 5 Bildern +``` + +**Bild 1**: Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren. + +**Bild 2**: Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen. + +**Bild 3**: Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden. + +**Bild 4**: Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben. + +**Bild 5**: Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat. + +`Gib mir noch schöne anrührende Überschriften zu den Bildern` +Bild 1: "Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung" +Bild 2: "Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen" +Bild 3: "Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens" +Bild 4: "Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde" +Bild 5: "Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor" + +### 2. Illustration durch Übersetzung der Bildbeschreibungen mit [Deepl](https://www.deepl.com/) und damit Prompterstellung für [midjourney](https://www.midjourney.com) +Ergänzung der automatischen Übersetzung für den Prompt jeweils durch ```Illustration by Eric Carle```für den Stil, ```--q 2``` für die höchste Qualitätsstufe und ```--v 5```für Midjourney Version 5 + +#### Prompt 1 +`A friendly farmer stands in an open field, a handful of seeds in his hand. He scatters the seeds far and wide to sow a harvest. Behind him you can see four different soils: one rocky, one thorny, one surrounded by birds and one fertile. Illustration by Eric Carle --q 2 --v 5` +#### Prompt 2 +`Some seeds fall on the rocky ground, where they have little soil. The seeds germinate quickly, but they do not have enough soil to root deeply. The picture shows small, weak plants starting to grow in the rocky soil. Illustration by Eric Carle --q 2 --v 5` +#### Prompt 3 +`Other seeds fall on the thorny ground, where they are surrounded by thorns and weeds. The plants begin to grow, but they are choked by the thorns that surround them. The picture shows how the thorns clasp the young plants and prevent them from growing tall and strong. Illustration by Eric Carle --q 2 --v 5` +#### Prompt 4 +`other seeds fall on the ground surrounded by birds, where they are immediately eaten by hungry birds. The picture shows happy birds enjoying the seeds before they even have a chance to grow. Illustration by Eric Carle --q 2 --v 5` +#### Prompt 5 +`Finally, some seeds fall on the fertile soil, where they can root deeply and grow. The picture shows large, healthy plants thriving in the sun and bearing abundant fruit. The farmer stands proudly next to the rich harvest and smiles, knowing that he has sown well. Illustration by Eric Carle --q 2 --v 5` + + +--- + +Alles von Gott erdacht, in der Bibel niedergeschrieben und mit künstlicher Intelligenz in Text und Bilder verwandelt unter der Lizenz +[CC-BY-SA](https://creativecommons.org/licenses/by-sa/3.0/de/) Das heißt, ihr dürft alles Weiterverwenden, Verändern, Anpassen oder sogar verkaufen. Eine Namensnennung von Jörg Lohrer wäre nett. diff --git a/content/posts/2023-03-23-saemann/saemann-title.jpg b/content/posts/2023-03-23-saemann/saemann-title.jpg new file mode 100644 index 0000000..772a492 Binary files /dev/null and b/content/posts/2023-03-23-saemann/saemann-title.jpg differ diff --git a/content/posts/2023-03-23-saemann/screen-chatgpt-saemann.png b/content/posts/2023-03-23-saemann/screen-chatgpt-saemann.png new file mode 100644 index 0000000..7b64da1 Binary files /dev/null and b/content/posts/2023-03-23-saemann/screen-chatgpt-saemann.png differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Dampfnudel-mit-Vanillesosse.jpg b/content/posts/2023-04-07-Dampfnudeln/Dampfnudel-mit-Vanillesosse.jpg new file mode 100644 index 0000000..f2034a6 Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Dampfnudel-mit-Vanillesosse.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-auf-Lochblech.jpg b/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-auf-Lochblech.jpg new file mode 100644 index 0000000..8a20185 Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-auf-Lochblech.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-im-Dampfgarer.jpg b/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-im-Dampfgarer.jpg new file mode 100644 index 0000000..9361b50 Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Dampfnudeln-im-Dampfgarer.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Hefefreuden.jpg b/content/posts/2023-04-07-Dampfnudeln/Hefefreuden.jpg new file mode 100644 index 0000000..8c8325e Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Hefefreuden.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Hefeteig.jpg b/content/posts/2023-04-07-Dampfnudeln/Hefeteig.jpg new file mode 100644 index 0000000..f0f0ded Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Hefeteig.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/Hefezopf.jpg b/content/posts/2023-04-07-Dampfnudeln/Hefezopf.jpg new file mode 100644 index 0000000..6c89b31 Binary files /dev/null and b/content/posts/2023-04-07-Dampfnudeln/Hefezopf.jpg differ diff --git a/content/posts/2023-04-07-Dampfnudeln/index.md b/content/posts/2023-04-07-Dampfnudeln/index.md new file mode 100644 index 0000000..3424900 --- /dev/null +++ b/content/posts/2023-04-07-Dampfnudeln/index.md @@ -0,0 +1,54 @@ +--- +layout: post +title: "Hefefreuden - Dampfnudeln & Minihefezopf" +description: "Rezept und Backanleitung" +author: Jörg Lohrer +image: Hefefreuden.jpg +cover: + image: Hefefreuden.jpg +tags: [ "Dampfnudel", "Hefeteig", "Hefezopf" ] +date: "2023-04-07" +slug: "Dampfnudeln" +lang: de +dir: ltr +--- + + +# Dampfnudeln & Minihefezopf + +## Zutaten + +- 400 ml Milch +- 120g Zucker +- 1 Pkg Hefe (42g) +- 3 Eier (ca 150g Vollei) +- 1000g Mehl (300g Weizen Type 405 & 700g Dinkel Type 630) +- 10 g Salz +- 120 g Butter + +## Rezept +- Milch, Zucker, Hefe handwarm mischen +- Eier dazu und in der Knetmaschine 5 Minuten lang das Mehl unterkneten +- Salz dazu und die in Streifen geschnittene Butter weitere 10 Minuten verkneten +- Mindestens 30 Minuten gehen lassen +![](Hefeteig.jpg) + +### Dampfnudeln +- 6 x 135g Stücke vom Teig abstechen, rundschleifen und auf gelochtes Dampfgarblech aufsetzen: +![](Dampfnudeln-auf-Lochblech.jpg) +- weitere 30 Minuten gehen lassen +- dann bei 100°Celsius für 30 Minuten dampfgaren +- fertig +![](Dampfnudeln-im-Dampfgarer.jpg) +- mit Vanillesoße servieren ![](Dampfnudel-mit-Vanillesosse.jpg) + + +### Hefezopf +- Die restlichen ca 900-1000g Teig in 3 gleiche Teile abwiegen und zu einem Zopf flechten +- Mit Küchenhandtuch abgedeckt mindestens 30 Minuten gehen lassen +- Mit Ei abstreichen und im auf 220° vorgeheizten Backofen direkt bei einschießen auf 180° reduzieren +- Nach 10 Minuten Back-Temperatur auf 160° reduzieren +- Entweder backen bis 93° Kerntemperatur erreicht ist oder nach ca weiteren 30 Minuten +![](Hefezopf.jpg) + + diff --git a/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/index.md b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/index.md new file mode 100755 index 0000000..a35911c --- /dev/null +++ b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/index.md @@ -0,0 +1,47 @@ +--- +layout: post +title: "WordPress statt Padlet oder TaskCards" +description: "Mit WordPress, horizontalem Scrolling und Beitragskategorien Sammlungen im Kanban-Style erstellen" +date: 2023-07-25 +author: Jörg Lohrer +slug: "wordpress-statt-padlet-oder-taskcards" +image: wordpress-horizontales-scrollen.gif +cover: + image: wordpress-horizontales-scrollen.gif +tags: [ "WordPress", "Padlet", "Kanban", "TaskCards", "horizontales Scrollen" ] +lang: de +dir: ltr + +--- + +Eine **Sammlung von Liedern für den Religionsunterricht** ist auf Instagram in Zusammenarbeit von [@relimomente](https://www.instagram.com/relimomente/) [@ezpz.lemon.sqz](https://www.instagram.com/ezpz.lemon.sqz) und [@colibri260](https://www.instagram.com/colibri260) entstanden und wurde zunächst **[hier auf TaskCards](https://www.taskcards.de/#/board/16af7347-ec26-468e-a093-34549dd2dae3/view)** veröffentlicht. + +Weil TaskCards [weder exportiert noch importiert](https://twitter.com/TaskCards_/status/1678706884323205122) werden können, es nur 2 kostenfreie gibt und somit kein [#OER](https://open-educational-resources.de/5rs-auf-deutsch/) damit erstellt werden kann, haben wir uns Gedanken gemacht, wie man **[das Ganze in Wordpress](https://blogs.rpi-virtuell.de/rulieder)** umsetzen kann: + +## [https://blogs.rpi-virtuell.de/rulieder](https://blogs.rpi-virtuell.de/rulieder) + + +Als Bonus sind ++ einzelnen Spalten jetzt auch in jeweiligen Kategorienseiten aufrufbar : +[Mensch sein](https://blogs.rpi-virtuell.de/rulieder/category/mensch-sein/), [Lebensweg](https://blogs.rpi-virtuell.de/rulieder/category/lebensweg/), [Liebe / Beziehung](https://blogs.rpi-virtuell.de/rulieder/category/liebe-beziehung/), [Gemeinschaft](https://blogs.rpi-virtuell.de/rulieder/category/gemeinschaft/), [Belastungen](https://blogs.rpi-virtuell.de/rulieder/category/belastungen/), [Hoffnung / Gerechtigkeit / Frieden](https://blogs.rpi-virtuell.de/rulieder/category/hoffnung-gerechtigkeit-frieden/), [Wunder](https://blogs.rpi-virtuell.de/rulieder/category/wunder/), [Schöpfung](https://blogs.rpi-virtuell.de/rulieder/category/schoepfung/), [Die Frage nach Gott](https://blogs.rpi-virtuell.de/rulieder/category/die-frage-nach-gott/), [Tod / Jenseitsvorstellungen](https://blogs.rpi-virtuell.de/rulieder/category/tod-jenseits/), [Biblische Geschichten](https://blogs.rpi-virtuell.de/rulieder/category/biblische-geschichten/), [Songs zum Kirchenjahr](https://blogs.rpi-virtuell.de/rulieder/category/songs-zum-kirchenjahr/) ++ Es gibt eine [Übersicht zu allen Lieder mit Unterrichtsimpuls von @45minuten](https://blogs.rpi-virtuell.de/rulieder/tag/45minuten/). ++ Und man kann [weitere Lieder einreichen](https://blogs.rpi-virtuell.de/rulieder/beitrag-einreichen/) + +## Alles was es dazu braucht ist: +### 1. "horizontales Scrollen" +![](wordpress-horizontales-scrollen.gif) +einfach umsetzbar mit verschiedenen WordPress-Plugins. +Hier wurde der "[horizontal Scroller](https://docs.wpstackable.com/article/502-how-to-use-the-horizontal-scroller)" von Stackable benutzt. + + +### 2. Spalten als "posts block" +Es gibt wieder eine Vielzahl von WordPress-Blöcken, die Beiträge (posts) nach Kategorien sortiert in Spalten anzeigbar machen. Hier wurde "[posts block](https://docs.wpstackable.com/article/492-how-to-use-the-posts-block)" wiederum von Stackable benutzt. +![](spalten-als-posts-block.png) + + +#### Sortieren der Beiträge in den Spalten +Um die Beiträge nicht nach Erstellungsdatum sondern individuell in ihren Kategorien zu sortieren gibt es das Plugin "[Intuitive Custom Post Order](https://de.wordpress.org/plugins/intuitive-custom-post-order/)", dass dies per Drag&Drop ermöglicht. +![](posts-per-drag-and-drop-sortieren.png) + +## [blogs.rpi-virtuell.de](https://blogs.rpi-virtuell.de) +Die Blogs von rpi-virtuell haben alle hier beschriebenen Plugins schon vorinstalliert und müssen nur noch aktiviert werden. Somit steht deinen eigenen WordPress-TaskCards-Padlet-Sammlungen nichts mehr im Wege und du kannst sie kostenfrei und als offene Bildungsmaterialien anderen zugänglich machen. \ No newline at end of file diff --git a/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/posts-per-drag-and-drop-sortieren.png b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/posts-per-drag-and-drop-sortieren.png new file mode 100755 index 0000000..4f4e1fc Binary files /dev/null and b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/posts-per-drag-and-drop-sortieren.png differ diff --git a/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/spalten-als-posts-block.png b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/spalten-als-posts-block.png new file mode 100755 index 0000000..6e432c7 Binary files /dev/null and b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/spalten-als-posts-block.png differ diff --git a/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/wordpress-horizontales-scrollen.gif b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/wordpress-horizontales-scrollen.gif new file mode 100755 index 0000000..668a039 Binary files /dev/null and b/content/posts/2023-07-25-wordpress-statt-padlet-oder-taskcards/wordpress-horizontales-scrollen.gif differ diff --git a/content/posts/2024-01-16-offenheit-das-wesentliche/index.md b/content/posts/2024-01-16-offenheit-das-wesentliche/index.md new file mode 100644 index 0000000..ad60251 --- /dev/null +++ b/content/posts/2024-01-16-offenheit-das-wesentliche/index.md @@ -0,0 +1,115 @@ +--- +layout: post +title: "Offenheit - das Wesentliche" +slug: "offenheit-das-wesentliche" +description: Ein Beitrag zu Teil 1 “Mein (schulisches) Motto für 2024” der EduBlogparade +image: offenheit-wesentlich.png +cover: + image: offenheit-wesentlich.png +date: 2024-01-26 +author: Jörg Lohrer +tags: [ "Offenheit", "OER", "WordPress", "Nextcloud", "Element", "Community" ] +lang: de +dir: ltr +--- + +# Offenheit - das Wesentliche +### 1. Einleitung: Persönliche Reflexion über Offenheit +Wenn ich auf das Jahr 2023 zurückblicke, gewinne ich den Eindruck, dass das Wesentliche in meinem Berufs- und Privatleben in den Verbindungen mit anderen Menschen liegt. +Dashalb ist die Offenheit für Andere, mit und an denen ich lerne nicht nur ein abstraktes Ideal oder eine berufliche Anforderung, sondern ein wesentlicher Bestandteil meiner täglichen Existenz. Dieses Bewusstsein hat mich dazu inspiriert, meine Neujahrsvorsätze für 2024 um das Thema Offenheit herum zu gestalten. + +Meine bisherigen Erfahrungen mit Offenheit haben mich gelehrt, dass es viel mehr ist als nur ein offenes Ohr für andere zu haben oder neue Ideen willkommen zu heißen. Es geht darum, mich selbst für neue Erfahrungen, Veränderungen und unterschiedliche Perspektiven zu öffnen. Ich habe gelernt, dass Offenheit eine Haltung ist, die Mut erfordert – den Mut, sich dem Unbekannten zu stellen, Veränderungen zu akzeptieren und manchmal auch das Risiko einzugehen, verletzlich zu sein. + +Für das kommende Jahr möchte ich mich noch stärker auf das Wesen der Offenheit konzentrieren. Ich habe erkannt, dass Offenheit nicht nur ein Weg ist, mein Leben zu bereichern, sondern auch ein Mittel, um effektiver zu kommunizieren, tiefere Beziehungen aufzubauen und eine bereichernde Arbeitsumgebung zu schaffen. Offenheit soll in meinem Alltag zur Grundlage meiner Entscheidungen und Interaktionen werden. + +Dies bedeutet, dass ich bewusst Raum schaffen möchte für das Zuhören und Verstehen anderer Meinungen, auch wenn sie von meinen eigenen abweichen. Es bedeutet auch, mich neuen Herausforderungen und Möglichkeiten zu stellen, ohne von vornherein eine defensive Haltung einzunehmen. In beruflicher Hinsicht möchte ich offener für kreative und innovative Ansätze sein, die über herkömmliche Methoden hinausgehen, und ich strebe danach, Offenheit als ein Schlüsselelement in meiner Arbeitskultur zu etablieren. + +Meine Neujahrsvorsätze für 2024 drehen sich also darum, Offenheit in meinem Denken und Handeln zu kultivieren. Ich möchte lernen, flexibler zu sein, meine Komfortzone zu erweitern und mich aktiv auf das Unbekannte einzulassen. Durch diese Reise erhoffe ich mir, nicht nur persönlich zu wachsen, sondern auch positiv auf die Menschen um mich herum einzuwirken. Offenheit ist für mich das Schlüsselwort für 2024 – ein Jahr, in dem ich mich auf das Wesentliche konzentrieren und neue Wege des Lernens und der Gemeinschaft erkunden möchte. + +### 2. Offenheit in meinem Alltag: Eine neue Perspektive +In meinem Streben nach Offenheit im neuen Jahr möchte ich diese nicht nur als abstraktes Konzept verstehen, sondern sie konkret in meinen Alltag integrieren. Offenheit in meiner täglichen Kommunikation und in meinen Beziehungen soll zu einem zentralen Fokus werden. + +Erstens plane ich, in meinen beruflichen Beziehungen geschlossene Systemen zu überwinden. Dies bedeutet für mich, mich aktiv um eine Kultur der Offenheit und Transparenz zu bemühen. Ich möchte die Silo-Mentalität abbauen, die in vielen Organisationen vorherrscht, und stattdessen eine Umgebung schaffen, in der Wissen und Informationen frei geteilt werden. Durch das Überwinden geschlossener Systeme erhoffe ich mir, ein integratives und kollaboratives Arbeitsumfeld zu fördern, in dem Ideen und Innovationen gedeihen können. +Das bedeutet Social-Media-Walls und geschlossene Plattformen (sowie meine [23.461 Tweets](https://tweets.joerg-lohrer.de/)) hinter mir zu lassen und offene, dezentrale Anschlussmöglichkeiten zu erlernen um Offenheit auch substantiell und nachhaltig zu ermöglichen. + +Ein weiterer Aspekt meiner Alltags-Offenheit bezieht sich auf meine persönliche Entwicklung. Ich möchte mich neuen Erfahrungen und Herausforderungen stellen, die mich aus meiner Komfortzone herausholen. Das kann bedeuten, Permakultur auszuprobieren, mich wieder musikalisch zu betätigen oder meine Kompetenzen online zu erweitern. Diese Schritte sollen nicht nur zur Selbstentfaltung beitragen, sondern auch meine Fähigkeit stärken, mit Veränderungen und Unsicherheiten umzugehen. + +Schließlich erkenne ich, dass Offenheit auch bedeutet, sich selbst gegenüber ehrlich zu sein. Es geht darum, meine eigenen Gefühle, Ängste und Hoffnungen anzuerkennen und sie nicht zu unterdrücken. Indem ich mir meiner eigenen inneren Welt bewusst werde, kann ich authentischer mit anderen interagieren und eine tiefere Selbstkenntnis entwickeln, die mich dann hoffentlich auch anschlussfähiger macht. Also mehr Offenheit in Arbeit und [freiZEIT](https://relilab.org/freizeit/) + +Durch diese konkreten Schritte hoffe ich, Offenheit zu einem integralen Bestandteil meines täglichen Lebens zu machen. Ich bin überzeugt, dass dies nicht nur mein persönliches Wachstum fördern, sondern auch meine Beziehungen zu anderen bereichern wird. Offen zu sein bedeutet für mich, aktiv und bewusst zu leben, immer bereit, neue Perspektiven zu erkunden und das Leben in all seinen Facetten zu umarmen. Indem ich Offenheit in meinen Alltag integriere, öffne ich die Tür zu einer Welt voller neuer Möglichkeiten, Lernerfahrungen und tiefgreifender Verbindungen. + +### 3. Offenheit in Bildung und Lernen: Ein lebenslanger Prozess + +In meinem Streben nach Offenheit im Jahr 2024 möchte ich mich besonders auf den Bereich der Bildung und des Lernens in offenen Communities konzentrieren. Offene Bildungsressourcen (OER) bieten eine wunderbare Gelegenheit, sich kontinuierlich weiterzuentwickeln und zu lernen. Meine Beteiligung an OER ist nicht nur ein berufliches Engagement, sondern auch ein persönliches Anliegen, das meine Leidenschaft für lebenslanges Lernen widerspiegelt. + +Ich sehe OER als eine Möglichkeit, Bildung zugänglicher und inklusiver zu gestalten. Durch meine Beteiligung an Projekten und Initiativen, die OER-Communities fördern, möchte ich dazu beitragen, Wissen frei verfügbar zu machen und Lernmöglichkeiten für Menschen aus unterschiedlichen Hintergründen zu schaffen. Dies beinhaltet auch die Förderung von Netzwerkknoten und Gemeinschaften, die offene Bildungsressourcen unterstützen und entwickeln. + +Ein weiterer Schwerpunkt für mich ist die kontinuierliche eigene Weiterbildung durch OER. Ich plane, Online-Kurse, Webinare und andere offene Bildungsangebote zu nutzen, um meine Fähigkeiten und mein Wissen zu erweitern. Dieses Engagement für das lebenslange Lernen ist ein Kernaspekt meiner persönlichen und beruflichen Entwicklung. + +Ich möchte auch mein Netzwerk aus Gleichgesinnten erweitern, die den Wert offener Bildung erkennen und fördern, wie beispielsweise im [Bündnis Freie Bildung](https://buendnis-freie-bildung.de/). Durch den Austausch mit anderen, die in diesem Bereich aktiv sind, kann ich neue Ideen und Perspektiven gewinnen und gleichzeitig meine eigenen Erfahrungen teilen. Dieser Austausch wird mir helfen, meine Rolle in der OER-Community zu stärken und effektiver zur Weiterentwicklung von offenen Bildungsressourcen beizutragen. + +Schließlich sehe ich Offenheit in der Bildung als einen Weg, um kritisch zu denken und kreative Lösungen für Herausforderungen zu finden. Offene Bildungsressourcen ermutigen mich, über traditionelle Lernmethoden hinauszugehen und innovative Ansätze in meinem Lernprozess zu erkunden. + +### 4. Qualitätssicherung und Standardisierung in OER +Mein Engagement für Offenheit im Bildungsbereich im Jahr 2024 beinhaltet auch einen starken Fokus auf die Qualitätssicherung und Standardisierung von Offenen Bildungsressourcen (OER). Mir ist bewusst, dass die Qualitätssicherung eine der größten Herausforderungen im Umgang mit OER darstellt, da es oft an standardisierten Bewertungskriterien fehlt. + +Um die Qualität von OER zu gewährleisten, plane ich, mich aktiv an der Entwicklung und Anwendung von Qualitätsstandards zu beteiligen. Dies könnte die Mitarbeit in Gremien oder Initiativen umfassen, die sich mit der Erstellung von Richtlinien und Best Practices für OER beschäftigen und beispielsweise auch eine intensivere Zusammenarbeit mit [WirLernenOnline - Freie Bildung zum Mitmachen](https://www.wirlernenonline.de/). Ich möchte sicherstellen, dass die mit mir gemeinschaftlich genutzten oder erstellten Ressourcen nicht nur frei zugänglich, sondern auch von hoher Qualität, wiederauffindbar und nachhaltig zugänglich sind. + +Ein weiterer Schritt in Richtung Qualitätssicherung ist die Teilnahme am Veranstaltungen wie dem [OERcamp](https://www.oercamp.de/), um mein Wissen über die besten Methoden zur Erstellung und Bewertung von OER zu vertiefen. Durch das Erlernen von Techniken zur effektiven Überprüfung und Bewertung von Bildungsmaterialien kann ich zur Verbesserung der Qualität der Ressourcen, mit denen ich arbeite, beitragen. + +Darüber hinaus möchte ich mich für die Förderung einer Kultur der kontinuierlichen Verbesserung und des Feedbacks innerhalb der OER-Community einsetzen. Dies bedeutet, offene Diskussionen über die Qualität von Ressourcen zu fördern und Plattformen, wie beispielsweise [rpi-virtuell](https://rpi-virtuell.de/), dem [relilab](https://relilab.org/) oder die [ZUM](https://www.zum.de/) für Peer-Reviews und Nutzerfeedback zu nutzen. Ich glaube, dass eine solche Kultur nicht nur die Qualität der Ressourcen verbessert, sondern auch das Bewusstsein und das Engagement der Community für hohe Standards stärkt. + +Insgesamt sehe ich die Qualitätssicherung und Standardisierung in OER als wesentliche Elemente meiner Bemühungen um Offenheit im Bildungsbereich. Durch die Fokussierung auf diese Aspekte hoffe ich, nicht nur zu meiner persönlichen Entwicklung beizutragen, sondern auch die Effektivität und Glaubwürdigkeit von OER als Werkzeug für lebenslanges Lernen zu stärken. + +### 5. Die Rolle der Technologie: Ermöglicher von Offenheit +In meinem Bestreben, Offenheit in meinem Leben im Jahr 2024 zu fördern, erkenne ich die entscheidende Rolle, die Technologie dabei spielt. Ich sehe Technologie als einen wesentlichen Ermöglicher an, der es mir ermöglicht, Offenheit in verschiedenen Bereichen meines Lebens zu integrieren und zu erweitern. + +Einer der Hauptaspekte, in denen ich Technologie nutzen möchte, ist die Verbesserung meiner Zugänglichkeit und Teilnahme an offenen Bildungsressourcen und Plattformen. Dies umfasst die Nutzung digitaler Plattformen für OER, die es mir und anderen ermöglichen, auf eine Vielzahl von Bildungsmaterialien zuzugreifen und diese mit anderen zu teilen. Ich plane, diese Tools zu nutzen, um mein Wissen zu erweitern und gleichzeitig zur Gemeinschaft beizutragen, indem ich eigene Inhalte erstelle und offen teile. +Nicht nur die dezentrale offene Bereitstellung, freie Lizenzen und offene Schnittstellen scheinen mir hier wichtig sondern auch die Offenheit der Gemeinschaft und die zugrundeliegenden Open-Source-Technologien, die uns zusammenbringen und zusammenhalten. + +Darüber hinaus möchte ich moderne Kommunikationstechnologien nutzen, um meine Beziehungen sowohl im persönlichen als auch im beruflichen Bereich zu stärken. Dies beinhaltet die Nutzung von sozialen Medien auf Basis des offenen Fediverse [joerglohrer@reliverse.social](https://reliverse.social/@joerglohrer), die Messaging App Element auf der Basis des offenen Matrix-Protokolls [@joerglohrer:rpi-virtuell.de](https://element.rpi-virtuell.de/#/user/@joerglohrer:rpi-virtuell.de), und Publikationsmöglichkeiten über das [offene ActivityPub Protokoll, das beispielsweise auch in WordPress integriert ist](https://news.rpi-virtuell.de/2023/12/06/wordpress-verwandle-dein-blog-in-einen-fediverse-server/). Durch diese Technologien kann ich meine Netzwerke pflegen und erweitern, während ich gleichzeitig offen für neue Perspektiven und Möglichkeiten bleibe. + +> "*Lassen Sie uns im Fediversum bloggen und podcasten und schreiben und filmen, als ob unser Leben davon abhinge. Denn unser demokratisches Leben hängt davon ab!* ([Michael Blume - Nur noch das Fediversum kann uns retten](https://scilogs.spektrum.de/natur-des-glaubens/nur-noch-das-fediversum-kann-uns-retten-neujahrsrede-zu-salach/)) + +Ein weiterer Bereich, in dem ich Technologie als Ermöglicher von Offenheit sehe, ist die persönliche Organisation und Produktivität. Die Nutzung digitaler Tools wie Kalender-Apps, Aufgabenmanager und Cloud-Speicher in einer Open source Kollaborationslösung wie der [Nextcloud](https://cloud.rpi-virtuell.de/) erleichtert es mir, organisiert zu bleiben und meinen Alltag effizient zu gestalten. Offenere Hardwarelösungen, die sich daran anbinden lassen mit z.B. einem FairPhone für die mobile Arbeit soll mir ermöglichen offener und flexibler zu sein, indem sie mir erlauben, meine Zeit und Ressourcen besser zu verwalten und unabhängiger von lizenzierten und geschlossenen Systemen zu werden. + +Schließlich sehe ich in den noch kommenden technischen Entwicklungen ebenfalls großes Potenzial, Offenheit in noch nie dagewesener Weise zu fördern. Ich bin gespannt darauf, wie neue Technologien wie Künstliche Intelligenz, erweiterte Realität und Big Data genutzt werden können, um Bildung, Arbeit und persönliche Entwicklung zu revolutionieren. Ich plane, nicht nur offen für das Erlernen und die Anwendung dieser Technologien zu sein, sondern in offenen Lernszenarien auch an der gemeinschaftlichen Entwicklung zu partizipieren, beispielsweise im [Forum Offene KI in der Bildung der Wikimedia](https://www.wikimedia.de/forum-offene-ki-bildung/). + +### 6. Ausblick: Aufbau einer Community of Trust durch Offenheit + +Während ich also einen Ausblick auf das Jahr 2024 wage, sehe ich den Aufbau und die Pflege einer „Community of Trust“ – einer Gemeinschaft, die auf Vertrauen basiert – als zentrales Ziel meiner Bemühungen um Offenheit an. +Eine solche Gemeinschaft zeichnet sich durch gegenseitigen Respekt, Transparenz und Unterstützung aus und bildet die Grundlage für nachhaltige und bedeutungsvolle Beziehungen sowohl im beruflichen als auch im privaten Bereich. + + +#### Kontakte und Vernetzung: + +**Aktives Networking**: Ich plane, mein Netzwerk aktiv zu erweitern, indem ich mich an Gemeinschaften und Gruppen beteilige, die ähnliche Werte teilen. Dies kann durch Teilnahme an Konferenzen, Workshops und Online-Foren geschehen, wo ich Gleichgesinnte treffen und mich mit ihnen austauschen kann. + +**Kultur der Digitalität**: Ich beabsichtige, digitale Technologien und soziale Medien zu nutzen, um mein Netzwerk zu erweitern und zu pflegen. Dies ermöglicht es mir, mit Menschen aus verschiedenen Teilen der Welt in Kontakt zu treten und Ideen und Erfahrungen auszutauschen. + +**Kollaborative Projekte**: Durch die Arbeit an gemeinsamen Projekten, die Offenheit und Kreativität fördern, kann ich enge Beziehungen zu anderen aufbauen und gleichzeitig zur Gemeinschaft beitragen. + +#### Community of Trust: + +**Vertrauensfördernde Maßnahmen:** Um eine Atmosphäre des Vertrauens zu schaffen, möchte ich offene Kommunikation und transparente Praktiken in allen meinen Interaktionen anwenden. Dies beinhaltet das Teilen von Wissen und Erfahrungen sowie das Zulassen von Verletzlichkeit und Echtheit in meinen Beziehungen. + +**Gegenseitige Unterstützung**: Eine Community of Trust basiert auf gegenseitiger Unterstützung und Ermutigung. Ich plane, anderen aktiv zu helfen und Unterstützung anzubieten, wo immer es möglich ist, und hoffe, dass dies zu einer Kultur der Zusammenarbeit und des Teilens beiträgt. + +**Langfristige Beziehungen**: Mein Ziel ist es, langfristige Beziehungen aufzubauen, die auf gemeinsamen Werten und gegenseitigem Vertrauen basieren. Diese Beziehungen werden nicht nur mein persönliches Wachstum fördern, sondern auch dazu beitragen, eine stärkere und widerstandsfähigere Gemeinschaft zu schaffen. + +Abschließend ist mein Ausblick für das Jahr 2024 und darüber hinaus, eine Community of Trust zu kultivieren, die sich durch gegenseitigen Respekt und eine gemeinsame Vision für Offenheit auszeichnet. Ich glaube, dass durch die Entwicklung einer solchen Gemeinschaft nicht nur persönliche und berufliche Beziehungen gestärkt werden, sondern auch ein Umfeld entsteht, in dem Innovation und Kreativität gedeihen können. Der Schlüssel dazu liegt in der aktiven Pflege von Beziehungen, dem Engagement für transparente Kommunikation und der Bereitschaft, sich auf andere einzulassen und von ihnen zu lernen. + +Dies ist ein Beitrag zu [Teil 1 "Mein (schulisches) Motto für 2024" der EduBlogparade](https://herrmess.de/2024/01/07/edublogparade-2024-1-runde/) + +Beitragsbild Public Domain [CC0](https://creativecommons.org/publicdomain/zero/1.0/deed.de) +Midjourney Prompt: "A Community of Trust based on Openness, silhouettes of people of all genders and ages that merge into each other and overlap, watercolors --v 6.0 --seed 1235164279" + +![](offenheit-wesentlich.png) + +## Austausch und Diskussion zu diesem Beitrag +- offen und dezentral + - **[hier auf Mastodon im Fediverse](https://reliverse.social/@joerglohrer/111766716255004412)** +- geschlossen und plattformgebunden + - [hier auf bluesky](https://bsky.app/profile/joerglohrer.bsky.social/post/3kj4h76gouw2v) + - [hier in Threads](https://www.threads.net/@joerglohrer/post/C2K0CP5s4RM) + - [hier in Linkedin](https://www.linkedin.com/feed/update/urn:li:activity:7153070579732946944/) \ No newline at end of file diff --git a/content/posts/2024-01-16-offenheit-das-wesentliche/offenheit-wesentlich.png b/content/posts/2024-01-16-offenheit-das-wesentliche/offenheit-wesentlich.png new file mode 100644 index 0000000..a0fa0cd Binary files /dev/null and b/content/posts/2024-01-16-offenheit-das-wesentliche/offenheit-wesentlich.png differ diff --git a/content/posts/2024-03-05-bottomup-markdown/bottomup-markdown.png b/content/posts/2024-03-05-bottomup-markdown/bottomup-markdown.png new file mode 100644 index 0000000..c0bc6d0 Binary files /dev/null and b/content/posts/2024-03-05-bottomup-markdown/bottomup-markdown.png differ diff --git a/content/posts/2024-03-05-bottomup-markdown/index.md b/content/posts/2024-03-05-bottomup-markdown/index.md new file mode 100644 index 0000000..27ce0dc --- /dev/null +++ b/content/posts/2024-03-05-bottomup-markdown/index.md @@ -0,0 +1,44 @@ +--- +layout: post +title: "BottomUp -> MarkDown - 5V-Power für deine OER!" +slug: "BottomUp-MarkDown" +description: Open Educational Resources mit MarkDown +image: bottomup-markdown.png +cover: + image: bottomup-markdown.png +date: 2024-03-05 +author: Jörg Lohrer +tags: [ "Offenheit", "OER", "MarkDown", "Community" ] +lang: de +dir: ltr +--- + +## Eine Session-Idee auf dem #OERcamp 24 in Hamburg +Entfessele deine kreative Superkraft und erstelle Open Educational Resources (OER) mit Markdown! + +In dieser Session tauchst du ein in die Welt der 5V-Freiheiten von Open Content und lernst gleichzeitig die Markdown-Sprache kennen – dein perfektes Werkzeug, um diese Freiheiten zu nutzen! + +## BottomUp MarkDown: + +* **Verwahren & Vervielfältigen**: Gestalte direkt online ohne Software, Registrierungen oder Anmeldungen. Lade deine OER herunter, sichere sie und erstelle so viele Kopien, wie du benötigst – ganz ohne Limits! Mit Markdown speicherst du deine Inhalte im praktischen und leicht editierbaren Textformat. +* **Verwenden**: Ob im Unterricht, in Lerngruppen oder online – bringe deine OER in allen erdenklichen Kontexten zum Einsatz! Markdown macht deine Inhalte überall zugänglich und flexibel. Auch Vorlagen von Lehrenden, die Lernende übernehmen und anpassen können sind einfach bereitgestellt. +* **Verarbeiten**: Bearbeite deine Inhalte, passe sie an deine Bedürfnisse an und kreiere neue Lernmaterialien – deiner Fantasie sind keine Grenzen gesetzt! Markdown bietet dir die Freiheit, deine OER ständig weiterzuentwickeln, zu versionieren und zu verändern. +* **Vermischen**: Kombiniere deine OER mit anderen offenen Inhalten, erweitere sie mit Bildern, Videos und Musik (sogar urheberrechtlich geschützten Werken) und schaffe einzigartige Lernerlebnisse! Markdown lässt sich nahtlos mit anderen Formaten und Medien kombinieren. +* **Verbreiten**: Teile deine OER mit der Welt! Veröffentliche sie online, versende sie an Freunde und Kollegen und trage zur globalen Wissensgemeinschaft bei! Mit Markdown präsentierst du deine OER im Web in einem ansprechenden und nutzerfreundlichen Format, das barrierefrei weiternutzbar ist unanbhängig von technischer Infrastruktur oder Plattformen. + +### In dieser Session: + +* **Entfessele die Markdown-Mania**: Lerne die Syntax der Sprache kennen und erstelle im Handumdrehen deine ersten OER. +* **Gestalte deine Inhalte mit Superkräften**: Formatiere Texte, füge Bilder und Tabellen ein und erstelle interaktive Elemente. Markdown gibt dir alle Werkzeuge dafür an die Hand. +* **Veröffentliche deine OER im Internet**: Erfahre, wie du deine Materialien online zugänglich machst und mit anderen teilst. Mit Markdown ist die Veröffentlichung deiner OER ein Kinderspiel. +* **Werde Teil der OER-Community**: Vernetze dich mit anderen Lernenden und Lehrenden und profitiere vom Austausch in der Community. Gemeinsam gestalten wir die Zukunft des Lernens mit Markdown! + +![](bottomup-markdown.png) + +## Austausch und Diskussion zu diesem Beitrag +- offen und dezentral + - **[hier auf Mastodon im Fediverse](https://reliverse.social/@joerglohrer/112044212054942606)** +- geschlossen und plattformgebunden + - [hier auf bluesky](https://bsky.app/profile/joerglohrer.bsky.social/post/3kmxobg2grq22) + - [hier in Threads](https://www.threads.net/@joerglohrer/post/C4JAGtZMLg8) + - [hier in Linkedin](https://linkedin.com/feed/update/urn:li:activity:7170830032897056768/) \ No newline at end of file diff --git a/content/posts/2024-04-03-kibedenken-bewusstsein/index.md b/content/posts/2024-04-03-kibedenken-bewusstsein/index.md new file mode 100644 index 0000000..68e08ff --- /dev/null +++ b/content/posts/2024-04-03-kibedenken-bewusstsein/index.md @@ -0,0 +1,52 @@ +--- +layout: post +title: "KIBedenken - Bewusstsein" +slug: "KIBedenken - Bewusstsein" +description: Intelligenz oder Bewusstsein? +image: kibedenken.png +cover: + image: kibedenken.png + caption: "[CC0](https://creativecommons.org/publicdomain/zero/1.0/deed.de) Das Foto des Roboters, der seine Reflexion im Wasser betrachtet referenziert auf Narziss aus der griechischen Mythologie, der die Liebe anderer zurückwies und sich in sein eigenes Spiegelbild verliebte und die Illustration von Caravaggio [(siehe wikipedia #Narziss)](https://de.wikipedia.org/wiki/Narziss#) erstellt mit der KI Midjourney und dem Prompt: *photographed with the Canon EOS 5D Mark IV a young robot boy with his head down, looking at his reflection in water --v6.0* " + alt: "Das Foto des Roboters, der seine Reflexion im Wasser betrachtet referenziert auf Narziss aus der griechischen Mythologie, der die Liebe anderer zurückwies und sich in sein eigenes Spiegelbild verliebte und die Illustration von Caravaggio [(siehe wikipedia #Narziss)](https://de.wikipedia.org/wiki/Narziss#) erstellt mit der KI Midjourney und dem Prompt: *photographed with the Canon EOS 5D Mark IV a young robot boy with his head down, looking at his reflection in water --v6.0*" +date: 2024-04-03 +author: Jörg Lohrer +comments: + host: reliverse.social + username: joerglohrer + id: 112208546053995638 +tags: [ "Künstliche Intelligenz", "Bewusstsein", "Religionspädagogik", "Community" ] +lang: de +dir: ltr +license: https://creativecommons.org/licenses/by/4.0/deed.de +creator: + - givenName: Jörg + familyName: Lohrer + id: https://orcid.org/0000-0002-9282-0406 + type: Person + affiliation: + name: Comenius-Institut + id: https://ror.org/025e8aw85 + type: Organization +--- + +# #KIBedenken - Bewusstsein +Den für mich derzeit wichtigsten Impuls über KI nachzudenken lieferte vor einigen Wochen [Yuval Noah Harari an der University of Cambridge am Ende eines Podiumsgesprächs hier ab 1:15 h auf youtube](https://youtu.be/XmhLmZwc2es?si=AOomz4ygJI35j-o8&t=4502): + + +> Ich denke, wir müssen die Frage des Bewusstseins in den Mittelpunkt der Diskussion stellen. Es gibt eine riesige, riesige Verwirrung in der Terminologie, auch in der Welt der KI, zwischen Bewusstsein und Intelligenz. Aber es sind zwei verschiedene Dinge. Intelligenz ist die Fähigkeit, Probleme zu lösen und Ziele zu erreichen. Bewusstsein ist die Fähigkeit, Dinge zu fühlen, wie Schmerz oder Freude oder Liebe oder Hass. Wir neigen dazu, die beiden zu verwechseln, weil bei Menschen und auch bei anderen Säugetieren, Vögeln und anderen Tieren Bewusstsein und Intelligenz zusammengehören. Wir lösen Probleme durch unsere Gefühle. Computer waren bisher sehr anders. Sie sind in einigen Bereichen bereits intelligenter als wir, haben aber, soweit wir wissen, kein Bewusstsein. Soweit wir wissen, können sie überhaupt keinen Schmerz, keine Freude, keine Liebe oder keinen Hass empfinden. Niemand weiß, was in Zukunft passieren wird. Es gibt Modelle und Theorien, die argumentieren, dass KIs irgendwann auch bewusst oder empfindsam werden. Sie werden anfangen, Dinge zu fühlen. Sie werden anfangen, Schmerz oder Liebe oder Hass zu empfinden. Es gibt andere Modelle und Theorien, die sagen, nein. Sie könnten weit intelligenter werden als wir und immer noch null Bewusstsein haben. Das kann in der Evolution des Lebens sein. Wenn man darüber nachdenkt, die lange Entwicklung von Milliarden von Jahren der Evolution. Die Entwicklung der Intelligenz ist im Falle von Tieren wie uns und Schimpansen und Hunden und Schweinen und so weiter durch die Entwicklung des Bewusstseins verlaufen. Aber das ist kein universelles Gesetz der Evolution der Intelligenz. Vielleicht gibt es alternative Wege, die zu Superintelligenz ohne jegliches Bewusstsein führen. Einfach einen anderen, einen fremden Weg gehen. Und wir könnten an einen Punkt gelangen, an dem sie superintelligent sind und trotzdem null Bewusstsein haben. Und die Gefahr besteht dann darin, dass sie nicht nur die menschliche Zivilisation zerstören könnten, sondern das ganze Licht des Bewusstseins, um das gesamte ökologische System nach ihren Bedürfnissen umzugestalten, wofür sie kein Bewusstsein brauchen. Sie funktionieren auf eine völlig andere Weise. Sie könnten sich sogar von der Erde auf andere Planeten, auf andere Galaxien ausbreiten. Sie werden das Universum mit Intelligenz füllen, aber es wird ein völlig dunkles Universum ohne Bewusstsein sein. Wieder hohe Intelligenz, fähig, Raumschiffe zu bauen, die mit Lichtgeschwindigkeit fliegen und was auch immer, aber es gibt null Gefühl. Niemand, keine Entität fühlt Schmerz oder Freude, Liebe oder Hass. Für mich ist das ein schreckliches Szenario. Das schlimmste Szenario von allen ist dies. Dass wir ein Universum voller Intelligenz und völlig ohne Bewusstsein haben werden, denn ich denke, dass von den beiden das Bewusstsein weitaus wichtiger, weitaus wertvoller ist. Und es ist eine gute Erinnerung daran, dass wir das zumindest heute mit vielen anderen Tieren teilen, aber nicht mit den Computern, nicht mit den KIs. Wir sind also immer noch im selben Team wie die Würmer und die Affen, nicht im selben Team wie die Computer. + + +Ich denke, hier wird eine Spur gelegt, die sich unterscheidet von der reinen Funktion von KI zur intelligenten Verbesserung und Unterstützung von Lernprozessen oder vielfältigem Kompetenzerwerb hin zur Selbstreflexion der Lernenden. +Auch im Blick auf (religionsbezogene) Bildung kennen wir den Mensch nicht nur biologisch, wie die Würmer und Affen sondern auch ausgestattet mit Würde, Entscheidungsfreiheit und als Beziehungswesen, das auf ein Gegenüber ausgerichtet sein kann und, wie Harari sagt, nicht im selben Team wie die Computer spielt. +Sinn, Seele und Verstand erhalten wir weder aus uns selbst heraus noch von einer wie auch immer gearteten Intelligenz. +Liebe, Gnade, Hoffnung, Frieden, Gemeinschaft, Trost, Zuversicht und viele weiteren lebensbedeutsame Erfahrungen gewinnen im Angesicht von Maschinen aus meiner Sicht an elementarer Bedeutung. + +Dies ist ein Beitrag zur Blogparade #KIBedenken von [Joscha Falck](https://joschafalck.de/blogparade-kibedenken/) und [Nele Hirsch](https://ebildungslabor.de/blog/aufruf-zur-blogparade-kibedenken/) + +## Austausch und Diskussion zu diesem Beitrag +- offen und dezentral + - **[hier auf Mastodon im Fediverse](https://reliverse.social/@joerglohrer/112208546053995638)** +- geschlossen und plattformgebunden + - [hier auf bluesky](https://bsky.app/profile/joerglohrer.bsky.social/post/3kpanjqwe3l2g) + - [hier in Threads](https://www.threads.net/@joerglohrer/post/C5TvJMrMN5D) + - [hier in Linkedin](https://linkedin.com/feed/update/urn:li:activity:7181348226032107522/) \ No newline at end of file diff --git a/content/posts/2024-04-03-kibedenken-bewusstsein/kibedenken.png b/content/posts/2024-04-03-kibedenken-bewusstsein/kibedenken.png new file mode 100644 index 0000000..f4f3bc7 Binary files /dev/null and b/content/posts/2024-04-03-kibedenken-bewusstsein/kibedenken.png differ diff --git a/content/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png b/content/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/content/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png differ diff --git a/content/posts/2025-03-04-dezentrale-oep-oer/index.md b/content/posts/2025-03-04-dezentrale-oep-oer/index.md new file mode 100644 index 0000000..2e32c35 --- /dev/null +++ b/content/posts/2025-03-04-dezentrale-oep-oer/index.md @@ -0,0 +1,135 @@ +--- +layout: post +title: "Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter" +slug: "Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter" +description: "Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der + Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational + Resources (OER) und Open Educational Practices (OEP) notwendig ist, um + nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei + wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet" +image: dezentrale-oep-oer.png +cover: + image: dezentrale-oep-oer.png + caption: "Ein in den Sand gezeichneter Strauß mit den Buchstaben 'OER' – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu 'Nostr' (das dezentralisierte Kommunikationsprotokoll) liegt nahe: 'Nostr' klingt wie ein Teil von 'Ostrich' (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig." + alt: "Ein in den Sand gezeichneter Strauß mit den Buchstaben 'OER' – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu 'Nostr' (das dezentralisierte Kommunikationsprotokoll) liegt nahe: 'Nostr' klingt wie ein Teil von 'Ostrich' (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig." +date: 2025-03-04 +author: + - Jörg Lohrer + - Steffen Rörtgen + - Bastian Granas +comments: + host: reliverse.social + username: comenius + id: 114104961785328046 +tags: [ "Künstliche Intelligenz", "Bewusstsein", "Religionspädagogik", "Community" ] +lang: de +dir: ltr +license: https://creativecommons.org/licenses/by/4.0/deed.de +creator: + - givenName: Jörg + familyName: Lohrer + id: https://orcid.org/0000-0002-9282-0406 + type: Person + affiliation: + name: Comenius-Institut + id: https://ror.org/025e8aw85 + type: Organization + - givenName: Steffen + familyName: Rörtgen + id: https://orcid.org/0000-0001-6378-2618 + type: Person + - givenName: Bastian + familyName: Granas + type: Person + affiliation: '' +keywords: + - OER + - OEP + - Dezentrale Bildung + - Interoperabilität + - Nostr +inLanguage: + - de +about: + - https://w3id.org/kim/hochschulfaechersystematik/n052 + - https://w3id.org/kim/hochschulfaechersystematik/n079 + - https://w3id.org/kim/hochschulfaechersystematik/n544 +learningResourceType: + - https://w3id.org/kim/hcrt/text + - https://w3id.org/kim/hcrt/web_page +educationalLevel: + - https://w3id.org/kim/educationalLevel/level_A +datePublished: '2025-03-04' +--- + +# Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +*Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft* + +--- + +### **Warum wir eine neue Perspektive brauchen** + +Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. +Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities. + +Doch Bildung sollte resilient sein – unabhängig von politischen oder finanziellen Rahmenbedingungen und gewissermaßen auch von der Plattform, auf der man gerade agiert. + +Hier setzt die Vision eines **dezentralen Datenraums** an: Statt zentraler Kontrolle verteilt er Daten auf viele Akteure, fördert Interoperabilität sowie Datensouveränität der Nutzer:innen und ermöglicht neue Geschäftsmodelle. +Inspiriert vom Messaging Protokoll "[Nostr](https://nostr.how/de/what-is-nostr)" – ursprünglich für zensurresistente soziale Netzwerke entwickelt – könnte so eine Infrastruktur entstehen, die Offenheit, Teilhabe und Vernetzung ins Zentrum stellt. + +--- + +### Von OER zu OEP: Offenheit als Haltung + +**Open Educational Resources (OER)** als frei verfügbare Bildungsmaterialien sind nur der erste Schritt. +Echte **Open Educational Practices (OEP)** umfassen eine Kultur des Teilens, kollaboratives Lernen und demokratische Bildungsprozesse. +Wie [Kerstin Mayrberger betont, geht es bei OEP im Kern um „Demokratiebildung](https://blog.bildungsserver.de/open-educational-practices-ist-viel-mehr-als-nur-der-einsatz-von-open-educational-resources/)“: Lernende und Lehrende gestalten gemeinsam Inhalte, hinterfragen Strukturen und entwickeln kritisches Denken. + +Doch dafür braucht es mehr als nur frei lizenzierte Materialien. Es braucht (freie) Infrastrukturen, die: + +1. **Partizipation ermöglichen**: Nutzer:innen behalten die Kontrolle über ihre Daten und Interaktionen. +2. **Resilienz schaffen**: Dezentrale Speicherung verhindert den „Stecker-Ziehen-Effekt“. +3. **Vernetzung fördern**: Plattformübergreifende Zusammenarbeit wird zur Norm, nicht zur Ausnahme. + +--- + +### Wie Nostr die Bildungsinfrastruktur revolutionieren könnte + +Die technische Grundlage für vernetzte Bildung sollte also nicht analog zu Systemen entwickelt werden, deren Grundlage ist, Nutzer und Inhalte (oft ökonomisch gewollt) an sich zu binden. +Stattdessen sollte sie strukturell so angelegt sein, die digitale Vernetzung, die wir uns für die Bildung wünschen, bereits grundlegend zu enthalten. +Wir suchen somit nicht nach lokalen Softwarelösungen für die Organisation von OER- und OEP-Communities, sondern nach grundlegenden Technologieansätzen, die diese Anforderungen erfüllen können. +Dadurch rücken neben den Schnittstellenlösungen, die Plattformen entwickeln müssen, um künftig anschlussfähig zu sein, zunehmend die zugrunde liegenden Protokolle für Zusammenarbeit und vernetzte Bildung in den Fokus einer Entwicklung, wenn diese auf Wirkung und Nachhaltigkeit angelegt sein soll. + +Das [Nostr-Protokoll](https://nostr.how/de/what-is-nostr) erfüllt diese grundlegenden Anforderungen: + +- **Clients & Relays**: Bildungsplattformen agieren als Clients, die mit Relays (dezentralen Servern) verbunden sind. Jede Institution kann eigene Relays betreiben, die Daten synchronisieren – ähnlich wie E-Mails über verschiedene Provider versendet werden. +- **Events & Schlüsselpaare**: Lernmaterialien, Kommentare oder Sammlungen werden als „Events“ gespeichert, signiert mit kryptografischen Schlüsseln. So bleibt die Urheberschaft nachvollziehbar, ohne zentrale Autorität. +- **Interoperabilität & Erweiterbarkeit**: Das Protokoll ist modular aufgebaut, sodass verschiedene Eventtypen integriert werden können. So könnten Metadatenstandards wie das [Allgemeine Metadatenprofil (AMB)](https://dini-ag-kim.github.io/amb/latest/) abgebildet werden, um die Publikation und den Konsum von Bildungsmetadaten plattformübergreifend zu erleichtern. + + + +**Beispiel**: Eine Lehrkraft erstellt auf [MUNDO](https://mundo.schule/) eine Merkliste zu „Nachhaltigkeit“. Dieses Event wird via Nostr-Relays an [WirLernenOnline](https://wirlernenonline.de/) übertragen – die Liste ist somit auf Relays im Nostr-Netzwerk verfügbar. Selbst wenn MUNDO und WirLernenOnline offline gehen würden, wäre die Merkliste weiterhin verfügbar, da sie nicht auf der Plattform, sondern auf einem (oder mehreren) Relay(s) liegt. + +--- + +### Chancen für Gemeinschaft und Nachhaltigkeit + +Ein dezentraler Datenraum fördert nicht nur technische Resilienz, sondern auch neue Formen der Zusammenarbeit: + +- **Qualitätssicherung durch Crowdsourcing**: Da Nutzer:innen nicht mehr durch Plattformgrenzen künstlich getrennt werden, können sie übergreifend miteinander und mit Ressourcen interagieren und sich darüber austauschen. Ihr sozialer Graph kann dabei – ähnlich dem „Circle of Trust“ der norwegischen [NDLA](https://doi.org/10.25656/01:16993)-Plattform - genutzt werden, um die Relevanz von Ressourcen algorithmisch einzuordnen. +- **Monetarisierung ohne Abhängigkeit**: Services wie Metadaten-Anreicherung oder Premium-Relays (für personalisierte Feeds, zusätzliche Materialien) können monetarisierbar auf dem Protokoll abgebildet werden und könnten zusätzliche Einnahmequellen bieten, während die Infrastruktur gemeinfrei bleibt . +- **Empowerment kleiner Akteure**: Lokale und kleinere Initiativen, die bis heute (2025!) nicht in der Lage sind, sich und ihre Materialien selbst in die öffentliche Bildungsinfrastruktur einzubringen, erhalten erweiterte Möglichkeiten. + +--- + +### Aufruf zum Mitgestalten + +Die Umsetzung dieser Vision lebt von der Gemeinschaft. Inspiriert von Projekten wie [ReliLab](https://relilab.org/relilab/) oder [SynLLOER](https://synlloer.blogs.uni-hamburg.de/), laden wir ein: + +1. **Erprobt die Dezentralität**: Testet den **Proof of Concept** „[EduFeed](https://www.edufeed.org/)“, der Nostr für Bildungsmetadaten nutzt. +2. **Denkt infrastrukturübergreifend**: Entwickelt OER nicht im Silo, sondern integriert sie in dezentrale Netzwerke. +3. **Engagiert euch politisch**: Fordert Fördergelder für offene Protokolle statt proprietärer Plattformen. + +Wie [Niels Winkelmann im Digilog.Blog ](https://digilog.blog/2024/01/08/oep-groesser-denken/)schreibt: „OEP systemisch zu denken ist der Wind in den Segeln für eine Vision offener Bildung“ . +Lasst uns gemeinsam die Segel setzen – dezentral, partizipativ und zukunftssicher! +:sailboat: "[for a race we must win](https://www.team-malizia.com/news/the-message-behind-our-slogan-a-race-we-must-win)" \ No newline at end of file diff --git a/content/search.md b/content/search.md new file mode 100644 index 0000000..505b99a --- /dev/null +++ b/content/search.md @@ -0,0 +1,8 @@ +--- +title: "Suche" # in any language you want +layout: "search" # necessary for search +# url: "/archive" +# description: "Description for Search" +summary: "search" +placeholder: "placeholder text in search input box" +--- \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-15-nostr-page-design.md b/docs/superpowers/specs/2026-04-15-nostr-page-design.md new file mode 100644 index 0000000..d65a13a --- /dev/null +++ b/docs/superpowers/specs/2026-04-15-nostr-page-design.md @@ -0,0 +1,470 @@ +# Nostr-Page auf Basis von Events — Design-Spec + +**Datum:** 2026-04-15 +**Status:** Entwurf, ausstehende User-Freigabe +**Scope:** Ablösung der Hugo-Seite `joerg-lohrer.de` durch eine SvelteKit-SPA, die Blog-Posts live aus Nostr-Events rendert. Diese Spec beschreibt **nur die SPA und den Event-/URL-Kontrakt**. Publish-Pipeline (Markdown → Event → Relays + Assets-Upload) ist separate Spec. + +--- + +## 1. Gesamtarchitektur + +``` + Browser JS-loser Client / Bot + │ │ + ▼ ▼ + ┌─────────────────────────────┐ ┌───────────────────────────┐ + │ All-Inkl (statisches Hosting)│ │ All-Inkl liefert │ + │ • index.html (SPA-Shell) │ │ index.html (leere Shell, │ + │ • _app/*.js, *.css │ │ kein Post-Inhalt, keine │ + │ • .htaccess (SPA-Fallback) │ │ OG-Tags für Posts) │ + │ • images/ bzw. Permalink- │ └───────────────────────────┘ + │ Pfade für Altbilder │ + └──────────────┬──────────────┘ + │ + ▼ + ┌─────────────────────────────────────┐ + │ Public Nostr-Relays (wss://) │ + │ damus.io, nos.lol, nostr.wine, │ + │ relay.nostr.band … │ + │ (später erweiterbar um eigene) │ + └─────────────────────────────────────┘ + + Publish-Flow (separate Spec, nur Artefakte hier relevant): + Markdown → signiertes kind:30023 Event → Public-Relays + Bilder (Altbestand) → All-Inkl unter Post-Permalink-Pfad + Bilder (neu) → Blossom-Server (Multi-Upload, single URL im Markdown) +``` + +### Kernprinzipien + +- **All-Inkl hostet nur eine statische SPA-Shell** plus Assets: Altbilder (unter Post-Permalink-Pfaden), Site-Icons, `robots.txt`. Kein Post-Body, keine Stubs, kein Backend. +- **Posts existieren als signierte NIP-23-Events auf mehreren Public-Relays.** Die SPA holt sie zur Laufzeit. +- **URL-Struktur bleibt kompatibel zur bestehenden Hugo-Seite.** Backlinks brechen nicht. +- **Minimale eigene Infrastruktur jetzt** (keine eigene Relay-Instanz, kein eigener Blossom-Server). Alles nachrüstbar ohne Bruch. +- **Bewusst akzeptierte Kosten:** kein SEO, keine Social-Previews in Phase 1. Siehe Risiken und Evolutionspfad. + +### Kostenübersicht Phase 1 + +- All-Inkl: unverändert (vorhandener Tarif). +- Public-Relays: 0 €. +- Public-Blossom-Server (nur Neu-Bilder ab Phase 2): 0 €. +- Domain `joerg-lohrer.de`: unverändert. +- **Zusatzkosten: keine.** + +--- + +## 2. URL-Struktur, Routing, Event-Kontrakt + +### URL-Schema (kompatibel zur bestehenden Hugo-Struktur) + +| URL | Inhalt | +|---|---| +| `/` | SPA-Shell. SPA rendert Startseite (Profilkachel + Post-Liste). | +| `/YYYY/MM/DD/.html/` | SPA-Shell (via `.htaccess`-Fallback). SPA-Router extrahiert `` und lädt Event. | +| `/archives/` | SPA-Shell, SPA rendert chronologische Liste. | +| `/tag//` | SPA-Shell, SPA rendert Tag-Filter. | +| `/impressum/` | Statisches HTML (rechtlicher Content, liegt wirklich auf Server). | +| `/YYYY/MM/DD/.html/` | echte Bilddateien der 18 Altposts, liegen unter dem jeweiligen Post-Permalink. | +| `/favicon.ico`, `/logo.png`, `/robots.txt` | globale Site-Assets. | + +**Datum in der URL** dient nur der Backlink-Kompatibilität. Die SPA benötigt zur Event-Abfrage nur den `dtag`; sie fragt Relays mit `kinds:[30023], authors:[], #d:[]`. Das Datum ist URL-Dekoration. + +### `.htaccess` + +```apache +RewriteEngine On + +# HTTPS forcieren +RewriteCond %{HTTPS} !=on +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Existierende Datei oder Verzeichnis? Direkt ausliefern (Bilder, _app/*, favicon etc.). +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Alles andere → SPA-Fallback. +RewriteRule ^ /index.html [L] +``` + +### Event-Kontrakt (NIP-23, `kind:30023`) + +Normatives Schema; Publish-Spec muss es einhalten, SPA verlässt sich darauf. + +**Pflicht-Tags pro Event:** + +- `["d", ""]` — URL-Slug. Stabiler Identifier über Edits hinweg (replaceable-Semantik). +- `["title", ""]` +- `["published_at", ""]` — ursprüngliches Veröffentlichungsdatum. + +**Empfohlene Tags:** + +- `["summary", ""]` — genutzt in Listen-Previews. +- `["image", ""]` — Vorschaubild. +- `["t", ""]` — mehrfach erlaubt, Kategorien/Tags. + +**Content:** Markdown. Bilder als Markdown-Syntax mit absoluten URLs. + +**Bild-URL-Policy pro Post-Ära:** + +- Migrations-Posts (bestehende 18 Posts, 2013–2024): Bild-URLs auf `joerg-lohrer.de` unter Post-Permalink-Pfad, z. B. `https://joerg-lohrer.de/2023/03/23/gleichnis-vom-saemann.html/bild1.jpeg`. Bilder liegen tatsächlich dort. +- Neue Posts (ab Phase 2): Bild-URLs auf Blossom-Server, z. B. `https://blossom.primal.net/abc123…def.jpeg`. Upload zu 2–3 Blossom-Servern parallel (BUD-03-Pattern), Markdown referenziert jeweils nur eine URL. + +Die SPA unterscheidet die beiden Eras nicht — sie rendert Markdown, der Browser lädt die absolute URL, wo sie auch liegt. + +### SPA-Routing + +SvelteKit mit `adapter-static`, `ssr: false`, Fallback-Page `index.html`. Routen: + +- `/` → Home +- `/[year]/[month]/[day]/[dtag].html/` → PostView (nur `dtag` genutzt) +- `/archives/` → Archives +- `/tag/[name]/` → TagView +- `/impressum/` → eigener Impressum-Pfad (oder statisch außerhalb der SPA) + +**Hinweis zum `.html`-Suffix im Routing:** SvelteKit unterstützt statische Dateiendungen in dynamischen Segmenten nicht direkt. Lösung: Entweder den `.html`-Suffix im Parameter-Wert mitbehandeln (`[dtag]` matched den String inklusive `.html`, davon wird beim Auslesen `.html` abgeschnitten) oder den Pfad als Catch-All-Route `[...slug]` aufnehmen und die Teile im Load-Handler selbst parsen. Details in der Implementation. + +### Relay-Konfiguration + +Fest im Bundle hinterlegte Default-Liste (Konfig-Datei, nicht hartcodiert): + +```ts +// src/lib/nostr/config.ts +export const READ_RELAYS = [ + 'wss://relay.damus.io', + 'wss://nos.lol', + 'wss://relay.nostr.band', + 'wss://nostr.wine', +] +// TODO bei Implementierung: npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9 +// in hex decodieren (nip19.decode) und hier eintragen. +export const AUTHOR_PUBKEY_HEX = '' +``` + +Später erweiterbar um eigenen Relay per Konfig-Änderung, kein Code-Umbau. + +--- + +## 3. SPA-Komponenten & Datenfluss + +### Stack + +- **Framework:** SvelteKit, Adapter `adapter-static`, `ssr: false`, Prerender-Disabled. +- **Nostr-SDK:** `applesauce-relay`, `applesauce-loaders`, `applesauce-signers` (höherstufig, RxJS-basiert, tree-shakable). +- **Markdown-Rendering:** `marked` + `DOMPurify` + `highlight.js` (3–5 Sprachen registriert). +- **Signing:** NIP-07 (Browser-Extension wie Alby oder nos2x). + +### Dateistruktur + +``` +src/ +├── app.html # SPA-Shell -Defaults +├── lib/ +│ ├── nostr/ +│ │ ├── config.ts # Relays, Pubkey +│ │ ├── pool.ts # RelayPool Singleton (applesauce-relay) +│ │ ├── loaders.ts # loadPostList, loadPost, loadReplies, loadReactions +│ │ ├── signer.ts # NIP-07 Wrapper (applesauce-signers) +│ │ └── outbox.ts # NIP-65 Read-Relay-Resolution für fremde Autoren +│ ├── render/ +│ │ ├── markdown.ts # renderMarkdown(md: string): string — SINGLE EXPORT +│ │ └── naddr.ts # nip19.naddrEncode Helper +│ └── components/ +│ ├── PostCard.svelte +│ ├── PostView.svelte +│ ├── ReplyList.svelte +│ ├── Reactions.svelte +│ └── ReplyComposer.svelte +└── routes/ + ├── +layout.svelte + ├── +page.svelte + ├── archives/+page.svelte + ├── tag/[name]/+page.svelte + ├── impressum/+page.svelte + └── [year]/[month]/[day]/[dtag=html_extension]/+page.svelte # s. Hinweis unten +``` + +### Datenfluss: Post-Seite + +1. Browser ruft `/2024/01/26/offenheit-das-wesentliche.html/` auf. +2. All-Inkl `.htaccess` → `/index.html` (Fallback, keine Datei unter dem Pfad). +3. SPA bootet, SvelteKit-Router matcht Route, extrahiert `dtag`. +4. `loadPost(dtag)` fragt via `applesauce-loaders` den `RelayPool` mit Filter `{ kinds:[30023], authors:[PUBKEY], '#d':[dtag] }`. +5. Observable emittiert Event (bei Versionen: neueste gewinnt, replaceable-Semantik via `applesauce`). +6. `renderMarkdown(event.content)` → sanitized HTML → `{@html}` in `PostView`. +7. Parallel: `loadReplies(event)` (kind:1 mit `#a` oder `#e`) und `loadReactions(event)` (kind:7), nonblocking. + +### Datenfluss: Home/Archiv + +``` +loadPostList() → req({ kinds:[30023], authors:[PUBKEY], limit:100 }) + → Observable streamt Events + → Dedup per d-Tag, sortiert nach published_at desc + → PostCard-Liste rendert reaktiv +``` + +### Datenfluss: Kommentar schreiben (NIP-07) + +``` +ReplyComposer öffnet + → signer.getPublicKey() # Alby/nos2x prompted ggf. + → User tippt, klickt Senden + → Event bauen (kind:1, Tags: ['a', addr], ['e', eventId], ['p', authorPk]) + → signer.signEvent(event) # Extension prompted zur Freigabe + → pool.publish(writeRelays, signedEvent) + → bestehende ReplyList-Subscription zeigt Event optimistisch sofort an +``` + +`writeRelays` kommt bevorzugt aus dem NIP-65-Outbox-Event des Signers; Fallback: `READ_RELAYS`. + +### State-Management + +RxJS-Observables direkt in Svelte konsumiert: + +```svelte + + +{#if $post$} +
{@html renderMarkdown($post$.content)}
+{:else} +

Lade …

+{/if} +``` + +Keine separaten Svelte-Stores. Observable ist der Store. + +### Fehler- und Loading-Zustände + +- **Soft-Timeout 8s:** „noch am Suchen …". +- **Hard-Timeout 15s:** Fallback-Hinweis mit Habla-Deeplink (`https://habla.news/a/`). +- **Kein Event gefunden:** 404-Komponente mit Habla-Link. +- **Alle Relays offline:** Banner + Retry-Button. +- **Replies/Reactions:** best-effort, Fehler silently — dürfen die Post-Anzeige nicht blockieren. + +### Markdown-Rendering (Isolation für Zukunft) + +Alles Rendering-Zeug in `src/lib/render/markdown.ts`. Externer Export genau eine Funktion: + +```ts +export function renderMarkdown(md: string): string +``` + +Kein Import von `marked` oder `DOMPurify` außerhalb dieser Datei. Das macht Austausch (z. B. zu `svelte-markdown`, `markdown-it` oder `unified`) später zu einem lokal begrenzten Refactor. + +Implementierung (Skizze): + +```ts +import { marked } from 'marked' +import DOMPurify from 'dompurify' +import hljs from 'highlight.js/lib/core' +import javascript from 'highlight.js/lib/languages/javascript' +import bash from 'highlight.js/lib/languages/bash' + +hljs.registerLanguage('javascript', javascript) +hljs.registerLanguage('bash', bash) + +marked.use({ + breaks: true, + gfm: true, + renderer: { + code(code, lang) { + const highlighted = lang && hljs.getLanguage(lang) + ? hljs.highlight(code, { language: lang }).value + : hljs.highlightAuto(code).value + return `
${highlighted}
` + }, + link(href, title, text) { + const internal = href?.startsWith('/') || href?.includes('joerg-lohrer.de') + const attrs = internal ? '' : ' target="_blank" rel="noopener"' + return `${text}` + }, + }, +}) + +export function renderMarkdown(md: string): string { + const raw = marked.parse(md) as string + return DOMPurify.sanitize(raw, { ADD_ATTR: ['target', 'rel'] }) +} +``` + +### Sicherheit + +- **DOMPurify für allen gerenderten Content** — Hauptposts (von dir signiert) und Replies (von Dritten). +- **Pubkey-Whitelist:** PostsLoader filtert strikt auf `authors:[PUBKEY]`. Fremde Events für Hauptinhalte nicht anzeigen. Replies/Reactions explizit ausgenommen, aber sanitized. +- **Privat-Key liegt nie im Bundle, nicht auf All-Inkl, nicht im Browser.** Signieren ausschließlich lokal (Publish-Spec) oder via NIP-07 (Besucher-Kommentare). + +### Bundle-Budget + +Schätzung gzip: + +- SvelteKit Runtime: ~15 KB +- applesauce-relay + -loaders + -signers: ~30 KB +- rxjs (tree-shaken): ~15 KB +- marked + DOMPurify: ~25 KB +- highlight.js Core + 3 Sprachen: ~15 KB +- App-Code: ~10 KB +- **Total: ~110 KB gzip** — vertretbar. + +--- + +## 4. Hosting, Deployment, Migrationspfad + +### Hosting bei All-Inkl + +Webhosting-Paket, Standardfeatures: + +- statische Dateiauslieferung +- `mod_rewrite` (Standard) +- HTTPS (Let's Encrypt inklusive, ggf. schon aktiv) + +Keine PHP, kein MySQL, keine Cronjobs, kein Backend. + +### Dateistruktur auf Webspace + +``` +/ +├── index.html # SPA-Shell +├── _app/ # SvelteKit-Bundle +├── .htaccess +├── robots.txt +├── favicon.ico +├── impressum/ +│ └── index.html # statische HTML-Datei +├── 2024/01/26/offenheit-das-wesentliche.html/ +│ ├── bild1.jpeg # Altbilder +│ └── bild2.jpeg +├── 2023/03/23/gleichnis-vom-saemann.html/ +│ └── … +└── … +``` + +### Upload-Mechanik + +- **SvelteKit-Bundle:** `npm run build` → `build/` → rsync/FTP in Webspace-Root. npm-Script `deploy`. +- **Altbilder:** einmalig per rsync aus `content/posts/` an die Permalink-Pfade übertragen. +- **Neue Bilder:** nicht auf All-Inkl (Phase 2, Blossom-Upload via Publish-Spec). + +**Credentials:** FTP-Login in `.env` des lokalen Repos, nicht committed. + +### Migrationspfad (die 18 bestehenden Posts) + +Um Verwechslung mit den „Phasen" im Evolutionspfad (Abschnitt 5) zu vermeiden, werden die Migrationsschritte mit **Schritt A–E** bezeichnet. + +**Schritt A — Pre-Launch:** +Hugo-Seite bleibt live, nichts anfassen. + +**Schritt B — SPA entwickeln:** +Lokal bauen, gegen Public-Relays mit Test-Events validieren. + +**Schritt C — Posts als Events publizieren (Publish-Spec):** +Alle 18 `.md` zu `kind:30023` signieren und zu 4–5 Public-Relays pushen. +`d`-Tag = bisheriger Hugo-Slug; `published_at` = Frontmatter-Datum. +Verifikation: Events in Habla-Client gegenchecken. + +**Schritt D — Cutover:** +1. Altbilder in Permalink-Pfade hochladen. +2. SPA-Bundle in Webspace-Root deployen. +3. `index.html` und `.htaccess` ersetzen (alte Hugo-Version wird überschrieben). +4. Alte, nicht mehr benötigte Hugo-Artefakte können bleiben oder gelöscht werden; `.htaccess`-Fallback macht sie harmlos. + +**Schritt E — Validierung:** +- Alle 18 URLs im Browser prüfen (Inhalt stimmt, Bilder laden). +- Stichprobenhaft `curl -A "Mozilla/5.0" ` → Shell wird ausgeliefert. +- Link auf Mastodon posten → Preview fehlt (erwartet im Minimal-Launch). + +**Rollback-Fähigkeit:** +Alter Hugo-`public/`-Stand als ZIP lokal archivieren. Rollback = zurückkopieren. + +### URL-Kompatibilität (verifiziert) + +Hugo-URL: `https://joerg-lohrer.de/2024/01/26/offenheit-das-wesentliche.html/` +Neu: Pfad existiert nicht als Datei → `.htaccess` → `/index.html` → SPA routed via `dtag`. +Für externe Links: identische URL, identische Inhaltsanzeige. Backlinks aus Mastodon, Google, Bookmarks funktionieren weiter. + +--- + +## 5. Testing, Risiken, Evolution + +### Testing-Strategie + +**Unit-Tests (Vitest):** +- `renderMarkdown()`: Input/Output, XSS-Vektoren (`javascript:`-URLs, ` + + +{{ end }} \ No newline at end of file diff --git a/public/1/01/01/.html/dezentrale-oep-oer.png b/public/1/01/01/.html/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/public/1/01/01/.html/dezentrale-oep-oer.png differ diff --git a/public/1/01/01/.html/index.html b/public/1/01/01/.html/index.html new file mode 100644 index 0000000..0808484 --- /dev/null +++ b/public/1/01/01/.html/index.html @@ -0,0 +1,223 @@ + + + + + + + +Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ +

+ +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2013/02/07/premium-freemium-mium-mium-mium.html/index.html b/public/2013/02/07/premium-freemium-mium-mium-mium.html/index.html new file mode 100644 index 0000000..0fcab07 --- /dev/null +++ b/public/2013/02/07/premium-freemium-mium-mium-mium.html/index.html @@ -0,0 +1,241 @@ + + + + + + + +Premium, Freemium, Mium mium mium | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Premium, Freemium, Mium mium mium +

+
+ Zur Produktion von sattmachenden Bildungsinhalten +
+ +
+
+ + +
+

Premium, Freemium, Mium mium mium

+

Wer leckere Bildungsangebote macht, findet immer reichlich Abnehmer. Und im digitalen Zeitalter kann ein einzelnes Produkt dank der vorhandenen Replikatormaschinen unendlich vervielfacht konsumiert werden. Das ist kein Traum mehr, sondern längst cloudgewordene Wirklichkeit.

+

Nun wird versucht über ein komplexes Rechtemanagement den Produzenten ein lukratives Einkommen zu sichern. Doch während im Dienstleitungssektor der Bildung die einen noch an Vertriebswegen tüfteln, sind die Teilnehmenden in den offenen und massiven Online-Kursen (MOOCs) schon einen Schritt weiter. Hier wird allmählich begriffen, dass nicht die Her- und Bereitstellung, Aufbereitung und didaktische Darbietung von Bildung sich in barer Münze auszahlt, sondern das vernetzende Lernen selbst, also der Prozess, die eigentliche Qualität darstellt, die ihr Geld wirklich wert wäre.

+

![](my-very-hungry-caterpillar.jpg =240x) +Foto: 365.79 My very hungry caterpillar - Relly Annett-Baker CC BY-NC-SA

+

Wo früher noch für ein Produkt bezahlt wurde, wird morgen ein Vorgang monetarisiert werden müssen. Übergangslösungen sind bezahlte Dienstleitungen, Werbeeinblendungen, Freischaltcodes, digitales Rechtemanagement oder Crowdfunding. Insgesamt zeigt sich zugleich, dass Geld immer weniger einen materialisierbaren Gegenwert erhält und sich somit eventuell die Substanz der Währung allmählich aufzulösen beginnt. Doch genausowenig wie man Geld essen kann, wird man von Bildung satt. Die Frage, die sich stellt, ist also keine geringere als die nach einer Kalibrierung der Geldfunktionen. +Gegenseitige Anerkennung, Verlässlichkeit und Loyalität, Kooperation und Ideenreichtum, Unterstützung und Feedback sind im Rahmen eines offenen Online-Kurses ohnehin unbezahlbar und treten verblüffenderweise da am stärksten auf, wo kein Geldtransfer im Spiel ist. Das zeigt einmal mehr, dass man sich die besten Dinge im Leben mit Geld eben gerade nicht kaufen kann. +Doch satt bin ich noch immer nicht.

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar.jpg b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar.jpg new file mode 100644 index 0000000..eb67205 Binary files /dev/null and b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar.jpg differ diff --git a/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg new file mode 100644 index 0000000..b3e600e Binary files /dev/null and b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg differ diff --git a/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg new file mode 100644 index 0000000..4ae2037 Binary files /dev/null and b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg differ diff --git a/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg new file mode 100644 index 0000000..17a7b53 Binary files /dev/null and b/public/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg differ diff --git a/public/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/index.html b/public/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/index.html new file mode 100644 index 0000000..54aa472 --- /dev/null +++ b/public/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/index.html @@ -0,0 +1,271 @@ + + + + + + + +Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven +

+
+ Artikel unter CC-BY Lizenz +
+ +
+

Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven

+

Das + + +Handbuch Jugend – Evangelische Perspektiven, welches 2013 erschienen ist, hat auf Seite 343-345 folgenden Artikel von mir zur Erlebnispädagogik abgedruckt. +CC BY Jörg Lohrer

+

Erlebnispädagogik

+

Ziele und Arbeitsformen

+

Erlebnispädagogik arbeitet mit einem pädagogischen Konzept zielorientiert und bevorzugt in der Natur oder dem naturnahen Raum vorrangig an der Förderung von Selbst- und Sozialkompetenzen. Dabei grenzt sich Erlebnispädagogik bewusst von ‚Nervenkitzel-Aktionismus‘ und der eskalierenden Suche nach dem Kick nach immer mehr und phantastischeren Erlebnissen ab. Die Förderung von Zutrauen in die eigenen Fähigkeiten, der Umgang mit Ängsten, das Erfahren und Überwinden von Grenzen, die Vemittlung von sozialen Kompetenzen können Zielsetzungen für erlebnispädagogische Maßnahmen in der evangelischen Jugendbildung sein. Dabei geht es auch immer um eine Erweiterung der eigenen Handlungskompetenzen zur Lebensbewältigung durch ein angstfreies Lernen in der Gruppe.

+

Erlebnispädagogik arbeitet mit Wahrnehmungs- und Vertrauensübungen, Kooperations- und Problemlösungsaufgaben, abenteuerlichen Aktionen, persönlichen Herausforderungen und Grenzerfahrungen. Angebote und Maßnahmen mit erlebnispädagogischem Charakter sind zum Beispiel Kanu- und Fahrrad-Touren, Kletteraktionen, kooperative Abenteuerspiele, Natursensibilisierung, Trekkingtouren, Nieder- und Hochseilparcours oder Geocaching.

+

Erlebnispädagogische Maßnahmen finden u.a. Anwendung im Bereich der Kooperation von Jugendverbandsarbeit und Schule, bei Klassenfahrten, der Präventionsarbeit, bei gruppendynamischen Prozessen, Mitarbeiterschulungen, der Entwicklung von Teamarbeit und in etlichen weiteren Praxisfeldern evangelischer Jugendbildung.

+

Mit den Arbeitsprinzipien Respekt, Selbstbestimmung, Vertrauen, Kooperation, Verantwortung und Ganzheitlichkeit korrespondiert die Erlebnispädagogik mit dem Profil der evangelischen Jugendarbeit. Ebenso liegen Chancen in einer Verknüpfung von erlebnispädagogischen Aktionen mit einer erfahrungsbezogenen Verkündigung. Erlebnispädagogische Maßnahmen werden als Jugendbildungsveranstaltungen gefördert, wenn sozial-ökologische Inhalte und/oder politisch-kulturelle Schwerpunktthemen mit gesellschaftlichem Bezug im Mittelpunkt der Maßnahme stehen.

+

Entstehung, Prinzipien, Methoden

+

Der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) nennt weit in die Vergangenheit zurück reichende Wurzeln der Erlebnispädagogik. Als wichtige Autoren, auf die das Konzept vom handlungsorientierten Lernen zurückgeführt wird, werden Platon (427–347 v.Chr.), Rousseau (1712–1778), Pestalozzi (1746–1827) und schließ- lich Kurt Hahn (1886–1974) als ‚Urvater‘ der Erlebnispädagogik genannt. Ihre heutige Vielfalt und weite Verbreitung hat die Erlebnispädagogik allerdings erst im 20. Jahrhundert und schließlich in den letzten Jahrzehnten entwickelt. Erlebnispädagogik wird nicht nur im Bereich der Erziehung von Kindern und Jugendlichen angewandt, sondern findet inzwischen auch vielfältige Beachtung in der Arbeit mit nahezu allen Altersgruppen zu unterschiedlichen Problem- und Zielstellungen in der präventiven Kurzzeitpädagogik, der intensiven sozialpädagogischen Einzelbetreuung, im Rahmen der beruflichen Fort und Weiterbildung oder in Führungskräftetrainings (vgl. www.bundesverband- erlebnispaedagogik.de).

+

Als Grundprinzipien können unter anderem benannt werden: Handlungsorientierung, Ganzheitlichkeit, Eigenverantwortung, Freiwilligkeit, Sicherheit und Nachhaltig- keit. Dabei sind die pädagogischen, kompetenz- und ressourcenorientierten Angebote der Erlebnispädagogik stets eingebettet in die aktuelle Rechtsgrundlage und (Bildungs-) Politik.

+

Methodische Aspekte sind z.B.: der hohe Stellenwert des Erlebnisses und das Arbeiten mit erlebnispädagogischen Lernszenarien, nicht-alltäglichen Herausforderungen und Wagnissen, Einsatz verschiedener Medien und der Natur als bevorzugtem Lern- und Erfahrungsraum. +Neben einer zunehmende Gruppenselbststeuerung baut die Erlebnispädagogik auf Lern- und Wirkungsmodelle wie das Komfortzonenmodell, das metaphorische Modell, Aktions- und Reflexionswelle oder das FlowModell. +Erlebnispädagogik hat als Lernszenariotechnik zwar eine eigene Strukturlogik, dient jedoch ebenso als Methode im nicht genuin erlebnispädagogischen Kontext und entwickelt somit Reichweite, Relevanz und pädagogische Innovationskraft in Konfirmandenarbeit, Religionsunterricht und Gemeindepädagogik.

+

Aktuelle Fragestellungen und Entwicklungsperspektiven: Qualität und Wirkung

+

Als partizipatorisches Angebot setzt die Erlebnispädagogik auf das Prinzip der Freiwilligkeit und der selbstbestimmten Teilnahme. Unter dem Motto ‚challenge by choice‘ hat eine subjektorientierte Erlebnispädagogik stets zu gewährleisten, dass die Teilnehmenden den Grad ihrer Beteiligung und Verantwortungsübernahme selbst bestimmen können. Reiserechtliche Bestimmungen, Versicherung und Haftung sind daher aktuell handlungsleitendend bei der Erstellung von erlebnispädagogischen Angeboten und Konzeptionen. Hier gab es in den letzten Jahren zahlreiche Entwicklungen, die eine Qualitätssicherung der Mitarbeitendenbildung in Pädagogik und Sicherheitstechnik hinsichtlich geltender Kriterien voraussetzen und notwendig machen. Entsprechende Zusatzqualifikationen sollten daher immer mindestens durch die jeweiligen Fachsportverbände zertifizierbar sein. Mit dem Gütesiegel „Qualität erlebnispädagogischer Programme und Angebote – Mit Sicherheit pädagogisch!“ (beQ) hat der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) ein Zertifizierungsverfahren entwickelt, das ein bundeseinheitliches Qualitätsmanagement fördern will.

+

Die Wirkungsforschung erlebnispädagogischer Lernarrangements untersucht deren Substanz, Akzeptanz und Nachhaltigkeit hinsichtlich ihrer Qualität von Konzept, Struktur, Prozess und Ergebnis. Studien konnten bislang Indizien für Impulse zur Kompetenzentwicklung nachweisen, die wissenschaftliche Evaluation gestaltet sich jedoch genauso komplex wie das Spektrum der erlebnispädagogischen Handlungsfelder und so fehlt es bislang an validen Studien, die das Wirkungspotenzial eindeutig beschreiben können.

+

Im Kontext evangelischer Jugendbildung stellt sich bei der Verwendung erlebnispädagogischer Methoden immer auch die Frage nach einer Verknüpfung von christlichen Inhalten mit der handlungsorientierten Pädagogik. Die Assoziation von Natur und Schöpfung ist beispielsweise ebenso naheliegend wie die Reflexion von religiösen Erfahrungen in erlebnispädagogischen Lernsettings. Inwiefern sich dabei Unverfügbares inszenieren lässt, bleibt dabei ebenso eine Herausforderung, wie bei der oben beschriebenen Wirkungsforschung. In den vergangenen Jahren haben sich einige Konzepte zur Erprobung erlebnispädagogischer Methoden im christlichen Kontext entwickelt, die zunehmend auch theologisch und religionsdidaktisch reflektiert werden. Eine überregionale Organisation dieser Einzelinitiativen auf Bundesebene wäre der nächste Schritt hin zu einem evangelischen Profil erlebnispädagogischer Jugendbildungsarbeit.

+

Literatur

+

+ +Großer, Achim/Oberländer, Rainer/Lohrer, Jörg/Wiedmayer, Jörg (2005/2011): Sinn gesucht – Gott erfahren. Erlebnispädagogik im christlichen Kontext (Band 1 (2005)/Band 2 (2011)). Stuttgart: Buch und Musik. + + +Heckmair, Bernd/Michl, Werner (2008): Erleben und Lernen. Einführung in die Erlebnispädagogik. München: Reinhardt. + + +Reiners, Annette (2007): Praktische Erlebnispädagogik. Augsburg: ZIEL. + + +Pum, Viktoria/Pirner, Manfred L./Lohrer, Jörg (Hrsg.) (2011): Erlebnispädagogik im christlichen Kontext. Dokumentation einer Tagung der Evangelischen Akademie Bad Boll, 2. bis 4. März 2009. Bad Boll: Evangelische Akademie.

+ + + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2017/10/23/telegram-octopi.html/index.html b/public/2017/10/23/telegram-octopi.html/index.html new file mode 100644 index 0000000..7e6bdb6 --- /dev/null +++ b/public/2017/10/23/telegram-octopi.html/index.html @@ -0,0 +1,247 @@ + + + + + + + +Telegram Bot für Octopi | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Telegram Bot für Octopi +

+
+ Schnittstelle zwischen Telegram und OctoPrint +
+ +
+
+ + +
+

Das OctoPrint-Telegram-Plugin schafft eine Schnittstelle zwischen Telegram und OctoPrint. +Hier die Anleitung auf Englisch: https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md

+

Das dauert eine Weile: + +

+

Token eingeben: + +

+

Heisst aber nicht, dass jetzt alles gleich klappt: + +

+

Es müssen dem Benutzer noch die Rechte “Command” und “Notify” gegeben werden: + +

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2017/10/23/telegram-octopi.html/octopi1.png b/public/2017/10/23/telegram-octopi.html/octopi1.png new file mode 100644 index 0000000..d57bed0 Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi1.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png b/public/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png new file mode 100644 index 0000000..37cfe5c Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png b/public/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png new file mode 100644 index 0000000..1e54a3e Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png b/public/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png new file mode 100644 index 0000000..5f42f4e Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png b/public/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png new file mode 100644 index 0000000..20b1014 Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi2.png b/public/2017/10/23/telegram-octopi.html/octopi2.png new file mode 100644 index 0000000..2a94249 Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi2.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi3.png b/public/2017/10/23/telegram-octopi.html/octopi3.png new file mode 100644 index 0000000..d871f75 Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi3.png differ diff --git a/public/2017/10/23/telegram-octopi.html/octopi4.png b/public/2017/10/23/telegram-octopi.html/octopi4.png new file mode 100644 index 0000000..2c090b1 Binary files /dev/null and b/public/2017/10/23/telegram-octopi.html/octopi4.png differ diff --git a/public/2017/10/31/lutherkuerbis.html/index.html b/public/2017/10/31/lutherkuerbis.html/index.html new file mode 100644 index 0000000..a0eadd7 --- /dev/null +++ b/public/2017/10/31/lutherkuerbis.html/index.html @@ -0,0 +1,261 @@ + + + + + + + +Lutherkürbis - Reformation an Halloween | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Lutherkürbis - Reformation an Halloween +

+
+ Schablone und Bastelanleitung für einen Kürbis zur Reformation +
+ +
+
+ + +
+

Lutherkürbis - Reformation an Halloween

+

Das Symbol der Lutherrose ist auch heute noch in vielen Wappen enthalten und wird als Dekoelement genutzt (Quelle: epd/imago)

+

Aus einer Fotovorlage der Lutherrose wird mit einem Online-Konverter eine Schablone als verlustfrei skalierbare Vektorgrafik erzeugt:

+

+ +Lutherrose PDF-Vorlage

+

Bastel-Anleitung

+

Einen Kürbis aufschneiden: + +

+

entkernen und aushöhlen: + +

+

Schablone aufbringen: + +

+

Ausschneiden: + +

+

Mit Kerze oder elektrischem Licht ausstatten: + +

+

Fertig!

+

Diese Idee inklusive der Schablone steht unter CC0-Lizenz. Du darfst das Werk kopieren, verändern, verbreiten und aufführen, sogar zu kommerziellen Zwecken, ohne um weitere Erlaubnis bitten zu müssen.

+

Weitere Quellen

+
    +
  • How to Make a Paper Cut-Out Luther Rose YouTube | PDF
  • +
+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-aufschneiden.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-aufschneiden.jpg new file mode 100644 index 0000000..b03134e Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-aufschneiden.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-ausschneiden.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-ausschneiden.jpg new file mode 100644 index 0000000..e418172 Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-ausschneiden.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-entkernen.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-entkernen.jpg new file mode 100644 index 0000000..ec743e0 Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-entkernen.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild.jpg new file mode 100644 index 0000000..818714a Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg new file mode 100644 index 0000000..2c7c874 Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg new file mode 100644 index 0000000..3cac92d Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg differ diff --git a/public/2017/10/31/lutherkuerbis.html/lutherrose.png b/public/2017/10/31/lutherkuerbis.html/lutherrose.png new file mode 100644 index 0000000..e4050fe Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/lutherrose.png differ diff --git a/public/2017/10/31/lutherkuerbis.html/schablone-aufbringen.jpg b/public/2017/10/31/lutherkuerbis.html/schablone-aufbringen.jpg new file mode 100644 index 0000000..95e533d Binary files /dev/null and b/public/2017/10/31/lutherkuerbis.html/schablone-aufbringen.jpg differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z.png new file mode 100644 index 0000000..a2a5b6d Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png new file mode 100644 index 0000000..8ba8641 Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png new file mode 100644 index 0000000..fed01ea Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png new file mode 100644 index 0000000..20e0a00 Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png new file mode 100644 index 0000000..d0cc21d Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png new file mode 100644 index 0000000..474c8fb Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png differ diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/index.html b/public/2019/03/26/pflanzenschild-qr-code.html/index.html new file mode 100644 index 0000000..49dac0c --- /dev/null +++ b/public/2019/03/26/pflanzenschild-qr-code.html/index.html @@ -0,0 +1,245 @@ + + + + + + + +Pflanzenschild mit QR-Code | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Pflanzenschild mit QR-Code +

+
+ Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen +
+ +
+
+ + +
+

Pflanzenschild mit QR-Code

+

Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen: +

+

Dann noch mit Thingiverse ein Dreieck designen (80x40x1.4mm) und den QR-Code obendrauf: +

+

Mit dem Cura-Plugin Change Filament at Z den 3D-Druck im Layer unterbrechen, wo ein Filament(Farb)-Wechsel stattfinden soll: + +

+

Et voilà: + + +

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2019/03/26/pflanzenschild-qr-code.html/qr-code-pflanzenschild.jpg b/public/2019/03/26/pflanzenschild-qr-code.html/qr-code-pflanzenschild.jpg new file mode 100644 index 0000000..93541d9 Binary files /dev/null and b/public/2019/03/26/pflanzenschild-qr-code.html/qr-code-pflanzenschild.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/01-immersion-wikipedia.jpg b/public/2021/08/15/virtual-reality.html/01-immersion-wikipedia.jpg new file mode 100644 index 0000000..05f722a Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/01-immersion-wikipedia.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/02-mittelalterliche-kirche.jpg b/public/2021/08/15/virtual-reality.html/02-mittelalterliche-kirche.jpg new file mode 100644 index 0000000..2bbe4a0 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/02-mittelalterliche-kirche.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/03-avatare-erstellen.jpg b/public/2021/08/15/virtual-reality.html/03-avatare-erstellen.jpg new file mode 100644 index 0000000..768810f Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/03-avatare-erstellen.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe.jpg b/public/2021/08/15/virtual-reality.html/04-aframe.jpg new file mode 100644 index 0000000..cf1d9cc Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg b/public/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg new file mode 100644 index 0000000..f6a9e66 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg b/public/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg new file mode 100644 index 0000000..1735075 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg b/public/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg new file mode 100644 index 0000000..8bac4bb Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg b/public/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg new file mode 100644 index 0000000..e5584f6 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg b/public/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg new file mode 100644 index 0000000..83aab92 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/05-pupillendistanz.jpg b/public/2021/08/15/virtual-reality.html/05-pupillendistanz.jpg new file mode 100644 index 0000000..a21301b Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/05-pupillendistanz.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/06-vr-adapter-3ddruck.jpg b/public/2021/08/15/virtual-reality.html/06-vr-adapter-3ddruck.jpg new file mode 100644 index 0000000..9d30ac1 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/06-vr-adapter-3ddruck.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/07-vive-straps-3ddruck.jpg b/public/2021/08/15/virtual-reality.html/07-vive-straps-3ddruck.jpg new file mode 100644 index 0000000..9156c45 Binary files /dev/null and b/public/2021/08/15/virtual-reality.html/07-vive-straps-3ddruck.jpg differ diff --git a/public/2021/08/15/virtual-reality.html/index.html b/public/2021/08/15/virtual-reality.html/index.html new file mode 100644 index 0000000..fe973b0 --- /dev/null +++ b/public/2021/08/15/virtual-reality.html/index.html @@ -0,0 +1,471 @@ + + + + + + + +VR - Virtual Reality | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ VR - Virtual Reality +

+
+ Tutorials der Oculus Quest 2 +
+ +
+
+ + +
+

VR - Virtual Reality

+

Ausschreibung Torsten & Jörg

+

Ausgehend vom Lernbaustein https://relilab.org/vr/ beschäftigen wir uns in diesem Workshop mit Immersion und praktischen Beispielen im Themenbereich VR/AR. Neben der Vermittlung von theoretischen Grundlagen besprechen wir die Einsatzmöglichkeit im Religionsunterricht am Beispiel einer Reihe zu Schöpfungsmythen. Darüber hinnaus bieten wir die Gelegenheit zu Erfahrungsaustausch, Diskussion und exemplarischen Erlebnismöglichkeiten in der virtuellen Realität.

+

Theorie

+

Immersion & Präsenz

+

https://www.immersivelearning.institute/ +https://omnia360.de/blog/was-ist-immersion/ +https://en.wikipedia.org/wiki/Immersive_learning + + +https://www.sciencedirect.com/science/article/pii/S0360131519303276

+

Forschung

+

A Public Database of 360 Videos with Corresponding Ratings of Arousal and Valence +https://vhil.stanford.edu/360-video-database/

+

https://www.researchgate.net/publication/335733502_Getting_your_game_on_Using_virtual_reality_to_improve_real_table_tennis_skills

+
+

“Diese Studie ergänzt die spärliche, aber wachsende Literatur, indem sie den Transfer von Fertigkeiten aus der realen Welt durch Virtual Reality in einer sportlichen Aufgabe demonstriert.”

+
+

https://mixed.de/vr-und-philosophie-youtuber-zeigt-ungewoehnliche-vr-apps/amp/ +Der norwegische Forscher Joakim Vindenes unterhält einen Blog, Podcast und Youtube-Kanal, in denen er außergewöhnliche VR-Apps vorstellt und sich mit der philosophischen Dimension des Mediums auseinandersetzt.

+

https://www.youtube.com/watch?v=VY5HaEhUm2Q +A look at what it would be like to plug into an infinite VR experience machine.

+

Religionen

+

https://www.matrise.no/2019/06/hinduism-and-virtual-reality/

+

https://www.matrise.no/2020/01/the-existential-problem-of-vr-existentialism/

+

Empathie

+

https://www.youtube.com/watch?v=L6m79wqNiMA&feature=youtu.be&t=150

+
+

“VR is a storytelling vehicle, but it’s an empathy vehicle.”

+
+

Therapie

+

Feeling Good during the COVID19 Epidemic +Virtual Reality Can Help Us to Overcome the Psychological Burden of Coronavirus - https://www.covidfeelgood.com/home

+

Die Verkörperung von Mitgefühl in der virtuellen Realität und ihre Auswirkungen auf Patienten mit Depressionen +https://scitec-media.ch/2016/03/04/game-technologien-helfen-gegen-depressionen/ +https://www.youtube.com/watch?v=GwxJVCESc-E +https://www.cambridge.org/core/journals/bjpsych-open/article/embodying-selfcompassion-within-virtual-reality-and-its-effects-on-patients-with-depression/

+

Theater

+

https://www.brendanabradley.com/futurestages

+

Körperlichkeit

+

https://www.matrise.no/2018/07/virtual-embodiment/ +https://www.matrise.no/2020/10/virtual-reality-depersonalization-derealization/

+

Praxis

+

Padlets

+
    +
  • [https://padlet.com/petiteprof79/xrinfo(https://padlet.com/petiteprof79/xrinfo)] XR-Info - Stephanie Wössner | CC BY-SA @petiteprof79
  • +
  • https://padlet.com/strsa/ar Augmented Reality (AR) & 360°, (VR) | Gestartet von Tobias Erles (@Mr_Airless) und Sabine Strauss (@Sallythechin) beim Barcamp #wildcampen18, erweitert bei #wildcampen19 zusammen mit Jan Hartwig (@hartifical)
  • +
+

Artikel

+ +

Unterricht

+ +

Communities

+

https://educatorsinvr.com/

+

Religiöse Erfahrungsräume

+

im Oculus Store

+

Wander

+

https://www.oculus.com/experiences/quest/2078376005587859/

+

Filme

+

[https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/(https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/)]

+

In Sidequest

+

Vanishing Grace

+

[https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo(https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo)]

+
+

Vanishing Grace ist eine emotionale Reise über die Opfer, die wir bringen müssen, um unseren Platz in der Welt einzunehmen.

+
+

Cubism

+

[https://sidequestvr.com/app/403/cubism-demo(https://sidequestvr.com/app/403/cubism-demo)]

+

Deism

+
+

The virtual reality god simulator +[https://sidequestvr.com/app/85/deisim(https://sidequestvr.com/app/85/deisim)]

+
+

Liminal

+

https://sidequestvr.com/app/1042/liminal +Wählen Sie aus, wie Sie sich fühlen und was Sie leisten wollen: Ruhe, Energie, Schmerzlinderung und Ehrfurcht.

+

3D-Modelle

+

https://sketchfab.com/3d-models/abandoned-warehouse-interior-scene-1d5285f2e0fd4211a27c8042496d5959#

+

+ +CC BY-NC Medieval Church, Calatrava la Nueva, Spain +Processed in Reality Capture from 76 Faro laser scans and 4100 photographs +https://sketchfab.com/3d-models/medieval-church-calatrava-la-nueva-spain-171a047c08bc4dd588cca5ac744e8065

+

Avatare

+

Erfahrungswelten:

+

360 Grad Filme

+ +

Anne Frank VR

+

https://www.annefrank.org/

+

Within

+

[https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr(https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr)] +[https://account.altvr.com/channels/VRChurch(https://account.altvr.com/channels/VRChurch)]

+

Programmierung

+ +

Mozilla Hubs

+

Dokumentation [https://hubs.mozilla.com/docs/welcome.html(https://hubs.mozilla.com/docs/welcome.html)]

+

Vorlagen

+

https://v3l.de/relilabvr (relilab-VR-Hub mit Videos, Bildern, …)

+

[https://hubs.mozilla.com/Av38AUU/detailed-tinted-room(https://hubs.mozilla.com/Av38AUU/detailed-tinted-room)] +[https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome(https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome)]

+

Avatare erstellen

+

Mozilla Hubs - GLB

+

Online Dienst - Readyplayer

+

https://twitter.com/joerglohrer/status/1388023150626099201 + +

+

[https://readyplayer.me/(https://readyplayer.me/)]

+

Beispiel: (CC BY-NC-SA - Wolfprint 3D) +https://d1a370nemizbjq.cloudfront.net/10b05c49-593a-4616-82e9-adcea09aa66c.glb

+

Hubs by Mozilla

+ +

http://tryquilt.io/]

+

Blender files for AvatarBot +Creating an Avatar using Hubs components in Blender

+

Online Editoren

+

[https://modelviewer.dev/editor/(https://modelviewer.dev/editor/)]

+

Software

+
MakeHuman
+

http://makehumancommunity.org/

+

https://www.youtube.com/watch?v=kQjp5DYsR_c&t=86s

+

Tutorials Altspace / Blender / Unity

+

http://edvschwab.de/Altspace/Kurz%20Doku%20Blender.pdf +[http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf(http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf)]

+

Sidequest

+

https://sidequestvr.com/ +Installation: +https://sidequestvr.com/setup-howto

+

How to put custom songs onto Beat Saber on Oculus Quest

+

Aframe

+

+ +https://codepen.io/joerglohrer/full/dyXQqWG +https://aframe.io/ +https://www.codecademy.com/learn/learn-a-frame +VR development within VR with Oculus Quest + Firefox Reality + Glitch + +https://rocketvirtual.com/index.html +Where to begin with VR in a browser? +https://www.reddit.com/r/WebVR/comments/equgdt/vr_development_within_vr_with_oculus_quest/

+

https://aframe-model-viewer.glitch.me/

+

https://klausw.github.io/a-frame-car-sample/index.html

+

ThreeJS

+

https://threejs.org/ +https://www.jesuisundev.com/en/understand-threejs/

+

Tour Creator Google

+

“Starting June 30, 2021, the Google Expeditions and Tour Creator will no longer be accessible.”

+

Unity

+

https://unity.com/de/learn/get-started

+

Optik

+

Pupillendistanz (PD) messen - IPD (interpupillary distance)

+

https://apps.apple.com/de/app/eyemeasure/id1417435049 +Die kostenfreie App misst den Augenabstand auf 0,5 mm genau ab iPhoneX oder iPadPro + + +Oder einfach mit Lineal: +https://imgur.com/a/gyYKB

+

Oculus Quest

+

Tutorials

+

Deutsch

+

https://twitter.com/StubeDie

+

Englisch

+

Foren

+

https://www.reddit.com/r/OculusQuest/ +https://www.reddit.com/r/OculusQuest2/

+

Streaming / Playthrough / Livecasting / OBS

+

Oculus Quest Recording / Live Streaming Guide +How to stream on Twitch: the ultimate guide

+

File Transfer

+

3 different ways +https://www.youtube.com/watch?v=APbbuJF4Ma4 +https://www.android.com/filetransfer/ +Wie übertrage ich Bilder oder Videos von meinem Computer auf mein Oculus Quest 2 oder Quest?

+

Facebook video downloader here - https://fbdown.net/

+

Brillenträger

+

Sehstärke-Linsen Einsätze +https://mixed.de/vr-optiker-sehstaerke-linsen-test/

+ +

Not to do

+

Sonnenlicht in die Linse)

+

Sonnenlicht kann durch die Linsen gebündelt werden und das Display beschödigen.

+

Linsen reinigen

+

Grips - Handhalterungen

+

https://www.youtube.com/watch?v=_52xWr_R4uM&feature=youtu.be&t=388

+

Headstrap

+

VIVE DELUXE AUDIO STRAP

+

https://www.vive.com/de/accessory/vive-deluxe-audio-strap/

+

FrankenQuest 2 +https://uploadvr.com/frankenquest-2-quest-2/ +Adapter zum 3D-Druck: +https://www.thingiverse.com/thing:4622970 +Variante mit Kabelklemme (oben oder unten): +https://www.thingiverse.com/thing:4628600/files + + +:::success +Druck skaliert auf 101% +::: +Install guide +Remove the Quest 2 straps following this guide: https://www.youtube.com/watch?v=PejiYjR7_44&feature=youtu.be&t=110 +Snap the DAS onto the adaptor (pushing the round front section in first like in the picture). +Snap the adaptor onto Quest 2. +Use the velcro loop to attach the head strap to the headset. + +

+

Oculus Quest 2 Comfort Head Strap Mods!

+

3DDruck

+

Oculus Quest 2 Elite Strap_V2_NAVIDA DESIGN +[https://www.thingiverse.com/thing:4630780/files(https://www.thingiverse.com/thing:4630780/files)] +Oculus Link Cable Clip for Deluxe Audio Strap “DAS” +https://www.thingiverse.com/thing:4666749

+

Überblick: +https://www.youtube.com/watch?v=sUhMk19PVq4 +https://www.youtube.com/watch?v=CN9fYlUGVtk

+

Lens Adaptor

+

Für Brillen

+

[https://www.thingiverse.com/thing:3653631(https://www.thingiverse.com/thing:3653631)] +Für Linsen +[https://www.thingiverse.com/thing:3642004(https://www.thingiverse.com/thing:3642004)]

+

Esimen Upgrade K3

+

Batterie

+

https://www.androidcentral.com/best-oculus-quest-battery-pack

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2021/11/17/wordpress-werkstatt.html/01-json-import.png b/public/2021/11/17/wordpress-werkstatt.html/01-json-import.png new file mode 100644 index 0000000..a24e5d0 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/01-json-import.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/02-terminfelder.png b/public/2021/11/17/wordpress-werkstatt.html/02-terminfelder.png new file mode 100644 index 0000000..2d7be48 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/02-terminfelder.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/03-kategorien.png b/public/2021/11/17/wordpress-werkstatt.html/03-kategorien.png new file mode 100644 index 0000000..46ebce0 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/03-kategorien.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu.png b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu.png new file mode 100644 index 0000000..c8dd592 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png new file mode 100644 index 0000000..3036164 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png new file mode 100644 index 0000000..62b73d3 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png new file mode 100644 index 0000000..35a478b Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png new file mode 100644 index 0000000..958fc04 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/05-php-storm.png b/public/2021/11/17/wordpress-werkstatt.html/05-php-storm.png new file mode 100644 index 0000000..4106246 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/05-php-storm.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/06-termine-listen.png b/public/2021/11/17/wordpress-werkstatt.html/06-termine-listen.png new file mode 100644 index 0000000..240a734 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/06-termine-listen.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/07-external-library.png b/public/2021/11/17/wordpress-werkstatt.html/07-external-library.png new file mode 100644 index 0000000..4305c96 Binary files /dev/null and b/public/2021/11/17/wordpress-werkstatt.html/07-external-library.png differ diff --git a/public/2021/11/17/wordpress-werkstatt.html/index.html b/public/2021/11/17/wordpress-werkstatt.html/index.html new file mode 100644 index 0000000..59eb250 --- /dev/null +++ b/public/2021/11/17/wordpress-werkstatt.html/index.html @@ -0,0 +1,374 @@ + + + + + + + +WordPress Werkstatt PHP | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ WordPress Werkstatt PHP +

+
+ Advanced Custom Fields und Formulareingaben +
+ +
+
+ + +
+

WordPress Werkstatt PHP

+

Zunächst wird auf relilab.org das kostenfreie Plugin ACF - Advanced Custom Fields installiert und aktiviert. +Dies ermöglicht weitere individuelle Beitragsfelder für die Beiträge. +Nun kann manuell aktiviert oder eine Feldgruppe importiert werden - hier mittels dieser JSON-Datei, die das abkürzt: + + +mit dem Ergebnis, dass unter allen WordPress-Beiträgen jetzt zwei Terminfelder erscheinen, die ausgefüllt werden können: + + +Zudem gibt es neu eine Kategorie “Termine”, die aktiviert werden kann mit Unterkategorien, die später Übersichtsseiten ermöglichen: + + +Jetzt wird das Plugin relilab-termine installiert und aktiviert +Nun kann mittels Shortcode [relilab_termine] eine Terminübersicht als WordPress-Block erzeugt werden: + +

+

JSON

+

ACF-JSON-Export:

+
[
+    {
+        "key": "group_6193936e4f12c",
+        "title": "Termin",
+        "fields": [
+            {
+                "key": "field_619393f8e62e0",
+                "label": "Startet am",
+                "name": "relilab_startdate",
+                "type": "date_time_picker",
+                "instructions": "",
+                "required": 0,
+                "conditional_logic": 0,
+                "wrapper": {
+                    "width": "",
+                    "class": "",
+                    "id": ""
+                },
+                "display_format": "d.m.Y H:i",
+                "return_format": "Y-m-d H:i",
+                "first_day": 1
+            },
+            {
+                "key": "field_619394a3e62e1",
+                "label": "Endet am",
+                "name": "relilab_enddate",
+                "type": "date_time_picker",
+                "instructions": "",
+                "required": 0,
+                "conditional_logic": 0,
+                "wrapper": {
+                    "width": "",
+                    "class": "",
+                    "id": ""
+                },
+                "display_format": "d.m.Y H:i",
+                "return_format": "Y-m-d H:i",
+                "first_day": 1
+            }
+        ],
+        "location": [
+            [
+                {
+                    "param": "post_type",
+                    "operator": "==",
+                    "value": "post"
+                }
+            ]
+        ],
+        "menu_order": 0,
+        "position": "normal",
+        "style": "default",
+        "label_placement": "left",
+        "instruction_placement": "label",
+        "hide_on_screen": "",
+        "active": true,
+        "description": "",
+        "show_in_rest": 0,
+        "acfe_display_title": "",
+        "acfe_autosync": "",
+        "acfe_form": 0,
+        "acfe_meta": "",
+        "acfe_note": ""
+    }
+]
+

PHP

+

Software

+

PHP-Storm

+

https://www.jetbrains.com/de-de/phpstorm/

+
Shortcode zum Sprechen bringen
+

https://developer.wordpress.org/reference/functions/add_shortcode/ +In PhpStorm + + +add_shortcode( string $tag, callable $callback )

+

alle Termine listen, die +https://www.advancedcustomfields.com/resources/orde-posts-by-custom-fields/

+

+

+

PHP-Storm nutzt als External Library dann WordPress + +

+

Plugin

+

Unsere Funktion:

+
/**
+*Plugin Name: relilab Termine
+*/
+add_shortcode('termine','termineAusgeben');
+
+function   termineAusgeben( $atts ) {
+
+$posts = get_posts(array(
+    'post_type'			=> 'post',
+    'posts_per_page'	=> -1,
+    'category'          => 'termine',
+    'meta_key'			=> 'relilab_startdate',
+    'orderby'			=> 'meta_value',
+    'order'				=> 'DESC'
+));
+
+
+// ob_start();
+global $post;
+?>
+<ul>
+<?php
+foreach ($posts as $post) {
+setup_postdata( $post )
+?>
+<li>
+<a href="<?php the_permalink(); ?>"><?php the_title(); ?> (date: <?php the_field('relilab_startdate'); ?>)</a>
+</li>
+<?php
+}
+?>
+
+    </ul>
+<?php
+wp_reset_postdata();
+
+
+//  return ob_get_clean();
+}
+
+ +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2021/12/03/bibelfussball.html/bibelfussball1.png b/public/2021/12/03/bibelfussball.html/bibelfussball1.png new file mode 100644 index 0000000..42a2165 Binary files /dev/null and b/public/2021/12/03/bibelfussball.html/bibelfussball1.png differ diff --git a/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png new file mode 100644 index 0000000..b6fcb7d Binary files /dev/null and b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png differ diff --git a/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png new file mode 100644 index 0000000..021ab56 Binary files /dev/null and b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png differ diff --git a/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png new file mode 100644 index 0000000..a0300b7 Binary files /dev/null and b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png differ diff --git a/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png new file mode 100644 index 0000000..9a76e4f Binary files /dev/null and b/public/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png differ diff --git a/public/2021/12/03/bibelfussball.html/index.html b/public/2021/12/03/bibelfussball.html/index.html new file mode 100644 index 0000000..c002c20 --- /dev/null +++ b/public/2021/12/03/bibelfussball.html/index.html @@ -0,0 +1,1012 @@ + + + + + + + +Bibelfußball - Nachschlage-Quiz zur Bibel | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Bibelfußball - Nachschlage-Quiz zur Bibel +

+
+ Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. +
+ +
+
+ + +
+

Bibelfußball: Nachschlage-Quiz zur Bibel

+

Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. Das Fußballfeld mit seinen entsprechenden Linien wird dabei an die Wandtafel gezeichnet und der Ball wird durch einen Magnetknopf symbolisiert. Gepunktet wird, indem der Lehrer eine Frage stellt und eine Bibelstelle nennt, die es nachzuschlagen gilt. Wer die Stelle zuerst findet und die Antwort ruft, dessen Mannschaft darf den Ball eine Linie weiterrücken in Richtung des gegnerischen Tores. Wurde ein Tor geschossen, beginnt das Spiel von neuem an der Mittellinie. + +

+

Hier umfangreiche Fragen mit Bibelstellen aus dem Alten und Neuen Testament, die einfach (bitte hier in’s Dokument hineinschreiben!) erweitert werden können:

+

Neues Testament

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FrageBibelstelleLösung
Ein Tier“Mt 26,74”ein Hahn
An welchem Ort ist Paulus“Phil 1,13”Gefängnis
Was ist wuchtig und voll Kraft“2Kor 10,10”Die Briefe
Körperteile“Mk 4,23”Ohren
Eine Farbe“Mt 23,27”Weiß
Biblische Zahl“Mk 1,13”40
Grundnahrungsmittel“Lk 11,3”Brot
Macht man auch in der Schule“Gal 6,11”Schreiben
Braucht man auf dem Bau“1 Thess 5,9”Helm
Ist strafbarHebr 10.34Raub
Eine Krankheit“Mt 8,15”Fieber
Wem gehört die zerfallene Hütte“Apg 15,16”David
Ein Gewürz“Offb 18,13”Zimt
Wie heißt das Kind“Lk 1,31”Jesus
Zwei Körperteile“Mt 5,38”“Auge , Zahn”
Häufige biblische Zahl“Mt 4,2”40
Angesehener Beruf“Mk 2,17”Arzt
Ist unangenehm“Lk 22,24”Streit
Was ist Gott“1 Kor 1,9”Treu
Was soll man ablegen“Eph 4,25”Lüge
Was fressen die Vögel“Mk 4,4”Körner
Was ist für Gott möglich“Mt 19,26”Alles
Ich kann es in der Küche finden“Lk 11,41”Schüsseln
In jedem Zimmer zu finden“Joh 10,9”Tür
Wie viel opfert die arme Witwe“Mk 12,42”2 kl. Münzen
Große Anzahl Soldaten“Mt 26, 53”Legionen
Kleine Lebewesen“Lk 13 ,19”Vögel
Brauchte jeder Ritter“Eph 6,1”Rüstung
Schlechte Eigenschaft“Hebr 13,5”Habgier
Sind aus Gold“Jak 2,2”Ringe
Welche Farbe hat der Kranz“Offb 14,14”Gold
Ein beliebtes Urlaubsland“Röm 15,24”Spanien
Häufiger Beruf zur Zeit Jesu“Mt 13,48”Fischer
Hohes Fest im Judentum“Joh 13,1”Paschafest
“Großer, schwerer Gegenstand”“Mk 16,4”Stein
Zeiteinheit“Mk 14,37”Stunde
Lasst darin nicht nach“Kol 4,2”Beten
Insel“Tit 1,5”Kreta
Letztes Wort im Petrusbrief1 PetrAmen
Kleines Naturwunder“Offb 10,1”Regenbogen
In jeder Wohnung zu finden“Lk 22,14”Tisch
Transportmittel“Mk 1,20”Boot
Bekommt man erst später“Apg 7,54”Zähne
Was werden sie gewinnen“Lk 21,19”Das Leben
Wichtiges Nahrungsmittel“Mt 5,13”Salz
Gegenstand aus Holz“Mt 27,32”Kreuz
Körperteil“Mt 28,9”Füße
Angeborene Behinderung“Joh 9,1”Blindheit
Geheimes Versteck“LK 19,46”Räuberhöhle
Die Liebe tut nichts …?“Röm 13,10”Böses
Bei uns als Drei Könige bekannt“Mt2,1”Sterndeuter
Hilfsmittel für Kranke“MK 2,12”Tragbahre
Stinkt“Lk 14,35”Misthaufen
Darauf kann man schreiben“Joh 19,20”Schild
Braucht man im Leben“Apg 23,11”Mut
Was war in den 7 Körben?“Mk 8,8”Brot
Leben am Bauernhof“Lk 15,16”Schweine
Gibt’s vor den Ferien“Joh 21,24”Zeugnis
“Gut, wenn man es nicht hat”“Apg 4,34”Not
Zahl der Kapitel bei MkMk16
Lebenswichtiges Organ“2Kor 9,7”Herz
Sechste Frucht des Geistes“Gal 5,22”Güte
Sehr unbeliebt bei Schülern“Lk 22,28”Prüfungen
Man freut sich darüber“Phil 3,7”Gewinn
Lebensfeindlicher Ort“Mk 1,3”Wüste
Beruf im Freien“Joh 10,11”Hirte
Was hat geholfen“Lk 17,19”Glaube
Erstes Transportmittel Jesu“Joh 12,14”Esel
Letztes Wort im NTOffbAllen
Wie viele Verse hat Joh 6Joh71 Verse
Wie viel lässt er zurück“Lk 15,4”99
Man hat eine Menge davon“Joh 20,27”Finger
Isst man hier normal nicht“Mt 3,4”Heuschrecken
Babys brauchen eine Menge“Lk 2,12”Windeln
Gehen oft sehr weit“Joh 12,20”Pilger
Tier unter Naturschutz“Joh 10,12”Wolf
Kann man öffnen und schließen“Lk 24,31”Augen
Auch du bist es“Mt 3,16”Getauft
Es war am Anfang“Joh 1,1”Das Wort
Kürzestes Buch im NTPhilemon
Was heisst Tabita auf deutsch?“Apg 9,36”Gazelle
Worin sehen wir nur rätselhafte Umrisse?“1 Kor 13,12”Spiegel
Wer steht vor der Frau?“Offb 12,4”Drache
Wohin will Paulus hier reisen?“Römer 15, 24”Spanien
Ein Tier“1 Petr 5,8”Löwe
Welche Frucht kommt hier zur Sprache?“Mk 11, 13”Feige
Welcher Prophet wird hier genannt?“Mt 3, 3”Jesaja
Wer hat hier Angst?“Joh 19, 8”Pilatus
Wie heißt Agrippas Frau?“Apg 25,23”Berenike
Von welchem scharfen Werkzeug ist hier die Rede?“Offb 14,18”Sichel
Was sind Jesu Worte?“Joh 6, 63”Geist und Leben
Wie nennt sich Jesus hier?“Joh 9,5”Licht (der Welt)
Was gibt es zu tragen?“Gal 6,2”Lasten
Wie wird Jesus verglichen“Eph 2,20”Eckstein
Name einer Frau aus dem AT“Hebr 11,21”Rahab
Name einer Stadt (in Syrien)“Apg 9,3”Damaskus
Was kommt aus den Mäulern der Pferde?“Offb 9,17”“Feuer, Rauch, Schwefel”
Wie heißt der Sohn?“Phlm 1,10”Onesimus
Bauwerk“1. Petr 2, 5”(lebendiges) Haus
Körperteil“1. Petr 2,22”Mund
Paar aus dem AT“1. Petr. 3, 6”Sara und Abraham
Was wird gejagt?“1. Petr. 3, 11”Frieden
Wieviele Menschen wurden in der Arche gerettet?“1. Petr. 3,20”acht
Gesucht ist ein Adjektiv (wie sollen wir sein?)“1. Petr. 4, 9”gastfreundlich
+

Altes Testament

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FrageBibelstelleLösung
zwei Musikinstrumente“Ps 98,6”Trompeten und Hörner
unechtes Körperteil“Ps 120,3”falsche Zunge
Was wird geöffnet“Ps 78,2”Mund
Wo wachsen die Bäume?“Ps 72,16”Libanon
Wie viele Männer?“Hiob 32,1”3
Mit wieviel Jahren wurde Zidkija König?“2. Kön 24,18”21
Kleine Vögel“Ps 147,9”junge Raben
Was regnet vom Himmel?“Ps 78,27”Fleisch
“was kann schwimmen, obwohl es zu schwer dafür ist?”“2 Kön 6,6”Eisen
Wie viele Steine suchte sich David?“1 Sam 17,40”5
Ein Getränk“Joel 2, 19”Most
Wie lange war Jona im Fisch?“Jona 2,1”drei Tage und drei Nächte
Wie heißen die drei Söhne Noachs?“Gen 6,10”“Sem, Ham, Jafet”
Wo singen die drei Jungen Männer?“Dan 3,51”Ofen
Wie viele Tage ruhen sie sich in Jerusalem aus?“Esra 8,32”3
Welche Früchte sind im Kuchen?“1 Chr 12,41”Traubenkuchen
Wo ist das Mehl? Wo ist das Öl?“1 Kön 17,12”“Topf, Krug”
“Was wird hochgehoben, damit es nicht nass wird?”“Jes 47,2”Schleppe
Was wird gesät?“Hos 8,7”Wind
Was bekommt Rut?“Rut 4,13”einen Sohn
Ein Tier“Hab 3, 19”Hirsch
Worin wird das Kleid gewaschen?“Gen 49,11”Wein
Welche Farbe hat das Gewand?“Jes 63,2”rot
Was ist süßer als Wein?“Hld 1,2”Liebe
Was wächst und wird immer mächtiger?“Dan 4,8”Baum
Wie viele Töchter hatte Rehabeam?“2 Chr 11,21”60
Eine Waffe“Jer 5,12”Schwert
Ein Kleidungsstück“Ps 109,29”Mantel
Was denkt Eli von Hanna?“1 Sam 1,13”Er hält sie für betrunken
Welche Frisur hatte Paulus?“Apg 18,18”Glatze
Wie viele Pferde?“Jes 36,8”2000
Ein Tier“Dtn 9,16”Kalb
Ein weibliches Tier“Spr 17,12”Bärin
Welche Farbe hat der Kranz?“Offb 14,14”gold
Wie schmeckt Manna?“Ex 16,31”Honigkuchen/Semmel mit Honig
Wie heißt der König von Baschan?“Ps 135,11”Og
Wie viele Monate lebt Elisabeth zurückgezogen?“Lk 1,24”5
Was reißen die anderen auf?“Ps 35,21”Mund
Woher kam Melatja?“Neh 3,7”Gibeon
Was zieht Josua aus?“Jos 5,15”Schuhe
Wie alt war Barsillai?“2 Sam 19,33”80
Von welchem Baum bekommt David Holz?“1 Chronik 14,1”Zeder
Wer sieht einen Engel?“Num 22,23”Esel
Welches Problem hat Jakob hier?“Gen 32, 32”er hinkt
Was wächst denn hier?“Jona 4, 6”Rizinusstrauch
Wer macht hier so einen Lärm?“Am 3, 4”Löwe
+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2022/02/16/moodle-iomad-linux.html/01-netzwerkbruecke.png b/public/2022/02/16/moodle-iomad-linux.html/01-netzwerkbruecke.png new file mode 100644 index 0000000..a59f11f Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/01-netzwerkbruecke.png differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/02-hosts-eintragen.png b/public/2022/02/16/moodle-iomad-linux.html/02-hosts-eintragen.png new file mode 100644 index 0000000..c3db4aa Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/02-hosts-eintragen.png differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/03-config generieren.png b/public/2022/02/16/moodle-iomad-linux.html/03-config generieren.png new file mode 100644 index 0000000..9189740 Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/03-config generieren.png differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/index.html b/public/2022/02/16/moodle-iomad-linux.html/index.html new file mode 100644 index 0000000..50d500b --- /dev/null +++ b/public/2022/02/16/moodle-iomad-linux.html/index.html @@ -0,0 +1,349 @@ + + + + + + + +Moodle Server mit Ubuntu 20 LTS und Iomad | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Moodle Server mit Ubuntu 20 LTS und Iomad +

+
+ Installation von Iomad zur Moodle-Instanz-Verwaltung +
+ +
+
+ + +
+

Moodle Server mit Ubuntu 20 LTS und Iomad

+

Ubuntu Server-Image herunterladen

+

https://releases.ubuntu.com/20.04/

+

Virtualbox mit dem Ubuntu Image einrichten

+

Netzwerkbrücke aktivieren

+

+

+

IP-Adresse ermitteln

+

ifconfig -> 192.168.178.132

+

Auf dem Mac (oder PC) die Auflösung des Hosts verknüpfen

+

auf dem Mac sudo nano /etc/hosts die IP eintragen und moodle.local zuweisen: + +

+

Moodle Server auf Virtualbox vorbereiten

+

sudo -iwechselt auf root

+

SSH Zugriff ermöglichen

+

Allow SSH root login on Ubuntu 20.04 Focal Fossa Linux

+

Shellbefehle zur Installation:

+
sudo apt update && apt upgrade -y
+
+apt install mariadb-server
+sudo apt install apache2 libapache2-mod-fcgid
+sudo apt install php php-cli php-fpm php-json php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-intl php-xmlrpc php-soap
+a2enconf php7.4-fpm
+
+sudo a2enmod actions fcgid alias proxy_fcgi setenvif
+
+a2dismod php7.4
+a2dismod mpm_prefork
+a2dismod mpm_worker
+
+a2enmod mpm_event
+
+systemctl restart php7.4-fpm apache2
+

anlegen: /etc/apache2/sites-available/moodle.conf

+
############################
+<VirtualHost *:80>
+	ServerName moodle.local
+
+	ServerAdmin webmaster@localhost
+	DocumentRoot /var/www/moodle
+	
+	<FilesMatch \.php$>
+        SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/"
+    </FilesMatch>
+	
+	ErrorLog ${APACHE_LOG_DIR}/error.log
+	CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+</VirtualHost>
+####################################################################
+

Weitere Shellbefehle zur Installation:

+
a2ensite moodle.conf
+systemctl reload apache2
+
+mkdir /var/www/moodle
+echo '<?php phpinfo(); ?>' > /var/www/moodle/info.php 
+

host eintrag hinzufügen: “192.168.178.xxx moodle.local”

+

192.168.178.xxx moodle.local +192.168.178.xxx www.moodle.local

+

im Browser öffnen: http://moodle.local/info.php

+

maschine speichern und klonen

+

Anschließend IOMAD moodle installieren:

+

https://www.iomad.org/wp-content/uploads/2021/03/Iomad-Installation-Guide.pdf

+

Datenbank für moodle erzeugen via SSH:

+

+mysql
+
+CREATE DATABASE moodledb;
+CREATE USER 'moodleowner'@'localhost' IDENTIFIED BY '$mdb2passwd';
+GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON moodledb.* TO 'moodleowner'@'localhost';
+GRANT FILE ON *.* TO 'moodleowner'@'localhost';
+
+quit
+

Installation iomad

+
cd /var/www/moodle
+git clone https://github.com/iomad/iomad.git
+cd iomad
+git checkout -b myiomad origin/IOMAD_310_STABLE
+mkdir /var/www/moodledata &&  chmod 777 /var/www/moodledata
+

ändern!!!: /etc/apache2/sites-available/moodle.conf -> DocumentRoot /var/www/moodle/iomad

+

systemctl restart php7.4-fpm apache2

+

http://moodle.local aufrufen und config.php Datei mit Hilfe des Assistenten generieren lassen

+

![](03-config generieren.png)

+

ändern!!!: /moodle entfernen

+

config.php

+
<?php  // Moodle configuration file
+
+unset($CFG);
+global $CFG;
+$CFG = new stdClass();
+
+$CFG->dbtype    = 'mariadb';
+$CFG->dblibrary = 'native';
+$CFG->dbhost    = 'localhost';
+$CFG->dbname    = 'moodledb';
+$CFG->dbuser    = 'moodleowner';
+$CFG->dbpass    = '$mdb2passwd';
+$CFG->prefix    = 'mdl_';
+$CFG->dboptions = array (
+  'dbpersist' => 0,
+  'dbport' => '',
+  'dbsocket' => '',
+  'dbcollation' => 'utf8mb4_general_ci',
+);
+
+$CFG->wwwroot   = 'http://moodle.local';
+$CFG->dataroot  = '/var/www/moodledata';
+$CFG->admin     = 'admin';
+
+$CFG->directorypermissions = 0777;
+
+require_once(__DIR__ . '/lib/setup.php');
+
+// There is no php closing tag in this file,
+// it is intentional because it prevents trailing whitespace problems!
+
+ +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2022/02/16/moodle-iomad-linux.html/title-gif.gif b/public/2022/02/16/moodle-iomad-linux.html/title-gif.gif new file mode 100644 index 0000000..f6c1d4f Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/title-gif.gif differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif new file mode 100644 index 0000000..c1fbeb3 Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif new file mode 100644 index 0000000..c8bab1a Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif new file mode 100644 index 0000000..a297e4a Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif differ diff --git a/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif new file mode 100644 index 0000000..b2cb5be Binary files /dev/null and b/public/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif differ diff --git a/public/2022/03/19/ob-virtualcam.html/01-deutsche-tastatur-ubuntu.png b/public/2022/03/19/ob-virtualcam.html/01-deutsche-tastatur-ubuntu.png new file mode 100644 index 0000000..af37db4 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/01-deutsche-tastatur-ubuntu.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/02-chrome-remote-desktop.png b/public/2022/03/19/ob-virtualcam.html/02-chrome-remote-desktop.png new file mode 100644 index 0000000..a35e63b Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/02-chrome-remote-desktop.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/03-status-chrome-remote.png b/public/2022/03/19/ob-virtualcam.html/03-status-chrome-remote.png new file mode 100644 index 0000000..7eeca4d Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/03-status-chrome-remote.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/04-remotezugriff.png b/public/2022/03/19/ob-virtualcam.html/04-remotezugriff.png new file mode 100644 index 0000000..a35e63b Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/04-remotezugriff.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/05-systemctl-status.png b/public/2022/03/19/ob-virtualcam.html/05-systemctl-status.png new file mode 100644 index 0000000..7eeca4d Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/05-systemctl-status.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/06-cannot-open-video-device.png b/public/2022/03/19/ob-virtualcam.html/06-cannot-open-video-device.png new file mode 100644 index 0000000..2a69d0e Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/06-cannot-open-video-device.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/07-jetzt-v412-ctl.png b/public/2022/03/19/ob-virtualcam.html/07-jetzt-v412-ctl.png new file mode 100644 index 0000000..5458b02 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/07-jetzt-v412-ctl.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/08-dummy-video-device.png b/public/2022/03/19/ob-virtualcam.html/08-dummy-video-device.png new file mode 100644 index 0000000..e7a9d10 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/08-dummy-video-device.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/09-relilab-technical-host.png b/public/2022/03/19/ob-virtualcam.html/09-relilab-technical-host.png new file mode 100644 index 0000000..37f64a5 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/09-relilab-technical-host.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/10-pin-remote-desktop.png b/public/2022/03/19/ob-virtualcam.html/10-pin-remote-desktop.png new file mode 100644 index 0000000..d77aad4 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/10-pin-remote-desktop.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/11-keyboard-tastatur-umstellen.png b/public/2022/03/19/ob-virtualcam.html/11-keyboard-tastatur-umstellen.png new file mode 100644 index 0000000..98ed150 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/11-keyboard-tastatur-umstellen.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/12-apps-verknuepfen.png b/public/2022/03/19/ob-virtualcam.html/12-apps-verknuepfen.png new file mode 100644 index 0000000..37a264b Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/12-apps-verknuepfen.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/13-startvirtualcam.png b/public/2022/03/19/ob-virtualcam.html/13-startvirtualcam.png new file mode 100644 index 0000000..2a96af3 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/13-startvirtualcam.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/14-OBS-deutsch-umstellen.png b/public/2022/03/19/ob-virtualcam.html/14-OBS-deutsch-umstellen.png new file mode 100644 index 0000000..4806a6e Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/14-OBS-deutsch-umstellen.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/15-obs-mit-virtual-cam-starten.png b/public/2022/03/19/ob-virtualcam.html/15-obs-mit-virtual-cam-starten.png new file mode 100644 index 0000000..2461000 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/15-obs-mit-virtual-cam-starten.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/16-startup-application.png b/public/2022/03/19/ob-virtualcam.html/16-startup-application.png new file mode 100644 index 0000000..b91b554 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/16-startup-application.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/17-i-will-only-be-using-OBS.png b/public/2022/03/19/ob-virtualcam.html/17-i-will-only-be-using-OBS.png new file mode 100644 index 0000000..e590784 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/17-i-will-only-be-using-OBS.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/18-video1920.png b/public/2022/03/19/ob-virtualcam.html/18-video1920.png new file mode 100644 index 0000000..4457758 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/18-video1920.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/19-szenensammlung-importieren-OBS.png b/public/2022/03/19/ob-virtualcam.html/19-szenensammlung-importieren-OBS.png new file mode 100644 index 0000000..8e3bda3 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/19-szenensammlung-importieren-OBS.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/20-chrome-einrichten.png b/public/2022/03/19/ob-virtualcam.html/20-chrome-einrichten.png new file mode 100644 index 0000000..5da1aa6 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/20-chrome-einrichten.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/21-chrome-standard.png b/public/2022/03/19/ob-virtualcam.html/21-chrome-standard.png new file mode 100644 index 0000000..2ce39a8 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/21-chrome-standard.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/22-chrome-anmeldung.png b/public/2022/03/19/ob-virtualcam.html/22-chrome-anmeldung.png new file mode 100644 index 0000000..5081531 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/22-chrome-anmeldung.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/23-zoom-anmeldung.png b/public/2022/03/19/ob-virtualcam.html/23-zoom-anmeldung.png new file mode 100644 index 0000000..44085eb Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/23-zoom-anmeldung.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/24-zoom-sprache-aendern.png b/public/2022/03/19/ob-virtualcam.html/24-zoom-sprache-aendern.png new file mode 100644 index 0000000..e0df640 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/24-zoom-sprache-aendern.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/25-slides-emojis.png b/public/2022/03/19/ob-virtualcam.html/25-slides-emojis.png new file mode 100644 index 0000000..c119850 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/25-slides-emojis.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/26-keyring-problem.png b/public/2022/03/19/ob-virtualcam.html/26-keyring-problem.png new file mode 100644 index 0000000..4bc0b90 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/26-keyring-problem.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/27-startvirtualcam-verknuepft-OBS.jpg b/public/2022/03/19/ob-virtualcam.html/27-startvirtualcam-verknuepft-OBS.jpg new file mode 100644 index 0000000..2ac47bb Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/27-startvirtualcam-verknuepft-OBS.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/28-shell-startup.png b/public/2022/03/19/ob-virtualcam.html/28-shell-startup.png new file mode 100644 index 0000000..3b3b0e8 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/28-shell-startup.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner.jpg new file mode 100644 index 0000000..d42eeda Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg new file mode 100644 index 0000000..7ef92a8 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg new file mode 100644 index 0000000..4b63a37 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg new file mode 100644 index 0000000..14e7d6d Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg new file mode 100644 index 0000000..3e54163 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg new file mode 100644 index 0000000..d3ca19f Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg differ diff --git a/public/2022/03/19/ob-virtualcam.html/index.html b/public/2022/03/19/ob-virtualcam.html/index.html new file mode 100644 index 0000000..f061a14 --- /dev/null +++ b/public/2022/03/19/ob-virtualcam.html/index.html @@ -0,0 +1,402 @@ + + + + + + + +Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern +

+
+ Via Konsole Instanz in aufsetzen, Desktop-Linux installieren, Apps einrichten und konfigurieren +
+ +
+
+ + +
+

Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern

+

Instanz erstellen auf https://console.cloud.google.com/

+
    +
  • Name, Region und Zone auswählen
  • +
  • E2 4 vCPU, 16GB Arbeitsspeicher - 0,17$ pro Stunde
  • +
  • +
  • Betriebssystem Ubuntu 20.04 LTS
  • +
+

Ubuntu Desktop auf Google Cloud Plattform installieren

+

https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud +https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome +https://bytexd.com/install-chrome-remote-desktop-headless/ +https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process

+

Via SSH/Terminal Update, Tasksel und Google Remote Desktop installieren:

+
sudo apt update
+sudo apt install --assume-yes wget tasksel
+wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb
+sudo apt-get install --assume-yes ./chrome-remote-desktop_current_amd64.deb
+

Cinnamon Desktop installieren

+
sudo DEBIAN_FRONTEND=noninteractive \
+    apt install --assume-yes cinnamon-core desktop-base dbus-x11
+

sudo bash -c 'echo "exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d" > /etc/chrome-remote-desktop-session'

+

Zusätzliche Einstellungen:

+
sudo systemctl disable lightdm.service
+

Deutsche Tastatur in der Ubuntu-Konsole festlegen:

+
sudo dpkg-reconfigure keyboard-configuration
+

+ + +

+

Optional: Google Chrome Browser installieren

+
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
+sudo apt install --assume-yes ./google-chrome-stable_current_amd64.deb
+

Chrome Remote Desktop konfiguieren und starten

+

https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#configuring_and_starting_the_chrome_remote_desktop_service) +Mit Google-Konto, das zur Remote-Stuerung benutzt werden soll, https://remotedesktop.google.com/headless aufrufen und den SSH-Befehl in der Konsole ausführen. 6-Stellige PIN festlegen. + + +Prüfen ob der Dienst ausgeführt wird:

+
sudo systemctl status chrome-remote-desktop@$USER
+

+

+

Instanzzeitplan festlegen

+

https://rominirani.com/hands-on-guide-to-scheduling-vm-instances-to-start-and-stop-a079a50e16c6

+

OBS Installation

+

https://obsproject.com/wiki/install-instructions#ubuntumint-installation

+
sudo apt install ffmpeg
+sudo apt install v4l2loopback-dkms
+sudo add-apt-repository ppa:obsproject/obs-studio
+sudo apt update
+sudo apt install obs-studio
+

Problem:

+

Test mit v4l2-ctl --list-devices bringt Fehlermeldung:

+
+

Cannot open device /dev/video0, exiting. + +

+
+

Lösung für virtuelle Kamera auf virtueller Maschine:

+
sudo apt -y install v4l2loopback-dkms v4l2loopback-utils linux-modules-extra-$(uname -r)
+
sudo modprobe v4l2loopback
+

Jetzt: + +

+

Problem: Trotzdem nach jedem Reboot wird die virtuelle Kamera nicht geladen:

+

+

+

Lösung v4l2loopback bei Start laden:

+

https://askubuntu.com/questions/1245212/how-do-i-automatically-run-modprobe-v4l2loopback-on-boot

+
sudo nano /etc/modules
+

hinzufügen: v4l2loopback

+

Zoom Installation

+

https://support.zoom.us/hc/de/articles/204206269-IZoom-unter-Linux-installieren-oder-aktualisieren

+
sudo apt install gdebi
+sudo apt update
+sudo apt upgrade
+
sudo snap install zoom-client
+

Inbetriebnahme des Remote Desktop

+

Verbindung zur VM-Instanz herstellen

+

Via https://remotedesktop.google.com/access auf das Remote Gerät zugreifen.: + + +Sechsstelligen PIN eingeben: + +

+

Keyboard / Tastatur auf deutsch umstellen:

+

+

+

Apps auf dem Desktop verknüpfen:

+

+

+

OBS einrichten

+

OBS mit virtueller Kamera automatisch starten:

+

Rechtsklick auf die Verknüpfung und dann beim Startbefehl --startvirtualcam ergänzen. + +

+

Beim Systemstart mit virtueller Kamera starten:

+

startup Applications wählen + + +ebenfalls --startvirtualcam ergänzen + +

+

Beim ersten Start von OBS

+

“I will only be using the virtual camera” wählen: + + +In den Einstellungen die Sprache auf Deutsch umstellen: + + +Videoauflösung auf 1920x1080 umstellen: + + +Szenensammlung importieren + + +(Vorkonfigurierte Szenen für das relilab-Café immer aktuell auf Github) +- relilab-cafe-obs-json.json

+

Google Chrome einrichten

+

Beim ersten Systemstart Password for new Keyring erstellen:

+

+

+

Chrome zum Standardbrowser machen

+

+

+

Google Chrome anmelden und Sync inkl. Lesezeichen aktivieren

+

+

+

Zoom einrichten

+

Zoom-Account anmelden

+

+

+

Sprache ändern in Zoom

+

Zoom starten und dann das Zoom-Symbol rechts in der unteren Leiste mit Rechtsklick der Maus das Menü zur Sprachänderung aufrufen: + +

+

Problemlösungen

+

Problem - keine Emojis in den Slides

+

+

+

Lösung: https://medium.com/@harshmaur/emojis-missing-from-chrome-in-ubuntu-9c25fe10867c

+
sudo apt-get remove fonts-noto-color-emoji
+sudo apt-get install fonts-noto-color-emoji
+

Problem - kein Font Yanone Kaffeesatz in den Slides

+

Lösung: https://zoomadmin.com/HowToInstall/UbuntuPackage/fonts-yanone-kaffeesatz

+
sudo apt-get update -y
+sudo apt-get install -y fonts-yanone-kaffeesatz
+

Mögliches Problem

+
+

GUI (Ubuntu Desktop) has its own security layer which blocks the root account from login. So, even we have a properly enabled root account with password, it does not work in GUI interface. + + +https://askubuntu.com/questions/1192471/login-as-root-on-ubuntu-desktop

+
+

https://www.computernetworkingnotes.com/linux-tutorials/how-to-enable-and-disable-root-login-in-ubuntu.html

+

Anstatt auf Cloud-Plattform mit Linux auf lokalem Windows-PC

+

Autostart OBS inkl virtueller Kamera & Zoom

+

Vorbereiten OBS inkl Virtueller Kamera

+

Hinzufügen von --startvirtualcam zur OBS-Verknüpfung: + +

+

open the start menu/tile thing and type in: +Run and hit enter. Then type in shell:startup + + +Dann die Verknüpfungen in den Autostartordner kopieren: + +

+

Weitere Schritte wie oben

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2022/03/19/ob-virtualcam.html/v412-ctl-fehlermeldung.png b/public/2022/03/19/ob-virtualcam.html/v412-ctl-fehlermeldung.png new file mode 100644 index 0000000..2a69d0e Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/v412-ctl-fehlermeldung.png differ diff --git a/public/2022/03/19/ob-virtualcam.html/virtueller-desktop-titelbild.jpg b/public/2022/03/19/ob-virtualcam.html/virtueller-desktop-titelbild.jpg new file mode 100644 index 0000000..b87aa25 Binary files /dev/null and b/public/2022/03/19/ob-virtualcam.html/virtueller-desktop-titelbild.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/16-Schneckennudeln.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/16-Schneckennudeln.jpg new file mode 100644 index 0000000..6e1a8cf Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/16-Schneckennudeln.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/Hefeteig-mit-Fuellung.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/Hefeteig-mit-Fuellung.jpg new file mode 100644 index 0000000..68cef76 Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/Hefeteig-mit-Fuellung.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/hefeschnecken-in-capelle-backform.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/hefeschnecken-in-capelle-backform.jpg new file mode 100644 index 0000000..d8d7359 Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/hefeschnecken-in-capelle-backform.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/index.html b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/index.html new file mode 100644 index 0000000..7b95f82 --- /dev/null +++ b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/index.html @@ -0,0 +1,278 @@ + + + + + + + +Jojos Schoko-Zimt-Schnecken | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Jojos Schoko-Zimt-Schnecken +

+
+ Rezept und Backanleitung +
+ +
+
+ + +
+

Schoko-Schnecken

+

Hefeteig

+

200g Milch handwarm +½ Pk Vanillezucker +60g Zucker +22g Hefe +verrühren +1 Ei Größe L dazu +in der Teigknetmaschine +120g Weizenmehl 405 +380g Dinkelmehl 630 +dazu und wenn es ein fester Teig ist +5g Salz zugeben +und +60g Butter kalt in Streifen schneiden und +5-10 Minuten einketen (-> Fenstertest) +danach Teig 30-60 Minuten ruhen/gehen lassen

+

Füllung

+

in der Zwischenzeit +10g brauner Zucker +30g Rohrohrzucker +50g weißer Zucker +100g Butter +½ Pk Vanillezucker +2 Teelöffel Zimt +5 Teelöffel Kaba +verkneten zu einer cremigen Masse

+

Hefeteig ausrollen und mit der Füllung bestreichen +Nach Belieben noch Raspel Schokolade darauf verteilen + + +einrollen, in 16 Stücke schneiden und in Kuchenform setzen: + + +Mit Frischhaltefolie abdecken und weitere ca. 30 Minuten gehen lassen, dann mit Eimilch abstreichen: + + +Backofen auf 220°Celsius Ober-/Unterhitze vorheizen. +In den Ofen und dabei auf 180° reduzieren. +Nach 10 Minuten auf 160° reduzien: + + +weitere 25 Minuten backen oder bis eine Kerntemperatur von 92° erreicht ist. Fertig: + +

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-fertig.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-fertig.jpg new file mode 100644 index 0000000..6a7abc5 Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-fertig.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-im-ofen.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-im-ofen.jpg new file mode 100644 index 0000000..1495aba Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-im-ofen.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel.jpg new file mode 100644 index 0000000..23a439d Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg new file mode 100644 index 0000000..9664230 Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg new file mode 100644 index 0000000..6888e8f Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg new file mode 100644 index 0000000..0703a7c Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg new file mode 100644 index 0000000..961516d Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg differ diff --git a/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg new file mode 100644 index 0000000..bd91bee Binary files /dev/null and b/public/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild1-alternativ-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild1-alternativ-saemann.jpeg new file mode 100644 index 0000000..46cfe95 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild1-alternativ-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild1-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild1-saemann.jpeg new file mode 100644 index 0000000..979b229 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild1-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild2-alternativ-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild2-alternativ-saemann.jpeg new file mode 100644 index 0000000..57da9ab Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild2-alternativ-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild2-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild2-saemann.jpeg new file mode 100644 index 0000000..6a8f4b2 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild2-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild3-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild3-saemann.jpeg new file mode 100644 index 0000000..ae08e42 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild3-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild4-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild4-saemann.jpeg new file mode 100644 index 0000000..f2cdae1 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild4-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/bild5-saemann.jpeg b/public/2023/03/23/gleichnis-vom-saemann.html/bild5-saemann.jpeg new file mode 100644 index 0000000..620c04e Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/bild5-saemann.jpeg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/index.html b/public/2023/03/23/gleichnis-vom-saemann.html/index.html new file mode 100644 index 0000000..dc07b5c --- /dev/null +++ b/public/2023/03/23/gleichnis-vom-saemann.html/index.html @@ -0,0 +1,294 @@ + + + + + + + +Das Gleichnis vom Sämann | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Das Gleichnis vom Sämann +

+
+ erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle +
+ +
+
+ + +
+

Das Gleichnis vom Sämann

+

erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle

+

Bild 1: “Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung”

+

+ +alternativ: + + +Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren.

+

Bild 2: “Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen”

+

+ +alternativ + + +Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen.

+

Bild 3: “Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens”

+

+ +Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden.

+

Bild 4: “Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde”

+

+ +Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben.

+

Bild 5: “Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor”

+

+ +Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat.

+
+

Anleitung / Erstellung - The Making of

+

1. Geschichte erstellen mit ChatGPT-4

+

Screenshot

+

![](screen-chatgpt-saemann.png =x600)

+

Volltext

+
Beschreibe mir die Geschichte vom Sämann aus der Bibel für einen 8-jähringen in 5 Bildern
+

Bild 1: Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren.

+

Bild 2: Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen.

+

Bild 3: Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden.

+

Bild 4: Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben.

+

Bild 5: Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat.

+

Gib mir noch schöne anrührende Überschriften zu den Bildern +Bild 1: “Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung” +Bild 2: “Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen” +Bild 3: “Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens” +Bild 4: “Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde” +Bild 5: “Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor”

+

2. Illustration durch Übersetzung der Bildbeschreibungen mit Deepl und damit Prompterstellung für midjourney

+

Ergänzung der automatischen Übersetzung für den Prompt jeweils durch Illustration by Eric Carlefür den Stil, --q 2 für die höchste Qualitätsstufe und --v 5für Midjourney Version 5

+

Prompt 1

+

A friendly farmer stands in an open field, a handful of seeds in his hand. He scatters the seeds far and wide to sow a harvest. Behind him you can see four different soils: one rocky, one thorny, one surrounded by birds and one fertile. Illustration by Eric Carle --q 2 --v 5

+

Prompt 2

+

Some seeds fall on the rocky ground, where they have little soil. The seeds germinate quickly, but they do not have enough soil to root deeply. The picture shows small, weak plants starting to grow in the rocky soil. Illustration by Eric Carle --q 2 --v 5

+

Prompt 3

+

Other seeds fall on the thorny ground, where they are surrounded by thorns and weeds. The plants begin to grow, but they are choked by the thorns that surround them. The picture shows how the thorns clasp the young plants and prevent them from growing tall and strong. Illustration by Eric Carle --q 2 --v 5

+

Prompt 4

+

other seeds fall on the ground surrounded by birds, where they are immediately eaten by hungry birds. The picture shows happy birds enjoying the seeds before they even have a chance to grow. Illustration by Eric Carle --q 2 --v 5

+

Prompt 5

+

Finally, some seeds fall on the fertile soil, where they can root deeply and grow. The picture shows large, healthy plants thriving in the sun and bearing abundant fruit. The farmer stands proudly next to the rich harvest and smiles, knowing that he has sown well. Illustration by Eric Carle --q 2 --v 5

+
+

Alles von Gott erdacht, in der Bibel niedergeschrieben und mit künstlicher Intelligenz in Text und Bilder verwandelt unter der Lizenz +CC-BY-SA Das heißt, ihr dürft alles Weiterverwenden, Verändern, Anpassen oder sogar verkaufen. Eine Namensnennung von Jörg Lohrer wäre nett.

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title.jpg b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title.jpg new file mode 100644 index 0000000..772a492 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title.jpg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg new file mode 100644 index 0000000..5e628a0 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg new file mode 100644 index 0000000..d24c97c Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg new file mode 100644 index 0000000..f07c937 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg differ diff --git a/public/2023/03/23/gleichnis-vom-saemann.html/screen-chatgpt-saemann.png b/public/2023/03/23/gleichnis-vom-saemann.html/screen-chatgpt-saemann.png new file mode 100644 index 0000000..7b64da1 Binary files /dev/null and b/public/2023/03/23/gleichnis-vom-saemann.html/screen-chatgpt-saemann.png differ diff --git a/public/2023/04/07/dampfnudeln.html/Dampfnudel-mit-Vanillesosse.jpg b/public/2023/04/07/dampfnudeln.html/Dampfnudel-mit-Vanillesosse.jpg new file mode 100644 index 0000000..f2034a6 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Dampfnudel-mit-Vanillesosse.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Dampfnudeln-auf-Lochblech.jpg b/public/2023/04/07/dampfnudeln.html/Dampfnudeln-auf-Lochblech.jpg new file mode 100644 index 0000000..8a20185 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Dampfnudeln-auf-Lochblech.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Dampfnudeln-im-Dampfgarer.jpg b/public/2023/04/07/dampfnudeln.html/Dampfnudeln-im-Dampfgarer.jpg new file mode 100644 index 0000000..9361b50 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Dampfnudeln-im-Dampfgarer.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefefreuden.jpg b/public/2023/04/07/dampfnudeln.html/Hefefreuden.jpg new file mode 100644 index 0000000..8c8325e Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefefreuden.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg new file mode 100644 index 0000000..79d44b8 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg new file mode 100644 index 0000000..c88fbaf Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg new file mode 100644 index 0000000..e2756ce Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg new file mode 100644 index 0000000..be0c992 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefeteig.jpg b/public/2023/04/07/dampfnudeln.html/Hefeteig.jpg new file mode 100644 index 0000000..f0f0ded Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefeteig.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/Hefezopf.jpg b/public/2023/04/07/dampfnudeln.html/Hefezopf.jpg new file mode 100644 index 0000000..6c89b31 Binary files /dev/null and b/public/2023/04/07/dampfnudeln.html/Hefezopf.jpg differ diff --git a/public/2023/04/07/dampfnudeln.html/index.html b/public/2023/04/07/dampfnudeln.html/index.html new file mode 100644 index 0000000..c113a5d --- /dev/null +++ b/public/2023/04/07/dampfnudeln.html/index.html @@ -0,0 +1,276 @@ + + + + + + + +Hefefreuden - Dampfnudeln & Minihefezopf | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Hefefreuden - Dampfnudeln & Minihefezopf +

+
+ Rezept und Backanleitung +
+ +
+
+ + +
+

Dampfnudeln & Minihefezopf

+

Zutaten

+
    +
  • 400 ml Milch
  • +
  • 120g Zucker
  • +
  • 1 Pkg Hefe (42g)
  • +
  • 3 Eier (ca 150g Vollei)
  • +
  • 1000g Mehl (300g Weizen Type 405 & 700g Dinkel Type 630)
  • +
  • 10 g Salz
  • +
  • 120 g Butter
  • +
+

Rezept

+
    +
  • Milch, Zucker, Hefe handwarm mischen
  • +
  • Eier dazu und in der Knetmaschine 5 Minuten lang das Mehl unterkneten
  • +
  • Salz dazu und die in Streifen geschnittene Butter weitere 10 Minuten verkneten
  • +
  • Mindestens 30 Minuten gehen lassen + +
  • +
+

Dampfnudeln

+
    +
  • 6 x 135g Stücke vom Teig abstechen, rundschleifen und auf gelochtes Dampfgarblech aufsetzen: + +
  • +
  • weitere 30 Minuten gehen lassen
  • +
  • dann bei 100°Celsius für 30 Minuten dampfgaren
  • +
  • fertig + +
  • +
  • mit Vanillesoße servieren +
  • +
+

Hefezopf

+
    +
  • Die restlichen ca 900-1000g Teig in 3 gleiche Teile abwiegen und zu einem Zopf flechten
  • +
  • Mit Küchenhandtuch abgedeckt mindestens 30 Minuten gehen lassen
  • +
  • Mit Ei abstreichen und im auf 220° vorgeheizten Backofen direkt bei einschießen auf 180° reduzieren
  • +
  • Nach 10 Minuten Back-Temperatur auf 160° reduzieren
  • +
  • Entweder backen bis 93° Kerntemperatur erreicht ist oder nach ca weiteren 30 Minuten + +
  • +
+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/index.html b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/index.html new file mode 100644 index 0000000..c4301ce --- /dev/null +++ b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/index.html @@ -0,0 +1,259 @@ + + + + + + + +WordPress statt Padlet oder TaskCards | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ WordPress statt Padlet oder TaskCards +

+
+ Mit WordPress, horizontalem Scrolling und Beitragskategorien Sammlungen im Kanban-Style erstellen +
+ +
+
+ + +
+

Eine Sammlung von Liedern für den Religionsunterricht ist auf Instagram in Zusammenarbeit von @relimomente @ezpz.lemon.sqz und @colibri260 entstanden und wurde zunächst hier auf TaskCards veröffentlicht.

+

Weil TaskCards weder exportiert noch importiert werden können, es nur 2 kostenfreie gibt und somit kein #OER damit erstellt werden kann, haben wir uns Gedanken gemacht, wie man das Ganze in Wordpress umsetzen kann:

+

https://blogs.rpi-virtuell.de/rulieder

+

Als Bonus sind

+ +

Alles was es dazu braucht ist:

+

1. “horizontales Scrollen”

+

+ +einfach umsetzbar mit verschiedenen WordPress-Plugins. +Hier wurde der “horizontal Scroller” von Stackable benutzt.

+

2. Spalten als “posts block”

+

Es gibt wieder eine Vielzahl von WordPress-Blöcken, die Beiträge (posts) nach Kategorien sortiert in Spalten anzeigbar machen. Hier wurde “posts block” wiederum von Stackable benutzt. + +

+

Sortieren der Beiträge in den Spalten

+

Um die Beiträge nicht nach Erstellungsdatum sondern individuell in ihren Kategorien zu sortieren gibt es das Plugin “Intuitive Custom Post Order”, dass dies per Drag&Drop ermöglicht. + +

+

blogs.rpi-virtuell.de

+

Die Blogs von rpi-virtuell haben alle hier beschriebenen Plugins schon vorinstalliert und müssen nur noch aktiviert werden. Somit steht deinen eigenen WordPress-TaskCards-Padlet-Sammlungen nichts mehr im Wege und du kannst sie kostenfrei und als offene Bildungsmaterialien anderen zugänglich machen.

+ + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/posts-per-drag-and-drop-sortieren.png b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/posts-per-drag-and-drop-sortieren.png new file mode 100644 index 0000000..4f4e1fc Binary files /dev/null and b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/posts-per-drag-and-drop-sortieren.png differ diff --git a/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/spalten-als-posts-block.png b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/spalten-als-posts-block.png new file mode 100644 index 0000000..6e432c7 Binary files /dev/null and b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/spalten-als-posts-block.png differ diff --git a/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/wordpress-horizontales-scrollen.gif b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/wordpress-horizontales-scrollen.gif new file mode 100644 index 0000000..668a039 Binary files /dev/null and b/public/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/wordpress-horizontales-scrollen.gif differ diff --git a/public/2024/01/26/offenheit-das-wesentliche.html/index.html b/public/2024/01/26/offenheit-das-wesentliche.html/index.html new file mode 100644 index 0000000..090963f --- /dev/null +++ b/public/2024/01/26/offenheit-das-wesentliche.html/index.html @@ -0,0 +1,302 @@ + + + + + + + +Offenheit - das Wesentliche | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Offenheit - das Wesentliche +

+
+ Ein Beitrag zu Teil 1 “Mein (schulisches) Motto für 2024” der EduBlogparade +
+ +
+
+ + +
+

Offenheit - das Wesentliche

+

1. Einleitung: Persönliche Reflexion über Offenheit

+

Wenn ich auf das Jahr 2023 zurückblicke, gewinne ich den Eindruck, dass das Wesentliche in meinem Berufs- und Privatleben in den Verbindungen mit anderen Menschen liegt. +Dashalb ist die Offenheit für Andere, mit und an denen ich lerne nicht nur ein abstraktes Ideal oder eine berufliche Anforderung, sondern ein wesentlicher Bestandteil meiner täglichen Existenz. Dieses Bewusstsein hat mich dazu inspiriert, meine Neujahrsvorsätze für 2024 um das Thema Offenheit herum zu gestalten.

+

Meine bisherigen Erfahrungen mit Offenheit haben mich gelehrt, dass es viel mehr ist als nur ein offenes Ohr für andere zu haben oder neue Ideen willkommen zu heißen. Es geht darum, mich selbst für neue Erfahrungen, Veränderungen und unterschiedliche Perspektiven zu öffnen. Ich habe gelernt, dass Offenheit eine Haltung ist, die Mut erfordert – den Mut, sich dem Unbekannten zu stellen, Veränderungen zu akzeptieren und manchmal auch das Risiko einzugehen, verletzlich zu sein.

+

Für das kommende Jahr möchte ich mich noch stärker auf das Wesen der Offenheit konzentrieren. Ich habe erkannt, dass Offenheit nicht nur ein Weg ist, mein Leben zu bereichern, sondern auch ein Mittel, um effektiver zu kommunizieren, tiefere Beziehungen aufzubauen und eine bereichernde Arbeitsumgebung zu schaffen. Offenheit soll in meinem Alltag zur Grundlage meiner Entscheidungen und Interaktionen werden.

+

Dies bedeutet, dass ich bewusst Raum schaffen möchte für das Zuhören und Verstehen anderer Meinungen, auch wenn sie von meinen eigenen abweichen. Es bedeutet auch, mich neuen Herausforderungen und Möglichkeiten zu stellen, ohne von vornherein eine defensive Haltung einzunehmen. In beruflicher Hinsicht möchte ich offener für kreative und innovative Ansätze sein, die über herkömmliche Methoden hinausgehen, und ich strebe danach, Offenheit als ein Schlüsselelement in meiner Arbeitskultur zu etablieren.

+

Meine Neujahrsvorsätze für 2024 drehen sich also darum, Offenheit in meinem Denken und Handeln zu kultivieren. Ich möchte lernen, flexibler zu sein, meine Komfortzone zu erweitern und mich aktiv auf das Unbekannte einzulassen. Durch diese Reise erhoffe ich mir, nicht nur persönlich zu wachsen, sondern auch positiv auf die Menschen um mich herum einzuwirken. Offenheit ist für mich das Schlüsselwort für 2024 – ein Jahr, in dem ich mich auf das Wesentliche konzentrieren und neue Wege des Lernens und der Gemeinschaft erkunden möchte.

+

2. Offenheit in meinem Alltag: Eine neue Perspektive

+

In meinem Streben nach Offenheit im neuen Jahr möchte ich diese nicht nur als abstraktes Konzept verstehen, sondern sie konkret in meinen Alltag integrieren. Offenheit in meiner täglichen Kommunikation und in meinen Beziehungen soll zu einem zentralen Fokus werden.

+

Erstens plane ich, in meinen beruflichen Beziehungen geschlossene Systemen zu überwinden. Dies bedeutet für mich, mich aktiv um eine Kultur der Offenheit und Transparenz zu bemühen. Ich möchte die Silo-Mentalität abbauen, die in vielen Organisationen vorherrscht, und stattdessen eine Umgebung schaffen, in der Wissen und Informationen frei geteilt werden. Durch das Überwinden geschlossener Systeme erhoffe ich mir, ein integratives und kollaboratives Arbeitsumfeld zu fördern, in dem Ideen und Innovationen gedeihen können. +Das bedeutet Social-Media-Walls und geschlossene Plattformen (sowie meine 23.461 Tweets) hinter mir zu lassen und offene, dezentrale Anschlussmöglichkeiten zu erlernen um Offenheit auch substantiell und nachhaltig zu ermöglichen.

+

Ein weiterer Aspekt meiner Alltags-Offenheit bezieht sich auf meine persönliche Entwicklung. Ich möchte mich neuen Erfahrungen und Herausforderungen stellen, die mich aus meiner Komfortzone herausholen. Das kann bedeuten, Permakultur auszuprobieren, mich wieder musikalisch zu betätigen oder meine Kompetenzen online zu erweitern. Diese Schritte sollen nicht nur zur Selbstentfaltung beitragen, sondern auch meine Fähigkeit stärken, mit Veränderungen und Unsicherheiten umzugehen.

+

Schließlich erkenne ich, dass Offenheit auch bedeutet, sich selbst gegenüber ehrlich zu sein. Es geht darum, meine eigenen Gefühle, Ängste und Hoffnungen anzuerkennen und sie nicht zu unterdrücken. Indem ich mir meiner eigenen inneren Welt bewusst werde, kann ich authentischer mit anderen interagieren und eine tiefere Selbstkenntnis entwickeln, die mich dann hoffentlich auch anschlussfähiger macht. Also mehr Offenheit in Arbeit und freiZEIT

+

Durch diese konkreten Schritte hoffe ich, Offenheit zu einem integralen Bestandteil meines täglichen Lebens zu machen. Ich bin überzeugt, dass dies nicht nur mein persönliches Wachstum fördern, sondern auch meine Beziehungen zu anderen bereichern wird. Offen zu sein bedeutet für mich, aktiv und bewusst zu leben, immer bereit, neue Perspektiven zu erkunden und das Leben in all seinen Facetten zu umarmen. Indem ich Offenheit in meinen Alltag integriere, öffne ich die Tür zu einer Welt voller neuer Möglichkeiten, Lernerfahrungen und tiefgreifender Verbindungen.

+

3. Offenheit in Bildung und Lernen: Ein lebenslanger Prozess

+

In meinem Streben nach Offenheit im Jahr 2024 möchte ich mich besonders auf den Bereich der Bildung und des Lernens in offenen Communities konzentrieren. Offene Bildungsressourcen (OER) bieten eine wunderbare Gelegenheit, sich kontinuierlich weiterzuentwickeln und zu lernen. Meine Beteiligung an OER ist nicht nur ein berufliches Engagement, sondern auch ein persönliches Anliegen, das meine Leidenschaft für lebenslanges Lernen widerspiegelt.

+

Ich sehe OER als eine Möglichkeit, Bildung zugänglicher und inklusiver zu gestalten. Durch meine Beteiligung an Projekten und Initiativen, die OER-Communities fördern, möchte ich dazu beitragen, Wissen frei verfügbar zu machen und Lernmöglichkeiten für Menschen aus unterschiedlichen Hintergründen zu schaffen. Dies beinhaltet auch die Förderung von Netzwerkknoten und Gemeinschaften, die offene Bildungsressourcen unterstützen und entwickeln.

+

Ein weiterer Schwerpunkt für mich ist die kontinuierliche eigene Weiterbildung durch OER. Ich plane, Online-Kurse, Webinare und andere offene Bildungsangebote zu nutzen, um meine Fähigkeiten und mein Wissen zu erweitern. Dieses Engagement für das lebenslange Lernen ist ein Kernaspekt meiner persönlichen und beruflichen Entwicklung.

+

Ich möchte auch mein Netzwerk aus Gleichgesinnten erweitern, die den Wert offener Bildung erkennen und fördern, wie beispielsweise im Bündnis Freie Bildung. Durch den Austausch mit anderen, die in diesem Bereich aktiv sind, kann ich neue Ideen und Perspektiven gewinnen und gleichzeitig meine eigenen Erfahrungen teilen. Dieser Austausch wird mir helfen, meine Rolle in der OER-Community zu stärken und effektiver zur Weiterentwicklung von offenen Bildungsressourcen beizutragen.

+

Schließlich sehe ich Offenheit in der Bildung als einen Weg, um kritisch zu denken und kreative Lösungen für Herausforderungen zu finden. Offene Bildungsressourcen ermutigen mich, über traditionelle Lernmethoden hinauszugehen und innovative Ansätze in meinem Lernprozess zu erkunden.

+

4. Qualitätssicherung und Standardisierung in OER

+

Mein Engagement für Offenheit im Bildungsbereich im Jahr 2024 beinhaltet auch einen starken Fokus auf die Qualitätssicherung und Standardisierung von Offenen Bildungsressourcen (OER). Mir ist bewusst, dass die Qualitätssicherung eine der größten Herausforderungen im Umgang mit OER darstellt, da es oft an standardisierten Bewertungskriterien fehlt.

+

Um die Qualität von OER zu gewährleisten, plane ich, mich aktiv an der Entwicklung und Anwendung von Qualitätsstandards zu beteiligen. Dies könnte die Mitarbeit in Gremien oder Initiativen umfassen, die sich mit der Erstellung von Richtlinien und Best Practices für OER beschäftigen und beispielsweise auch eine intensivere Zusammenarbeit mit WirLernenOnline - Freie Bildung zum Mitmachen. Ich möchte sicherstellen, dass die mit mir gemeinschaftlich genutzten oder erstellten Ressourcen nicht nur frei zugänglich, sondern auch von hoher Qualität, wiederauffindbar und nachhaltig zugänglich sind.

+

Ein weiterer Schritt in Richtung Qualitätssicherung ist die Teilnahme am Veranstaltungen wie dem OERcamp, um mein Wissen über die besten Methoden zur Erstellung und Bewertung von OER zu vertiefen. Durch das Erlernen von Techniken zur effektiven Überprüfung und Bewertung von Bildungsmaterialien kann ich zur Verbesserung der Qualität der Ressourcen, mit denen ich arbeite, beitragen.

+

Darüber hinaus möchte ich mich für die Förderung einer Kultur der kontinuierlichen Verbesserung und des Feedbacks innerhalb der OER-Community einsetzen. Dies bedeutet, offene Diskussionen über die Qualität von Ressourcen zu fördern und Plattformen, wie beispielsweise rpi-virtuell, dem relilab oder die ZUM für Peer-Reviews und Nutzerfeedback zu nutzen. Ich glaube, dass eine solche Kultur nicht nur die Qualität der Ressourcen verbessert, sondern auch das Bewusstsein und das Engagement der Community für hohe Standards stärkt.

+

Insgesamt sehe ich die Qualitätssicherung und Standardisierung in OER als wesentliche Elemente meiner Bemühungen um Offenheit im Bildungsbereich. Durch die Fokussierung auf diese Aspekte hoffe ich, nicht nur zu meiner persönlichen Entwicklung beizutragen, sondern auch die Effektivität und Glaubwürdigkeit von OER als Werkzeug für lebenslanges Lernen zu stärken.

+

5. Die Rolle der Technologie: Ermöglicher von Offenheit

+

In meinem Bestreben, Offenheit in meinem Leben im Jahr 2024 zu fördern, erkenne ich die entscheidende Rolle, die Technologie dabei spielt. Ich sehe Technologie als einen wesentlichen Ermöglicher an, der es mir ermöglicht, Offenheit in verschiedenen Bereichen meines Lebens zu integrieren und zu erweitern.

+

Einer der Hauptaspekte, in denen ich Technologie nutzen möchte, ist die Verbesserung meiner Zugänglichkeit und Teilnahme an offenen Bildungsressourcen und Plattformen. Dies umfasst die Nutzung digitaler Plattformen für OER, die es mir und anderen ermöglichen, auf eine Vielzahl von Bildungsmaterialien zuzugreifen und diese mit anderen zu teilen. Ich plane, diese Tools zu nutzen, um mein Wissen zu erweitern und gleichzeitig zur Gemeinschaft beizutragen, indem ich eigene Inhalte erstelle und offen teile. +Nicht nur die dezentrale offene Bereitstellung, freie Lizenzen und offene Schnittstellen scheinen mir hier wichtig sondern auch die Offenheit der Gemeinschaft und die zugrundeliegenden Open-Source-Technologien, die uns zusammenbringen und zusammenhalten.

+

Darüber hinaus möchte ich moderne Kommunikationstechnologien nutzen, um meine Beziehungen sowohl im persönlichen als auch im beruflichen Bereich zu stärken. Dies beinhaltet die Nutzung von sozialen Medien auf Basis des offenen Fediverse joerglohrer@reliverse.social, die Messaging App Element auf der Basis des offenen Matrix-Protokolls @joerglohrer:rpi-virtuell.de, und Publikationsmöglichkeiten über das offene ActivityPub Protokoll, das beispielsweise auch in WordPress integriert ist. Durch diese Technologien kann ich meine Netzwerke pflegen und erweitern, während ich gleichzeitig offen für neue Perspektiven und Möglichkeiten bleibe.

+
+

Lassen Sie uns im Fediversum bloggen und podcasten und schreiben und filmen, als ob unser Leben davon abhinge. Denn unser demokratisches Leben hängt davon ab! (Michael Blume - Nur noch das Fediversum kann uns retten)

+
+

Ein weiterer Bereich, in dem ich Technologie als Ermöglicher von Offenheit sehe, ist die persönliche Organisation und Produktivität. Die Nutzung digitaler Tools wie Kalender-Apps, Aufgabenmanager und Cloud-Speicher in einer Open source Kollaborationslösung wie der Nextcloud erleichtert es mir, organisiert zu bleiben und meinen Alltag effizient zu gestalten. Offenere Hardwarelösungen, die sich daran anbinden lassen mit z.B. einem FairPhone für die mobile Arbeit soll mir ermöglichen offener und flexibler zu sein, indem sie mir erlauben, meine Zeit und Ressourcen besser zu verwalten und unabhängiger von lizenzierten und geschlossenen Systemen zu werden.

+

Schließlich sehe ich in den noch kommenden technischen Entwicklungen ebenfalls großes Potenzial, Offenheit in noch nie dagewesener Weise zu fördern. Ich bin gespannt darauf, wie neue Technologien wie Künstliche Intelligenz, erweiterte Realität und Big Data genutzt werden können, um Bildung, Arbeit und persönliche Entwicklung zu revolutionieren. Ich plane, nicht nur offen für das Erlernen und die Anwendung dieser Technologien zu sein, sondern in offenen Lernszenarien auch an der gemeinschaftlichen Entwicklung zu partizipieren, beispielsweise im Forum Offene KI in der Bildung der Wikimedia.

+

6. Ausblick: Aufbau einer Community of Trust durch Offenheit

+

Während ich also einen Ausblick auf das Jahr 2024 wage, sehe ich den Aufbau und die Pflege einer „Community of Trust“ – einer Gemeinschaft, die auf Vertrauen basiert – als zentrales Ziel meiner Bemühungen um Offenheit an. +Eine solche Gemeinschaft zeichnet sich durch gegenseitigen Respekt, Transparenz und Unterstützung aus und bildet die Grundlage für nachhaltige und bedeutungsvolle Beziehungen sowohl im beruflichen als auch im privaten Bereich.

+

Kontakte und Vernetzung:

+

Aktives Networking: Ich plane, mein Netzwerk aktiv zu erweitern, indem ich mich an Gemeinschaften und Gruppen beteilige, die ähnliche Werte teilen. Dies kann durch Teilnahme an Konferenzen, Workshops und Online-Foren geschehen, wo ich Gleichgesinnte treffen und mich mit ihnen austauschen kann.

+

Kultur der Digitalität: Ich beabsichtige, digitale Technologien und soziale Medien zu nutzen, um mein Netzwerk zu erweitern und zu pflegen. Dies ermöglicht es mir, mit Menschen aus verschiedenen Teilen der Welt in Kontakt zu treten und Ideen und Erfahrungen auszutauschen.

+

Kollaborative Projekte: Durch die Arbeit an gemeinsamen Projekten, die Offenheit und Kreativität fördern, kann ich enge Beziehungen zu anderen aufbauen und gleichzeitig zur Gemeinschaft beitragen.

+

Community of Trust:

+

Vertrauensfördernde Maßnahmen: Um eine Atmosphäre des Vertrauens zu schaffen, möchte ich offene Kommunikation und transparente Praktiken in allen meinen Interaktionen anwenden. Dies beinhaltet das Teilen von Wissen und Erfahrungen sowie das Zulassen von Verletzlichkeit und Echtheit in meinen Beziehungen.

+

Gegenseitige Unterstützung: Eine Community of Trust basiert auf gegenseitiger Unterstützung und Ermutigung. Ich plane, anderen aktiv zu helfen und Unterstützung anzubieten, wo immer es möglich ist, und hoffe, dass dies zu einer Kultur der Zusammenarbeit und des Teilens beiträgt.

+

Langfristige Beziehungen: Mein Ziel ist es, langfristige Beziehungen aufzubauen, die auf gemeinsamen Werten und gegenseitigem Vertrauen basieren. Diese Beziehungen werden nicht nur mein persönliches Wachstum fördern, sondern auch dazu beitragen, eine stärkere und widerstandsfähigere Gemeinschaft zu schaffen.

+

Abschließend ist mein Ausblick für das Jahr 2024 und darüber hinaus, eine Community of Trust zu kultivieren, die sich durch gegenseitigen Respekt und eine gemeinsame Vision für Offenheit auszeichnet. Ich glaube, dass durch die Entwicklung einer solchen Gemeinschaft nicht nur persönliche und berufliche Beziehungen gestärkt werden, sondern auch ein Umfeld entsteht, in dem Innovation und Kreativität gedeihen können. Der Schlüssel dazu liegt in der aktiven Pflege von Beziehungen, dem Engagement für transparente Kommunikation und der Bereitschaft, sich auf andere einzulassen und von ihnen zu lernen.

+

Dies ist ein Beitrag zu Teil 1 “Mein (schulisches) Motto für 2024” der EduBlogparade

+

Beitragsbild Public Domain CC0 +Midjourney Prompt: “A Community of Trust based on Openness, silhouettes of people of all genders and ages that merge into each other and overlap, watercolors –v 6.0 –seed 1235164279”

+

+

+

Austausch und Diskussion zu diesem Beitrag

+ + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich.png b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich.png new file mode 100644 index 0000000..a0fa0cd Binary files /dev/null and b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich.png differ diff --git a/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png new file mode 100644 index 0000000..94249ab Binary files /dev/null and b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png differ diff --git a/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png new file mode 100644 index 0000000..461f7fd Binary files /dev/null and b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png differ diff --git a/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png new file mode 100644 index 0000000..b7c0601 Binary files /dev/null and b/public/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown.png new file mode 100644 index 0000000..c0bc6d0 Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png new file mode 100644 index 0000000..6af802a Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png new file mode 100644 index 0000000..1d21918 Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png new file mode 100644 index 0000000..2cc48e2 Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png new file mode 100644 index 0000000..109d84a Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png new file mode 100644 index 0000000..c4f0ee1 Binary files /dev/null and b/public/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png differ diff --git a/public/2024/03/05/bottomup-markdown.html/index.html b/public/2024/03/05/bottomup-markdown.html/index.html new file mode 100644 index 0000000..5dd2bbf --- /dev/null +++ b/public/2024/03/05/bottomup-markdown.html/index.html @@ -0,0 +1,268 @@ + + + + + + + +BottomUp -> MarkDown - 5V-Power für deine OER! | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ BottomUp -> MarkDown - 5V-Power für deine OER! +

+
+ Open Educational Resources mit MarkDown +
+ +
+
+ + +
+

Eine Session-Idee auf dem #OERcamp 24 in Hamburg

+

Entfessele deine kreative Superkraft und erstelle Open Educational Resources (OER) mit Markdown!

+

In dieser Session tauchst du ein in die Welt der 5V-Freiheiten von Open Content und lernst gleichzeitig die Markdown-Sprache kennen – dein perfektes Werkzeug, um diese Freiheiten zu nutzen!

+

BottomUp MarkDown:

+
    +
  • Verwahren & Vervielfältigen: Gestalte direkt online ohne Software, Registrierungen oder Anmeldungen. Lade deine OER herunter, sichere sie und erstelle so viele Kopien, wie du benötigst – ganz ohne Limits! Mit Markdown speicherst du deine Inhalte im praktischen und leicht editierbaren Textformat.
  • +
  • Verwenden: Ob im Unterricht, in Lerngruppen oder online – bringe deine OER in allen erdenklichen Kontexten zum Einsatz! Markdown macht deine Inhalte überall zugänglich und flexibel. Auch Vorlagen von Lehrenden, die Lernende übernehmen und anpassen können sind einfach bereitgestellt.
  • +
  • Verarbeiten: Bearbeite deine Inhalte, passe sie an deine Bedürfnisse an und kreiere neue Lernmaterialien – deiner Fantasie sind keine Grenzen gesetzt! Markdown bietet dir die Freiheit, deine OER ständig weiterzuentwickeln, zu versionieren und zu verändern.
  • +
  • Vermischen: Kombiniere deine OER mit anderen offenen Inhalten, erweitere sie mit Bildern, Videos und Musik (sogar urheberrechtlich geschützten Werken) und schaffe einzigartige Lernerlebnisse! Markdown lässt sich nahtlos mit anderen Formaten und Medien kombinieren.
  • +
  • Verbreiten: Teile deine OER mit der Welt! Veröffentliche sie online, versende sie an Freunde und Kollegen und trage zur globalen Wissensgemeinschaft bei! Mit Markdown präsentierst du deine OER im Web in einem ansprechenden und nutzerfreundlichen Format, das barrierefrei weiternutzbar ist unanbhängig von technischer Infrastruktur oder Plattformen.
  • +
+

In dieser Session:

+
    +
  • Entfessele die Markdown-Mania: Lerne die Syntax der Sprache kennen und erstelle im Handumdrehen deine ersten OER.
  • +
  • Gestalte deine Inhalte mit Superkräften: Formatiere Texte, füge Bilder und Tabellen ein und erstelle interaktive Elemente. Markdown gibt dir alle Werkzeuge dafür an die Hand.
  • +
  • Veröffentliche deine OER im Internet: Erfahre, wie du deine Materialien online zugänglich machst und mit anderen teilst. Mit Markdown ist die Veröffentlichung deiner OER ein Kinderspiel.
  • +
  • Werde Teil der OER-Community: Vernetze dich mit anderen Lernenden und Lehrenden und profitiere vom Austausch in der Community. Gemeinsam gestalten wir die Zukunft des Lernens mit Markdown!
  • +
+

+

+

Austausch und Diskussion zu diesem Beitrag

+ + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + diff --git a/public/2024/04/03/kibedenken-bewusstsein.html/index.html b/public/2024/04/03/kibedenken-bewusstsein.html/index.html new file mode 100644 index 0000000..b49c46c --- /dev/null +++ b/public/2024/04/03/kibedenken-bewusstsein.html/index.html @@ -0,0 +1,448 @@ + + + + + + + +KIBedenken - Bewusstsein | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ KIBedenken - Bewusstsein +

+
+ Intelligenz oder Bewusstsein? +
+ +
+
+ Das Foto des Roboters, der seine Reflexion im Wasser betrachtet referenziert auf Narziss aus der griechischen Mythologie, der die Liebe anderer zurückwies und sich in sein eigenes Spiegelbild verliebte und die Illustration von Caravaggio [(siehe wikipedia #Narziss)](https://de.wikipedia.org/wiki/Narziss#) erstellt mit der KI Midjourney und dem Prompt: *photographed with the Canon EOS 5D Mark IV a young robot boy with his head down, looking at his reflection in water --v6.0* +

CC0 Das Foto des Roboters, der seine Reflexion im Wasser betrachtet referenziert auf Narziss aus der griechischen Mythologie, der die Liebe anderer zurückwies und sich in sein eigenes Spiegelbild verliebte und die Illustration von Caravaggio (siehe wikipedia #Narziss) erstellt mit der KI Midjourney und dem Prompt: photographed with the Canon EOS 5D Mark IV a young robot boy with his head down, looking at his reflection in water –v6.0

+
+

#KIBedenken - Bewusstsein

+

Den für mich derzeit wichtigsten Impuls über KI nachzudenken lieferte vor einigen Wochen Yuval Noah Harari an der University of Cambridge am Ende eines Podiumsgesprächs hier ab 1:15 h auf youtube:

+
+

Ich denke, wir müssen die Frage des Bewusstseins in den Mittelpunkt der Diskussion stellen. Es gibt eine riesige, riesige Verwirrung in der Terminologie, auch in der Welt der KI, zwischen Bewusstsein und Intelligenz. Aber es sind zwei verschiedene Dinge. Intelligenz ist die Fähigkeit, Probleme zu lösen und Ziele zu erreichen. Bewusstsein ist die Fähigkeit, Dinge zu fühlen, wie Schmerz oder Freude oder Liebe oder Hass. Wir neigen dazu, die beiden zu verwechseln, weil bei Menschen und auch bei anderen Säugetieren, Vögeln und anderen Tieren Bewusstsein und Intelligenz zusammengehören. Wir lösen Probleme durch unsere Gefühle. Computer waren bisher sehr anders. Sie sind in einigen Bereichen bereits intelligenter als wir, haben aber, soweit wir wissen, kein Bewusstsein. Soweit wir wissen, können sie überhaupt keinen Schmerz, keine Freude, keine Liebe oder keinen Hass empfinden. Niemand weiß, was in Zukunft passieren wird. Es gibt Modelle und Theorien, die argumentieren, dass KIs irgendwann auch bewusst oder empfindsam werden. Sie werden anfangen, Dinge zu fühlen. Sie werden anfangen, Schmerz oder Liebe oder Hass zu empfinden. Es gibt andere Modelle und Theorien, die sagen, nein. Sie könnten weit intelligenter werden als wir und immer noch null Bewusstsein haben. Das kann in der Evolution des Lebens sein. Wenn man darüber nachdenkt, die lange Entwicklung von Milliarden von Jahren der Evolution. Die Entwicklung der Intelligenz ist im Falle von Tieren wie uns und Schimpansen und Hunden und Schweinen und so weiter durch die Entwicklung des Bewusstseins verlaufen. Aber das ist kein universelles Gesetz der Evolution der Intelligenz. Vielleicht gibt es alternative Wege, die zu Superintelligenz ohne jegliches Bewusstsein führen. Einfach einen anderen, einen fremden Weg gehen. Und wir könnten an einen Punkt gelangen, an dem sie superintelligent sind und trotzdem null Bewusstsein haben. Und die Gefahr besteht dann darin, dass sie nicht nur die menschliche Zivilisation zerstören könnten, sondern das ganze Licht des Bewusstseins, um das gesamte ökologische System nach ihren Bedürfnissen umzugestalten, wofür sie kein Bewusstsein brauchen. Sie funktionieren auf eine völlig andere Weise. Sie könnten sich sogar von der Erde auf andere Planeten, auf andere Galaxien ausbreiten. Sie werden das Universum mit Intelligenz füllen, aber es wird ein völlig dunkles Universum ohne Bewusstsein sein. Wieder hohe Intelligenz, fähig, Raumschiffe zu bauen, die mit Lichtgeschwindigkeit fliegen und was auch immer, aber es gibt null Gefühl. Niemand, keine Entität fühlt Schmerz oder Freude, Liebe oder Hass. Für mich ist das ein schreckliches Szenario. Das schlimmste Szenario von allen ist dies. Dass wir ein Universum voller Intelligenz und völlig ohne Bewusstsein haben werden, denn ich denke, dass von den beiden das Bewusstsein weitaus wichtiger, weitaus wertvoller ist. Und es ist eine gute Erinnerung daran, dass wir das zumindest heute mit vielen anderen Tieren teilen, aber nicht mit den Computern, nicht mit den KIs. Wir sind also immer noch im selben Team wie die Würmer und die Affen, nicht im selben Team wie die Computer.

+
+

Ich denke, hier wird eine Spur gelegt, die sich unterscheidet von der reinen Funktion von KI zur intelligenten Verbesserung und Unterstützung von Lernprozessen oder vielfältigem Kompetenzerwerb hin zur Selbstreflexion der Lernenden. +Auch im Blick auf (religionsbezogene) Bildung kennen wir den Mensch nicht nur biologisch, wie die Würmer und Affen sondern auch ausgestattet mit Würde, Entscheidungsfreiheit und als Beziehungswesen, das auf ein Gegenüber ausgerichtet sein kann und, wie Harari sagt, nicht im selben Team wie die Computer spielt. +Sinn, Seele und Verstand erhalten wir weder aus uns selbst heraus noch von einer wie auch immer gearteten Intelligenz. +Liebe, Gnade, Hoffnung, Frieden, Gemeinschaft, Trost, Zuversicht und viele weiteren lebensbedeutsame Erfahrungen gewinnen im Angesicht von Maschinen aus meiner Sicht an elementarer Bedeutung.

+

Dies ist ein Beitrag zur Blogparade #KIBedenken von Joscha Falck und Nele Hirsch

+

Austausch und Diskussion zu diesem Beitrag

+ + + +
+ +
+ +
+
+

Kommentare

+

Mit einem Mastodon- oder Fediverse-Account kannst du hier antworten

+ +

+
+ +
+ + + +
+ +
+
+ + + + + + + + + + + + + + diff --git a/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken.png b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken.png new file mode 100644 index 0000000..f4f3bc7 Binary files /dev/null and b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken.png differ diff --git a/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png new file mode 100644 index 0000000..a170e31 Binary files /dev/null and b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png differ diff --git a/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png new file mode 100644 index 0000000..69d246b Binary files /dev/null and b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png differ diff --git a/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png new file mode 100644 index 0000000..0c531e5 Binary files /dev/null and b/public/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png differ diff --git a/public/2025/03/04/dezentrale-oep-oer.html/dezentrale-oep-oer.png b/public/2025/03/04/dezentrale-oep-oer.html/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/public/2025/03/04/dezentrale-oep-oer.html/dezentrale-oep-oer.png differ diff --git a/public/2025/03/04/dezentrale-oep-oer.html/index.html b/public/2025/03/04/dezentrale-oep-oer.html/index.html new file mode 100644 index 0000000..9d8bb17 --- /dev/null +++ b/public/2025/03/04/dezentrale-oep-oer.html/index.html @@ -0,0 +1,475 @@ + + + + + + + +Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +

+
+ Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational Resources (OER) und Open Educational Practices (OEP) notwendig ist, um nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet +
+ +
+
+ Ein in den Sand gezeichneter Strauß mit den Buchstaben 'OER' – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu 'Nostr' (das dezentralisierte Kommunikationsprotokoll) liegt nahe: 'Nostr' klingt wie ein Teil von 'Ostrich' (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig. +

Ein in den Sand gezeichneter Strauß mit den Buchstaben ‘OER’ – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu ‘Nostr’ (das dezentralisierte Kommunikationsprotokoll) liegt nahe: ‘Nostr’ klingt wie ein Teil von ‘Ostrich’ (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig.

+
+

Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter

+

Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft

+
+

Warum wir eine neue Perspektive brauchen

+

Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. +Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities.

+

Doch Bildung sollte resilient sein – unabhängig von politischen oder finanziellen Rahmenbedingungen und gewissermaßen auch von der Plattform, auf der man gerade agiert.

+

Hier setzt die Vision eines dezentralen Datenraums an: Statt zentraler Kontrolle verteilt er Daten auf viele Akteure, fördert Interoperabilität sowie Datensouveränität der Nutzer:innen und ermöglicht neue Geschäftsmodelle. +Inspiriert vom Messaging Protokoll “Nostr” – ursprünglich für zensurresistente soziale Netzwerke entwickelt – könnte so eine Infrastruktur entstehen, die Offenheit, Teilhabe und Vernetzung ins Zentrum stellt.

+
+

Von OER zu OEP: Offenheit als Haltung

+

Open Educational Resources (OER) als frei verfügbare Bildungsmaterialien sind nur der erste Schritt. +Echte Open Educational Practices (OEP) umfassen eine Kultur des Teilens, kollaboratives Lernen und demokratische Bildungsprozesse. +Wie Kerstin Mayrberger betont, geht es bei OEP im Kern um „Demokratiebildung“: Lernende und Lehrende gestalten gemeinsam Inhalte, hinterfragen Strukturen und entwickeln kritisches Denken.

+

Doch dafür braucht es mehr als nur frei lizenzierte Materialien. Es braucht (freie) Infrastrukturen, die:

+
    +
  1. Partizipation ermöglichen: Nutzer:innen behalten die Kontrolle über ihre Daten und Interaktionen.
  2. +
  3. Resilienz schaffen: Dezentrale Speicherung verhindert den „Stecker-Ziehen-Effekt“.
  4. +
  5. Vernetzung fördern: Plattformübergreifende Zusammenarbeit wird zur Norm, nicht zur Ausnahme.
  6. +
+
+

Wie Nostr die Bildungsinfrastruktur revolutionieren könnte

+

Die technische Grundlage für vernetzte Bildung sollte also nicht analog zu Systemen entwickelt werden, deren Grundlage ist, Nutzer und Inhalte (oft ökonomisch gewollt) an sich zu binden. +Stattdessen sollte sie strukturell so angelegt sein, die digitale Vernetzung, die wir uns für die Bildung wünschen, bereits grundlegend zu enthalten. +Wir suchen somit nicht nach lokalen Softwarelösungen für die Organisation von OER- und OEP-Communities, sondern nach grundlegenden Technologieansätzen, die diese Anforderungen erfüllen können. +Dadurch rücken neben den Schnittstellenlösungen, die Plattformen entwickeln müssen, um künftig anschlussfähig zu sein, zunehmend die zugrunde liegenden Protokolle für Zusammenarbeit und vernetzte Bildung in den Fokus einer Entwicklung, wenn diese auf Wirkung und Nachhaltigkeit angelegt sein soll.

+

Das Nostr-Protokoll erfüllt diese grundlegenden Anforderungen:

+
    +
  • Clients & Relays: Bildungsplattformen agieren als Clients, die mit Relays (dezentralen Servern) verbunden sind. Jede Institution kann eigene Relays betreiben, die Daten synchronisieren – ähnlich wie E-Mails über verschiedene Provider versendet werden.
  • +
  • Events & Schlüsselpaare: Lernmaterialien, Kommentare oder Sammlungen werden als „Events“ gespeichert, signiert mit kryptografischen Schlüsseln. So bleibt die Urheberschaft nachvollziehbar, ohne zentrale Autorität.
  • +
  • Interoperabilität & Erweiterbarkeit: Das Protokoll ist modular aufgebaut, sodass verschiedene Eventtypen integriert werden können. So könnten Metadatenstandards wie das Allgemeine Metadatenprofil (AMB) abgebildet werden, um die Publikation und den Konsum von Bildungsmetadaten plattformübergreifend zu erleichtern.
  • +
+

Beispiel: Eine Lehrkraft erstellt auf MUNDO eine Merkliste zu „Nachhaltigkeit“. Dieses Event wird via Nostr-Relays an WirLernenOnline übertragen – die Liste ist somit auf Relays im Nostr-Netzwerk verfügbar. Selbst wenn MUNDO und WirLernenOnline offline gehen würden, wäre die Merkliste weiterhin verfügbar, da sie nicht auf der Plattform, sondern auf einem (oder mehreren) Relay(s) liegt.

+
+

Chancen für Gemeinschaft und Nachhaltigkeit

+

Ein dezentraler Datenraum fördert nicht nur technische Resilienz, sondern auch neue Formen der Zusammenarbeit:

+
    +
  • Qualitätssicherung durch Crowdsourcing: Da Nutzer:innen nicht mehr durch Plattformgrenzen künstlich getrennt werden, können sie übergreifend miteinander und mit Ressourcen interagieren und sich darüber austauschen. Ihr sozialer Graph kann dabei – ähnlich dem „Circle of Trust“ der norwegischen NDLA-Plattform - genutzt werden, um die Relevanz von Ressourcen algorithmisch einzuordnen.
  • +
  • Monetarisierung ohne Abhängigkeit: Services wie Metadaten-Anreicherung oder Premium-Relays (für personalisierte Feeds, zusätzliche Materialien) können monetarisierbar auf dem Protokoll abgebildet werden und könnten zusätzliche Einnahmequellen bieten, während die Infrastruktur gemeinfrei bleibt .
  • +
  • Empowerment kleiner Akteure: Lokale und kleinere Initiativen, die bis heute (2025!) nicht in der Lage sind, sich und ihre Materialien selbst in die öffentliche Bildungsinfrastruktur einzubringen, erhalten erweiterte Möglichkeiten.
  • +
+
+

Aufruf zum Mitgestalten

+

Die Umsetzung dieser Vision lebt von der Gemeinschaft. Inspiriert von Projekten wie ReliLab oder SynLLOER, laden wir ein:

+
    +
  1. Erprobt die Dezentralität: Testet den Proof of ConceptEduFeed“, der Nostr für Bildungsmetadaten nutzt.
  2. +
  3. Denkt infrastrukturübergreifend: Entwickelt OER nicht im Silo, sondern integriert sie in dezentrale Netzwerke.
  4. +
  5. Engagiert euch politisch: Fordert Fördergelder für offene Protokolle statt proprietärer Plattformen.
  6. +
+

Wie Niels Winkelmann im Digilog.Blog schreibt: „OEP systemisch zu denken ist der Wind in den Segeln für eine Vision offener Bildung“ . +Lasst uns gemeinsam die Segel setzen – dezentral, partizipativ und zukunftssicher! +:sailboat: “for a race we must win

+ + +
+ +
+ +
+
+

Kommentare

+

Mit einem Mastodon- oder Fediverse-Account kannst du hier antworten

+ +

+
+ +
+ + + +
+ +
+
+ + + + + + + + + + + + + + diff --git a/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer.png b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer.png differ diff --git a/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png new file mode 100644 index 0000000..99ff94d Binary files /dev/null and b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png differ diff --git a/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png new file mode 100644 index 0000000..14fd20e Binary files /dev/null and b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png differ diff --git a/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png new file mode 100644 index 0000000..dda0f3a Binary files /dev/null and b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png differ diff --git a/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/index.html b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/index.html new file mode 100644 index 0000000..bd2d8c8 --- /dev/null +++ b/public/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/index.html @@ -0,0 +1,475 @@ + + + + + + + +Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +

+ Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +

+
+ Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational Resources (OER) und Open Educational Practices (OEP) notwendig ist, um nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet +
+ +
+
+ Ein in den Sand gezeichneter Strauß mit den Buchstaben 'OER' – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu 'Nostr' (das dezentralisierte Kommunikationsprotokoll) liegt nahe: 'Nostr' klingt wie ein Teil von 'Ostrich' (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig. +

Ein in den Sand gezeichneter Strauß mit den Buchstaben ‘OER’ – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu ‘Nostr’ (das dezentralisierte Kommunikationsprotokoll) liegt nahe: ‘Nostr’ klingt wie ein Teil von ‘Ostrich’ (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig.

+
+

Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter

+

Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft

+
+

Warum wir eine neue Perspektive brauchen

+

Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. +Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities.

+

Doch Bildung sollte resilient sein – unabhängig von politischen oder finanziellen Rahmenbedingungen und gewissermaßen auch von der Plattform, auf der man gerade agiert.

+

Hier setzt die Vision eines dezentralen Datenraums an: Statt zentraler Kontrolle verteilt er Daten auf viele Akteure, fördert Interoperabilität sowie Datensouveränität der Nutzer:innen und ermöglicht neue Geschäftsmodelle. +Inspiriert vom Messaging Protokoll “Nostr” – ursprünglich für zensurresistente soziale Netzwerke entwickelt – könnte so eine Infrastruktur entstehen, die Offenheit, Teilhabe und Vernetzung ins Zentrum stellt.

+
+

Von OER zu OEP: Offenheit als Haltung

+

Open Educational Resources (OER) als frei verfügbare Bildungsmaterialien sind nur der erste Schritt. +Echte Open Educational Practices (OEP) umfassen eine Kultur des Teilens, kollaboratives Lernen und demokratische Bildungsprozesse. +Wie Kerstin Mayrberger betont, geht es bei OEP im Kern um „Demokratiebildung“: Lernende und Lehrende gestalten gemeinsam Inhalte, hinterfragen Strukturen und entwickeln kritisches Denken.

+

Doch dafür braucht es mehr als nur frei lizenzierte Materialien. Es braucht (freie) Infrastrukturen, die:

+
    +
  1. Partizipation ermöglichen: Nutzer:innen behalten die Kontrolle über ihre Daten und Interaktionen.
  2. +
  3. Resilienz schaffen: Dezentrale Speicherung verhindert den „Stecker-Ziehen-Effekt“.
  4. +
  5. Vernetzung fördern: Plattformübergreifende Zusammenarbeit wird zur Norm, nicht zur Ausnahme.
  6. +
+
+

Wie Nostr die Bildungsinfrastruktur revolutionieren könnte

+

Die technische Grundlage für vernetzte Bildung sollte also nicht analog zu Systemen entwickelt werden, deren Grundlage ist, Nutzer und Inhalte (oft ökonomisch gewollt) an sich zu binden. +Stattdessen sollte sie strukturell so angelegt sein, die digitale Vernetzung, die wir uns für die Bildung wünschen, bereits grundlegend zu enthalten. +Wir suchen somit nicht nach lokalen Softwarelösungen für die Organisation von OER- und OEP-Communities, sondern nach grundlegenden Technologieansätzen, die diese Anforderungen erfüllen können. +Dadurch rücken neben den Schnittstellenlösungen, die Plattformen entwickeln müssen, um künftig anschlussfähig zu sein, zunehmend die zugrunde liegenden Protokolle für Zusammenarbeit und vernetzte Bildung in den Fokus einer Entwicklung, wenn diese auf Wirkung und Nachhaltigkeit angelegt sein soll.

+

Das Nostr-Protokoll erfüllt diese grundlegenden Anforderungen:

+
    +
  • Clients & Relays: Bildungsplattformen agieren als Clients, die mit Relays (dezentralen Servern) verbunden sind. Jede Institution kann eigene Relays betreiben, die Daten synchronisieren – ähnlich wie E-Mails über verschiedene Provider versendet werden.
  • +
  • Events & Schlüsselpaare: Lernmaterialien, Kommentare oder Sammlungen werden als „Events“ gespeichert, signiert mit kryptografischen Schlüsseln. So bleibt die Urheberschaft nachvollziehbar, ohne zentrale Autorität.
  • +
  • Interoperabilität & Erweiterbarkeit: Das Protokoll ist modular aufgebaut, sodass verschiedene Eventtypen integriert werden können. So könnten Metadatenstandards wie das Allgemeine Metadatenprofil (AMB) abgebildet werden, um die Publikation und den Konsum von Bildungsmetadaten plattformübergreifend zu erleichtern.
  • +
+

Beispiel: Eine Lehrkraft erstellt auf MUNDO eine Merkliste zu „Nachhaltigkeit“. Dieses Event wird via Nostr-Relays an WirLernenOnline übertragen – die Liste ist somit auf Relays im Nostr-Netzwerk verfügbar. Selbst wenn MUNDO und WirLernenOnline offline gehen würden, wäre die Merkliste weiterhin verfügbar, da sie nicht auf der Plattform, sondern auf einem (oder mehreren) Relay(s) liegt.

+
+

Chancen für Gemeinschaft und Nachhaltigkeit

+

Ein dezentraler Datenraum fördert nicht nur technische Resilienz, sondern auch neue Formen der Zusammenarbeit:

+
    +
  • Qualitätssicherung durch Crowdsourcing: Da Nutzer:innen nicht mehr durch Plattformgrenzen künstlich getrennt werden, können sie übergreifend miteinander und mit Ressourcen interagieren und sich darüber austauschen. Ihr sozialer Graph kann dabei – ähnlich dem „Circle of Trust“ der norwegischen NDLA-Plattform - genutzt werden, um die Relevanz von Ressourcen algorithmisch einzuordnen.
  • +
  • Monetarisierung ohne Abhängigkeit: Services wie Metadaten-Anreicherung oder Premium-Relays (für personalisierte Feeds, zusätzliche Materialien) können monetarisierbar auf dem Protokoll abgebildet werden und könnten zusätzliche Einnahmequellen bieten, während die Infrastruktur gemeinfrei bleibt .
  • +
  • Empowerment kleiner Akteure: Lokale und kleinere Initiativen, die bis heute (2025!) nicht in der Lage sind, sich und ihre Materialien selbst in die öffentliche Bildungsinfrastruktur einzubringen, erhalten erweiterte Möglichkeiten.
  • +
+
+

Aufruf zum Mitgestalten

+

Die Umsetzung dieser Vision lebt von der Gemeinschaft. Inspiriert von Projekten wie ReliLab oder SynLLOER, laden wir ein:

+
    +
  1. Erprobt die Dezentralität: Testet den Proof of ConceptEduFeed“, der Nostr für Bildungsmetadaten nutzt.
  2. +
  3. Denkt infrastrukturübergreifend: Entwickelt OER nicht im Silo, sondern integriert sie in dezentrale Netzwerke.
  4. +
  5. Engagiert euch politisch: Fordert Fördergelder für offene Protokolle statt proprietärer Plattformen.
  6. +
+

Wie Niels Winkelmann im Digilog.Blog schreibt: „OEP systemisch zu denken ist der Wind in den Segeln für eine Vision offener Bildung“ . +Lasst uns gemeinsam die Segel setzen – dezentral, partizipativ und zukunftssicher! +:sailboat: “for a race we must win

+ + +
+ +
+ +
+
+

Kommentare

+

Mit einem Mastodon- oder Fediverse-Account kannst du hier antworten

+ +

+
+ +
+ + + +
+ +
+
+ + + + + + + + + + + + + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..afbee15 --- /dev/null +++ b/public/404.html @@ -0,0 +1,207 @@ + + + + + + + +404 Page not found | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+
404
+
+ + + + + + + + + + + + + + diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100755 index 0000000..bf8f3d8 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100755 index 0000000..ec3a77c Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100755 index 0000000..af60fcd Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/archives/index.html b/public/archives/index.html new file mode 100644 index 0000000..e1c14eb --- /dev/null +++ b/public/archives/index.html @@ -0,0 +1,437 @@ + + + + + + + +Archive | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+

2025  1 +

+
+

März  1

+
+
+

Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +

+
März 4, 2025 · Jörg Lohrer, Steffen Rörtgen, Bastian Granas
+ +
+
+
+
+
+

2024  3 +

+
+

April  1

+
+
+

KIBedenken - Bewusstsein +

+
April 3, 2024 · Jörg Lohrer
+ +
+
+
+
+

März  1

+
+
+

BottomUp -> MarkDown - 5V-Power für deine OER! +

+
März 5, 2024 · Jörg Lohrer
+ +
+
+
+
+

Januar  1

+
+
+

Offenheit - das Wesentliche +

+
Januar 26, 2024 · Jörg Lohrer
+ +
+
+
+
+
+

2023  4 +

+
+

Juli  1

+
+
+

WordPress statt Padlet oder TaskCards +

+
Juli 25, 2023 · Jörg Lohrer
+ +
+
+
+
+

April  1

+
+
+

Hefefreuden - Dampfnudeln & Minihefezopf +

+
April 7, 2023 · Jörg Lohrer
+ +
+
+
+
+

März  1

+
+
+

Das Gleichnis vom Sämann +

+
März 23, 2023 · Jörg Lohrer
+ +
+
+
+
+

Februar  1

+
+
+

Jojos Schoko-Zimt-Schnecken +

+
Februar 26, 2023 · Jörg Lohrer
+ +
+
+
+
+
+

2022  2 +

+
+

März  1

+
+
+

Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern +

+
März 19, 2022 · Jörg Lohrer
+ +
+
+
+
+

Februar  1

+
+
+

Moodle Server mit Ubuntu 20 LTS und Iomad +

+
Februar 16, 2022 · Jörg Lohrer
+ +
+
+
+
+
+

2021  3 +

+
+

Dezember  1

+
+
+

Bibelfußball - Nachschlage-Quiz zur Bibel +

+
Dezember 3, 2021 · Jörg Lohrer
+ +
+
+
+
+

November  1

+
+
+

WordPress Werkstatt PHP +

+
November 17, 2021 · Jörg Lohrer
+ +
+
+
+
+

August  1

+
+
+

VR - Virtual Reality +

+
August 15, 2021 · Jörg Lohrer
+ +
+
+
+
+
+

2019  1 +

+
+

März  1

+
+
+

Pflanzenschild mit QR-Code +

+
März 26, 2019 · Jörg Lohrer
+ +
+
+
+
+
+

2017  2 +

+
+

Oktober  2

+
+
+

Lutherkürbis - Reformation an Halloween +

+
Oktober 31, 2017 · Jörg Lohrer
+ +
+
+

Telegram Bot für Octopi +

+
Oktober 23, 2017 · Jörg Lohrer
+ +
+
+
+
+
+

2013  2 +

+
+

Mai  1

+
+
+

Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven +

+
Mai 29, 2013 · Jörg Lohrer
+ +
+
+
+
+

Februar  1

+
+
+

Premium, Freemium, Mium mium mium +

+
Februar 7, 2013 · Jörg Lohrer
+ +
+
+
+
+
+ + + + + + + + + + + + + + diff --git a/public/assets/css/stylesheet.fcb38834b6dee4645dbe7c77d6c5278e12448b758b3f769e48a2d86d35709cb2.css b/public/assets/css/stylesheet.fcb38834b6dee4645dbe7c77d6c5278e12448b758b3f769e48a2d86d35709cb2.css new file mode 100644 index 0000000..1216ca5 --- /dev/null +++ b/public/assets/css/stylesheet.fcb38834b6dee4645dbe7c77d6c5278e12448b758b3f769e48a2d86d35709cb2.css @@ -0,0 +1,7 @@ +/* + PaperMod v7 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2024 adityatelange +*/ +:root{--gap:24px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--code-block-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll;-webkit-text-size-adjust:100%;text-size-adjust:100%}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:18px;line-height:1.6;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons a{display:inline-flex;padding:10px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);background:var(--entry);border-radius:var(--radius);transition:transform .1s;border:1px solid var(--border)}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-hint{color:var(--secondary)}.entry-hint-parent{display:flex;justify-content:space-between}.entry-cover{font-size:14px;margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto var(--content-gap)}.post-title{margin-bottom:2px;font-size:40px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{color:var(--content)}.post-content h3,.post-content h4,.post-content h5,.post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px;box-decoration-break:clone;-webkit-box-decoration-break:clone}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:line-through}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:var(--content-gap)}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:8px 5px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--code-block-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:grid;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--code-block-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-footer>*{margin-bottom:10px}.post-tags{display:flex;flex-wrap:wrap;gap:10px}.post-tags li{display:inline-block}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius);background:var(--code-bg);border:1px solid var(--border)}.post-tags a{display:block;padding:0 14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.post-tags a:hover,.paginav a:hover{background:var(--border)}.share-buttons{padding:10px;display:flex;justify-content:center;overflow-x:auto;gap:10px}.share-buttons li,.share-buttons a{display:inline-flex}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{display:flex;line-height:30px}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 1px}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.mastodon-comment{color:#000;margin:.4rem;padding:.4rem;opacity:.8;display:flex;flex-direction:column}.mastodon-comment .author{display:flex}.mastodon-comment .author .details{margin:10px;padding:10px}.mastodon-comment .author .date{margin-left:auto;font-size:small}.mastodon-comment .author a:link,.mastodon-comment .author a:visited,.mastodon-comment .status a:link{text-decoration:none;border-bottom:0}.mastodon-comment .content{padding:5px}.mastodon-comment .status{display:block}.mastodon-comment .status>div{display:inline-block;margin-right:15px}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner{display:flex;flex-direction:column;align-items:center;gap:10px}.profile img{border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.bg{color:#cad3f5;background-color:#24273a}.chroma{color:#cad3f5;background-color:#24273a}.chroma .x{}.chroma .err{color:#ed8796}.chroma .cl{}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#474733}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .line{display:flex}.chroma .k{color:#c6a0f6}.chroma .kc{color:#f5a97f}.chroma .kd{color:#ed8796}.chroma .kn{color:#8bd5ca}.chroma .kp{color:#c6a0f6}.chroma .kr{color:#c6a0f6}.chroma .kt{color:#ed8796}.chroma .n{}.chroma .na{color:#8aadf4}.chroma .nb{color:#91d7e3}.chroma .bp{color:#91d7e3}.chroma .nc{color:#eed49f}.chroma .no{color:#eed49f}.chroma .nd{color:#8aadf4;font-weight:700}.chroma .ni{color:#8bd5ca}.chroma .ne{color:#f5a97f}.chroma .nf{color:#8aadf4}.chroma .fm{color:#8aadf4}.chroma .nl{color:#91d7e3}.chroma .nn{color:#f5a97f}.chroma .nx{}.chroma .py{color:#f5a97f}.chroma .nt{color:#c6a0f6}.chroma .nv{color:#f4dbd6}.chroma .vc{color:#f4dbd6}.chroma .vg{color:#f4dbd6}.chroma .vi{color:#f4dbd6}.chroma .vm{color:#f4dbd6}.chroma .l{}.chroma .ld{}.chroma .s{color:#a6da95}.chroma .sa{color:#ed8796}.chroma .sb{color:#a6da95}.chroma .sc{color:#a6da95}.chroma .dl{color:#8aadf4}.chroma .sd{color:#6e738d}.chroma .s2{color:#a6da95}.chroma .se{color:#8aadf4}.chroma .sh{color:#6e738d}.chroma .si{color:#a6da95}.chroma .sx{color:#a6da95}.chroma .sr{color:#8bd5ca}.chroma .s1{color:#a6da95}.chroma .ss{color:#a6da95}.chroma .m{color:#f5a97f}.chroma .mb{color:#f5a97f}.chroma .mf{color:#f5a97f}.chroma .mh{color:#f5a97f}.chroma .mi{color:#f5a97f}.chroma .il{color:#f5a97f}.chroma .mo{color:#f5a97f}.chroma .o{color:#91d7e3;font-weight:700}.chroma .ow{color:#91d7e3;font-weight:700}.chroma .p{}.chroma .c{color:#6e738d;font-style:italic}.chroma .ch{color:#6e738d;font-style:italic}.chroma .cm{color:#6e738d;font-style:italic}.chroma .c1{color:#6e738d;font-style:italic}.chroma .cs{color:#6e738d;font-style:italic}.chroma .cp{color:#6e738d;font-style:italic}.chroma .cpf{color:#6e738d;font-weight:700;font-style:italic}.chroma .g{}.chroma .gd{color:#ed8796;background-color:#363a4f}.chroma .ge{font-style:italic}.chroma .gr{color:#ed8796}.chroma .gh{color:#f5a97f;font-weight:700}.chroma .gi{color:#a6da95;background-color:#363a4f}.chroma .go{}.chroma .gp{}.chroma .gs{font-weight:700}.chroma .gu{color:#f5a97f;font-weight:700}.chroma .gt{color:#ed8796}.chroma .gl{text-decoration:underline}.chroma .w{}.chroma{background-color:unset!important}.chroma .hl{display:flex}.chroma .lnt{padding:0 0 0 12px}.highlight pre.chroma code{padding:8px 0}.highlight pre.chroma .line .cl,.chroma .ln{padding:0 10px}.chroma .lntd:last-of-type{width:100%}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--code-block-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media screen and (max-width:340px){.share-buttons{justify-content:unset}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}} \ No newline at end of file diff --git a/public/assets/js/search.40bc872e663a93629c28470a60af5070cb451de1a65f242264488d087eabd131.js b/public/assets/js/search.40bc872e663a93629c28470a60af5070cb451de1a65f242264488d087eabd131.js new file mode 100644 index 0000000..f22aa43 --- /dev/null +++ b/public/assets/js/search.40bc872e663a93629c28470a60af5070cb451de1a65f242264488d087eabd131.js @@ -0,0 +1,19 @@ +/** + * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,f(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();f(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j=$;z-=1){var J=z-1,R=n[e.charAt(J)];if(L&&(S[J]=+!!R),K[z]=(K[z+1]<<1|1)&R,P&&(K[z]|=(A[z+1]|A[z])<<1|1|A[z+1]),K[z]&N&&(E=I(t,{errors:P,currentLocation:J,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=J)<=M)break;$=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=K}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}var K=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=T(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=T(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return K.version="7.0.0",K.createIndex=E,K.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},K.config=O,K},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); +; +/* + PaperMod v7 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2024 adityatelange +*/ + +; +(()=>{var s,r,c,e=null,n=document.getElementById("searchResults"),t=document.getElementById("searchInput"),a=null,o=!1;window.onload=function(){let t=new XMLHttpRequest;t.onreadystatechange=function(){if(t.readyState===4)if(t.status===200){{let n=JSON.parse(t.responseText);if(n){let t={distance:100,threshold:.4,ignoreLocation:!0,keys:["title","permalink","summary","content"]};e&&(t={isCaseSensitive:e.iscasesensitive??!1,includeScore:e.includescore??!1,includeMatches:e.includematches??!1,minMatchCharLength:e.minmatchcharlength??1,shouldSort:e.shouldsort??!0,findAllMatches:e.findallmatches??!1,keys:e.keys??["title","permalink","summary","content"],location:e.location??0,threshold:e.threshold??.4,distance:e.distance??100,ignoreLocation:e.ignorelocation??!0}),s=new Fuse(n,t)}}}else console.log(t.responseText)},t.open("GET","../index.json"),t.send()};function i(e){document.querySelectorAll(".focus").forEach(function(e){e.classList.remove("focus")}),e?(e.focus(),document.activeElement=a=e,e.parentElement.classList.add("focus")):document.activeElement.parentElement.classList.add("focus")}function l(){o=!1,n.innerHTML=t.value="",t.focus()}t.onkeyup=function(){if(s){let t;if(e?t=s.search(this.value.trim(),{limit:e.limit}):t=s.search(this.value.trim()),t.length!==0){let e="";for(let n in t)e+=`
  • ${t[n].item.title} \xBB
  • `;n.innerHTML=e,o=!0,r=n.firstChild,c=n.lastChild}else o=!1,n.innerHTML=""}},t.addEventListener("search",function(){this.value||l()}),document.onkeydown=function(e){let d=e.key,s=document.activeElement,u=document.getElementById("searchbox").contains(s);if(s===t){let e=document.getElementsByClassName("focus");for(;e.length>0;)e[0].classList.remove("focus")}else a&&(s=a);if(d==="Escape")l();else if(!o||!u)return;else d==="ArrowDown"?(e.preventDefault(),s==t?i(n.firstChild.lastChild):s.parentElement!=c&&i(s.parentElement.nextSibling.lastChild)):d==="ArrowUp"?(e.preventDefault(),s.parentElement==r?i(t):s!=t&&i(s.parentElement.previousSibling.lastChild)):d==="ArrowRight"&&s.click()}})() \ No newline at end of file diff --git a/public/category/index.html b/public/category/index.html new file mode 100644 index 0000000..96e1dd9 --- /dev/null +++ b/public/category/index.html @@ -0,0 +1,213 @@ + + + + + + + +Category | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
      +
    +
    + + + + + + + + + + + + + + diff --git a/public/category/index.xml b/public/category/index.xml new file mode 100644 index 0000000..86a3540 --- /dev/null +++ b/public/category/index.xml @@ -0,0 +1,11 @@ + + + + Category on Jörg Lohrer + http://localhost:1313/category/ + Recent content in Category on Jörg Lohrer + Hugo -- gohugo.io + de + + + diff --git a/public/dezentrale-oep-oer/dezentrale-oep-oer.png b/public/dezentrale-oep-oer/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/public/dezentrale-oep-oer/dezentrale-oep-oer.png differ diff --git a/public/dezentrale-oep-oer/index.html b/public/dezentrale-oep-oer/index.html new file mode 100644 index 0000000..80881be --- /dev/null +++ b/public/dezentrale-oep-oer/index.html @@ -0,0 +1,284 @@ + + + + + + + +Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    +
    + +

    + Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +

    +
    + Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational Resources (OER) und Open Educational Practices (OEP) notwendig ist, um nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet. +
    + +
    +
    + +
    +

    Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter

    +

    Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft

    +
    +

    Warum wir eine neue Perspektive brauchen

    +

    Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. +Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities.

    +

    Doch Bildung sollte resilient sein – unabhängig von politischen oder finanziellen Rahmenbedingungen und gewissermaßen auch von der Plattform, auf der man gerade agiert.

    +

    Hier setzt die Vision eines dezentralen Datenraums an: Statt zentraler Kontrolle verteilt er Daten auf viele Akteure, fördert Interoperabilität sowie Datensouveränität der Nutzer:innen und ermöglicht neue Geschäftsmodelle. +Inspiriert vom Messaging Protokoll “Nostr” – ursprünglich für zensurresistente soziale Netzwerke entwickelt – könnte so eine Infrastruktur entstehen, die Offenheit, Teilhabe und Vernetzung ins Zentrum stellt.

    +
    +

    Von OER zu OEP: Offenheit als Haltung

    +

    Open Educational Resources (OER) als frei verfügbare Bildungsmaterialien sind nur der erste Schritt. +Echte Open Educational Practices (OEP) umfassen eine Kultur des Teilens, kollaboratives Lernen und demokratische Bildungsprozesse. +Wie Kerstin Mayrberger betont, geht es bei OEP im Kern um „Demokratiebildung“: Lernende und Lehrende gestalten gemeinsam Inhalte, hinterfragen Strukturen und entwickeln kritisches Denken.

    +

    Doch dafür braucht es mehr als nur frei lizenzierte Materialien. Es braucht (freie) Infrastrukturen, die:

    +
      +
    1. Partizipation ermöglichen: Nutzer:innen behalten die Kontrolle über ihre Daten und Interaktionen.
    2. +
    3. Resilienz schaffen: Dezentrale Speicherung verhindert den „Stecker-Ziehen-Effekt“.
    4. +
    5. Vernetzung fördern: Plattformübergreifende Zusammenarbeit wird zur Norm, nicht zur Ausnahme.
    6. +
    +
    +

    Wie Nostr die Bildungsinfrastruktur revolutionieren könnte

    +

    Die technische Grundlage für vernetzte Bildung sollte also nicht analog zu Systemen entwickelt werden, deren Grundlage ist, Nutzer und Inhalte (oft ökonomisch gewollt) an sich zu binden. +Stattdessen sollte sie strukturell so angelegt sein, die digitale Vernetzung, die wir uns für die Bildung wünschen, bereits grundlegend zu enthalten. +Wir suchen somit nicht nach lokalen Softwarelösungen für die Organisation von OER- und OEP-Communities, sondern nach grundlegenden Technologieansätzen, die diese Anforderungen erfüllen können. +Dadurch rücken neben den Schnittstellenlösungen, die Plattformen entwickeln müssen, um künftig anschlussfähig zu sein, zunehmend die zugrunde liegenden Protokolle für Zusammenarbeit und vernetzte Bildung in den Fokus einer Entwicklung, wenn diese auf Wirkung und Nachhaltigkeit angelegt sein soll.

    +

    Das Nostr-Protokoll erfüllt diese grundlegenden Anforderungen:

    +
      +
    • Clients & Relays: Bildungsplattformen agieren als Clients, die mit Relays (dezentralen Servern) verbunden sind. Jede Institution kann eigene Relays betreiben, die Daten synchronisieren – ähnlich wie E-Mails über verschiedene Provider versendet werden.
    • +
    • Events & Schlüsselpaare: Lernmaterialien, Kommentare oder Sammlungen werden als „Events“ gespeichert, signiert mit kryptografischen Schlüsseln. So bleibt die Urheberschaft nachvollziehbar, ohne zentrale Autorität.
    • +
    • Interoperabilität & Erweiterbarkeit: Das Protokoll ist modular aufgebaut, sodass verschiedene Eventtypen integriert werden können. So könnten Metadatenstandards wie das Allgemeine Metadatenprofil (AMB) abgebildet werden, um die Publikation und den Konsum von Bildungsmetadaten plattformübergreifend zu erleichtern.
    • +
    +

    Beispiel: Eine Lehrkraft erstellt auf MUNDO eine Merkliste zu „Nachhaltigkeit“. Dieses Event wird via Nostr-Relays an WirLernenOnline übertragen – die Liste ist somit auf Relays im Nostr-Netzwerk verfügbar. Selbst wenn MUNDO und WirLernenOnline offline gehen würden, wäre die Merkliste weiterhin verfügbar, da sie nicht auf der Plattform, sondern auf einem (oder mehreren) Relay(s) liegt.

    +
    +

    Chancen für Gemeinschaft und Nachhaltigkeit

    +

    Ein dezentraler Datenraum fördert nicht nur technische Resilienz, sondern auch neue Formen der Zusammenarbeit:

    +
      +
    • Qualitätssicherung durch Crowdsourcing: Da Nutzer:innen nicht mehr durch Plattformgrenzen künstlich getrennt werden, können sie übergreifend miteinander und mit Ressourcen interagieren und sich darüber austauschen. Ihr sozialer Graph kann dabei – ähnlich dem „Circle of Trust“ der norwegischen NDLA-Plattform - genutzt werden, um die Relevanz von Ressourcen algorithmisch einzuordnen.
    • +
    • Monetarisierung ohne Abhängigkeit: Services wie Metadaten-Anreicherung oder Premium-Relays (für personalisierte Feeds, zusätzliche Materialien) können monetarisierbar auf dem Protokoll abgebildet werden und könnten zusätzliche Einnahmequellen bieten, während die Infrastruktur gemeinfrei bleibt .
    • +
    • Empowerment kleiner Akteure: Lokale und kleinere Initiativen, die bis heute (2025!) nicht in der Lage sind, sich und ihre Materialien selbst in die öffentliche Bildungsinfrastruktur einzubringen, erhalten erweiterte Möglichkeiten.
    • +
    +
    +

    Aufruf zum Mitgestalten

    +

    Die Umsetzung dieser Vision lebt von der Gemeinschaft. Inspiriert von Projekten wie ReliLab oder SynLLOER, laden wir ein:

    +
      +
    1. Erprobt die Dezentralität: Testet den Proof of ConceptEduFeed“, der Nostr für Bildungsmetadaten nutzt.
    2. +
    3. Denkt infrastrukturübergreifend: Entwickelt OER nicht im Silo, sondern integriert sie in dezentrale Netzwerke.
    4. +
    5. Engagiert euch politisch: Fordert Fördergelder für offene Protokolle statt proprietärer Plattformen.
    6. +
    +

    Wie Niels Winkelmann im Digilog.Blog schreibt: „OEP systemisch zu denken ist der Wind in den Segeln für eine Vision offener Bildung“ . +Lasst uns gemeinsam die Segel setzen – dezentral, partizipativ und zukunftssicher! +:sailboat: “for a race we must win

    + + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100755 index 0000000..7411c58 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100755 index 0000000..37aeaa5 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100755 index 0000000..58e9669 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/impressum/index.html b/public/impressum/index.html new file mode 100644 index 0000000..80dd99f --- /dev/null +++ b/public/impressum/index.html @@ -0,0 +1,243 @@ + + + + + + + +Impressum | Jörg Lohrer + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    +
    + +

    + Impressum +

    + +
    +

    Impressum

    +

    Angaben gemäß § 5 TMG

    +

    Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Jörg Lohrer Austr.23 74239 Hardthausen Telefon: 07139-50897070 E-Mail: info.empeiria@gmail.com

    +

    Haftungsausschluss:

    +

    Haftung für Inhalte

    +

    Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.

    + +

    Mein Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen.

    +

    Urheberrecht

    +

    Die durch den Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen jedoch nicht der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind sowohl für den privaten, als auch für den kommerziellen Gebrauch unter Namensnennung und der Creative Commons Lizenz CC BY-SA gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Solltest Du trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen.

    +

    Datenschutz

    +

    Die Nutzung meiner Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf meiner Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Deine ausdrückliche Zustimmung nicht an Dritte weitergegeben. Ich weise darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.

    + + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..990d48e --- /dev/null +++ b/public/index.html @@ -0,0 +1,280 @@ + + + + + + + + +Jörg Lohrer + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + Mein Profilbild +

    Hi 🖖

    + Willkommen auf meinem Blog 🤗 + + +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/public/index.json b/public/index.json new file mode 100644 index 0000000..250c07f --- /dev/null +++ b/public/index.json @@ -0,0 +1 @@ +[{"content":"Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft\nWarum wir eine neue Perspektive brauchen Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities.\nDoch Bildung sollte resilient sein – unabhängig von politischen oder finanziellen Rahmenbedingungen und gewissermaßen auch von der Plattform, auf der man gerade agiert.\nHier setzt die Vision eines dezentralen Datenraums an: Statt zentraler Kontrolle verteilt er Daten auf viele Akteure, fördert Interoperabilität sowie Datensouveränität der Nutzer:innen und ermöglicht neue Geschäftsmodelle. Inspiriert vom Messaging Protokoll \u0026ldquo;Nostr\u0026rdquo; – ursprünglich für zensurresistente soziale Netzwerke entwickelt – könnte so eine Infrastruktur entstehen, die Offenheit, Teilhabe und Vernetzung ins Zentrum stellt.\nVon OER zu OEP: Offenheit als Haltung Open Educational Resources (OER) als frei verfügbare Bildungsmaterialien sind nur der erste Schritt. Echte Open Educational Practices (OEP) umfassen eine Kultur des Teilens, kollaboratives Lernen und demokratische Bildungsprozesse. Wie Kerstin Mayrberger betont, geht es bei OEP im Kern um „Demokratiebildung“: Lernende und Lehrende gestalten gemeinsam Inhalte, hinterfragen Strukturen und entwickeln kritisches Denken.\nDoch dafür braucht es mehr als nur frei lizenzierte Materialien. Es braucht (freie) Infrastrukturen, die:\nPartizipation ermöglichen: Nutzer:innen behalten die Kontrolle über ihre Daten und Interaktionen. Resilienz schaffen: Dezentrale Speicherung verhindert den „Stecker-Ziehen-Effekt“. Vernetzung fördern: Plattformübergreifende Zusammenarbeit wird zur Norm, nicht zur Ausnahme. Wie Nostr die Bildungsinfrastruktur revolutionieren könnte Die technische Grundlage für vernetzte Bildung sollte also nicht analog zu Systemen entwickelt werden, deren Grundlage ist, Nutzer und Inhalte (oft ökonomisch gewollt) an sich zu binden. Stattdessen sollte sie strukturell so angelegt sein, die digitale Vernetzung, die wir uns für die Bildung wünschen, bereits grundlegend zu enthalten. Wir suchen somit nicht nach lokalen Softwarelösungen für die Organisation von OER- und OEP-Communities, sondern nach grundlegenden Technologieansätzen, die diese Anforderungen erfüllen können. Dadurch rücken neben den Schnittstellenlösungen, die Plattformen entwickeln müssen, um künftig anschlussfähig zu sein, zunehmend die zugrunde liegenden Protokolle für Zusammenarbeit und vernetzte Bildung in den Fokus einer Entwicklung, wenn diese auf Wirkung und Nachhaltigkeit angelegt sein soll.\nDas Nostr-Protokoll erfüllt diese grundlegenden Anforderungen:\nClients \u0026amp; Relays: Bildungsplattformen agieren als Clients, die mit Relays (dezentralen Servern) verbunden sind. Jede Institution kann eigene Relays betreiben, die Daten synchronisieren – ähnlich wie E-Mails über verschiedene Provider versendet werden. Events \u0026amp; Schlüsselpaare: Lernmaterialien, Kommentare oder Sammlungen werden als „Events“ gespeichert, signiert mit kryptografischen Schlüsseln. So bleibt die Urheberschaft nachvollziehbar, ohne zentrale Autorität. Interoperabilität \u0026amp; Erweiterbarkeit: Das Protokoll ist modular aufgebaut, sodass verschiedene Eventtypen integriert werden können. So könnten Metadatenstandards wie das Allgemeine Metadatenprofil (AMB) abgebildet werden, um die Publikation und den Konsum von Bildungsmetadaten plattformübergreifend zu erleichtern. Beispiel: Eine Lehrkraft erstellt auf MUNDO eine Merkliste zu „Nachhaltigkeit“. Dieses Event wird via Nostr-Relays an WirLernenOnline übertragen – die Liste ist somit auf Relays im Nostr-Netzwerk verfügbar. Selbst wenn MUNDO und WirLernenOnline offline gehen würden, wäre die Merkliste weiterhin verfügbar, da sie nicht auf der Plattform, sondern auf einem (oder mehreren) Relay(s) liegt.\nChancen für Gemeinschaft und Nachhaltigkeit Ein dezentraler Datenraum fördert nicht nur technische Resilienz, sondern auch neue Formen der Zusammenarbeit:\nQualitätssicherung durch Crowdsourcing: Da Nutzer:innen nicht mehr durch Plattformgrenzen künstlich getrennt werden, können sie übergreifend miteinander und mit Ressourcen interagieren und sich darüber austauschen. Ihr sozialer Graph kann dabei – ähnlich dem „Circle of Trust“ der norwegischen NDLA-Plattform - genutzt werden, um die Relevanz von Ressourcen algorithmisch einzuordnen. Monetarisierung ohne Abhängigkeit: Services wie Metadaten-Anreicherung oder Premium-Relays (für personalisierte Feeds, zusätzliche Materialien) können monetarisierbar auf dem Protokoll abgebildet werden und könnten zusätzliche Einnahmequellen bieten, während die Infrastruktur gemeinfrei bleibt . Empowerment kleiner Akteure: Lokale und kleinere Initiativen, die bis heute (2025!) nicht in der Lage sind, sich und ihre Materialien selbst in die öffentliche Bildungsinfrastruktur einzubringen, erhalten erweiterte Möglichkeiten. Aufruf zum Mitgestalten Die Umsetzung dieser Vision lebt von der Gemeinschaft. Inspiriert von Projekten wie ReliLab oder SynLLOER, laden wir ein:\nErprobt die Dezentralität: Testet den Proof of Concept „EduFeed“, der Nostr für Bildungsmetadaten nutzt. Denkt infrastrukturübergreifend: Entwickelt OER nicht im Silo, sondern integriert sie in dezentrale Netzwerke. Engagiert euch politisch: Fordert Fördergelder für offene Protokolle statt proprietärer Plattformen. Wie Niels Winkelmann im Digilog.Blog schreibt: „OEP systemisch zu denken ist der Wind in den Segeln für eine Vision offener Bildung“ . Lasst uns gemeinsam die Segel setzen – dezentral, partizipativ und zukunftssicher! :sailboat: \u0026ldquo;for a race we must win\u0026rdquo;\n","permalink":"http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/","summary":"\u003ch1 id=\"gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter\"\u003eGemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter\u003c/h1\u003e\n\u003cp\u003e\u003cem\u003eEinladung zum offenen Denken und Handeln in der Bildungsgemeinschaft\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"warum-wir-eine-neue-perspektive-brauchen\"\u003e\u003cstrong\u003eWarum wir eine neue Perspektive brauchen\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003eDie aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen.\nDiese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities.\u003c/p\u003e","title":"Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter"},{"content":"#KIBedenken - Bewusstsein Den für mich derzeit wichtigsten Impuls über KI nachzudenken lieferte vor einigen Wochen Yuval Noah Harari an der University of Cambridge am Ende eines Podiumsgesprächs hier ab 1:15 h auf youtube:\nIch denke, wir müssen die Frage des Bewusstseins in den Mittelpunkt der Diskussion stellen. Es gibt eine riesige, riesige Verwirrung in der Terminologie, auch in der Welt der KI, zwischen Bewusstsein und Intelligenz. Aber es sind zwei verschiedene Dinge. Intelligenz ist die Fähigkeit, Probleme zu lösen und Ziele zu erreichen. Bewusstsein ist die Fähigkeit, Dinge zu fühlen, wie Schmerz oder Freude oder Liebe oder Hass. Wir neigen dazu, die beiden zu verwechseln, weil bei Menschen und auch bei anderen Säugetieren, Vögeln und anderen Tieren Bewusstsein und Intelligenz zusammengehören. Wir lösen Probleme durch unsere Gefühle. Computer waren bisher sehr anders. Sie sind in einigen Bereichen bereits intelligenter als wir, haben aber, soweit wir wissen, kein Bewusstsein. Soweit wir wissen, können sie überhaupt keinen Schmerz, keine Freude, keine Liebe oder keinen Hass empfinden. Niemand weiß, was in Zukunft passieren wird. Es gibt Modelle und Theorien, die argumentieren, dass KIs irgendwann auch bewusst oder empfindsam werden. Sie werden anfangen, Dinge zu fühlen. Sie werden anfangen, Schmerz oder Liebe oder Hass zu empfinden. Es gibt andere Modelle und Theorien, die sagen, nein. Sie könnten weit intelligenter werden als wir und immer noch null Bewusstsein haben. Das kann in der Evolution des Lebens sein. Wenn man darüber nachdenkt, die lange Entwicklung von Milliarden von Jahren der Evolution. Die Entwicklung der Intelligenz ist im Falle von Tieren wie uns und Schimpansen und Hunden und Schweinen und so weiter durch die Entwicklung des Bewusstseins verlaufen. Aber das ist kein universelles Gesetz der Evolution der Intelligenz. Vielleicht gibt es alternative Wege, die zu Superintelligenz ohne jegliches Bewusstsein führen. Einfach einen anderen, einen fremden Weg gehen. Und wir könnten an einen Punkt gelangen, an dem sie superintelligent sind und trotzdem null Bewusstsein haben. Und die Gefahr besteht dann darin, dass sie nicht nur die menschliche Zivilisation zerstören könnten, sondern das ganze Licht des Bewusstseins, um das gesamte ökologische System nach ihren Bedürfnissen umzugestalten, wofür sie kein Bewusstsein brauchen. Sie funktionieren auf eine völlig andere Weise. Sie könnten sich sogar von der Erde auf andere Planeten, auf andere Galaxien ausbreiten. Sie werden das Universum mit Intelligenz füllen, aber es wird ein völlig dunkles Universum ohne Bewusstsein sein. Wieder hohe Intelligenz, fähig, Raumschiffe zu bauen, die mit Lichtgeschwindigkeit fliegen und was auch immer, aber es gibt null Gefühl. Niemand, keine Entität fühlt Schmerz oder Freude, Liebe oder Hass. Für mich ist das ein schreckliches Szenario. Das schlimmste Szenario von allen ist dies. Dass wir ein Universum voller Intelligenz und völlig ohne Bewusstsein haben werden, denn ich denke, dass von den beiden das Bewusstsein weitaus wichtiger, weitaus wertvoller ist. Und es ist eine gute Erinnerung daran, dass wir das zumindest heute mit vielen anderen Tieren teilen, aber nicht mit den Computern, nicht mit den KIs. Wir sind also immer noch im selben Team wie die Würmer und die Affen, nicht im selben Team wie die Computer.\nIch denke, hier wird eine Spur gelegt, die sich unterscheidet von der reinen Funktion von KI zur intelligenten Verbesserung und Unterstützung von Lernprozessen oder vielfältigem Kompetenzerwerb hin zur Selbstreflexion der Lernenden. Auch im Blick auf (religionsbezogene) Bildung kennen wir den Mensch nicht nur biologisch, wie die Würmer und Affen sondern auch ausgestattet mit Würde, Entscheidungsfreiheit und als Beziehungswesen, das auf ein Gegenüber ausgerichtet sein kann und, wie Harari sagt, nicht im selben Team wie die Computer spielt. Sinn, Seele und Verstand erhalten wir weder aus uns selbst heraus noch von einer wie auch immer gearteten Intelligenz. Liebe, Gnade, Hoffnung, Frieden, Gemeinschaft, Trost, Zuversicht und viele weiteren lebensbedeutsame Erfahrungen gewinnen im Angesicht von Maschinen aus meiner Sicht an elementarer Bedeutung.\nDies ist ein Beitrag zur Blogparade #KIBedenken von Joscha Falck und Nele Hirsch\nAustausch und Diskussion zu diesem Beitrag offen und dezentral hier auf Mastodon im Fediverse geschlossen und plattformgebunden hier auf bluesky hier in Threads hier in Linkedin ","permalink":"http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/","summary":"\u003ch1 id=\"kibedenken---bewusstsein\"\u003e#KIBedenken - Bewusstsein\u003c/h1\u003e\n\u003cp\u003eDen für mich derzeit wichtigsten Impuls über KI nachzudenken lieferte vor einigen Wochen \u003ca href=\"https://youtu.be/XmhLmZwc2es?si=AOomz4ygJI35j-o8\u0026amp;t=4502\"\u003eYuval Noah Harari an der University of Cambridge am Ende eines Podiumsgesprächs hier ab 1:15 h auf youtube\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIch denke, wir müssen die Frage des Bewusstseins in den Mittelpunkt der Diskussion stellen. Es gibt eine riesige, riesige Verwirrung in der Terminologie, auch in der Welt der KI, zwischen Bewusstsein und Intelligenz. Aber es sind zwei verschiedene Dinge. Intelligenz ist die Fähigkeit, Probleme zu lösen und Ziele zu erreichen. Bewusstsein ist die Fähigkeit, Dinge zu fühlen, wie Schmerz oder Freude oder Liebe oder Hass. Wir neigen dazu, die beiden zu verwechseln, weil bei Menschen und auch bei anderen Säugetieren, Vögeln und anderen Tieren Bewusstsein und Intelligenz zusammengehören. Wir lösen Probleme durch unsere Gefühle. Computer waren bisher sehr anders. Sie sind in einigen Bereichen bereits intelligenter als wir, haben aber, soweit wir wissen, kein Bewusstsein. Soweit wir wissen, können sie überhaupt keinen Schmerz, keine Freude, keine Liebe oder keinen Hass empfinden. Niemand weiß, was in Zukunft passieren wird. Es gibt Modelle und Theorien, die argumentieren, dass KIs irgendwann auch bewusst oder empfindsam werden. Sie werden anfangen, Dinge zu fühlen. Sie werden anfangen, Schmerz oder Liebe oder Hass zu empfinden. Es gibt andere Modelle und Theorien, die sagen, nein. Sie könnten weit intelligenter werden als wir und immer noch null Bewusstsein haben. Das kann in der Evolution des Lebens sein. Wenn man darüber nachdenkt, die lange Entwicklung von Milliarden von Jahren der Evolution. Die Entwicklung der Intelligenz ist im Falle von Tieren wie uns und Schimpansen und Hunden und Schweinen und so weiter durch die Entwicklung des Bewusstseins verlaufen. Aber das ist kein universelles Gesetz der Evolution der Intelligenz. Vielleicht gibt es alternative Wege, die zu Superintelligenz ohne jegliches Bewusstsein führen. Einfach einen anderen, einen fremden Weg gehen. Und wir könnten an einen Punkt gelangen, an dem sie superintelligent sind und trotzdem null Bewusstsein haben. Und die Gefahr besteht dann darin, dass sie nicht nur die menschliche Zivilisation zerstören könnten, sondern das ganze Licht des Bewusstseins, um das gesamte ökologische System nach ihren Bedürfnissen umzugestalten, wofür sie kein Bewusstsein brauchen. Sie funktionieren auf eine völlig andere Weise. Sie könnten sich sogar von der Erde auf andere Planeten, auf andere Galaxien ausbreiten. Sie werden das Universum mit Intelligenz füllen, aber es wird ein völlig dunkles Universum ohne Bewusstsein sein. Wieder hohe Intelligenz, fähig, Raumschiffe zu bauen, die mit Lichtgeschwindigkeit fliegen und was auch immer, aber es gibt null Gefühl. Niemand, keine Entität fühlt Schmerz oder Freude, Liebe oder Hass. Für mich ist das ein schreckliches Szenario. Das schlimmste Szenario von allen ist dies. Dass wir ein Universum voller Intelligenz und völlig ohne Bewusstsein haben werden, denn ich denke, dass von den beiden das Bewusstsein weitaus wichtiger, weitaus wertvoller ist. Und es ist eine gute Erinnerung daran, dass wir das zumindest heute mit vielen anderen Tieren teilen, aber nicht mit den Computern, nicht mit den KIs. Wir sind also immer noch im selben Team wie die Würmer und die Affen, nicht im selben Team wie die Computer.\u003c/p\u003e","title":"KIBedenken - Bewusstsein"},{"content":"Eine Session-Idee auf dem #OERcamp 24 in Hamburg Entfessele deine kreative Superkraft und erstelle Open Educational Resources (OER) mit Markdown!\nIn dieser Session tauchst du ein in die Welt der 5V-Freiheiten von Open Content und lernst gleichzeitig die Markdown-Sprache kennen – dein perfektes Werkzeug, um diese Freiheiten zu nutzen!\nBottomUp MarkDown: Verwahren \u0026amp; Vervielfältigen: Gestalte direkt online ohne Software, Registrierungen oder Anmeldungen. Lade deine OER herunter, sichere sie und erstelle so viele Kopien, wie du benötigst – ganz ohne Limits! Mit Markdown speicherst du deine Inhalte im praktischen und leicht editierbaren Textformat. Verwenden: Ob im Unterricht, in Lerngruppen oder online – bringe deine OER in allen erdenklichen Kontexten zum Einsatz! Markdown macht deine Inhalte überall zugänglich und flexibel. Auch Vorlagen von Lehrenden, die Lernende übernehmen und anpassen können sind einfach bereitgestellt. Verarbeiten: Bearbeite deine Inhalte, passe sie an deine Bedürfnisse an und kreiere neue Lernmaterialien – deiner Fantasie sind keine Grenzen gesetzt! Markdown bietet dir die Freiheit, deine OER ständig weiterzuentwickeln, zu versionieren und zu verändern. Vermischen: Kombiniere deine OER mit anderen offenen Inhalten, erweitere sie mit Bildern, Videos und Musik (sogar urheberrechtlich geschützten Werken) und schaffe einzigartige Lernerlebnisse! Markdown lässt sich nahtlos mit anderen Formaten und Medien kombinieren. Verbreiten: Teile deine OER mit der Welt! Veröffentliche sie online, versende sie an Freunde und Kollegen und trage zur globalen Wissensgemeinschaft bei! Mit Markdown präsentierst du deine OER im Web in einem ansprechenden und nutzerfreundlichen Format, das barrierefrei weiternutzbar ist unanbhängig von technischer Infrastruktur oder Plattformen. In dieser Session: Entfessele die Markdown-Mania: Lerne die Syntax der Sprache kennen und erstelle im Handumdrehen deine ersten OER. Gestalte deine Inhalte mit Superkräften: Formatiere Texte, füge Bilder und Tabellen ein und erstelle interaktive Elemente. Markdown gibt dir alle Werkzeuge dafür an die Hand. Veröffentliche deine OER im Internet: Erfahre, wie du deine Materialien online zugänglich machst und mit anderen teilst. Mit Markdown ist die Veröffentlichung deiner OER ein Kinderspiel. Werde Teil der OER-Community: Vernetze dich mit anderen Lernenden und Lehrenden und profitiere vom Austausch in der Community. Gemeinsam gestalten wir die Zukunft des Lernens mit Markdown! Austausch und Diskussion zu diesem Beitrag offen und dezentral hier auf Mastodon im Fediverse geschlossen und plattformgebunden hier auf bluesky hier in Threads hier in Linkedin ","permalink":"http://localhost:1313/2024/03/05/bottomup-markdown.html/","summary":"\u003ch2 id=\"eine-session-idee-auf-dem-oercamp-24-in-hamburg\"\u003eEine Session-Idee auf dem #OERcamp 24 in Hamburg\u003c/h2\u003e\n\u003cp\u003eEntfessele deine kreative Superkraft und erstelle Open Educational Resources (OER) mit Markdown!\u003c/p\u003e\n\u003cp\u003eIn dieser Session tauchst du ein in die Welt der 5V-Freiheiten von Open Content und lernst gleichzeitig die Markdown-Sprache kennen – dein perfektes Werkzeug, um diese Freiheiten zu nutzen!\u003c/p\u003e\n\u003ch2 id=\"bottomup-markdown\"\u003eBottomUp MarkDown:\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eVerwahren \u0026amp; Vervielfältigen\u003c/strong\u003e: Gestalte direkt online ohne Software, Registrierungen oder Anmeldungen. Lade deine OER herunter, sichere sie und erstelle so viele Kopien, wie du benötigst – ganz ohne Limits! Mit Markdown speicherst du deine Inhalte im praktischen und leicht editierbaren Textformat.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerwenden\u003c/strong\u003e: Ob im Unterricht, in Lerngruppen oder online – bringe deine OER in allen erdenklichen Kontexten zum Einsatz! Markdown macht deine Inhalte überall zugänglich und flexibel. Auch Vorlagen von Lehrenden, die Lernende übernehmen und anpassen können sind einfach bereitgestellt.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerarbeiten\u003c/strong\u003e: Bearbeite deine Inhalte, passe sie an deine Bedürfnisse an und kreiere neue Lernmaterialien – deiner Fantasie sind keine Grenzen gesetzt! Markdown bietet dir die Freiheit, deine OER ständig weiterzuentwickeln, zu versionieren und zu verändern.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVermischen\u003c/strong\u003e: Kombiniere deine OER mit anderen offenen Inhalten, erweitere sie mit Bildern, Videos und Musik (sogar urheberrechtlich geschützten Werken) und schaffe einzigartige Lernerlebnisse! Markdown lässt sich nahtlos mit anderen Formaten und Medien kombinieren.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerbreiten\u003c/strong\u003e: Teile deine OER mit der Welt! Veröffentliche sie online, versende sie an Freunde und Kollegen und trage zur globalen Wissensgemeinschaft bei! Mit Markdown präsentierst du deine OER im Web in einem ansprechenden und nutzerfreundlichen Format, das barrierefrei weiternutzbar ist unanbhängig von technischer Infrastruktur oder Plattformen.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"in-dieser-session\"\u003eIn dieser Session:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eEntfessele die Markdown-Mania\u003c/strong\u003e: Lerne die Syntax der Sprache kennen und erstelle im Handumdrehen deine ersten OER.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGestalte deine Inhalte mit Superkräften\u003c/strong\u003e: Formatiere Texte, füge Bilder und Tabellen ein und erstelle interaktive Elemente. Markdown gibt dir alle Werkzeuge dafür an die Hand.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVeröffentliche deine OER im Internet\u003c/strong\u003e: Erfahre, wie du deine Materialien online zugänglich machst und mit anderen teilst. Mit Markdown ist die Veröffentlichung deiner OER ein Kinderspiel.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWerde Teil der OER-Community\u003c/strong\u003e: Vernetze dich mit anderen Lernenden und Lehrenden und profitiere vom Austausch in der Community. Gemeinsam gestalten wir die Zukunft des Lernens mit Markdown!\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"bottomup-markdown.png\" alt=\"\" /\u003e\n\u003c/p\u003e","title":"BottomUp -\u003e MarkDown - 5V-Power für deine OER!"},{"content":"Offenheit - das Wesentliche 1. Einleitung: Persönliche Reflexion über Offenheit Wenn ich auf das Jahr 2023 zurückblicke, gewinne ich den Eindruck, dass das Wesentliche in meinem Berufs- und Privatleben in den Verbindungen mit anderen Menschen liegt. Dashalb ist die Offenheit für Andere, mit und an denen ich lerne nicht nur ein abstraktes Ideal oder eine berufliche Anforderung, sondern ein wesentlicher Bestandteil meiner täglichen Existenz. Dieses Bewusstsein hat mich dazu inspiriert, meine Neujahrsvorsätze für 2024 um das Thema Offenheit herum zu gestalten.\nMeine bisherigen Erfahrungen mit Offenheit haben mich gelehrt, dass es viel mehr ist als nur ein offenes Ohr für andere zu haben oder neue Ideen willkommen zu heißen. Es geht darum, mich selbst für neue Erfahrungen, Veränderungen und unterschiedliche Perspektiven zu öffnen. Ich habe gelernt, dass Offenheit eine Haltung ist, die Mut erfordert – den Mut, sich dem Unbekannten zu stellen, Veränderungen zu akzeptieren und manchmal auch das Risiko einzugehen, verletzlich zu sein.\nFür das kommende Jahr möchte ich mich noch stärker auf das Wesen der Offenheit konzentrieren. Ich habe erkannt, dass Offenheit nicht nur ein Weg ist, mein Leben zu bereichern, sondern auch ein Mittel, um effektiver zu kommunizieren, tiefere Beziehungen aufzubauen und eine bereichernde Arbeitsumgebung zu schaffen. Offenheit soll in meinem Alltag zur Grundlage meiner Entscheidungen und Interaktionen werden.\nDies bedeutet, dass ich bewusst Raum schaffen möchte für das Zuhören und Verstehen anderer Meinungen, auch wenn sie von meinen eigenen abweichen. Es bedeutet auch, mich neuen Herausforderungen und Möglichkeiten zu stellen, ohne von vornherein eine defensive Haltung einzunehmen. In beruflicher Hinsicht möchte ich offener für kreative und innovative Ansätze sein, die über herkömmliche Methoden hinausgehen, und ich strebe danach, Offenheit als ein Schlüsselelement in meiner Arbeitskultur zu etablieren.\nMeine Neujahrsvorsätze für 2024 drehen sich also darum, Offenheit in meinem Denken und Handeln zu kultivieren. Ich möchte lernen, flexibler zu sein, meine Komfortzone zu erweitern und mich aktiv auf das Unbekannte einzulassen. Durch diese Reise erhoffe ich mir, nicht nur persönlich zu wachsen, sondern auch positiv auf die Menschen um mich herum einzuwirken. Offenheit ist für mich das Schlüsselwort für 2024 – ein Jahr, in dem ich mich auf das Wesentliche konzentrieren und neue Wege des Lernens und der Gemeinschaft erkunden möchte.\n2. Offenheit in meinem Alltag: Eine neue Perspektive In meinem Streben nach Offenheit im neuen Jahr möchte ich diese nicht nur als abstraktes Konzept verstehen, sondern sie konkret in meinen Alltag integrieren. Offenheit in meiner täglichen Kommunikation und in meinen Beziehungen soll zu einem zentralen Fokus werden.\nErstens plane ich, in meinen beruflichen Beziehungen geschlossene Systemen zu überwinden. Dies bedeutet für mich, mich aktiv um eine Kultur der Offenheit und Transparenz zu bemühen. Ich möchte die Silo-Mentalität abbauen, die in vielen Organisationen vorherrscht, und stattdessen eine Umgebung schaffen, in der Wissen und Informationen frei geteilt werden. Durch das Überwinden geschlossener Systeme erhoffe ich mir, ein integratives und kollaboratives Arbeitsumfeld zu fördern, in dem Ideen und Innovationen gedeihen können. Das bedeutet Social-Media-Walls und geschlossene Plattformen (sowie meine 23.461 Tweets) hinter mir zu lassen und offene, dezentrale Anschlussmöglichkeiten zu erlernen um Offenheit auch substantiell und nachhaltig zu ermöglichen.\nEin weiterer Aspekt meiner Alltags-Offenheit bezieht sich auf meine persönliche Entwicklung. Ich möchte mich neuen Erfahrungen und Herausforderungen stellen, die mich aus meiner Komfortzone herausholen. Das kann bedeuten, Permakultur auszuprobieren, mich wieder musikalisch zu betätigen oder meine Kompetenzen online zu erweitern. Diese Schritte sollen nicht nur zur Selbstentfaltung beitragen, sondern auch meine Fähigkeit stärken, mit Veränderungen und Unsicherheiten umzugehen.\nSchließlich erkenne ich, dass Offenheit auch bedeutet, sich selbst gegenüber ehrlich zu sein. Es geht darum, meine eigenen Gefühle, Ängste und Hoffnungen anzuerkennen und sie nicht zu unterdrücken. Indem ich mir meiner eigenen inneren Welt bewusst werde, kann ich authentischer mit anderen interagieren und eine tiefere Selbstkenntnis entwickeln, die mich dann hoffentlich auch anschlussfähiger macht. Also mehr Offenheit in Arbeit und freiZEIT\nDurch diese konkreten Schritte hoffe ich, Offenheit zu einem integralen Bestandteil meines täglichen Lebens zu machen. Ich bin überzeugt, dass dies nicht nur mein persönliches Wachstum fördern, sondern auch meine Beziehungen zu anderen bereichern wird. Offen zu sein bedeutet für mich, aktiv und bewusst zu leben, immer bereit, neue Perspektiven zu erkunden und das Leben in all seinen Facetten zu umarmen. Indem ich Offenheit in meinen Alltag integriere, öffne ich die Tür zu einer Welt voller neuer Möglichkeiten, Lernerfahrungen und tiefgreifender Verbindungen.\n3. Offenheit in Bildung und Lernen: Ein lebenslanger Prozess In meinem Streben nach Offenheit im Jahr 2024 möchte ich mich besonders auf den Bereich der Bildung und des Lernens in offenen Communities konzentrieren. Offene Bildungsressourcen (OER) bieten eine wunderbare Gelegenheit, sich kontinuierlich weiterzuentwickeln und zu lernen. Meine Beteiligung an OER ist nicht nur ein berufliches Engagement, sondern auch ein persönliches Anliegen, das meine Leidenschaft für lebenslanges Lernen widerspiegelt.\nIch sehe OER als eine Möglichkeit, Bildung zugänglicher und inklusiver zu gestalten. Durch meine Beteiligung an Projekten und Initiativen, die OER-Communities fördern, möchte ich dazu beitragen, Wissen frei verfügbar zu machen und Lernmöglichkeiten für Menschen aus unterschiedlichen Hintergründen zu schaffen. Dies beinhaltet auch die Förderung von Netzwerkknoten und Gemeinschaften, die offene Bildungsressourcen unterstützen und entwickeln.\nEin weiterer Schwerpunkt für mich ist die kontinuierliche eigene Weiterbildung durch OER. Ich plane, Online-Kurse, Webinare und andere offene Bildungsangebote zu nutzen, um meine Fähigkeiten und mein Wissen zu erweitern. Dieses Engagement für das lebenslange Lernen ist ein Kernaspekt meiner persönlichen und beruflichen Entwicklung.\nIch möchte auch mein Netzwerk aus Gleichgesinnten erweitern, die den Wert offener Bildung erkennen und fördern, wie beispielsweise im Bündnis Freie Bildung. Durch den Austausch mit anderen, die in diesem Bereich aktiv sind, kann ich neue Ideen und Perspektiven gewinnen und gleichzeitig meine eigenen Erfahrungen teilen. Dieser Austausch wird mir helfen, meine Rolle in der OER-Community zu stärken und effektiver zur Weiterentwicklung von offenen Bildungsressourcen beizutragen.\nSchließlich sehe ich Offenheit in der Bildung als einen Weg, um kritisch zu denken und kreative Lösungen für Herausforderungen zu finden. Offene Bildungsressourcen ermutigen mich, über traditionelle Lernmethoden hinauszugehen und innovative Ansätze in meinem Lernprozess zu erkunden.\n4. Qualitätssicherung und Standardisierung in OER Mein Engagement für Offenheit im Bildungsbereich im Jahr 2024 beinhaltet auch einen starken Fokus auf die Qualitätssicherung und Standardisierung von Offenen Bildungsressourcen (OER). Mir ist bewusst, dass die Qualitätssicherung eine der größten Herausforderungen im Umgang mit OER darstellt, da es oft an standardisierten Bewertungskriterien fehlt.\nUm die Qualität von OER zu gewährleisten, plane ich, mich aktiv an der Entwicklung und Anwendung von Qualitätsstandards zu beteiligen. Dies könnte die Mitarbeit in Gremien oder Initiativen umfassen, die sich mit der Erstellung von Richtlinien und Best Practices für OER beschäftigen und beispielsweise auch eine intensivere Zusammenarbeit mit WirLernenOnline - Freie Bildung zum Mitmachen. Ich möchte sicherstellen, dass die mit mir gemeinschaftlich genutzten oder erstellten Ressourcen nicht nur frei zugänglich, sondern auch von hoher Qualität, wiederauffindbar und nachhaltig zugänglich sind.\nEin weiterer Schritt in Richtung Qualitätssicherung ist die Teilnahme am Veranstaltungen wie dem OERcamp, um mein Wissen über die besten Methoden zur Erstellung und Bewertung von OER zu vertiefen. Durch das Erlernen von Techniken zur effektiven Überprüfung und Bewertung von Bildungsmaterialien kann ich zur Verbesserung der Qualität der Ressourcen, mit denen ich arbeite, beitragen.\nDarüber hinaus möchte ich mich für die Förderung einer Kultur der kontinuierlichen Verbesserung und des Feedbacks innerhalb der OER-Community einsetzen. Dies bedeutet, offene Diskussionen über die Qualität von Ressourcen zu fördern und Plattformen, wie beispielsweise rpi-virtuell, dem relilab oder die ZUM für Peer-Reviews und Nutzerfeedback zu nutzen. Ich glaube, dass eine solche Kultur nicht nur die Qualität der Ressourcen verbessert, sondern auch das Bewusstsein und das Engagement der Community für hohe Standards stärkt.\nInsgesamt sehe ich die Qualitätssicherung und Standardisierung in OER als wesentliche Elemente meiner Bemühungen um Offenheit im Bildungsbereich. Durch die Fokussierung auf diese Aspekte hoffe ich, nicht nur zu meiner persönlichen Entwicklung beizutragen, sondern auch die Effektivität und Glaubwürdigkeit von OER als Werkzeug für lebenslanges Lernen zu stärken.\n5. Die Rolle der Technologie: Ermöglicher von Offenheit In meinem Bestreben, Offenheit in meinem Leben im Jahr 2024 zu fördern, erkenne ich die entscheidende Rolle, die Technologie dabei spielt. Ich sehe Technologie als einen wesentlichen Ermöglicher an, der es mir ermöglicht, Offenheit in verschiedenen Bereichen meines Lebens zu integrieren und zu erweitern.\nEiner der Hauptaspekte, in denen ich Technologie nutzen möchte, ist die Verbesserung meiner Zugänglichkeit und Teilnahme an offenen Bildungsressourcen und Plattformen. Dies umfasst die Nutzung digitaler Plattformen für OER, die es mir und anderen ermöglichen, auf eine Vielzahl von Bildungsmaterialien zuzugreifen und diese mit anderen zu teilen. Ich plane, diese Tools zu nutzen, um mein Wissen zu erweitern und gleichzeitig zur Gemeinschaft beizutragen, indem ich eigene Inhalte erstelle und offen teile. Nicht nur die dezentrale offene Bereitstellung, freie Lizenzen und offene Schnittstellen scheinen mir hier wichtig sondern auch die Offenheit der Gemeinschaft und die zugrundeliegenden Open-Source-Technologien, die uns zusammenbringen und zusammenhalten.\nDarüber hinaus möchte ich moderne Kommunikationstechnologien nutzen, um meine Beziehungen sowohl im persönlichen als auch im beruflichen Bereich zu stärken. Dies beinhaltet die Nutzung von sozialen Medien auf Basis des offenen Fediverse joerglohrer@reliverse.social, die Messaging App Element auf der Basis des offenen Matrix-Protokolls @joerglohrer:rpi-virtuell.de, und Publikationsmöglichkeiten über das offene ActivityPub Protokoll, das beispielsweise auch in WordPress integriert ist. Durch diese Technologien kann ich meine Netzwerke pflegen und erweitern, während ich gleichzeitig offen für neue Perspektiven und Möglichkeiten bleibe.\n\u0026ldquo;Lassen Sie uns im Fediversum bloggen und podcasten und schreiben und filmen, als ob unser Leben davon abhinge. Denn unser demokratisches Leben hängt davon ab! (Michael Blume - Nur noch das Fediversum kann uns retten)\nEin weiterer Bereich, in dem ich Technologie als Ermöglicher von Offenheit sehe, ist die persönliche Organisation und Produktivität. Die Nutzung digitaler Tools wie Kalender-Apps, Aufgabenmanager und Cloud-Speicher in einer Open source Kollaborationslösung wie der Nextcloud erleichtert es mir, organisiert zu bleiben und meinen Alltag effizient zu gestalten. Offenere Hardwarelösungen, die sich daran anbinden lassen mit z.B. einem FairPhone für die mobile Arbeit soll mir ermöglichen offener und flexibler zu sein, indem sie mir erlauben, meine Zeit und Ressourcen besser zu verwalten und unabhängiger von lizenzierten und geschlossenen Systemen zu werden.\nSchließlich sehe ich in den noch kommenden technischen Entwicklungen ebenfalls großes Potenzial, Offenheit in noch nie dagewesener Weise zu fördern. Ich bin gespannt darauf, wie neue Technologien wie Künstliche Intelligenz, erweiterte Realität und Big Data genutzt werden können, um Bildung, Arbeit und persönliche Entwicklung zu revolutionieren. Ich plane, nicht nur offen für das Erlernen und die Anwendung dieser Technologien zu sein, sondern in offenen Lernszenarien auch an der gemeinschaftlichen Entwicklung zu partizipieren, beispielsweise im Forum Offene KI in der Bildung der Wikimedia.\n6. Ausblick: Aufbau einer Community of Trust durch Offenheit Während ich also einen Ausblick auf das Jahr 2024 wage, sehe ich den Aufbau und die Pflege einer „Community of Trust“ – einer Gemeinschaft, die auf Vertrauen basiert – als zentrales Ziel meiner Bemühungen um Offenheit an. Eine solche Gemeinschaft zeichnet sich durch gegenseitigen Respekt, Transparenz und Unterstützung aus und bildet die Grundlage für nachhaltige und bedeutungsvolle Beziehungen sowohl im beruflichen als auch im privaten Bereich.\nKontakte und Vernetzung: Aktives Networking: Ich plane, mein Netzwerk aktiv zu erweitern, indem ich mich an Gemeinschaften und Gruppen beteilige, die ähnliche Werte teilen. Dies kann durch Teilnahme an Konferenzen, Workshops und Online-Foren geschehen, wo ich Gleichgesinnte treffen und mich mit ihnen austauschen kann.\nKultur der Digitalität: Ich beabsichtige, digitale Technologien und soziale Medien zu nutzen, um mein Netzwerk zu erweitern und zu pflegen. Dies ermöglicht es mir, mit Menschen aus verschiedenen Teilen der Welt in Kontakt zu treten und Ideen und Erfahrungen auszutauschen.\nKollaborative Projekte: Durch die Arbeit an gemeinsamen Projekten, die Offenheit und Kreativität fördern, kann ich enge Beziehungen zu anderen aufbauen und gleichzeitig zur Gemeinschaft beitragen.\nCommunity of Trust: Vertrauensfördernde Maßnahmen: Um eine Atmosphäre des Vertrauens zu schaffen, möchte ich offene Kommunikation und transparente Praktiken in allen meinen Interaktionen anwenden. Dies beinhaltet das Teilen von Wissen und Erfahrungen sowie das Zulassen von Verletzlichkeit und Echtheit in meinen Beziehungen.\nGegenseitige Unterstützung: Eine Community of Trust basiert auf gegenseitiger Unterstützung und Ermutigung. Ich plane, anderen aktiv zu helfen und Unterstützung anzubieten, wo immer es möglich ist, und hoffe, dass dies zu einer Kultur der Zusammenarbeit und des Teilens beiträgt.\nLangfristige Beziehungen: Mein Ziel ist es, langfristige Beziehungen aufzubauen, die auf gemeinsamen Werten und gegenseitigem Vertrauen basieren. Diese Beziehungen werden nicht nur mein persönliches Wachstum fördern, sondern auch dazu beitragen, eine stärkere und widerstandsfähigere Gemeinschaft zu schaffen.\nAbschließend ist mein Ausblick für das Jahr 2024 und darüber hinaus, eine Community of Trust zu kultivieren, die sich durch gegenseitigen Respekt und eine gemeinsame Vision für Offenheit auszeichnet. Ich glaube, dass durch die Entwicklung einer solchen Gemeinschaft nicht nur persönliche und berufliche Beziehungen gestärkt werden, sondern auch ein Umfeld entsteht, in dem Innovation und Kreativität gedeihen können. Der Schlüssel dazu liegt in der aktiven Pflege von Beziehungen, dem Engagement für transparente Kommunikation und der Bereitschaft, sich auf andere einzulassen und von ihnen zu lernen.\nDies ist ein Beitrag zu Teil 1 \u0026ldquo;Mein (schulisches) Motto für 2024\u0026rdquo; der EduBlogparade\nBeitragsbild Public Domain CC0 Midjourney Prompt: \u0026ldquo;A Community of Trust based on Openness, silhouettes of people of all genders and ages that merge into each other and overlap, watercolors \u0026ndash;v 6.0 \u0026ndash;seed 1235164279\u0026rdquo;\nAustausch und Diskussion zu diesem Beitrag offen und dezentral hier auf Mastodon im Fediverse geschlossen und plattformgebunden hier auf bluesky hier in Threads hier in Linkedin ","permalink":"http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/","summary":"\u003ch1 id=\"offenheit---das-wesentliche\"\u003eOffenheit - das Wesentliche\u003c/h1\u003e\n\u003ch3 id=\"1-einleitung-persönliche-reflexion-über-offenheit\"\u003e1. Einleitung: Persönliche Reflexion über Offenheit\u003c/h3\u003e\n\u003cp\u003eWenn ich auf das Jahr 2023 zurückblicke, gewinne ich den Eindruck, dass das Wesentliche in meinem Berufs- und Privatleben in den Verbindungen mit anderen Menschen liegt.\nDashalb ist die Offenheit für Andere, mit und an denen ich lerne nicht nur ein abstraktes Ideal oder eine berufliche Anforderung, sondern ein wesentlicher Bestandteil meiner täglichen Existenz. Dieses Bewusstsein hat mich dazu inspiriert, meine Neujahrsvorsätze für 2024 um das Thema Offenheit herum zu gestalten.\u003c/p\u003e","title":"Offenheit - das Wesentliche"},{"content":"Eine Sammlung von Liedern für den Religionsunterricht ist auf Instagram in Zusammenarbeit von @relimomente @ezpz.lemon.sqz und @colibri260 entstanden und wurde zunächst hier auf TaskCards veröffentlicht.\nWeil TaskCards weder exportiert noch importiert werden können, es nur 2 kostenfreie gibt und somit kein #OER damit erstellt werden kann, haben wir uns Gedanken gemacht, wie man das Ganze in Wordpress umsetzen kann:\nhttps://blogs.rpi-virtuell.de/rulieder Als Bonus sind\neinzelnen Spalten jetzt auch in jeweiligen Kategorienseiten aufrufbar : Mensch sein, Lebensweg, Liebe / Beziehung, Gemeinschaft, Belastungen, Hoffnung / Gerechtigkeit / Frieden, Wunder, Schöpfung, Die Frage nach Gott, Tod / Jenseitsvorstellungen, Biblische Geschichten, Songs zum Kirchenjahr Es gibt eine Übersicht zu allen Lieder mit Unterrichtsimpuls von @45minuten. Und man kann weitere Lieder einreichen Alles was es dazu braucht ist: 1. \u0026ldquo;horizontales Scrollen\u0026rdquo; einfach umsetzbar mit verschiedenen WordPress-Plugins. Hier wurde der \u0026ldquo;horizontal Scroller\u0026rdquo; von Stackable benutzt.\n2. Spalten als \u0026ldquo;posts block\u0026rdquo; Es gibt wieder eine Vielzahl von WordPress-Blöcken, die Beiträge (posts) nach Kategorien sortiert in Spalten anzeigbar machen. Hier wurde \u0026ldquo;posts block\u0026rdquo; wiederum von Stackable benutzt. Sortieren der Beiträge in den Spalten Um die Beiträge nicht nach Erstellungsdatum sondern individuell in ihren Kategorien zu sortieren gibt es das Plugin \u0026ldquo;Intuitive Custom Post Order\u0026rdquo;, dass dies per Drag\u0026amp;Drop ermöglicht. blogs.rpi-virtuell.de Die Blogs von rpi-virtuell haben alle hier beschriebenen Plugins schon vorinstalliert und müssen nur noch aktiviert werden. Somit steht deinen eigenen WordPress-TaskCards-Padlet-Sammlungen nichts mehr im Wege und du kannst sie kostenfrei und als offene Bildungsmaterialien anderen zugänglich machen.\n","permalink":"http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/","summary":"\u003cp\u003eEine \u003cstrong\u003eSammlung von Liedern für den Religionsunterricht\u003c/strong\u003e ist auf Instagram in Zusammenarbeit von \u003ca href=\"https://www.instagram.com/relimomente/\"\u003e@relimomente\u003c/a\u003e \u003ca href=\"https://www.instagram.com/ezpz.lemon.sqz\"\u003e@ezpz.lemon.sqz\u003c/a\u003e und \u003ca href=\"https://www.instagram.com/colibri260\"\u003e@colibri260\u003c/a\u003e entstanden und wurde zunächst \u003cstrong\u003e\u003ca href=\"https://www.taskcards.de/#/board/16af7347-ec26-468e-a093-34549dd2dae3/view\"\u003ehier auf TaskCards\u003c/a\u003e\u003c/strong\u003e veröffentlicht.\u003c/p\u003e\n\u003cp\u003eWeil TaskCards \u003ca href=\"https://twitter.com/TaskCards_/status/1678706884323205122\"\u003eweder exportiert noch importiert\u003c/a\u003e werden können, es nur 2 kostenfreie gibt und somit kein \u003ca href=\"https://open-educational-resources.de/5rs-auf-deutsch/\"\u003e#OER\u003c/a\u003e damit erstellt werden kann, haben wir uns Gedanken gemacht, wie man \u003cstrong\u003e\u003ca href=\"https://blogs.rpi-virtuell.de/rulieder\"\u003edas Ganze in Wordpress\u003c/a\u003e\u003c/strong\u003e umsetzen kann:\u003c/p\u003e\n\u003ch2 id=\"httpsblogsrpi-virtuellderuliederhttpsblogsrpi-virtuellderulieder\"\u003e\u003ca href=\"https://blogs.rpi-virtuell.de/rulieder\"\u003ehttps://blogs.rpi-virtuell.de/rulieder\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAls Bonus sind\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eeinzelnen Spalten jetzt auch in jeweiligen Kategorienseiten aufrufbar :\n\u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/mensch-sein/\"\u003eMensch sein\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/lebensweg/\"\u003eLebensweg\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/liebe-beziehung/\"\u003eLiebe / Beziehung\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/gemeinschaft/\"\u003eGemeinschaft\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/belastungen/\"\u003eBelastungen\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/hoffnung-gerechtigkeit-frieden/\"\u003eHoffnung / Gerechtigkeit / Frieden\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/wunder/\"\u003eWunder\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/schoepfung/\"\u003eSchöpfung\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/die-frage-nach-gott/\"\u003eDie Frage nach Gott\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/tod-jenseits/\"\u003eTod / Jenseitsvorstellungen\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/biblische-geschichten/\"\u003eBiblische Geschichten\u003c/a\u003e, \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/category/songs-zum-kirchenjahr/\"\u003eSongs zum Kirchenjahr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEs gibt eine \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/tag/45minuten/\"\u003eÜbersicht zu allen Lieder mit Unterrichtsimpuls von @45minuten\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUnd man kann \u003ca href=\"https://blogs.rpi-virtuell.de/rulieder/beitrag-einreichen/\"\u003eweitere Lieder einreichen\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"alles-was-es-dazu-braucht-ist\"\u003eAlles was es dazu braucht ist:\u003c/h2\u003e\n\u003ch3 id=\"1-horizontales-scrollen\"\u003e1. \u0026ldquo;horizontales Scrollen\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"wordpress-horizontales-scrollen.gif\" alt=\"\" /\u003e\n\neinfach umsetzbar mit verschiedenen WordPress-Plugins.\nHier wurde der \u0026ldquo;\u003ca href=\"https://docs.wpstackable.com/article/502-how-to-use-the-horizontal-scroller\"\u003ehorizontal Scroller\u003c/a\u003e\u0026rdquo; von Stackable benutzt.\u003c/p\u003e","title":"WordPress statt Padlet oder TaskCards"},{"content":"Dampfnudeln \u0026amp; Minihefezopf Zutaten 400 ml Milch 120g Zucker 1 Pkg Hefe (42g) 3 Eier (ca 150g Vollei) 1000g Mehl (300g Weizen Type 405 \u0026amp; 700g Dinkel Type 630) 10 g Salz 120 g Butter Rezept Milch, Zucker, Hefe handwarm mischen Eier dazu und in der Knetmaschine 5 Minuten lang das Mehl unterkneten Salz dazu und die in Streifen geschnittene Butter weitere 10 Minuten verkneten Mindestens 30 Minuten gehen lassen Dampfnudeln 6 x 135g Stücke vom Teig abstechen, rundschleifen und auf gelochtes Dampfgarblech aufsetzen: weitere 30 Minuten gehen lassen dann bei 100°Celsius für 30 Minuten dampfgaren fertig mit Vanillesoße servieren Hefezopf Die restlichen ca 900-1000g Teig in 3 gleiche Teile abwiegen und zu einem Zopf flechten Mit Küchenhandtuch abgedeckt mindestens 30 Minuten gehen lassen Mit Ei abstreichen und im auf 220° vorgeheizten Backofen direkt bei einschießen auf 180° reduzieren Nach 10 Minuten Back-Temperatur auf 160° reduzieren Entweder backen bis 93° Kerntemperatur erreicht ist oder nach ca weiteren 30 Minuten ","permalink":"http://localhost:1313/2023/04/07/dampfnudeln.html/","summary":"\u003ch1 id=\"dampfnudeln--minihefezopf\"\u003eDampfnudeln \u0026amp; Minihefezopf\u003c/h1\u003e\n\u003ch2 id=\"zutaten\"\u003eZutaten\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e400 ml Milch\u003c/li\u003e\n\u003cli\u003e120g Zucker\u003c/li\u003e\n\u003cli\u003e1 Pkg Hefe (42g)\u003c/li\u003e\n\u003cli\u003e3 Eier (ca 150g Vollei)\u003c/li\u003e\n\u003cli\u003e1000g Mehl (300g Weizen Type 405 \u0026amp; 700g Dinkel Type 630)\u003c/li\u003e\n\u003cli\u003e10 g Salz\u003c/li\u003e\n\u003cli\u003e120 g Butter\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"rezept\"\u003eRezept\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMilch, Zucker, Hefe handwarm mischen\u003c/li\u003e\n\u003cli\u003eEier dazu und in der Knetmaschine 5 Minuten lang das Mehl unterkneten\u003c/li\u003e\n\u003cli\u003eSalz dazu und die in Streifen geschnittene Butter weitere 10 Minuten verkneten\u003c/li\u003e\n\u003cli\u003eMindestens 30 Minuten gehen lassen\n\u003cimg loading=\"lazy\" src=\"Hefeteig.jpg\" alt=\"\" /\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dampfnudeln\"\u003eDampfnudeln\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e6 x 135g Stücke vom Teig abstechen, rundschleifen und auf gelochtes Dampfgarblech aufsetzen:\n\u003cimg loading=\"lazy\" src=\"Dampfnudeln-auf-Lochblech.jpg\" alt=\"\" /\u003e\n\u003c/li\u003e\n\u003cli\u003eweitere 30 Minuten gehen lassen\u003c/li\u003e\n\u003cli\u003edann bei 100°Celsius für 30 Minuten dampfgaren\u003c/li\u003e\n\u003cli\u003efertig\n\u003cimg loading=\"lazy\" src=\"Dampfnudeln-im-Dampfgarer.jpg\" alt=\"\" /\u003e\n\u003c/li\u003e\n\u003cli\u003emit Vanillesoße servieren \u003cimg loading=\"lazy\" src=\"Dampfnudel-mit-Vanillesosse.jpg\" alt=\"\" /\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"hefezopf\"\u003eHefezopf\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDie restlichen ca 900-1000g Teig in 3 gleiche Teile abwiegen und zu einem Zopf flechten\u003c/li\u003e\n\u003cli\u003eMit Küchenhandtuch abgedeckt mindestens 30 Minuten gehen lassen\u003c/li\u003e\n\u003cli\u003eMit Ei abstreichen und im auf 220° vorgeheizten Backofen direkt bei einschießen auf 180° reduzieren\u003c/li\u003e\n\u003cli\u003eNach 10 Minuten Back-Temperatur auf 160° reduzieren\u003c/li\u003e\n\u003cli\u003eEntweder backen bis 93° Kerntemperatur erreicht ist oder nach ca weiteren 30 Minuten\n\u003cimg loading=\"lazy\" src=\"Hefezopf.jpg\" alt=\"\" /\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Hefefreuden - Dampfnudeln \u0026 Minihefezopf"},{"content":"Das Gleichnis vom Sämann erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle\nBild 1: \u0026ldquo;Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung\u0026rdquo; alternativ: Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren.\nBild 2: \u0026ldquo;Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen\u0026rdquo; alternativ Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen.\nBild 3: \u0026ldquo;Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens\u0026rdquo; Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden.\nBild 4: \u0026ldquo;Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde\u0026rdquo; Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben.\nBild 5: \u0026ldquo;Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor\u0026rdquo; Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat.\nAnleitung / Erstellung - The Making of 1. Geschichte erstellen mit ChatGPT-4 Screenshot ![](screen-chatgpt-saemann.png =x600)\nVolltext Beschreibe mir die Geschichte vom Sämann aus der Bibel für einen 8-jähringen in 5 Bildern Bild 1: Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren.\nBild 2: Einige Samen fallen auf den felsigen Boden, wo sie wenig Erde haben. Die Samen keimen schnell, aber sie haben nicht genug Erde, um tief zu wurzeln. Das Bild zeigt kleine, schwache Pflanzen, die im felsigen Boden zu wachsen beginnen.\nBild 3: Andere Samen fallen auf den dornigen Boden, wo sie von Dornen und Unkraut umgeben sind. Die Pflanzen beginnen zu wachsen, aber sie werden von den Dornen erstickt, die sie umgeben. Das Bild zeigt, wie die Dornen die jungen Pflanzen umklammern und sie daran hindern, groß und stark zu werden.\nBild 4: Wieder andere Samen fallen auf den von Vögeln umgebenen Boden, wo sie sofort von hungrigen Vögeln gefressen werden. Das Bild zeigt fröhliche Vögel, die sich an den Samen erfreuen, bevor sie überhaupt eine Chance zum Wachsen haben.\nBild 5: Schließlich fallen einige Samen auf den fruchtbaren Boden, wo sie tief wurzeln und wachsen können. Das Bild zeigt große, gesunde Pflanzen, die in der Sonne gedeihen und reiche Früchte tragen. Der Bauer steht stolz neben der reichen Ernte und lächelt, da er weiß, dass er gut gesät hat.\nGib mir noch schöne anrührende Überschriften zu den Bildern Bild 1: \u0026ldquo;Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung\u0026rdquo; Bild 2: \u0026ldquo;Der felsige Boden: Die kleinen Pflanzen kämpfen mutig gegen die widrigen Bedingungen\u0026rdquo; Bild 3: \u0026ldquo;Der dornige Boden: Junge Pflänzchen suchen ihren Weg durch die Hindernisse des Lebens\u0026rdquo; Bild 4: \u0026ldquo;Der von Vögeln umgebene Boden: Eine unerwartete Mahlzeit für unsere gefiederten Freunde\u0026rdquo; Bild 5: \u0026ldquo;Der fruchtbare Boden: Die Kraft der Liebe und Fürsorge bringt eine reiche Ernte hervor\u0026rdquo;\n2. Illustration durch Übersetzung der Bildbeschreibungen mit Deepl und damit Prompterstellung für midjourney Ergänzung der automatischen Übersetzung für den Prompt jeweils durch Illustration by Eric Carlefür den Stil, --q 2 für die höchste Qualitätsstufe und --v 5für Midjourney Version 5\nPrompt 1 A friendly farmer stands in an open field, a handful of seeds in his hand. He scatters the seeds far and wide to sow a harvest. Behind him you can see four different soils: one rocky, one thorny, one surrounded by birds and one fertile. Illustration by Eric Carle --q 2 --v 5\nPrompt 2 Some seeds fall on the rocky ground, where they have little soil. The seeds germinate quickly, but they do not have enough soil to root deeply. The picture shows small, weak plants starting to grow in the rocky soil. Illustration by Eric Carle --q 2 --v 5\nPrompt 3 Other seeds fall on the thorny ground, where they are surrounded by thorns and weeds. The plants begin to grow, but they are choked by the thorns that surround them. The picture shows how the thorns clasp the young plants and prevent them from growing tall and strong. Illustration by Eric Carle --q 2 --v 5\nPrompt 4 other seeds fall on the ground surrounded by birds, where they are immediately eaten by hungry birds. The picture shows happy birds enjoying the seeds before they even have a chance to grow. Illustration by Eric Carle --q 2 --v 5\nPrompt 5 Finally, some seeds fall on the fertile soil, where they can root deeply and grow. The picture shows large, healthy plants thriving in the sun and bearing abundant fruit. The farmer stands proudly next to the rich harvest and smiles, knowing that he has sown well. Illustration by Eric Carle --q 2 --v 5\nAlles von Gott erdacht, in der Bibel niedergeschrieben und mit künstlicher Intelligenz in Text und Bilder verwandelt unter der Lizenz CC-BY-SA Das heißt, ihr dürft alles Weiterverwenden, Verändern, Anpassen oder sogar verkaufen. Eine Namensnennung von Jörg Lohrer wäre nett.\n","permalink":"http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/","summary":"\u003ch1 id=\"das-gleichnis-vom-sämann\"\u003eDas Gleichnis vom Sämann\u003c/h1\u003e\n\u003cp\u003eerstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle\u003c/p\u003e\n\u003ch3 id=\"bild-1-der-liebevolle-sämann-und-die-vier-böden-eine-ernte-voller-hoffnung\"\u003eBild 1: \u0026ldquo;Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"bild1-saemann.jpeg\" alt=\"\" /\u003e\n\nalternativ:\n\u003cimg loading=\"lazy\" src=\"bild1-alternativ-saemann.jpeg\" alt=\"\" /\u003e\n\nEin freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren.\u003c/p\u003e","title":"Das Gleichnis vom Sämann"},{"content":"Schoko-Schnecken Hefeteig 200g Milch handwarm ½ Pk Vanillezucker 60g Zucker 22g Hefe verrühren 1 Ei Größe L dazu in der Teigknetmaschine 120g Weizenmehl 405 380g Dinkelmehl 630 dazu und wenn es ein fester Teig ist 5g Salz zugeben und 60g Butter kalt in Streifen schneiden und 5-10 Minuten einketen (-\u0026gt; Fenstertest) danach Teig 30-60 Minuten ruhen/gehen lassen\nFüllung in der Zwischenzeit 10g brauner Zucker 30g Rohrohrzucker 50g weißer Zucker 100g Butter ½ Pk Vanillezucker 2 Teelöffel Zimt 5 Teelöffel Kaba verkneten zu einer cremigen Masse\nHefeteig ausrollen und mit der Füllung bestreichen Nach Belieben noch Raspel Schokolade darauf verteilen einrollen, in 16 Stücke schneiden und in Kuchenform setzen: Mit Frischhaltefolie abdecken und weitere ca. 30 Minuten gehen lassen, dann mit Eimilch abstreichen: Backofen auf 220°Celsius Ober-/Unterhitze vorheizen. In den Ofen und dabei auf 180° reduzieren. Nach 10 Minuten auf 160° reduzien: weitere 25 Minuten backen oder bis eine Kerntemperatur von 92° erreicht ist. Fertig: ","permalink":"http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/","summary":"\u003ch1 id=\"schoko-schnecken\"\u003eSchoko-Schnecken\u003c/h1\u003e\n\u003ch2 id=\"hefeteig\"\u003eHefeteig\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e200g Milch\u003c/strong\u003e handwarm\n\u003cstrong\u003e½ Pk Vanillezucker\n60g Zucker\n22g Hefe\u003c/strong\u003e\nverrühren\n\u003cstrong\u003e1 Ei Größe L\u003c/strong\u003e dazu\nin der Teigknetmaschine\n\u003cstrong\u003e120g Weizenmehl 405\n380g Dinkelmehl 630\u003c/strong\u003e\ndazu und wenn es ein fester Teig ist\n\u003cstrong\u003e5g Salz\u003c/strong\u003e zugeben\nund\n\u003cstrong\u003e60g Butter\u003c/strong\u003e kalt in Streifen schneiden und\n5-10 Minuten einketen (-\u0026gt; Fenstertest)\ndanach Teig 30-60 Minuten ruhen/gehen lassen\u003c/p\u003e\n\u003ch2 id=\"füllung\"\u003eFüllung\u003c/h2\u003e\n\u003cp\u003ein der Zwischenzeit\n\u003cstrong\u003e10g brauner Zucker\n30g Rohrohrzucker\n50g weißer Zucker\n100g Butter\n½ Pk Vanillezucker\n2 Teelöffel Zimt\n5 Teelöffel Kaba\u003c/strong\u003e\nverkneten zu einer cremigen Masse\u003c/p\u003e","title":"Jojos Schoko-Zimt-Schnecken"},{"content":"Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern Instanz erstellen auf https://console.cloud.google.com/ Name, Region und Zone auswählen E2 4 vCPU, 16GB Arbeitsspeicher - 0,17$ pro Stunde Betriebssystem Ubuntu 20.04 LTS Ubuntu Desktop auf Google Cloud Plattform installieren https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome https://bytexd.com/install-chrome-remote-desktop-headless/ https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process\nVia SSH/Terminal Update, Tasksel und Google Remote Desktop installieren: sudo apt update sudo apt install --assume-yes wget tasksel wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb sudo apt-get install --assume-yes ./chrome-remote-desktop_current_amd64.deb Cinnamon Desktop installieren sudo DEBIAN_FRONTEND=noninteractive \\ apt install --assume-yes cinnamon-core desktop-base dbus-x11 sudo bash -c 'echo \u0026quot;exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d\u0026quot; \u0026gt; /etc/chrome-remote-desktop-session'\nZusätzliche Einstellungen: sudo systemctl disable lightdm.service Deutsche Tastatur in der Ubuntu-Konsole festlegen: sudo dpkg-reconfigure keyboard-configuration Optional: Google Chrome Browser installieren wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install --assume-yes ./google-chrome-stable_current_amd64.deb Chrome Remote Desktop konfiguieren und starten https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#configuring_and_starting_the_chrome_remote_desktop_service) Mit Google-Konto, das zur Remote-Stuerung benutzt werden soll, https://remotedesktop.google.com/headless aufrufen und den SSH-Befehl in der Konsole ausführen. 6-Stellige PIN festlegen. Prüfen ob der Dienst ausgeführt wird:\nsudo systemctl status chrome-remote-desktop@$USER Instanzzeitplan festlegen https://rominirani.com/hands-on-guide-to-scheduling-vm-instances-to-start-and-stop-a079a50e16c6\nOBS Installation https://obsproject.com/wiki/install-instructions#ubuntumint-installation\nsudo apt install ffmpeg sudo apt install v4l2loopback-dkms sudo add-apt-repository ppa:obsproject/obs-studio sudo apt update sudo apt install obs-studio Problem: Test mit v4l2-ctl --list-devices bringt Fehlermeldung:\nCannot open device /dev/video0, exiting. Lösung für virtuelle Kamera auf virtueller Maschine: sudo apt -y install v4l2loopback-dkms v4l2loopback-utils linux-modules-extra-$(uname -r) sudo modprobe v4l2loopback Jetzt: Problem: Trotzdem nach jedem Reboot wird die virtuelle Kamera nicht geladen: Lösung v4l2loopback bei Start laden: https://askubuntu.com/questions/1245212/how-do-i-automatically-run-modprobe-v4l2loopback-on-boot\nsudo nano /etc/modules hinzufügen: v4l2loopback\nZoom Installation https://support.zoom.us/hc/de/articles/204206269-IZoom-unter-Linux-installieren-oder-aktualisieren\nsudo apt install gdebi sudo apt update sudo apt upgrade sudo snap install zoom-client Inbetriebnahme des Remote Desktop Verbindung zur VM-Instanz herstellen Via https://remotedesktop.google.com/access auf das Remote Gerät zugreifen.: Sechsstelligen PIN eingeben: Keyboard / Tastatur auf deutsch umstellen: Apps auf dem Desktop verknüpfen: OBS einrichten OBS mit virtueller Kamera automatisch starten: Rechtsklick auf die Verknüpfung und dann beim Startbefehl --startvirtualcam ergänzen. Beim Systemstart mit virtueller Kamera starten: startup Applications wählen ebenfalls --startvirtualcam ergänzen Beim ersten Start von OBS \u0026ldquo;I will only be using the virtual camera\u0026rdquo; wählen: In den Einstellungen die Sprache auf Deutsch umstellen: Videoauflösung auf 1920x1080 umstellen: Szenensammlung importieren (Vorkonfigurierte Szenen für das relilab-Café immer aktuell auf Github) - relilab-cafe-obs-json.json\nGoogle Chrome einrichten Beim ersten Systemstart Password for new Keyring erstellen: Chrome zum Standardbrowser machen Google Chrome anmelden und Sync inkl. Lesezeichen aktivieren Zoom einrichten Zoom-Account anmelden Sprache ändern in Zoom Zoom starten und dann das Zoom-Symbol rechts in der unteren Leiste mit Rechtsklick der Maus das Menü zur Sprachänderung aufrufen: Problemlösungen Problem - keine Emojis in den Slides Lösung: https://medium.com/@harshmaur/emojis-missing-from-chrome-in-ubuntu-9c25fe10867c sudo apt-get remove fonts-noto-color-emoji sudo apt-get install fonts-noto-color-emoji Problem - kein Font Yanone Kaffeesatz in den Slides Lösung: https://zoomadmin.com/HowToInstall/UbuntuPackage/fonts-yanone-kaffeesatz sudo apt-get update -y sudo apt-get install -y fonts-yanone-kaffeesatz Mögliches Problem GUI (Ubuntu Desktop) has its own security layer which blocks the root account from login. So, even we have a properly enabled root account with password, it does not work in GUI interface. https://askubuntu.com/questions/1192471/login-as-root-on-ubuntu-desktop\nhttps://www.computernetworkingnotes.com/linux-tutorials/how-to-enable-and-disable-root-login-in-ubuntu.html\nAnstatt auf Cloud-Plattform mit Linux auf lokalem Windows-PC Autostart OBS inkl virtueller Kamera \u0026amp; Zoom Vorbereiten OBS inkl Virtueller Kamera Hinzufügen von --startvirtualcam zur OBS-Verknüpfung: open the start menu/tile thing and type in: Run and hit enter. Then type in shell:startup Dann die Verknüpfungen in den Autostartordner kopieren: Weitere Schritte wie oben\n","permalink":"http://localhost:1313/2022/03/19/ob-virtualcam.html/","summary":"\u003ch1 id=\"auf-google-cloud-platform-mit-ubuntu-desktop-via-chrome-remote-desktop-obs-und-zoom-fernsteuern\"\u003eAuf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern\u003c/h1\u003e\n\u003ch2 id=\"instanz-erstellen-auf-httpsconsolecloudgooglecomhttpsconsolecloudgooglecom\"\u003eInstanz erstellen auf \u003ca href=\"https://console.cloud.google.com/\"\u003ehttps://console.cloud.google.com/\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eName, Region und Zone auswählen\u003c/li\u003e\n\u003cli\u003eE2 4 vCPU, 16GB Arbeitsspeicher - 0,17$ pro Stunde\u003c/li\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003eBetriebssystem Ubuntu 20.04 LTS\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ubuntu-desktop-auf-google-cloud-plattform-installieren\"\u003eUbuntu Desktop auf Google Cloud Plattform installieren\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud\"\u003ehttps://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud\u003c/a\u003e\n\u003ca href=\"https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome\"\u003ehttps://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome\u003c/a\u003e\n\u003ca href=\"https://bytexd.com/install-chrome-remote-desktop-headless/\"\u003ehttps://bytexd.com/install-chrome-remote-desktop-headless/\u003c/a\u003e\n\u003ca href=\"https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process\"\u003ehttps://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"via-sshterminal-update-tasksel-und-google-remote-desktop-installieren\"\u003eVia SSH/Terminal Update, Tasksel und Google Remote Desktop installieren:\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shell=\" data-lang=\"shell=\"\u003esudo apt update\nsudo apt install --assume-yes wget tasksel\nwget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb\nsudo apt-get install --assume-yes ./chrome-remote-desktop_current_amd64.deb\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cinnamon-desktop-installieren\"\u003eCinnamon Desktop installieren\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shell=\" data-lang=\"shell=\"\u003esudo DEBIAN_FRONTEND=noninteractive \\\n apt install --assume-yes cinnamon-core desktop-base dbus-x11\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003esudo bash -c 'echo \u0026quot;exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d\u0026quot; \u0026gt; /etc/chrome-remote-desktop-session'\u003c/code\u003e\u003c/p\u003e","title":"Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern"},{"content":"Moodle Server mit Ubuntu 20 LTS und Iomad Ubuntu Server-Image herunterladen https://releases.ubuntu.com/20.04/\nVirtualbox mit dem Ubuntu Image einrichten Netzwerkbrücke aktivieren IP-Adresse ermitteln ifconfig -\u0026gt; 192.168.178.132\nAuf dem Mac (oder PC) die Auflösung des Hosts verknüpfen auf dem Mac sudo nano /etc/hosts die IP eintragen und moodle.local zuweisen: Moodle Server auf Virtualbox vorbereiten sudo -iwechselt auf root\nSSH Zugriff ermöglichen Allow SSH root login on Ubuntu 20.04 Focal Fossa Linux\nShellbefehle zur Installation: sudo apt update \u0026amp;\u0026amp; apt upgrade -y apt install mariadb-server sudo apt install apache2 libapache2-mod-fcgid sudo apt install php php-cli php-fpm php-json php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-intl php-xmlrpc php-soap a2enconf php7.4-fpm sudo a2enmod actions fcgid alias proxy_fcgi setenvif a2dismod php7.4 a2dismod mpm_prefork a2dismod mpm_worker a2enmod mpm_event systemctl restart php7.4-fpm apache2 anlegen: /etc/apache2/sites-available/moodle.conf ############################ \u0026lt;VirtualHost *:80\u0026gt; ServerName moodle.local ServerAdmin webmaster@localhost DocumentRoot /var/www/moodle \u0026lt;FilesMatch \\.php$\u0026gt; SetHandler \u0026#34;proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/\u0026#34; \u0026lt;/FilesMatch\u0026gt; ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined \u0026lt;/VirtualHost\u0026gt; #################################################################### Weitere Shellbefehle zur Installation: a2ensite moodle.conf systemctl reload apache2 mkdir /var/www/moodle echo \u0026#39;\u0026lt;?php phpinfo(); ?\u0026gt;\u0026#39; \u0026gt; /var/www/moodle/info.php host eintrag hinzufügen: \u0026ldquo;192.168.178.xxx moodle.local\u0026rdquo; 192.168.178.xxx moodle.local 192.168.178.xxx www.moodle.local\nim Browser öffnen: http://moodle.local/info.php maschine speichern und klonen Anschließend IOMAD moodle installieren: https://www.iomad.org/wp-content/uploads/2021/03/Iomad-Installation-Guide.pdf\nDatenbank für moodle erzeugen via SSH: mysql CREATE DATABASE moodledb; CREATE USER \u0026#39;moodleowner\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;$mdb2passwd\u0026#39;; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON moodledb.* TO \u0026#39;moodleowner\u0026#39;@\u0026#39;localhost\u0026#39;; GRANT FILE ON *.* TO \u0026#39;moodleowner\u0026#39;@\u0026#39;localhost\u0026#39;; quit Installation iomad cd /var/www/moodle git clone https://github.com/iomad/iomad.git cd iomad git checkout -b myiomad origin/IOMAD_310_STABLE mkdir /var/www/moodledata \u0026amp;\u0026amp; chmod 777 /var/www/moodledata ändern!!!: /etc/apache2/sites-available/moodle.conf -\u0026gt; DocumentRoot /var/www/moodle/iomad\nsystemctl restart php7.4-fpm apache2\nhttp://moodle.local aufrufen und config.php Datei mit Hilfe des Assistenten generieren lassen ![](03-config generieren.png)\nändern!!!: /moodle entfernen\nconfig.php \u0026lt;?php // Moodle configuration file unset($CFG); global $CFG; $CFG = new stdClass(); $CFG-\u0026gt;dbtype = \u0026#39;mariadb\u0026#39;; $CFG-\u0026gt;dblibrary = \u0026#39;native\u0026#39;; $CFG-\u0026gt;dbhost = \u0026#39;localhost\u0026#39;; $CFG-\u0026gt;dbname = \u0026#39;moodledb\u0026#39;; $CFG-\u0026gt;dbuser = \u0026#39;moodleowner\u0026#39;; $CFG-\u0026gt;dbpass = \u0026#39;$mdb2passwd\u0026#39;; $CFG-\u0026gt;prefix = \u0026#39;mdl_\u0026#39;; $CFG-\u0026gt;dboptions = array ( \u0026#39;dbpersist\u0026#39; =\u0026gt; 0, \u0026#39;dbport\u0026#39; =\u0026gt; \u0026#39;\u0026#39;, \u0026#39;dbsocket\u0026#39; =\u0026gt; \u0026#39;\u0026#39;, \u0026#39;dbcollation\u0026#39; =\u0026gt; \u0026#39;utf8mb4_general_ci\u0026#39;, ); $CFG-\u0026gt;wwwroot = \u0026#39;http://moodle.local\u0026#39;; $CFG-\u0026gt;dataroot = \u0026#39;/var/www/moodledata\u0026#39;; $CFG-\u0026gt;admin = \u0026#39;admin\u0026#39;; $CFG-\u0026gt;directorypermissions = 0777; require_once(__DIR__ . \u0026#39;/lib/setup.php\u0026#39;); // There is no php closing tag in this file, // it is intentional because it prevents trailing whitespace problems! ","permalink":"http://localhost:1313/2022/02/16/moodle-iomad-linux.html/","summary":"\u003ch1 id=\"moodle-server-mit-ubuntu-20-lts-und-iomad\"\u003eMoodle Server mit Ubuntu 20 LTS und Iomad\u003c/h1\u003e\n\u003ch2 id=\"ubuntu-server-image-herunterladen\"\u003eUbuntu Server-Image herunterladen\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://releases.ubuntu.com/20.04/\"\u003ehttps://releases.ubuntu.com/20.04/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"virtualbox-mit-dem-ubuntu-image-einrichten\"\u003eVirtualbox mit dem Ubuntu Image einrichten\u003c/h2\u003e\n\u003ch3 id=\"netzwerkbrücke-aktivieren\"\u003eNetzwerkbrücke aktivieren\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"01-netzwerkbruecke.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003ch3 id=\"ip-adresse-ermitteln\"\u003eIP-Adresse ermitteln\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eifconfig \u003c/code\u003e -\u0026gt; 192.168.178.132\u003c/p\u003e\n\u003ch3 id=\"auf-dem-mac-oder-pc-die-auflösung-des-hosts-verknüpfen\"\u003eAuf dem Mac (oder PC) die Auflösung des Hosts verknüpfen\u003c/h3\u003e\n\u003cp\u003eauf dem Mac \u003ccode\u003esudo nano /etc/hosts\u003c/code\u003e die IP eintragen und moodle.local zuweisen:\n\u003cimg loading=\"lazy\" src=\"02-hosts-eintragen.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003ch2 id=\"moodle-server-auf-virtualbox-vorbereiten\"\u003eMoodle Server auf Virtualbox vorbereiten\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003esudo -i\u003c/code\u003ewechselt auf root\u003c/p\u003e\n\u003ch3 id=\"ssh-zugriff-ermöglichen\"\u003eSSH Zugriff ermöglichen\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://linuxconfig.org/allow-ssh-root-login-on-ubuntu-20-04-focal-fossa-linux\"\u003eAllow SSH root login on Ubuntu 20.04 Focal Fossa Linux\u003c/a\u003e\u003c/p\u003e","title":"Moodle Server mit Ubuntu 20 LTS und Iomad"},{"content":"Bibelfußball: Nachschlage-Quiz zur Bibel Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. Das Fußballfeld mit seinen entsprechenden Linien wird dabei an die Wandtafel gezeichnet und der Ball wird durch einen Magnetknopf symbolisiert. Gepunktet wird, indem der Lehrer eine Frage stellt und eine Bibelstelle nennt, die es nachzuschlagen gilt. Wer die Stelle zuerst findet und die Antwort ruft, dessen Mannschaft darf den Ball eine Linie weiterrücken in Richtung des gegnerischen Tores. Wurde ein Tor geschossen, beginnt das Spiel von neuem an der Mittellinie. Hier umfangreiche Fragen mit Bibelstellen aus dem Alten und Neuen Testament, die einfach (bitte hier in\u0026rsquo;s Dokument hineinschreiben!) erweitert werden können:\nNeues Testament Frage Bibelstelle Lösung Ein Tier \u0026ldquo;Mt 26,74\u0026rdquo; ein Hahn An welchem Ort ist Paulus \u0026ldquo;Phil 1,13\u0026rdquo; Gefängnis Was ist wuchtig und voll Kraft \u0026ldquo;2Kor 10,10\u0026rdquo; Die Briefe Körperteile \u0026ldquo;Mk 4,23\u0026rdquo; Ohren Eine Farbe \u0026ldquo;Mt 23,27\u0026rdquo; Weiß Biblische Zahl \u0026ldquo;Mk 1,13\u0026rdquo; 40 Grundnahrungsmittel \u0026ldquo;Lk 11,3\u0026rdquo; Brot Macht man auch in der Schule \u0026ldquo;Gal 6,11\u0026rdquo; Schreiben Braucht man auf dem Bau \u0026ldquo;1 Thess 5,9\u0026rdquo; Helm Ist strafbar Hebr 10.34 Raub Eine Krankheit \u0026ldquo;Mt 8,15\u0026rdquo; Fieber Wem gehört die zerfallene Hütte \u0026ldquo;Apg 15,16\u0026rdquo; David Ein Gewürz \u0026ldquo;Offb 18,13\u0026rdquo; Zimt Wie heißt das Kind \u0026ldquo;Lk 1,31\u0026rdquo; Jesus Zwei Körperteile \u0026ldquo;Mt 5,38\u0026rdquo; \u0026ldquo;Auge , Zahn\u0026rdquo; Häufige biblische Zahl \u0026ldquo;Mt 4,2\u0026rdquo; 40 Angesehener Beruf \u0026ldquo;Mk 2,17\u0026rdquo; Arzt Ist unangenehm \u0026ldquo;Lk 22,24\u0026rdquo; Streit Was ist Gott \u0026ldquo;1 Kor 1,9\u0026rdquo; Treu Was soll man ablegen \u0026ldquo;Eph 4,25\u0026rdquo; Lüge Was fressen die Vögel \u0026ldquo;Mk 4,4\u0026rdquo; Körner Was ist für Gott möglich \u0026ldquo;Mt 19,26\u0026rdquo; Alles Ich kann es in der Küche finden \u0026ldquo;Lk 11,41\u0026rdquo; Schüsseln In jedem Zimmer zu finden \u0026ldquo;Joh 10,9\u0026rdquo; Tür Wie viel opfert die arme Witwe \u0026ldquo;Mk 12,42\u0026rdquo; 2 kl. Münzen Große Anzahl Soldaten \u0026ldquo;Mt 26, 53\u0026rdquo; Legionen Kleine Lebewesen \u0026ldquo;Lk 13 ,19\u0026rdquo; Vögel Brauchte jeder Ritter \u0026ldquo;Eph 6,1\u0026rdquo; Rüstung Schlechte Eigenschaft \u0026ldquo;Hebr 13,5\u0026rdquo; Habgier Sind aus Gold \u0026ldquo;Jak 2,2\u0026rdquo; Ringe Welche Farbe hat der Kranz \u0026ldquo;Offb 14,14\u0026rdquo; Gold Ein beliebtes Urlaubsland \u0026ldquo;Röm 15,24\u0026rdquo; Spanien Häufiger Beruf zur Zeit Jesu \u0026ldquo;Mt 13,48\u0026rdquo; Fischer Hohes Fest im Judentum \u0026ldquo;Joh 13,1\u0026rdquo; Paschafest \u0026ldquo;Großer, schwerer Gegenstand\u0026rdquo; \u0026ldquo;Mk 16,4\u0026rdquo; Stein Zeiteinheit \u0026ldquo;Mk 14,37\u0026rdquo; Stunde Lasst darin nicht nach \u0026ldquo;Kol 4,2\u0026rdquo; Beten Insel \u0026ldquo;Tit 1,5\u0026rdquo; Kreta Letztes Wort im Petrusbrief 1 Petr Amen Kleines Naturwunder \u0026ldquo;Offb 10,1\u0026rdquo; Regenbogen In jeder Wohnung zu finden \u0026ldquo;Lk 22,14\u0026rdquo; Tisch Transportmittel \u0026ldquo;Mk 1,20\u0026rdquo; Boot Bekommt man erst später \u0026ldquo;Apg 7,54\u0026rdquo; Zähne Was werden sie gewinnen \u0026ldquo;Lk 21,19\u0026rdquo; Das Leben Wichtiges Nahrungsmittel \u0026ldquo;Mt 5,13\u0026rdquo; Salz Gegenstand aus Holz \u0026ldquo;Mt 27,32\u0026rdquo; Kreuz Körperteil \u0026ldquo;Mt 28,9\u0026rdquo; Füße Angeborene Behinderung \u0026ldquo;Joh 9,1\u0026rdquo; Blindheit Geheimes Versteck \u0026ldquo;LK 19,46\u0026rdquo; Räuberhöhle Die Liebe tut nichts …? \u0026ldquo;Röm 13,10\u0026rdquo; Böses Bei uns als Drei Könige bekannt \u0026ldquo;Mt2,1\u0026rdquo; Sterndeuter Hilfsmittel für Kranke \u0026ldquo;MK 2,12\u0026rdquo; Tragbahre Stinkt \u0026ldquo;Lk 14,35\u0026rdquo; Misthaufen Darauf kann man schreiben \u0026ldquo;Joh 19,20\u0026rdquo; Schild Braucht man im Leben \u0026ldquo;Apg 23,11\u0026rdquo; Mut Was war in den 7 Körben? \u0026ldquo;Mk 8,8\u0026rdquo; Brot Leben am Bauernhof \u0026ldquo;Lk 15,16\u0026rdquo; Schweine Gibt’s vor den Ferien \u0026ldquo;Joh 21,24\u0026rdquo; Zeugnis \u0026ldquo;Gut, wenn man es nicht hat\u0026rdquo; \u0026ldquo;Apg 4,34\u0026rdquo; Not Zahl der Kapitel bei Mk Mk 16 Lebenswichtiges Organ \u0026ldquo;2Kor 9,7\u0026rdquo; Herz Sechste Frucht des Geistes \u0026ldquo;Gal 5,22\u0026rdquo; Güte Sehr unbeliebt bei Schülern \u0026ldquo;Lk 22,28\u0026rdquo; Prüfungen Man freut sich darüber \u0026ldquo;Phil 3,7\u0026rdquo; Gewinn Lebensfeindlicher Ort \u0026ldquo;Mk 1,3\u0026rdquo; Wüste Beruf im Freien \u0026ldquo;Joh 10,11\u0026rdquo; Hirte Was hat geholfen \u0026ldquo;Lk 17,19\u0026rdquo; Glaube Erstes Transportmittel Jesu \u0026ldquo;Joh 12,14\u0026rdquo; Esel Letztes Wort im NT Offb Allen Wie viele Verse hat Joh 6 Joh 71 Verse Wie viel lässt er zurück \u0026ldquo;Lk 15,4\u0026rdquo; 99 Man hat eine Menge davon \u0026ldquo;Joh 20,27\u0026rdquo; Finger Isst man hier normal nicht \u0026ldquo;Mt 3,4\u0026rdquo; Heuschrecken Babys brauchen eine Menge \u0026ldquo;Lk 2,12\u0026rdquo; Windeln Gehen oft sehr weit \u0026ldquo;Joh 12,20\u0026rdquo; Pilger Tier unter Naturschutz \u0026ldquo;Joh 10,12\u0026rdquo; Wolf Kann man öffnen und schließen \u0026ldquo;Lk 24,31\u0026rdquo; Augen Auch du bist es \u0026ldquo;Mt 3,16\u0026rdquo; Getauft Es war am Anfang \u0026ldquo;Joh 1,1\u0026rdquo; Das Wort Kürzestes Buch im NT \u0026ndash; Philemon Was heisst Tabita auf deutsch? \u0026ldquo;Apg 9,36\u0026rdquo; Gazelle Worin sehen wir nur rätselhafte Umrisse? \u0026ldquo;1 Kor 13,12\u0026rdquo; Spiegel Wer steht vor der Frau? \u0026ldquo;Offb 12,4\u0026rdquo; Drache Wohin will Paulus hier reisen? \u0026ldquo;Römer 15, 24\u0026rdquo; Spanien Ein Tier \u0026ldquo;1 Petr 5,8\u0026rdquo; Löwe Welche Frucht kommt hier zur Sprache? \u0026ldquo;Mk 11, 13\u0026rdquo; Feige Welcher Prophet wird hier genannt? \u0026ldquo;Mt 3, 3\u0026rdquo; Jesaja Wer hat hier Angst? \u0026ldquo;Joh 19, 8\u0026rdquo; Pilatus Wie heißt Agrippas Frau? \u0026ldquo;Apg 25,23\u0026rdquo; Berenike Von welchem scharfen Werkzeug ist hier die Rede? \u0026ldquo;Offb 14,18\u0026rdquo; Sichel Was sind Jesu Worte? \u0026ldquo;Joh 6, 63\u0026rdquo; Geist und Leben Wie nennt sich Jesus hier? \u0026ldquo;Joh 9,5\u0026rdquo; Licht (der Welt) Was gibt es zu tragen? \u0026ldquo;Gal 6,2\u0026rdquo; Lasten Wie wird Jesus verglichen \u0026ldquo;Eph 2,20\u0026rdquo; Eckstein Name einer Frau aus dem AT \u0026ldquo;Hebr 11,21\u0026rdquo; Rahab Name einer Stadt (in Syrien) \u0026ldquo;Apg 9,3\u0026rdquo; Damaskus Was kommt aus den Mäulern der Pferde? \u0026ldquo;Offb 9,17\u0026rdquo; \u0026ldquo;Feuer, Rauch, Schwefel\u0026rdquo; Wie heißt der Sohn? \u0026ldquo;Phlm 1,10\u0026rdquo; Onesimus Bauwerk \u0026ldquo;1. Petr 2, 5\u0026rdquo; (lebendiges) Haus Körperteil \u0026ldquo;1. Petr 2,22\u0026rdquo; Mund Paar aus dem AT \u0026ldquo;1. Petr. 3, 6\u0026rdquo; Sara und Abraham Was wird gejagt? \u0026ldquo;1. Petr. 3, 11\u0026rdquo; Frieden Wieviele Menschen wurden in der Arche gerettet? \u0026ldquo;1. Petr. 3,20\u0026rdquo; acht Gesucht ist ein Adjektiv (wie sollen wir sein?) \u0026ldquo;1. Petr. 4, 9\u0026rdquo; gastfreundlich Altes Testament Frage Bibelstelle Lösung zwei Musikinstrumente \u0026ldquo;Ps 98,6\u0026rdquo; Trompeten und Hörner unechtes Körperteil \u0026ldquo;Ps 120,3\u0026rdquo; falsche Zunge Was wird geöffnet \u0026ldquo;Ps 78,2\u0026rdquo; Mund Wo wachsen die Bäume? \u0026ldquo;Ps 72,16\u0026rdquo; Libanon Wie viele Männer? \u0026ldquo;Hiob 32,1\u0026rdquo; 3 Mit wieviel Jahren wurde Zidkija König? \u0026ldquo;2. Kön 24,18\u0026rdquo; 21 Kleine Vögel \u0026ldquo;Ps 147,9\u0026rdquo; junge Raben Was regnet vom Himmel? \u0026ldquo;Ps 78,27\u0026rdquo; Fleisch \u0026ldquo;was kann schwimmen, obwohl es zu schwer dafür ist?\u0026rdquo; \u0026ldquo;2 Kön 6,6\u0026rdquo; Eisen Wie viele Steine suchte sich David? \u0026ldquo;1 Sam 17,40\u0026rdquo; 5 Ein Getränk \u0026ldquo;Joel 2, 19\u0026rdquo; Most Wie lange war Jona im Fisch? \u0026ldquo;Jona 2,1\u0026rdquo; drei Tage und drei Nächte Wie heißen die drei Söhne Noachs? \u0026ldquo;Gen 6,10\u0026rdquo; \u0026ldquo;Sem, Ham, Jafet\u0026rdquo; Wo singen die drei Jungen Männer? \u0026ldquo;Dan 3,51\u0026rdquo; Ofen Wie viele Tage ruhen sie sich in Jerusalem aus? \u0026ldquo;Esra 8,32\u0026rdquo; 3 Welche Früchte sind im Kuchen? \u0026ldquo;1 Chr 12,41\u0026rdquo; Traubenkuchen Wo ist das Mehl? Wo ist das Öl? \u0026ldquo;1 Kön 17,12\u0026rdquo; \u0026ldquo;Topf, Krug\u0026rdquo; \u0026ldquo;Was wird hochgehoben, damit es nicht nass wird?\u0026rdquo; \u0026ldquo;Jes 47,2\u0026rdquo; Schleppe Was wird gesät? \u0026ldquo;Hos 8,7\u0026rdquo; Wind Was bekommt Rut? \u0026ldquo;Rut 4,13\u0026rdquo; einen Sohn Ein Tier \u0026ldquo;Hab 3, 19\u0026rdquo; Hirsch Worin wird das Kleid gewaschen? \u0026ldquo;Gen 49,11\u0026rdquo; Wein Welche Farbe hat das Gewand? \u0026ldquo;Jes 63,2\u0026rdquo; rot Was ist süßer als Wein? \u0026ldquo;Hld 1,2\u0026rdquo; Liebe Was wächst und wird immer mächtiger? \u0026ldquo;Dan 4,8\u0026rdquo; Baum Wie viele Töchter hatte Rehabeam? \u0026ldquo;2 Chr 11,21\u0026rdquo; 60 Eine Waffe \u0026ldquo;Jer 5,12\u0026rdquo; Schwert Ein Kleidungsstück \u0026ldquo;Ps 109,29\u0026rdquo; Mantel Was denkt Eli von Hanna? \u0026ldquo;1 Sam 1,13\u0026rdquo; Er hält sie für betrunken Welche Frisur hatte Paulus? \u0026ldquo;Apg 18,18\u0026rdquo; Glatze Wie viele Pferde? \u0026ldquo;Jes 36,8\u0026rdquo; 2000 Ein Tier \u0026ldquo;Dtn 9,16\u0026rdquo; Kalb Ein weibliches Tier \u0026ldquo;Spr 17,12\u0026rdquo; Bärin Welche Farbe hat der Kranz? \u0026ldquo;Offb 14,14\u0026rdquo; gold Wie schmeckt Manna? \u0026ldquo;Ex 16,31\u0026rdquo; Honigkuchen/Semmel mit Honig Wie heißt der König von Baschan? \u0026ldquo;Ps 135,11\u0026rdquo; Og Wie viele Monate lebt Elisabeth zurückgezogen? \u0026ldquo;Lk 1,24\u0026rdquo; 5 Was reißen die anderen auf? \u0026ldquo;Ps 35,21\u0026rdquo; Mund Woher kam Melatja? \u0026ldquo;Neh 3,7\u0026rdquo; Gibeon Was zieht Josua aus? \u0026ldquo;Jos 5,15\u0026rdquo; Schuhe Wie alt war Barsillai? \u0026ldquo;2 Sam 19,33\u0026rdquo; 80 Von welchem Baum bekommt David Holz? \u0026ldquo;1 Chronik 14,1\u0026rdquo; Zeder Wer sieht einen Engel? \u0026ldquo;Num 22,23\u0026rdquo; Esel Welches Problem hat Jakob hier? \u0026ldquo;Gen 32, 32\u0026rdquo; er hinkt Was wächst denn hier? \u0026ldquo;Jona 4, 6\u0026rdquo; Rizinusstrauch Wer macht hier so einen Lärm? \u0026ldquo;Am 3, 4\u0026rdquo; Löwe ","permalink":"http://localhost:1313/2021/12/03/bibelfussball.html/","summary":"\u003ch1 id=\"bibelfußball-nachschlage-quiz-zur-bibel\"\u003eBibelfußball: Nachschlage-Quiz zur Bibel\u003c/h1\u003e\n\u003cp\u003eBibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. Das Fußballfeld mit seinen entsprechenden Linien wird dabei an die Wandtafel gezeichnet und der Ball wird durch einen Magnetknopf symbolisiert. Gepunktet wird, indem der Lehrer eine Frage stellt und eine Bibelstelle nennt, die es nachzuschlagen gilt. Wer die Stelle zuerst findet und die Antwort ruft, dessen Mannschaft darf den Ball eine Linie weiterrücken in Richtung des gegnerischen Tores. Wurde ein Tor geschossen, beginnt das Spiel von neuem an der Mittellinie.\n\u003cimg loading=\"lazy\" src=\"bibelfussball1.png\" alt=\"\" /\u003e\n\u003c/p\u003e","title":"Bibelfußball - Nachschlage-Quiz zur Bibel"},{"content":"WordPress Werkstatt PHP Zunächst wird auf relilab.org das kostenfreie Plugin ACF - Advanced Custom Fields installiert und aktiviert. Dies ermöglicht weitere individuelle Beitragsfelder für die Beiträge. Nun kann manuell aktiviert oder eine Feldgruppe importiert werden - hier mittels dieser JSON-Datei, die das abkürzt: mit dem Ergebnis, dass unter allen WordPress-Beiträgen jetzt zwei Terminfelder erscheinen, die ausgefüllt werden können: Zudem gibt es neu eine Kategorie \u0026ldquo;Termine\u0026rdquo;, die aktiviert werden kann mit Unterkategorien, die später Übersichtsseiten ermöglichen: Jetzt wird das Plugin relilab-termine installiert und aktiviert Nun kann mittels Shortcode [relilab_termine] eine Terminübersicht als WordPress-Block erzeugt werden: JSON ACF-JSON-Export: [ { \u0026#34;key\u0026#34;: \u0026#34;group_6193936e4f12c\u0026#34;, \u0026#34;title\u0026#34;: \u0026#34;Termin\u0026#34;, \u0026#34;fields\u0026#34;: [ { \u0026#34;key\u0026#34;: \u0026#34;field_619393f8e62e0\u0026#34;, \u0026#34;label\u0026#34;: \u0026#34;Startet am\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;relilab_startdate\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;date_time_picker\u0026#34;, \u0026#34;instructions\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;required\u0026#34;: 0, \u0026#34;conditional_logic\u0026#34;: 0, \u0026#34;wrapper\u0026#34;: { \u0026#34;width\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;class\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;id\u0026#34;: \u0026#34;\u0026#34; }, \u0026#34;display_format\u0026#34;: \u0026#34;d.m.Y H:i\u0026#34;, \u0026#34;return_format\u0026#34;: \u0026#34;Y-m-d H:i\u0026#34;, \u0026#34;first_day\u0026#34;: 1 }, { \u0026#34;key\u0026#34;: \u0026#34;field_619394a3e62e1\u0026#34;, \u0026#34;label\u0026#34;: \u0026#34;Endet am\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;relilab_enddate\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;date_time_picker\u0026#34;, \u0026#34;instructions\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;required\u0026#34;: 0, \u0026#34;conditional_logic\u0026#34;: 0, \u0026#34;wrapper\u0026#34;: { \u0026#34;width\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;class\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;id\u0026#34;: \u0026#34;\u0026#34; }, \u0026#34;display_format\u0026#34;: \u0026#34;d.m.Y H:i\u0026#34;, \u0026#34;return_format\u0026#34;: \u0026#34;Y-m-d H:i\u0026#34;, \u0026#34;first_day\u0026#34;: 1 } ], \u0026#34;location\u0026#34;: [ [ { \u0026#34;param\u0026#34;: \u0026#34;post_type\u0026#34;, \u0026#34;operator\u0026#34;: \u0026#34;==\u0026#34;, \u0026#34;value\u0026#34;: \u0026#34;post\u0026#34; } ] ], \u0026#34;menu_order\u0026#34;: 0, \u0026#34;position\u0026#34;: \u0026#34;normal\u0026#34;, \u0026#34;style\u0026#34;: \u0026#34;default\u0026#34;, \u0026#34;label_placement\u0026#34;: \u0026#34;left\u0026#34;, \u0026#34;instruction_placement\u0026#34;: \u0026#34;label\u0026#34;, \u0026#34;hide_on_screen\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;active\u0026#34;: true, \u0026#34;description\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;show_in_rest\u0026#34;: 0, \u0026#34;acfe_display_title\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;acfe_autosync\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;acfe_form\u0026#34;: 0, \u0026#34;acfe_meta\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;acfe_note\u0026#34;: \u0026#34;\u0026#34; } ] PHP Software PHP-Storm https://www.jetbrains.com/de-de/phpstorm/\nShortcode zum Sprechen bringen https://developer.wordpress.org/reference/functions/add_shortcode/ In PhpStorm add_shortcode( string $tag, callable $callback )\nalle Termine listen, die https://www.advancedcustomfields.com/resources/orde-posts-by-custom-fields/\nPHP-Storm nutzt als External Library dann WordPress Plugin Unsere Funktion:\n/** *Plugin Name: relilab Termine */ add_shortcode(\u0026#39;termine\u0026#39;,\u0026#39;termineAusgeben\u0026#39;); function termineAusgeben( $atts ) { $posts = get_posts(array( \u0026#39;post_type\u0026#39;\t=\u0026gt; \u0026#39;post\u0026#39;, \u0026#39;posts_per_page\u0026#39;\t=\u0026gt; -1, \u0026#39;category\u0026#39; =\u0026gt; \u0026#39;termine\u0026#39;, \u0026#39;meta_key\u0026#39;\t=\u0026gt; \u0026#39;relilab_startdate\u0026#39;, \u0026#39;orderby\u0026#39;\t=\u0026gt; \u0026#39;meta_value\u0026#39;, \u0026#39;order\u0026#39;\t=\u0026gt; \u0026#39;DESC\u0026#39; )); // ob_start(); global $post; ?\u0026gt; \u0026lt;ul\u0026gt; \u0026lt;?php foreach ($posts as $post) { setup_postdata( $post ) ?\u0026gt; \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;\u0026lt;?php the_permalink(); ?\u0026gt;\u0026#34;\u0026gt;\u0026lt;?php the_title(); ?\u0026gt; (date: \u0026lt;?php the_field(\u0026#39;relilab_startdate\u0026#39;); ?\u0026gt;)\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;?php } ?\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;?php wp_reset_postdata(); // return ob_get_clean(); } ","permalink":"http://localhost:1313/2021/11/17/wordpress-werkstatt.html/","summary":"\u003ch1 id=\"wordpress-werkstatt-php\"\u003eWordPress Werkstatt PHP\u003c/h1\u003e\n\u003cp\u003eZunächst wird auf relilab.org das kostenfreie \u003ca href=\"https://de.wordpress.org/plugins/advanced-custom-fields/\"\u003ePlugin ACF - Advanced Custom Fields\u003c/a\u003e installiert und aktiviert.\nDies ermöglicht weitere individuelle Beitragsfelder für die Beiträge.\nNun kann manuell aktiviert oder eine Feldgruppe importiert werden - hier mittels \u003ca href=\"#ACF-JSON-Export\"\u003edieser JSON-Datei\u003c/a\u003e, die das abkürzt:\n\u003cimg loading=\"lazy\" src=\"h01-json-import.png\" alt=\"\" /\u003e\n\nmit dem Ergebnis, dass unter allen WordPress-Beiträgen jetzt zwei Terminfelder erscheinen, die ausgefüllt werden können:\n\u003cimg loading=\"lazy\" src=\"02-terminfelder.png\" alt=\"\" /\u003e\n\nZudem gibt es neu eine Kategorie \u0026ldquo;Termine\u0026rdquo;, die aktiviert werden kann mit Unterkategorien, die später Übersichtsseiten ermöglichen:\n\u003cimg loading=\"lazy\" src=\"03-kategorien.png\" alt=\"\" /\u003e\n\nJetzt wird das \u003ca href=\"https://github.com/rpi-virtuell/relilab-termine\"\u003ePlugin relilab-termine\u003c/a\u003e installiert und aktiviert\nNun kann mittels Shortcode \u003ccode\u003e[relilab_termine]\u003c/code\u003e eine Terminübersicht als WordPress-Block erzeugt werden:\n\u003cimg loading=\"lazy\" src=\"04-termine-neu.png\" alt=\"\" /\u003e\n\u003c/p\u003e","title":"WordPress Werkstatt PHP"},{"content":"VR - Virtual Reality Ausschreibung Torsten \u0026amp; Jörg Ausgehend vom Lernbaustein https://relilab.org/vr/ beschäftigen wir uns in diesem Workshop mit Immersion und praktischen Beispielen im Themenbereich VR/AR. Neben der Vermittlung von theoretischen Grundlagen besprechen wir die Einsatzmöglichkeit im Religionsunterricht am Beispiel einer Reihe zu Schöpfungsmythen. Darüber hinnaus bieten wir die Gelegenheit zu Erfahrungsaustausch, Diskussion und exemplarischen Erlebnismöglichkeiten in der virtuellen Realität.\nTheorie Immersion \u0026amp; Präsenz https://www.immersivelearning.institute/ https://omnia360.de/blog/was-ist-immersion/ https://en.wikipedia.org/wiki/Immersive_learning https://www.sciencedirect.com/science/article/pii/S0360131519303276\nForschung A Public Database of 360 Videos with Corresponding Ratings of Arousal and Valence https://vhil.stanford.edu/360-video-database/\nhttps://www.researchgate.net/publication/335733502_Getting_your_game_on_Using_virtual_reality_to_improve_real_table_tennis_skills\n\u0026ldquo;Diese Studie ergänzt die spärliche, aber wachsende Literatur, indem sie den Transfer von Fertigkeiten aus der realen Welt durch Virtual Reality in einer sportlichen Aufgabe demonstriert.\u0026rdquo;\nhttps://mixed.de/vr-und-philosophie-youtuber-zeigt-ungewoehnliche-vr-apps/amp/ Der norwegische Forscher Joakim Vindenes unterhält einen Blog, Podcast und Youtube-Kanal, in denen er außergewöhnliche VR-Apps vorstellt und sich mit der philosophischen Dimension des Mediums auseinandersetzt.\nhttps://www.youtube.com/watch?v=VY5HaEhUm2Q A look at what it would be like to plug into an infinite VR experience machine.\nReligionen https://www.matrise.no/2019/06/hinduism-and-virtual-reality/\nhttps://www.matrise.no/2020/01/the-existential-problem-of-vr-existentialism/\nEmpathie https://www.youtube.com/watch?v=L6m79wqNiMA\u0026amp;feature=youtu.be\u0026amp;t=150\n\u0026ldquo;VR is a storytelling vehicle, but it\u0026rsquo;s an empathy vehicle.\u0026rdquo;\nTherapie Feeling Good during the COVID19 Epidemic Virtual Reality Can Help Us to Overcome the Psychological Burden of Coronavirus - https://www.covidfeelgood.com/home\nDie Verkörperung von Mitgefühl in der virtuellen Realität und ihre Auswirkungen auf Patienten mit Depressionen https://scitec-media.ch/2016/03/04/game-technologien-helfen-gegen-depressionen/ https://www.youtube.com/watch?v=GwxJVCESc-E https://www.cambridge.org/core/journals/bjpsych-open/article/embodying-selfcompassion-within-virtual-reality-and-its-effects-on-patients-with-depression/\nTheater https://www.brendanabradley.com/futurestages\nKörperlichkeit https://www.matrise.no/2018/07/virtual-embodiment/ https://www.matrise.no/2020/10/virtual-reality-depersonalization-derealization/\nPraxis Padlets [https://padlet.com/petiteprof79/xrinfo(https://padlet.com/petiteprof79/xrinfo)] XR-Info - Stephanie Wössner | CC BY-SA @petiteprof79 https://padlet.com/strsa/ar Augmented Reality (AR) \u0026amp; 360°, (VR) | Gestartet von Tobias Erles (@Mr_Airless) und Sabine Strauss (@Sallythechin) beim Barcamp #wildcampen18, erweitert bei #wildcampen19 zusammen mit Jan Hartwig (@hartifical) Artikel Virtual und Augmented Reality im Klassenraum? Ein Überblick bildungsrelevanter Angebote - Steffen Jauch am 16.10.2029 bei bpb Unterricht Eine Auswahl an Unterrichtsbeispielen mit Virtual Reality Szenarien von Stephanie Wössner @petiteprof79 Communities https://educatorsinvr.com/\nReligiöse Erfahrungsräume im Oculus Store Wander https://www.oculus.com/experiences/quest/2078376005587859/\nFilme [https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/(https://mixed.de/beruehrender-oculus-film-zeigt-worauf-es-im-leben-ankommt/)]\nIn Sidequest Vanishing Grace [https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo(https://sidequestvr.com/app/772/vanishing-grace-pre-alpha-demo)]\nVanishing Grace ist eine emotionale Reise über die Opfer, die wir bringen müssen, um unseren Platz in der Welt einzunehmen.\nCubism [https://sidequestvr.com/app/403/cubism-demo(https://sidequestvr.com/app/403/cubism-demo)]\nDeism The virtual reality god simulator [https://sidequestvr.com/app/85/deisim(https://sidequestvr.com/app/85/deisim)]\nLiminal https://sidequestvr.com/app/1042/liminal Wählen Sie aus, wie Sie sich fühlen und was Sie leisten wollen: Ruhe, Energie, Schmerzlinderung und Ehrfurcht.\n3D-Modelle https://sketchfab.com/3d-models/abandoned-warehouse-interior-scene-1d5285f2e0fd4211a27c8042496d5959#\nCC BY-NC Medieval Church, Calatrava la Nueva, Spain Processed in Reality Capture from 76 Faro laser scans and 4100 photographs https://sketchfab.com/3d-models/medieval-church-calatrava-la-nueva-spain-171a047c08bc4dd588cca5ac744e8065\nAvatare Erfahrungswelten: 360 Grad Filme Kölner Dom in 360°: Privatkonzert | WDR Der Domchor gibt ein nächtliches Konzert – und der einzige Zuschauer bist du. Unter Leitung des Domkapellmeisters Professor Eberhard Metternich singt der Chor das Ave Maria von Franz Biebl in einer eher ungewöhnlichen Aufstellung. Und du stehst mittendrin. https://dom360.wdr.de/privatkonzert-bei-nacht/] INSIDE AUSCHWITZ - Das ehemalige Konzentrationslager in 360° | WDR Anne Frank VR https://www.annefrank.org/\nWithin [https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr(https://www.with.in/watch/the-ellen-fund-presents-gorillas-in-vr)] [https://account.altvr.com/channels/VRChurch(https://account.altvr.com/channels/VRChurch)]\nProgrammierung Learn VR Development: Tips, tricks, and guides to develop VR and AR applications Reddit - Learn Virtual Reality Development Mozilla Hubs Dokumentation [https://hubs.mozilla.com/docs/welcome.html(https://hubs.mozilla.com/docs/welcome.html)] Vorlagen https://v3l.de/relilabvr (relilab-VR-Hub mit Videos, Bildern, \u0026hellip;)\n[https://hubs.mozilla.com/Av38AUU/detailed-tinted-room(https://hubs.mozilla.com/Av38AUU/detailed-tinted-room)] [https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome(https://hubs.mozilla.com/scenes/juMbRem/dramainvrhome)]\nAvatare erstellen Mozilla Hubs - GLB Online Dienst - Readyplayer https://twitter.com/joerglohrer/status/1388023150626099201 [https://readyplayer.me/(https://readyplayer.me/)]\nBeispiel: (CC BY-NC-SA - Wolfprint 3D) https://d1a370nemizbjq.cloudfront.net/10b05c49-593a-4616-82e9-adcea09aa66c.glb\nHubs by Mozilla\nCreating Custom Avatars Advanced Avatar Customization http://tryquilt.io/]\nBlender files for AvatarBot Creating an Avatar using Hubs components in Blender\nOnline Editoren [https://modelviewer.dev/editor/(https://modelviewer.dev/editor/)]\nSoftware MakeHuman http://makehumancommunity.org/\nhttps://www.youtube.com/watch?v=kQjp5DYsR_c\u0026amp;t=86s\nTutorials Altspace / Blender / Unity http://edvschwab.de/Altspace/Kurz%20Doku%20Blender.pdf [http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf(http://edvschwab.de/Altspace/Kurz%20Doku%20Unity.pdf)]\nSidequest https://sidequestvr.com/ Installation: https://sidequestvr.com/setup-howto\nHow to put custom songs onto Beat Saber on Oculus Quest\nAframe https://codepen.io/joerglohrer/full/dyXQqWG https://aframe.io/ https://www.codecademy.com/learn/learn-a-frame VR development within VR with Oculus Quest + Firefox Reality + Glitch + https://rocketvirtual.com/index.html Where to begin with VR in a browser? https://www.reddit.com/r/WebVR/comments/equgdt/vr_development_within_vr_with_oculus_quest/\nhttps://aframe-model-viewer.glitch.me/\nhttps://klausw.github.io/a-frame-car-sample/index.html\nThreeJS https://threejs.org/ https://www.jesuisundev.com/en/understand-threejs/\nTour Creator Google \u0026ldquo;Starting June 30, 2021, the Google Expeditions and Tour Creator will no longer be accessible.\u0026rdquo;\nUnity https://unity.com/de/learn/get-started\nOptik Pupillendistanz (PD) messen - IPD (interpupillary distance) https://apps.apple.com/de/app/eyemeasure/id1417435049 Die kostenfreie App misst den Augenabstand auf 0,5 mm genau ab iPhoneX oder iPadPro Oder einfach mit Lineal: https://imgur.com/a/gyYKB\nOculus Quest Tutorials Deutsch https://twitter.com/StubeDie\nEnglisch Foren https://www.reddit.com/r/OculusQuest/ https://www.reddit.com/r/OculusQuest2/\nStreaming / Playthrough / Livecasting / OBS Oculus Quest Recording / Live Streaming Guide How to stream on Twitch: the ultimate guide\nFile Transfer 3 different ways https://www.youtube.com/watch?v=APbbuJF4Ma4 https://www.android.com/filetransfer/ Wie übertrage ich Bilder oder Videos von meinem Computer auf mein Oculus Quest 2 oder Quest?\nFacebook video downloader here - https://fbdown.net/\nBrillenträger Sehstärke-Linsen Einsätze https://mixed.de/vr-optiker-sehstaerke-linsen-test/\nhttps://vroptiker.de/sehstaerke-linsen-einsaetze/oculus-quest2/ https://widmovr.com/product/oculus-quest-2-prescription-lens-adapters/ Not to do Sonnenlicht in die Linse) Sonnenlicht kann durch die Linsen gebündelt werden und das Display beschödigen.\nLinsen reinigen Grips - Handhalterungen https://www.youtube.com/watch?v=_52xWr_R4uM\u0026amp;feature=youtu.be\u0026amp;t=388\nHeadstrap VIVE DELUXE AUDIO STRAP https://www.vive.com/de/accessory/vive-deluxe-audio-strap/\nFrankenQuest 2 https://uploadvr.com/frankenquest-2-quest-2/ Adapter zum 3D-Druck: https://www.thingiverse.com/thing:4622970 Variante mit Kabelklemme (oben oder unten): https://www.thingiverse.com/thing:4628600/files :::success Druck skaliert auf 101% ::: Install guide Remove the Quest 2 straps following this guide: https://www.youtube.com/watch?v=PejiYjR7_44\u0026amp;feature=youtu.be\u0026amp;t=110 Snap the DAS onto the adaptor (pushing the round front section in first like in the picture). Snap the adaptor onto Quest 2. Use the velcro loop to attach the head strap to the headset. Oculus Quest 2 Comfort Head Strap Mods!\n3DDruck Oculus Quest 2 Elite Strap_V2_NAVIDA DESIGN [https://www.thingiverse.com/thing:4630780/files(https://www.thingiverse.com/thing:4630780/files)] Oculus Link Cable Clip for Deluxe Audio Strap \u0026ldquo;DAS\u0026rdquo; https://www.thingiverse.com/thing:4666749\nÜberblick: https://www.youtube.com/watch?v=sUhMk19PVq4 https://www.youtube.com/watch?v=CN9fYlUGVtk\nLens Adaptor Für Brillen [https://www.thingiverse.com/thing:3653631(https://www.thingiverse.com/thing:3653631)] Für Linsen [https://www.thingiverse.com/thing:3642004(https://www.thingiverse.com/thing:3642004)]\nEsimen Upgrade K3\nBatterie https://www.androidcentral.com/best-oculus-quest-battery-pack\n","permalink":"http://localhost:1313/2021/08/15/virtual-reality.html/","summary":"\u003ch1 id=\"vr---virtual-reality\"\u003eVR - Virtual Reality\u003c/h1\u003e\n\u003ch1 id=\"ausschreibung-torsten--jörg\"\u003eAusschreibung Torsten \u0026amp; Jörg\u003c/h1\u003e\n\u003cp\u003eAusgehend vom Lernbaustein \u003ca href=\"https://relilab.org/vr/\"\u003ehttps://relilab.org/vr/\u003c/a\u003e beschäftigen wir uns in diesem Workshop mit Immersion und praktischen Beispielen im Themenbereich VR/AR. Neben der Vermittlung von theoretischen Grundlagen besprechen wir die Einsatzmöglichkeit im Religionsunterricht am Beispiel einer Reihe zu Schöpfungsmythen. Darüber hinnaus bieten wir die Gelegenheit zu Erfahrungsaustausch, Diskussion und exemplarischen Erlebnismöglichkeiten in der virtuellen Realität.\u003c/p\u003e\n\u003ch1 id=\"theorie\"\u003eTheorie\u003c/h1\u003e\n\u003ch2 id=\"immersion--präsenz\"\u003eImmersion \u0026amp; Präsenz\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.immersivelearning.institute/\"\u003ehttps://www.immersivelearning.institute/\u003c/a\u003e\n\u003ca href=\"https://omnia360.de/blog/was-ist-immersion/\"\u003ehttps://omnia360.de/blog/was-ist-immersion/\u003c/a\u003e\n\u003ca href=\"https://en.wikipedia.org/wiki/Immersive_learning\"\u003ehttps://en.wikipedia.org/wiki/Immersive_learning\u003c/a\u003e\n\u003cimg loading=\"lazy\" src=\"01-immersion-wikipedia.jpg\" alt=\"\" /\u003e\n\n\u003ca href=\"https://www.sciencedirect.com/science/article/pii/S0360131519303276\"\u003ehttps://www.sciencedirect.com/science/article/pii/S0360131519303276\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"forschung\"\u003eForschung\u003c/h2\u003e\n\u003cp\u003eA Public Database of 360 Videos with Corresponding Ratings of Arousal and Valence\n\u003ca href=\"https://vhil.stanford.edu/360-video-database/\"\u003ehttps://vhil.stanford.edu/360-video-database/\u003c/a\u003e\u003c/p\u003e","title":"VR - Virtual Reality"},{"content":"Pflanzenschild mit QR-Code Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen: Dann noch mit Thingiverse ein Dreieck designen (80x40x1.4mm) und den QR-Code obendrauf: Mit dem Cura-Plugin Change Filament at Z den 3D-Druck im Layer unterbrechen, wo ein Filament(Farb)-Wechsel stattfinden soll: Et voilà: ","permalink":"http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/","summary":"\u003ch1 id=\"pflanzenschild-mit-qr-code\"\u003ePflanzenschild mit QR-Code\u003c/h1\u003e\n\u003cp\u003eMit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen:\n\u003ca href=\"https://keremerkan.net/qr-code-and-2d-code-generator/\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDann noch mit Thingiverse ein Dreieck designen (80x40x1.4mm) und den QR-Code obendrauf:\n\u003ca href=\"https://www.tinkercad.com/embed/dcnCyqLFX1P?editbtn=1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMit dem Cura-Plugin \u003ca href=\"https://www.thingiverse.com/thing:2077884/#files\"\u003eChange Filament at Z\u003c/a\u003e den 3D-Druck im Layer unterbrechen, wo ein Filament(Farb)-Wechsel stattfinden soll:\n\u003cimg loading=\"lazy\" src=\"cura-plugin-change-filment-at-z.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eEt voilà:\n\u003ca href=\"https://twitter.com/joerglohrer/status/1110580168035176449\"\u003e\u003c/a\u003e\n\u003cimg loading=\"lazy\" src=\"qr-code-pflanzenschild.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e","title":"Pflanzenschild mit QR-Code"},{"content":"Lutherkürbis - Reformation an Halloween Das Symbol der Lutherrose ist auch heute noch in vielen Wappen enthalten und wird als Dekoelement genutzt (Quelle: epd/imago)\nAus einer Fotovorlage der Lutherrose wird mit einem Online-Konverter eine Schablone als verlustfrei skalierbare Vektorgrafik erzeugt:\nLutherrose PDF-Vorlage\nBastel-Anleitung Einen Kürbis aufschneiden: entkernen und aushöhlen: Schablone aufbringen: Ausschneiden: Mit Kerze oder elektrischem Licht ausstatten: Fertig!\nDiese Idee inklusive der Schablone steht unter CC0-Lizenz. Du darfst das Werk kopieren, verändern, verbreiten und aufführen, sogar zu kommerziellen Zwecken, ohne um weitere Erlaubnis bitten zu müssen.\nWeitere Quellen How to Make a Paper Cut-Out Luther Rose YouTube | PDF ","permalink":"http://localhost:1313/2017/10/31/lutherkuerbis.html/","summary":"\u003ch1 id=\"lutherkürbis---reformation-an-halloween\"\u003eLutherkürbis - Reformation an Halloween\u003c/h1\u003e\n\u003cp\u003eDas Symbol der Lutherrose ist auch heute noch in vielen Wappen enthalten und wird als Dekoelement genutzt (\u003ca href=\"https://www.t-online.de/leben/familie/id_65982142/lutherrose-entstehung-und-bedeutung.html\"\u003eQuelle: epd/imago\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eAus einer \u003ca href=\"https://duckduckgo.com/?q=lutherrose\u0026amp;t=h_\u0026amp;iax=images\u0026amp;ia=images\"\u003eFotovorlage der Lutherrose\u003c/a\u003e wird mit einem \u003ca href=\"https://image.online-convert.com/convert-to-svg\"\u003eOnline-Konverter eine Schablone als verlustfrei skalierbare Vektorgrafik\u003c/a\u003e erzeugt:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://material.rpi-virtuell.de/wp-content/uploads/2018/10/Lutherrose.pdf\"\u003e\u003cimg loading=\"lazy\" src=\"lutherrose.png\" alt=\"\" /\u003e\n\u003c/a\u003e\n\u003ca href=\"https://material.rpi-virtuell.de/wp-content/uploads/2018/10/Lutherrose.pdf\"\u003eLutherrose PDF-Vorlage\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"bastel-anleitung\"\u003eBastel-Anleitung\u003c/h2\u003e\n\u003cp\u003eEinen Kürbis aufschneiden:\n\u003cimg loading=\"lazy\" src=\"kuerbis-aufschneiden.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eentkernen und aushöhlen:\n\u003cimg loading=\"lazy\" src=\"kuerbis-entkernen.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eSchablone aufbringen:\n\u003cimg loading=\"lazy\" src=\"schablone-aufbringen.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eAusschneiden:\n\u003cimg loading=\"lazy\" src=\"kuerbis-ausschneiden.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eMit Kerze oder elektrischem Licht ausstatten:\n\u003cimg loading=\"lazy\" src=\"kuerbis-titelbild.jpg\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eFertig!\u003c/p\u003e\n\u003cp\u003eDiese Idee inklusive der Schablone steht unter \u003ca href=\"https://creativecommons.org/publicdomain/zero/1.0/deed.de\"\u003eCC0-Lizenz\u003c/a\u003e. Du darfst das Werk kopieren, verändern, verbreiten und aufführen, sogar zu kommerziellen Zwecken, ohne um weitere Erlaubnis bitten zu müssen.\u003c/p\u003e","title":"Lutherkürbis - Reformation an Halloween"},{"content":"Das OctoPrint-Telegram-Plugin schafft eine Schnittstelle zwischen Telegram und OctoPrint. Hier die Anleitung auf Englisch: https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md\nDas dauert eine Weile: Token eingeben: Heisst aber nicht, dass jetzt alles gleich klappt: Es müssen dem Benutzer noch die Rechte “Command” und “Notify” gegeben werden: ","permalink":"http://localhost:1313/2017/10/23/telegram-octopi.html/","summary":"\u003cp\u003eDas \u003ca href=\"http://plugins.octoprint.org/plugins/telegram/\"\u003eOctoPrint-Telegram-Plugin\u003c/a\u003e schafft eine Schnittstelle zwischen Telegram und OctoPrint.\nHier die Anleitung auf Englisch: \u003ca href=\"https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md\"\u003ehttps://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDas dauert eine Weile:\n\u003cimg loading=\"lazy\" src=\"octopi1.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eToken eingeben:\n\u003cimg loading=\"lazy\" src=\"octopi2.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eHeisst aber nicht, dass jetzt alles gleich klappt:\n\u003cimg loading=\"lazy\" src=\"octopi3.png\" alt=\"\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eEs müssen dem Benutzer noch die Rechte “Command” und “Notify” gegeben werden:\n\u003cimg loading=\"lazy\" src=\"octopi4.png\" alt=\"\" /\u003e\n\u003c/p\u003e","title":"Telegram Bot für Octopi"},{"content":"Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven Das Handbuch Jugend – Evangelische Perspektiven, welches 2013 erschienen ist, hat auf Seite 343-345 folgenden Artikel von mir zur Erlebnispädagogik abgedruckt. CC BY Jörg Lohrer\nErlebnispädagogik Ziele und Arbeitsformen Erlebnispädagogik arbeitet mit einem pädagogischen Konzept zielorientiert und bevorzugt in der Natur oder dem naturnahen Raum vorrangig an der Förderung von Selbst- und Sozialkompetenzen. Dabei grenzt sich Erlebnispädagogik bewusst von ‚Nervenkitzel-Aktionismus‘ und der eskalierenden Suche nach dem Kick nach immer mehr und phantastischeren Erlebnissen ab. Die Förderung von Zutrauen in die eigenen Fähigkeiten, der Umgang mit Ängsten, das Erfahren und Überwinden von Grenzen, die Vemittlung von sozialen Kompetenzen können Zielsetzungen für erlebnispädagogische Maßnahmen in der evangelischen Jugendbildung sein. Dabei geht es auch immer um eine Erweiterung der eigenen Handlungskompetenzen zur Lebensbewältigung durch ein angstfreies Lernen in der Gruppe.\nErlebnispädagogik arbeitet mit Wahrnehmungs- und Vertrauensübungen, Kooperations- und Problemlösungsaufgaben, abenteuerlichen Aktionen, persönlichen Herausforderungen und Grenzerfahrungen. Angebote und Maßnahmen mit erlebnispädagogischem Charakter sind zum Beispiel Kanu- und Fahrrad-Touren, Kletteraktionen, kooperative Abenteuerspiele, Natursensibilisierung, Trekkingtouren, Nieder- und Hochseilparcours oder Geocaching.\nErlebnispädagogische Maßnahmen finden u.a. Anwendung im Bereich der Kooperation von Jugendverbandsarbeit und Schule, bei Klassenfahrten, der Präventionsarbeit, bei gruppendynamischen Prozessen, Mitarbeiterschulungen, der Entwicklung von Teamarbeit und in etlichen weiteren Praxisfeldern evangelischer Jugendbildung.\nMit den Arbeitsprinzipien Respekt, Selbstbestimmung, Vertrauen, Kooperation, Verantwortung und Ganzheitlichkeit korrespondiert die Erlebnispädagogik mit dem Profil der evangelischen Jugendarbeit. Ebenso liegen Chancen in einer Verknüpfung von erlebnispädagogischen Aktionen mit einer erfahrungsbezogenen Verkündigung. Erlebnispädagogische Maßnahmen werden als Jugendbildungsveranstaltungen gefördert, wenn sozial-ökologische Inhalte und/oder politisch-kulturelle Schwerpunktthemen mit gesellschaftlichem Bezug im Mittelpunkt der Maßnahme stehen.\nEntstehung, Prinzipien, Methoden Der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) nennt weit in die Vergangenheit zurück reichende Wurzeln der Erlebnispädagogik. Als wichtige Autoren, auf die das Konzept vom handlungsorientierten Lernen zurückgeführt wird, werden Platon (427–347 v.Chr.), Rousseau (1712–1778), Pestalozzi (1746–1827) und schließ- lich Kurt Hahn (1886–1974) als ‚Urvater‘ der Erlebnispädagogik genannt. Ihre heutige Vielfalt und weite Verbreitung hat die Erlebnispädagogik allerdings erst im 20. Jahrhundert und schließlich in den letzten Jahrzehnten entwickelt. Erlebnispädagogik wird nicht nur im Bereich der Erziehung von Kindern und Jugendlichen angewandt, sondern findet inzwischen auch vielfältige Beachtung in der Arbeit mit nahezu allen Altersgruppen zu unterschiedlichen Problem- und Zielstellungen in der präventiven Kurzzeitpädagogik, der intensiven sozialpädagogischen Einzelbetreuung, im Rahmen der beruflichen Fort und Weiterbildung oder in Führungskräftetrainings (vgl. www.bundesverband- erlebnispaedagogik.de).\nAls Grundprinzipien können unter anderem benannt werden: Handlungsorientierung, Ganzheitlichkeit, Eigenverantwortung, Freiwilligkeit, Sicherheit und Nachhaltig- keit. Dabei sind die pädagogischen, kompetenz- und ressourcenorientierten Angebote der Erlebnispädagogik stets eingebettet in die aktuelle Rechtsgrundlage und (Bildungs-) Politik.\nMethodische Aspekte sind z.B.: der hohe Stellenwert des Erlebnisses und das Arbeiten mit erlebnispädagogischen Lernszenarien, nicht-alltäglichen Herausforderungen und Wagnissen, Einsatz verschiedener Medien und der Natur als bevorzugtem Lern- und Erfahrungsraum. Neben einer zunehmende Gruppenselbststeuerung baut die Erlebnispädagogik auf Lern- und Wirkungsmodelle wie das Komfortzonenmodell, das metaphorische Modell, Aktions- und Reflexionswelle oder das FlowModell. Erlebnispädagogik hat als Lernszenariotechnik zwar eine eigene Strukturlogik, dient jedoch ebenso als Methode im nicht genuin erlebnispädagogischen Kontext und entwickelt somit Reichweite, Relevanz und pädagogische Innovationskraft in Konfirmandenarbeit, Religionsunterricht und Gemeindepädagogik.\nAktuelle Fragestellungen und Entwicklungsperspektiven: Qualität und Wirkung Als partizipatorisches Angebot setzt die Erlebnispädagogik auf das Prinzip der Freiwilligkeit und der selbstbestimmten Teilnahme. Unter dem Motto ‚challenge by choice‘ hat eine subjektorientierte Erlebnispädagogik stets zu gewährleisten, dass die Teilnehmenden den Grad ihrer Beteiligung und Verantwortungsübernahme selbst bestimmen können. Reiserechtliche Bestimmungen, Versicherung und Haftung sind daher aktuell handlungsleitendend bei der Erstellung von erlebnispädagogischen Angeboten und Konzeptionen. Hier gab es in den letzten Jahren zahlreiche Entwicklungen, die eine Qualitätssicherung der Mitarbeitendenbildung in Pädagogik und Sicherheitstechnik hinsichtlich geltender Kriterien voraussetzen und notwendig machen. Entsprechende Zusatzqualifikationen sollten daher immer mindestens durch die jeweiligen Fachsportverbände zertifizierbar sein. Mit dem Gütesiegel „Qualität erlebnispädagogischer Programme und Angebote – Mit Sicherheit pädagogisch!“ (beQ) hat der Bundesverband Individual- und Erlebnispädagogik e.V. (BE) ein Zertifizierungsverfahren entwickelt, das ein bundeseinheitliches Qualitätsmanagement fördern will.\nDie Wirkungsforschung erlebnispädagogischer Lernarrangements untersucht deren Substanz, Akzeptanz und Nachhaltigkeit hinsichtlich ihrer Qualität von Konzept, Struktur, Prozess und Ergebnis. Studien konnten bislang Indizien für Impulse zur Kompetenzentwicklung nachweisen, die wissenschaftliche Evaluation gestaltet sich jedoch genauso komplex wie das Spektrum der erlebnispädagogischen Handlungsfelder und so fehlt es bislang an validen Studien, die das Wirkungspotenzial eindeutig beschreiben können.\nIm Kontext evangelischer Jugendbildung stellt sich bei der Verwendung erlebnispädagogischer Methoden immer auch die Frage nach einer Verknüpfung von christlichen Inhalten mit der handlungsorientierten Pädagogik. Die Assoziation von Natur und Schöpfung ist beispielsweise ebenso naheliegend wie die Reflexion von religiösen Erfahrungen in erlebnispädagogischen Lernsettings. Inwiefern sich dabei Unverfügbares inszenieren lässt, bleibt dabei ebenso eine Herausforderung, wie bei der oben beschriebenen Wirkungsforschung. In den vergangenen Jahren haben sich einige Konzepte zur Erprobung erlebnispädagogischer Methoden im christlichen Kontext entwickelt, die zunehmend auch theologisch und religionsdidaktisch reflektiert werden. Eine überregionale Organisation dieser Einzelinitiativen auf Bundesebene wäre der nächste Schritt hin zu einem evangelischen Profil erlebnispädagogischer Jugendbildungsarbeit.\nLiteratur Großer, Achim/Oberländer, Rainer/Lohrer, Jörg/Wiedmayer, Jörg (2005/2011): Sinn gesucht – Gott erfahren. Erlebnispädagogik im christlichen Kontext (Band 1 (2005)/Band 2 (2011)). Stuttgart: Buch und Musik. Heckmair, Bernd/Michl, Werner (2008): Erleben und Lernen. Einführung in die Erlebnispädagogik. München: Reinhardt. Reiners, Annette (2007): Praktische Erlebnispädagogik. Augsburg: ZIEL. Pum, Viktoria/Pirner, Manfred L./Lohrer, Jörg (Hrsg.) (2011): Erlebnispädagogik im christlichen Kontext. Dokumentation einer Tagung der Evangelischen Akademie Bad Boll, 2. bis 4. März 2009. Bad Boll: Evangelische Akademie.\nLinks Bundesverband Individual- und Erlebnispädagogik e.V. (BE): https://www.bundesverband-erlebnispaedagogik.de/ Fachportal für Erlebnispädagogik im christlichen Kontext des Evangelischen Jugendwerks in Württemberg: https://www.ejwue.de/arbeitsbereiche/erlebnispaedagogik/ Informationsdienst Erlebnispädagogik mit Literaturliste: http://erlebnispaedagogik.de/ Bundesweite Klassenfahrten, Aus- und Weiterbildungsangebote der Gesellschaft zur Förderung der Erlebnispädagogik (GFE): https://www.erlebnistage.de/ ","permalink":"http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/","summary":"\u003ch1 id=\"erlebnispädagogik-im-handbuch-jugend--evangelische-perspektiven\"\u003eErlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven\u003c/h1\u003e\n\u003cp\u003eDas\n\u003ca href=\"http://ci-muenster.de/bookshop/artikel/buecher/Bildung-im-Kindes-und-Jugendalter/A40097_Handbuch_Jugend_2013.php\"\u003e\u003cimg loading=\"lazy\" src=\"http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8\u0026amp;ASIN=3847400746\u0026amp;Format=_SL160_\u0026amp;ID=AsinImage\u0026amp;MarketPlace=DE\u0026amp;ServiceVersion=20070822\u0026amp;WS=1\u0026amp;tag=httpwwwjoergl-21\" alt=\"\" /\u003e\n\u003c/a\u003e\n\u003cstrong\u003eHandbuch Jugend – Evangelische Perspektiven\u003c/strong\u003e, welches 2013 erschienen ist, hat auf Seite 343-345 folgenden Artikel von mir zur Erlebnispädagogik abgedruckt.\n\u003ca href=\"http://creativecommons.org/licenses/by/2.0/de/\"\u003eCC BY\u003c/a\u003e Jörg Lohrer\u003c/p\u003e\n\u003ch2 id=\"erlebnispädagogik\"\u003eErlebnispädagogik\u003c/h2\u003e\n\u003ch3 id=\"ziele-und-arbeitsformen\"\u003eZiele und Arbeitsformen\u003c/h3\u003e\n\u003cp\u003eErlebnispädagogik arbeitet mit einem pädagogischen Konzept zielorientiert und bevorzugt in der Natur oder dem naturnahen Raum vorrangig an der Förderung von Selbst- und Sozialkompetenzen. Dabei grenzt sich Erlebnispädagogik bewusst von ‚Nervenkitzel-Aktionismus‘ und der eskalierenden Suche nach dem Kick nach immer mehr und phantastischeren Erlebnissen ab. Die Förderung von Zutrauen in die eigenen Fähigkeiten, der Umgang mit Ängsten, das Erfahren und Überwinden von Grenzen, die Vemittlung von sozialen Kompetenzen können Zielsetzungen für erlebnispädagogische Maßnahmen in der evangelischen Jugendbildung sein. Dabei geht es auch immer um eine Erweiterung der eigenen Handlungskompetenzen zur Lebensbewältigung durch ein angstfreies Lernen in der Gruppe.\u003c/p\u003e","title":"Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven"},{"content":"Premium, Freemium, Mium mium mium Wer leckere Bildungsangebote macht, findet immer reichlich Abnehmer. Und im digitalen Zeitalter kann ein einzelnes Produkt dank der vorhandenen Replikatormaschinen unendlich vervielfacht konsumiert werden. Das ist kein Traum mehr, sondern längst cloudgewordene Wirklichkeit.\nNun wird versucht über ein komplexes Rechtemanagement den Produzenten ein lukratives Einkommen zu sichern. Doch während im Dienstleitungssektor der Bildung die einen noch an Vertriebswegen tüfteln, sind die Teilnehmenden in den offenen und massiven Online-Kursen (MOOCs) schon einen Schritt weiter. Hier wird allmählich begriffen, dass nicht die Her- und Bereitstellung, Aufbereitung und didaktische Darbietung von Bildung sich in barer Münze auszahlt, sondern das vernetzende Lernen selbst, also der Prozess, die eigentliche Qualität darstellt, die ihr Geld wirklich wert wäre.\n![](my-very-hungry-caterpillar.jpg =240x) Foto: 365.79 My very hungry caterpillar - Relly Annett-Baker CC BY-NC-SA\nWo früher noch für ein Produkt bezahlt wurde, wird morgen ein Vorgang monetarisiert werden müssen. Übergangslösungen sind bezahlte Dienstleitungen, Werbeeinblendungen, Freischaltcodes, digitales Rechtemanagement oder Crowdfunding. Insgesamt zeigt sich zugleich, dass Geld immer weniger einen materialisierbaren Gegenwert erhält und sich somit eventuell die Substanz der Währung allmählich aufzulösen beginnt. Doch genausowenig wie man Geld essen kann, wird man von Bildung satt. Die Frage, die sich stellt, ist also keine geringere als die nach einer Kalibrierung der Geldfunktionen. Gegenseitige Anerkennung, Verlässlichkeit und Loyalität, Kooperation und Ideenreichtum, Unterstützung und Feedback sind im Rahmen eines offenen Online-Kurses ohnehin unbezahlbar und treten verblüffenderweise da am stärksten auf, wo kein Geldtransfer im Spiel ist. Das zeigt einmal mehr, dass man sich die besten Dinge im Leben mit Geld eben gerade nicht kaufen kann. Doch satt bin ich noch immer nicht.\n","permalink":"http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/","summary":"\u003ch1 id=\"premium-freemium-mium-mium-mium\"\u003ePremium, Freemium, Mium mium mium\u003c/h1\u003e\n\u003cp\u003eWer leckere Bildungsangebote macht, findet immer reichlich Abnehmer. Und im digitalen Zeitalter kann ein einzelnes Produkt dank der vorhandenen Replikatormaschinen unendlich vervielfacht konsumiert werden. Das ist kein Traum mehr, sondern längst cloudgewordene Wirklichkeit.\u003c/p\u003e\n\u003cp\u003eNun wird versucht über ein komplexes Rechtemanagement den Produzenten ein lukratives Einkommen zu sichern. Doch während im Dienstleitungssektor der Bildung die einen noch an Vertriebswegen tüfteln, sind die Teilnehmenden in den offenen und massiven Online-Kursen (MOOCs) schon einen Schritt weiter. Hier wird allmählich begriffen, dass nicht die Her- und Bereitstellung, Aufbereitung und didaktische Darbietung von Bildung sich in barer Münze auszahlt, sondern das vernetzende Lernen selbst, also der Prozess, die eigentliche Qualität darstellt, die ihr Geld wirklich wert wäre.\u003c/p\u003e","title":"Premium, Freemium, Mium mium mium"},{"content":"Impressum Angaben gemäß § 5 TMG\nVerantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Jörg Lohrer Austr.23 74239 Hardthausen Telefon: 07139-50897070 E-Mail: info.empeiria@gmail.com\nHaftungsausschluss: Haftung für Inhalte Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.\nHaftung für Links Mein Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen.\nUrheberrecht Die durch den Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen jedoch nicht der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind sowohl für den privaten, als auch für den kommerziellen Gebrauch unter Namensnennung und der Creative Commons Lizenz CC BY-SA gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Solltest Du trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen.\nDatenschutz Die Nutzung meiner Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf meiner Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Deine ausdrückliche Zustimmung nicht an Dritte weitergegeben. Ich weise darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.\n","permalink":"http://localhost:1313/impressum/","summary":"\u003ch1 id=\"impressum\"\u003eImpressum\u003c/h1\u003e\n\u003cp\u003eAngaben gemäß § 5 TMG\u003c/p\u003e\n\u003cp\u003eVerantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Jörg Lohrer Austr.23 74239 Hardthausen Telefon: 07139-50897070 E-Mail: \u003ca href=\"mailto:info.empeiria@gmail.com\"\u003einfo.empeiria@gmail.com\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"haftungsausschluss\"\u003eHaftungsausschluss:\u003c/h2\u003e\n\u003ch3 id=\"haftung-für-inhalte\"\u003eHaftung für Inhalte\u003c/h3\u003e\n\u003cp\u003eDie Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.\u003c/p\u003e","title":"Impressum"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..a5f044f --- /dev/null +++ b/public/index.xml @@ -0,0 +1,150 @@ + + + + Jörg Lohrer + http://localhost:1313/ + Recent content on Jörg Lohrer + Hugo -- gohugo.io + de + Tue, 04 Mar 2025 00:00:00 +0000 + + + Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter + http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/ + Tue, 04 Mar 2025 00:00:00 +0000 + http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/ + Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational Resources (OER) und Open Educational Practices (OEP) notwendig ist, um nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet + + + KIBedenken - Bewusstsein + http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/ + Wed, 03 Apr 2024 00:00:00 +0000 + http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/ + Intelligenz oder Bewusstsein? + + + BottomUp -> MarkDown - 5V-Power für deine OER! + http://localhost:1313/2024/03/05/bottomup-markdown.html/ + Tue, 05 Mar 2024 00:00:00 +0000 + http://localhost:1313/2024/03/05/bottomup-markdown.html/ + Open Educational Resources mit MarkDown + + + Offenheit - das Wesentliche + http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/ + Fri, 26 Jan 2024 00:00:00 +0000 + http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/ + Ein Beitrag zu Teil 1 “Mein (schulisches) Motto für 2024” der EduBlogparade + + + WordPress statt Padlet oder TaskCards + http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/ + Tue, 25 Jul 2023 00:00:00 +0000 + http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/ + Mit WordPress, horizontalem Scrolling und Beitragskategorien Sammlungen im Kanban-Style erstellen + + + Hefefreuden - Dampfnudeln & Minihefezopf + http://localhost:1313/2023/04/07/dampfnudeln.html/ + Fri, 07 Apr 2023 00:00:00 +0000 + http://localhost:1313/2023/04/07/dampfnudeln.html/ + Rezept und Backanleitung + + + Das Gleichnis vom Sämann + http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/ + Thu, 23 Mar 2023 00:00:00 +0000 + http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/ + erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle + + + Jojos Schoko-Zimt-Schnecken + http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/ + Sun, 26 Feb 2023 00:00:00 +0000 + http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/ + Rezept und Backanleitung + + + Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern + http://localhost:1313/2022/03/19/ob-virtualcam.html/ + Sat, 19 Mar 2022 00:00:00 +0000 + http://localhost:1313/2022/03/19/ob-virtualcam.html/ + Via Konsole Instanz in aufsetzen, Desktop-Linux installieren, Apps einrichten und konfigurieren + + + Moodle Server mit Ubuntu 20 LTS und Iomad + http://localhost:1313/2022/02/16/moodle-iomad-linux.html/ + Wed, 16 Feb 2022 00:00:00 +0000 + http://localhost:1313/2022/02/16/moodle-iomad-linux.html/ + Installation von Iomad zur Moodle-Instanz-Verwaltung + + + Bibelfußball - Nachschlage-Quiz zur Bibel + http://localhost:1313/2021/12/03/bibelfussball.html/ + Fri, 03 Dec 2021 00:00:00 +0000 + http://localhost:1313/2021/12/03/bibelfussball.html/ + Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. + + + WordPress Werkstatt PHP + http://localhost:1313/2021/11/17/wordpress-werkstatt.html/ + Wed, 17 Nov 2021 00:00:00 +0000 + http://localhost:1313/2021/11/17/wordpress-werkstatt.html/ + Advanced Custom Fields und Formulareingaben + + + VR - Virtual Reality + http://localhost:1313/2021/08/15/virtual-reality.html/ + Sun, 15 Aug 2021 00:00:00 +0000 + http://localhost:1313/2021/08/15/virtual-reality.html/ + Tutorials der Oculus Quest 2 + + + Pflanzenschild mit QR-Code + http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/ + Tue, 26 Mar 2019 00:00:00 +0000 + http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/ + Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen + + + Lutherkürbis - Reformation an Halloween + http://localhost:1313/2017/10/31/lutherkuerbis.html/ + Tue, 31 Oct 2017 00:00:00 +0000 + http://localhost:1313/2017/10/31/lutherkuerbis.html/ + Schablone und Bastelanleitung für einen Kürbis zur Reformation + + + Telegram Bot für Octopi + http://localhost:1313/2017/10/23/telegram-octopi.html/ + Mon, 23 Oct 2017 00:00:00 +0000 + http://localhost:1313/2017/10/23/telegram-octopi.html/ + Schnittstelle zwischen Telegram und OctoPrint + + + Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven + http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/ + Wed, 29 May 2013 00:00:00 +0000 + http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/ + Artikel unter CC-BY Lizenz + + + Premium, Freemium, Mium mium mium + http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/ + Thu, 07 Feb 2013 00:00:00 +0000 + http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/ + Zur Produktion von sattmachenden Bildungsinhalten + + + Impressum + http://localhost:1313/impressum/ + Tue, 01 Jan 2013 00:00:00 +0000 + http://localhost:1313/impressum/ + <h1 id="impressum">Impressum</h1> +<p>Angaben gemäß § 5 TMG</p> +<p>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Jörg Lohrer Austr.23 74239 Hardthausen Telefon: 07139-50897070 E-Mail: <a href="mailto:info.empeiria@gmail.com">info.empeiria@gmail.com</a></p> +<h2 id="haftungsausschluss">Haftungsausschluss:</h2> +<h3 id="haftung-für-inhalte">Haftung für Inhalte</h3> +<p>Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.</p> + + + diff --git a/public/joerg-profil-2024.webp b/public/joerg-profil-2024.webp new file mode 100644 index 0000000..c025a5f Binary files /dev/null and b/public/joerg-profil-2024.webp differ diff --git a/public/js/purify.js b/public/js/purify.js new file mode 100644 index 0000000..a03f326 --- /dev/null +++ b/public/js/purify.js @@ -0,0 +1,1346 @@ +/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory()); +})(this, (function () { 'use strict'; + + const { + entries, + setPrototypeOf, + isFrozen, + getPrototypeOf, + getOwnPropertyDescriptor + } = Object; + let { + freeze, + seal, + create + } = Object; // eslint-disable-line import/no-mutable-exports + let { + apply, + construct + } = typeof Reflect !== 'undefined' && Reflect; + if (!freeze) { + freeze = function freeze(x) { + return x; + }; + } + if (!seal) { + seal = function seal(x) { + return x; + }; + } + if (!apply) { + apply = function apply(fun, thisValue, args) { + return fun.apply(thisValue, args); + }; + } + if (!construct) { + construct = function construct(Func, args) { + return new Func(...args); + }; + } + const arrayForEach = unapply(Array.prototype.forEach); + const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf); + const arrayPop = unapply(Array.prototype.pop); + const arrayPush = unapply(Array.prototype.push); + const arraySplice = unapply(Array.prototype.splice); + const stringToLowerCase = unapply(String.prototype.toLowerCase); + const stringToString = unapply(String.prototype.toString); + const stringMatch = unapply(String.prototype.match); + const stringReplace = unapply(String.prototype.replace); + const stringIndexOf = unapply(String.prototype.indexOf); + const stringTrim = unapply(String.prototype.trim); + const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty); + const regExpTest = unapply(RegExp.prototype.test); + const typeErrorCreate = unconstruct(TypeError); + /** + * Creates a new function that calls the given function with a specified thisArg and arguments. + * + * @param func - The function to be wrapped and called. + * @returns A new function that calls the given function with a specified thisArg and arguments. + */ + function unapply(func) { + return function (thisArg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return apply(func, thisArg, args); + }; + } + /** + * Creates a new function that constructs an instance of the given constructor function with the provided arguments. + * + * @param func - The constructor function to be wrapped and called. + * @returns A new function that constructs an instance of the given constructor function with the provided arguments. + */ + function unconstruct(func) { + return function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return construct(func, args); + }; + } + /** + * Add properties to a lookup table + * + * @param set - The set to which elements will be added. + * @param array - The array containing elements to be added to the set. + * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set. + * @returns The modified set with added elements. + */ + function addToSet(set, array) { + let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase; + if (setPrototypeOf) { + // Make 'in' and truthy checks like Boolean(set.constructor) + // independent of any properties defined on Object.prototype. + // Prevent prototype setters from intercepting set as a this value. + setPrototypeOf(set, null); + } + let l = array.length; + while (l--) { + let element = array[l]; + if (typeof element === 'string') { + const lcElement = transformCaseFunc(element); + if (lcElement !== element) { + // Config presets (e.g. tags.js, attrs.js) are immutable. + if (!isFrozen(array)) { + array[l] = lcElement; + } + element = lcElement; + } + } + set[element] = true; + } + return set; + } + /** + * Clean up an array to harden against CSPP + * + * @param array - The array to be cleaned. + * @returns The cleaned version of the array + */ + function cleanArray(array) { + for (let index = 0; index < array.length; index++) { + const isPropertyExist = objectHasOwnProperty(array, index); + if (!isPropertyExist) { + array[index] = null; + } + } + return array; + } + /** + * Shallow clone an object + * + * @param object - The object to be cloned. + * @returns A new object that copies the original. + */ + function clone(object) { + const newObject = create(null); + for (const [property, value] of entries(object)) { + const isPropertyExist = objectHasOwnProperty(object, property); + if (isPropertyExist) { + if (Array.isArray(value)) { + newObject[property] = cleanArray(value); + } else if (value && typeof value === 'object' && value.constructor === Object) { + newObject[property] = clone(value); + } else { + newObject[property] = value; + } + } + } + return newObject; + } + /** + * This method automatically checks if the prop is function or getter and behaves accordingly. + * + * @param object - The object to look up the getter function in its prototype chain. + * @param prop - The property name for which to find the getter function. + * @returns The getter function found in the prototype chain or a fallback function. + */ + function lookupGetter(object, prop) { + while (object !== null) { + const desc = getOwnPropertyDescriptor(object, prop); + if (desc) { + if (desc.get) { + return unapply(desc.get); + } + if (typeof desc.value === 'function') { + return unapply(desc.value); + } + } + object = getPrototypeOf(object); + } + function fallbackValue() { + return null; + } + return fallbackValue; + } + + const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); + const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']); + const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); + // List of SVG elements that are disallowed by default. + // We still need to know them so that we can do namespace + // checks properly in case one wants to add them to + // allow-list. + const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']); + const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']); + // Similarly to SVG, we want to know all MathML elements, + // even those that we disallow by default. + const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']); + const text = freeze(['#text']); + + const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']); + const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']); + const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']); + const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']); + + // eslint-disable-next-line unicorn/better-regex + const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode + const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); + const TMPLIT_EXPR = seal(/\$\{[\w\W]*/gm); // eslint-disable-line unicorn/better-regex + const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape + const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape + const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape + ); + const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); + const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex + ); + const DOCTYPE_NAME = seal(/^html$/i); + const CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i); + + var EXPRESSIONS = /*#__PURE__*/Object.freeze({ + __proto__: null, + ARIA_ATTR: ARIA_ATTR, + ATTR_WHITESPACE: ATTR_WHITESPACE, + CUSTOM_ELEMENT: CUSTOM_ELEMENT, + DATA_ATTR: DATA_ATTR, + DOCTYPE_NAME: DOCTYPE_NAME, + ERB_EXPR: ERB_EXPR, + IS_ALLOWED_URI: IS_ALLOWED_URI, + IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA, + MUSTACHE_EXPR: MUSTACHE_EXPR, + TMPLIT_EXPR: TMPLIT_EXPR + }); + + /* eslint-disable @typescript-eslint/indent */ + // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + const NODE_TYPE = { + element: 1, + attribute: 2, + text: 3, + cdataSection: 4, + entityReference: 5, + // Deprecated + entityNode: 6, + // Deprecated + progressingInstruction: 7, + comment: 8, + document: 9, + documentType: 10, + documentFragment: 11, + notation: 12 // Deprecated + }; + const getGlobal = function getGlobal() { + return typeof window === 'undefined' ? null : window; + }; + /** + * Creates a no-op policy for internal use only. + * Don't export this function outside this module! + * @param trustedTypes The policy factory. + * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix). + * @return The policy created (or null, if Trusted Types + * are not supported or creating the policy failed). + */ + const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) { + if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') { + return null; + } + // Allow the callers to control the unique policy name + // by adding a data-tt-policy-suffix to the script element with the DOMPurify. + // Policy creation with duplicate names throws in Trusted Types. + let suffix = null; + const ATTR_NAME = 'data-tt-policy-suffix'; + if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) { + suffix = purifyHostElement.getAttribute(ATTR_NAME); + } + const policyName = 'dompurify' + (suffix ? '#' + suffix : ''); + try { + return trustedTypes.createPolicy(policyName, { + createHTML(html) { + return html; + }, + createScriptURL(scriptUrl) { + return scriptUrl; + } + }); + } catch (_) { + // Policy creation failed (most likely another DOMPurify script has + // already run). Skip creating the policy, as this will only cause errors + // if TT are enforced. + console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); + return null; + } + }; + const _createHooksMap = function _createHooksMap() { + return { + afterSanitizeAttributes: [], + afterSanitizeElements: [], + afterSanitizeShadowDOM: [], + beforeSanitizeAttributes: [], + beforeSanitizeElements: [], + beforeSanitizeShadowDOM: [], + uponSanitizeAttribute: [], + uponSanitizeElement: [], + uponSanitizeShadowNode: [] + }; + }; + function createDOMPurify() { + let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); + const DOMPurify = root => createDOMPurify(root); + DOMPurify.version = '3.2.4'; + DOMPurify.removed = []; + if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) { + // Not running in a browser, provide a factory function + // so that you can pass your own Window + DOMPurify.isSupported = false; + return DOMPurify; + } + let { + document + } = window; + const originalDocument = document; + const currentScript = originalDocument.currentScript; + const { + DocumentFragment, + HTMLTemplateElement, + Node, + Element, + NodeFilter, + NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap, + HTMLFormElement, + DOMParser, + trustedTypes + } = window; + const ElementPrototype = Element.prototype; + const cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); + const remove = lookupGetter(ElementPrototype, 'remove'); + const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); + const getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); + const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); + // As per issue #47, the web-components registry is inherited by a + // new document created via createHTMLDocument. As per the spec + // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries) + // a new empty registry is used when creating a template contents owner + // document, so we use that as our parent document to ensure nothing + // is inherited. + if (typeof HTMLTemplateElement === 'function') { + const template = document.createElement('template'); + if (template.content && template.content.ownerDocument) { + document = template.content.ownerDocument; + } + } + let trustedTypesPolicy; + let emptyHTML = ''; + const { + implementation, + createNodeIterator, + createDocumentFragment, + getElementsByTagName + } = document; + const { + importNode + } = originalDocument; + let hooks = _createHooksMap(); + /** + * Expose whether this browser supports running the full DOMPurify. + */ + DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined; + const { + MUSTACHE_EXPR, + ERB_EXPR, + TMPLIT_EXPR, + DATA_ATTR, + ARIA_ATTR, + IS_SCRIPT_OR_DATA, + ATTR_WHITESPACE, + CUSTOM_ELEMENT + } = EXPRESSIONS; + let { + IS_ALLOWED_URI: IS_ALLOWED_URI$1 + } = EXPRESSIONS; + /** + * We consider the elements and attributes below to be safe. Ideally + * don't add any new ones but feel free to remove unwanted ones. + */ + /* allowed element names */ + let ALLOWED_TAGS = null; + const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); + /* Allowed attribute names */ + let ALLOWED_ATTR = null; + const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); + /* + * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements. + * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements) + * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list) + * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`. + */ + let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, { + tagNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + attributeNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + allowCustomizedBuiltInElements: { + writable: true, + configurable: false, + enumerable: true, + value: false + } + })); + /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */ + let FORBID_TAGS = null; + /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */ + let FORBID_ATTR = null; + /* Decide if ARIA attributes are okay */ + let ALLOW_ARIA_ATTR = true; + /* Decide if custom data attributes are okay */ + let ALLOW_DATA_ATTR = true; + /* Decide if unknown protocols are okay */ + let ALLOW_UNKNOWN_PROTOCOLS = false; + /* Decide if self-closing tags in attributes are allowed. + * Usually removed due to a mXSS issue in jQuery 3.0 */ + let ALLOW_SELF_CLOSE_IN_ATTR = true; + /* Output should be safe for common template engines. + * This means, DOMPurify removes data attributes, mustaches and ERB + */ + let SAFE_FOR_TEMPLATES = false; + /* Output should be safe even for XML used within HTML and alike. + * This means, DOMPurify removes comments when containing risky content. + */ + let SAFE_FOR_XML = true; + /* Decide if document with ... should be returned */ + let WHOLE_DOCUMENT = false; + /* Track whether config is already set on this instance of DOMPurify. */ + let SET_CONFIG = false; + /* Decide if all elements (e.g. style, script) must be children of + * document.body. By default, browsers might move them to document.head */ + let FORCE_BODY = false; + /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported). + * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead + */ + let RETURN_DOM = false; + /* Decide if a DOM `DocumentFragment` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported) */ + let RETURN_DOM_FRAGMENT = false; + /* Try to return a Trusted Type object instead of a string, return a string in + * case Trusted Types are not supported */ + let RETURN_TRUSTED_TYPE = false; + /* Output should be free from DOM clobbering attacks? + * This sanitizes markups named with colliding, clobberable built-in DOM APIs. + */ + let SANITIZE_DOM = true; + /* Achieve full DOM Clobbering protection by isolating the namespace of named + * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules. + * + * HTML/DOM spec rules that enable DOM Clobbering: + * - Named Access on Window (§7.3.3) + * - DOM Tree Accessors (§3.1.5) + * - Form Element Parent-Child Relations (§4.10.3) + * - Iframe srcdoc / Nested WindowProxies (§4.8.5) + * - HTMLCollection (§4.2.10.2) + * + * Namespace isolation is implemented by prefixing `id` and `name` attributes + * with a constant string, i.e., `user-content-` + */ + let SANITIZE_NAMED_PROPS = false; + const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-'; + /* Keep element content when removing element? */ + let KEEP_CONTENT = true; + /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead + * of importing it into a new Document and returning a sanitized copy */ + let IN_PLACE = false; + /* Allow usage of profiles like html, svg and mathMl */ + let USE_PROFILES = {}; + /* Tags to ignore content of when KEEP_CONTENT is true */ + let FORBID_CONTENTS = null; + const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']); + /* Tags that are safe for data: URIs */ + let DATA_URI_TAGS = null; + const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); + /* Attributes safe for values like "javascript:" */ + let URI_SAFE_ATTRIBUTES = null; + const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']); + const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; + const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; + const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; + /* Document namespace */ + let NAMESPACE = HTML_NAMESPACE; + let IS_EMPTY_INPUT = false; + /* Allowed XHTML+XML namespaces */ + let ALLOWED_NAMESPACES = null; + const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString); + let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); + let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']); + // Certain elements are allowed in both SVG and HTML + // namespace. We need to specify them explicitly + // so that they don't get erroneously deleted from + // HTML namespace. + const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']); + /* Parsing of strict XHTML documents */ + let PARSER_MEDIA_TYPE = null; + const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html']; + const DEFAULT_PARSER_MEDIA_TYPE = 'text/html'; + let transformCaseFunc = null; + /* Keep a reference to config to pass to hooks */ + let CONFIG = null; + /* Ideally, do not touch anything below this line */ + /* ______________________________________________ */ + const formElement = document.createElement('form'); + const isRegexOrFunction = function isRegexOrFunction(testValue) { + return testValue instanceof RegExp || testValue instanceof Function; + }; + /** + * _parseConfig + * + * @param cfg optional config literal + */ + // eslint-disable-next-line complexity + const _parseConfig = function _parseConfig() { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (CONFIG && CONFIG === cfg) { + return; + } + /* Shield configuration object from tampering */ + if (!cfg || typeof cfg !== 'object') { + cfg = {}; + } + /* Shield configuration object from prototype pollution */ + cfg = clone(cfg); + PARSER_MEDIA_TYPE = + // eslint-disable-next-line unicorn/prefer-includes + SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE; + // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is. + transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase; + /* Set configuration parameters */ + ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS; + ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR; + ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES; + URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES; + DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS; + FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS; + FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {}; + FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {}; + USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false; + ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true + ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true + ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false + ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true + SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false + SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true + WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false + RETURN_DOM = cfg.RETURN_DOM || false; // Default false + RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false + RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false + FORCE_BODY = cfg.FORCE_BODY || false; // Default false + SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true + SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false + KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true + IN_PLACE = cfg.IN_PLACE || false; // Default false + IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI; + NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; + MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS; + HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS; + CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {}; + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { + CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { + CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') { + CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; + } + if (SAFE_FOR_TEMPLATES) { + ALLOW_DATA_ATTR = false; + } + if (RETURN_DOM_FRAGMENT) { + RETURN_DOM = true; + } + /* Parse profile info */ + if (USE_PROFILES) { + ALLOWED_TAGS = addToSet({}, text); + ALLOWED_ATTR = []; + if (USE_PROFILES.html === true) { + addToSet(ALLOWED_TAGS, html$1); + addToSet(ALLOWED_ATTR, html); + } + if (USE_PROFILES.svg === true) { + addToSet(ALLOWED_TAGS, svg$1); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.svgFilters === true) { + addToSet(ALLOWED_TAGS, svgFilters); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.mathMl === true) { + addToSet(ALLOWED_TAGS, mathMl$1); + addToSet(ALLOWED_ATTR, mathMl); + addToSet(ALLOWED_ATTR, xml); + } + } + /* Merge configuration parameters */ + if (cfg.ADD_TAGS) { + if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { + ALLOWED_TAGS = clone(ALLOWED_TAGS); + } + addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc); + } + if (cfg.ADD_ATTR) { + if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { + ALLOWED_ATTR = clone(ALLOWED_ATTR); + } + addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc); + } + if (cfg.ADD_URI_SAFE_ATTR) { + addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc); + } + if (cfg.FORBID_CONTENTS) { + if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { + FORBID_CONTENTS = clone(FORBID_CONTENTS); + } + addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc); + } + /* Add #text in case KEEP_CONTENT is set to true */ + if (KEEP_CONTENT) { + ALLOWED_TAGS['#text'] = true; + } + /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */ + if (WHOLE_DOCUMENT) { + addToSet(ALLOWED_TAGS, ['html', 'head', 'body']); + } + /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */ + if (ALLOWED_TAGS.table) { + addToSet(ALLOWED_TAGS, ['tbody']); + delete FORBID_TAGS.tbody; + } + if (cfg.TRUSTED_TYPES_POLICY) { + if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + } + if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + } + // Overwrite existing TrustedTypes policy. + trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY; + // Sign local variables required by `sanitize`. + emptyHTML = trustedTypesPolicy.createHTML(''); + } else { + // Uninitialized policy, attempt to initialize the internal dompurify policy. + if (trustedTypesPolicy === undefined) { + trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript); + } + // If creating the internal policy succeeded sign internal variables. + if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') { + emptyHTML = trustedTypesPolicy.createHTML(''); + } + } + // Prevent further manipulation of configuration. + // Not available in IE8, Safari 5, etc. + if (freeze) { + freeze(cfg); + } + CONFIG = cfg; + }; + /* Keep track of all possible SVG and MathML tags + * so that we can perform the namespace checks + * correctly. */ + const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]); + const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]); + /** + * @param element a DOM element whose namespace is being checked + * @returns Return false if the element has a + * namespace that a spec-compliant parser would never + * return. Return true otherwise. + */ + const _checkValidNamespace = function _checkValidNamespace(element) { + let parent = getParentNode(element); + // In JSDOM, if we're inside shadow DOM, then parentNode + // can be null. We just simulate parent in this case. + if (!parent || !parent.tagName) { + parent = { + namespaceURI: NAMESPACE, + tagName: 'template' + }; + } + const tagName = stringToLowerCase(element.tagName); + const parentTagName = stringToLowerCase(parent.tagName); + if (!ALLOWED_NAMESPACES[element.namespaceURI]) { + return false; + } + if (element.namespaceURI === SVG_NAMESPACE) { + // The only way to switch from HTML namespace to SVG + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'svg'; + } + // The only way to switch from MathML to SVG is via` + // svg if parent is either or MathML + // text integration points. + if (parent.namespaceURI === MATHML_NAMESPACE) { + return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); + } + // We only allow elements that are defined in SVG + // spec. All others are disallowed in SVG namespace. + return Boolean(ALL_SVG_TAGS[tagName]); + } + if (element.namespaceURI === MATHML_NAMESPACE) { + // The only way to switch from HTML namespace to MathML + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'math'; + } + // The only way to switch from SVG to MathML is via + // and HTML integration points + if (parent.namespaceURI === SVG_NAMESPACE) { + return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; + } + // We only allow elements that are defined in MathML + // spec. All others are disallowed in MathML namespace. + return Boolean(ALL_MATHML_TAGS[tagName]); + } + if (element.namespaceURI === HTML_NAMESPACE) { + // The only way to switch from SVG to HTML is via + // HTML integration points, and from MathML to HTML + // is via MathML text integration points + if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { + return false; + } + if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { + return false; + } + // We disallow tags that are specific for MathML + // or SVG and should never appear in HTML namespace + return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); + } + // For XHTML and XML documents that support custom namespaces + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) { + return true; + } + // The code should never reach this place (this means + // that the element somehow got namespace that is not + // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES). + // Return false just in case. + return false; + }; + /** + * _forceRemove + * + * @param node a DOM node + */ + const _forceRemove = function _forceRemove(node) { + arrayPush(DOMPurify.removed, { + element: node + }); + try { + // eslint-disable-next-line unicorn/prefer-dom-node-remove + getParentNode(node).removeChild(node); + } catch (_) { + remove(node); + } + }; + /** + * _removeAttribute + * + * @param name an Attribute name + * @param element a DOM node + */ + const _removeAttribute = function _removeAttribute(name, element) { + try { + arrayPush(DOMPurify.removed, { + attribute: element.getAttributeNode(name), + from: element + }); + } catch (_) { + arrayPush(DOMPurify.removed, { + attribute: null, + from: element + }); + } + element.removeAttribute(name); + // We void attribute values for unremovable "is" attributes + if (name === 'is') { + if (RETURN_DOM || RETURN_DOM_FRAGMENT) { + try { + _forceRemove(element); + } catch (_) {} + } else { + try { + element.setAttribute(name, ''); + } catch (_) {} + } + } + }; + /** + * _initDocument + * + * @param dirty - a string of dirty markup + * @return a DOM, filled with the dirty markup + */ + const _initDocument = function _initDocument(dirty) { + /* Create a HTML document */ + let doc = null; + let leadingWhitespace = null; + if (FORCE_BODY) { + dirty = '' + dirty; + } else { + /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */ + const matches = stringMatch(dirty, /^[\r\n\t ]+/); + leadingWhitespace = matches && matches[0]; + } + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) { + // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict) + dirty = '' + dirty + ''; + } + const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; + /* + * Use the DOMParser API by default, fallback later if needs be + * DOMParser not work for svg when has multiple root element. + */ + if (NAMESPACE === HTML_NAMESPACE) { + try { + doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); + } catch (_) {} + } + /* Use createHTMLDocument in case DOMParser is not available */ + if (!doc || !doc.documentElement) { + doc = implementation.createDocument(NAMESPACE, 'template', null); + try { + doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload; + } catch (_) { + // Syntax error if dirtyPayload is invalid xml + } + } + const body = doc.body || doc.documentElement; + if (dirty && leadingWhitespace) { + body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); + } + /* Work on whole document or just its body */ + if (NAMESPACE === HTML_NAMESPACE) { + return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; + } + return WHOLE_DOCUMENT ? doc.documentElement : body; + }; + /** + * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. + * + * @param root The root element or node to start traversing on. + * @return The created NodeIterator + */ + const _createNodeIterator = function _createNodeIterator(root) { + return createNodeIterator.call(root.ownerDocument || root, root, + // eslint-disable-next-line no-bitwise + NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null); + }; + /** + * _isClobbered + * + * @param element element to check for clobbering attacks + * @return true if clobbered, false if safe + */ + const _isClobbered = function _isClobbered(element) { + return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function'); + }; + /** + * Checks whether the given object is a DOM node. + * + * @param value object to check whether it's a DOM node + * @return true is object is a DOM node + */ + const _isNode = function _isNode(value) { + return typeof Node === 'function' && value instanceof Node; + }; + function _executeHooks(hooks, currentNode, data) { + arrayForEach(hooks, hook => { + hook.call(DOMPurify, currentNode, data, CONFIG); + }); + } + /** + * _sanitizeElements + * + * @protect nodeName + * @protect textContent + * @protect removeChild + * @param currentNode to check for permission to exist + * @return true if node was killed, false if left alive + */ + const _sanitizeElements = function _sanitizeElements(currentNode) { + let content = null; + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeElements, currentNode, null); + /* Check if element is clobbered or can clobber */ + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Now let's check the element's type and name */ + const tagName = transformCaseFunc(currentNode.nodeName); + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeElement, currentNode, { + tagName, + allowedTags: ALLOWED_TAGS + }); + /* Detect mXSS attempts abusing namespace confusion */ + if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { + _forceRemove(currentNode); + return true; + } + /* Remove any occurrence of processing instructions */ + if (currentNode.nodeType === NODE_TYPE.progressingInstruction) { + _forceRemove(currentNode); + return true; + } + /* Remove any kind of possibly harmful comments */ + if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\w]/g, currentNode.data)) { + _forceRemove(currentNode); + return true; + } + /* Remove element if anything forbids its presence */ + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + /* Check if we have a custom element to handle */ + if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) { + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) { + return false; + } + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) { + return false; + } + } + /* Keep content except for bad-listed elements */ + if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) { + const parentNode = getParentNode(currentNode) || currentNode.parentNode; + const childNodes = getChildNodes(currentNode) || currentNode.childNodes; + if (childNodes && parentNode) { + const childCount = childNodes.length; + for (let i = childCount - 1; i >= 0; --i) { + const childClone = cloneNode(childNodes[i], true); + childClone.__removalCount = (currentNode.__removalCount || 0) + 1; + parentNode.insertBefore(childClone, getNextSibling(currentNode)); + } + } + } + _forceRemove(currentNode); + return true; + } + /* Check whether element has a valid namespace */ + if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Make sure that older browsers don't get fallback-tag mXSS */ + if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\/no(script|embed|frames)/i, currentNode.innerHTML)) { + _forceRemove(currentNode); + return true; + } + /* Sanitize element content to be template-safe */ + if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) { + /* Get the element's text content */ + content = currentNode.textContent; + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + content = stringReplace(content, expr, ' '); + }); + if (currentNode.textContent !== content) { + arrayPush(DOMPurify.removed, { + element: currentNode.cloneNode() + }); + currentNode.textContent = content; + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeElements, currentNode, null); + return false; + }; + /** + * _isValidAttribute + * + * @param lcTag Lowercase tag name of containing element. + * @param lcName Lowercase attribute name. + * @param value Attribute value. + * @return Returns true if `value` is valid, otherwise false. + */ + // eslint-disable-next-line complexity + const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) { + /* Make sure attribute cannot clobber */ + if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) { + return false; + } + /* Allow valid data-* attributes: At least one character after "-" + (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes) + XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804) + We don't need to check the value; it's always URI safe. */ + if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) { + if ( + // First condition does a very basic check if a) it's basically a valid custom element tagname AND + // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck + _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || + // Alternative, second condition checks if it's an `is`-attribute, AND + // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else { + return false; + } + /* Check value is safe. First, is attr inert? If so, is safe */ + } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) { + return false; + } else ; + return true; + }; + /** + * _isBasicCustomElement + * checks if at least one dash is included in tagName, and it's not the first char + * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name + * + * @param tagName name of the tag of the node to sanitize + * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false. + */ + const _isBasicCustomElement = function _isBasicCustomElement(tagName) { + return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT); + }; + /** + * _sanitizeAttributes + * + * @protect attributes + * @protect nodeName + * @protect removeAttribute + * @protect setAttribute + * + * @param currentNode to sanitize + */ + const _sanitizeAttributes = function _sanitizeAttributes(currentNode) { + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null); + const { + attributes + } = currentNode; + /* Check if we have attributes; if not we might have a text node */ + if (!attributes || _isClobbered(currentNode)) { + return; + } + const hookEvent = { + attrName: '', + attrValue: '', + keepAttr: true, + allowedAttributes: ALLOWED_ATTR, + forceKeepAttr: undefined + }; + let l = attributes.length; + /* Go backwards over all attributes; safely remove bad ones */ + while (l--) { + const attr = attributes[l]; + const { + name, + namespaceURI, + value: attrValue + } = attr; + const lcName = transformCaseFunc(name); + let value = name === 'value' ? attrValue : stringTrim(attrValue); + /* Execute a hook if present */ + hookEvent.attrName = lcName; + hookEvent.attrValue = value; + hookEvent.keepAttr = true; + hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set + _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent); + value = hookEvent.attrValue; + /* Full DOM Clobbering protection via namespace isolation, + * Prefix id and name attributes with `user-content-` + */ + if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) { + // Remove the attribute with this value + _removeAttribute(name, currentNode); + // Prefix the value and later re-create the attribute with the sanitized value + value = SANITIZE_NAMED_PROPS_PREFIX + value; + } + /* Work around a security issue with comments inside attributes */ + if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title)/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Did the hooks approve of the attribute? */ + if (hookEvent.forceKeepAttr) { + continue; + } + /* Remove attribute */ + _removeAttribute(name, currentNode); + /* Did the hooks approve of the attribute? */ + if (!hookEvent.keepAttr) { + continue; + } + /* Work around a security issue in jQuery 3.0 */ + if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Sanitize attribute content to be template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + value = stringReplace(value, expr, ' '); + }); + } + /* Is `value` valid for this attribute? */ + const lcTag = transformCaseFunc(currentNode.nodeName); + if (!_isValidAttribute(lcTag, lcName, value)) { + continue; + } + /* Handle attributes that require Trusted Types */ + if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') { + if (namespaceURI) ; else { + switch (trustedTypes.getAttributeType(lcTag, lcName)) { + case 'TrustedHTML': + { + value = trustedTypesPolicy.createHTML(value); + break; + } + case 'TrustedScriptURL': + { + value = trustedTypesPolicy.createScriptURL(value); + break; + } + } + } + } + /* Handle invalid data-* attribute set by try-catching it */ + try { + if (namespaceURI) { + currentNode.setAttributeNS(namespaceURI, name, value); + } else { + /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */ + currentNode.setAttribute(name, value); + } + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + } else { + arrayPop(DOMPurify.removed); + } + } catch (_) {} + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeAttributes, currentNode, null); + }; + /** + * _sanitizeShadowDOM + * + * @param fragment to iterate over recursively + */ + const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) { + let shadowNode = null; + const shadowIterator = _createNodeIterator(fragment); + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null); + while (shadowNode = shadowIterator.nextNode()) { + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null); + /* Sanitize tags and elements */ + _sanitizeElements(shadowNode); + /* Check attributes next */ + _sanitizeAttributes(shadowNode); + /* Deep shadow DOM detected */ + if (shadowNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(shadowNode.content); + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null); + }; + // eslint-disable-next-line complexity + DOMPurify.sanitize = function (dirty) { + let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let body = null; + let importedNode = null; + let currentNode = null; + let returnNode = null; + /* Make sure we have a string to sanitize. + DO NOT return early, as this will return the wrong type if + the user has requested a DOM object rather than a string */ + IS_EMPTY_INPUT = !dirty; + if (IS_EMPTY_INPUT) { + dirty = ''; + } + /* Stringify, in case dirty is an object */ + if (typeof dirty !== 'string' && !_isNode(dirty)) { + if (typeof dirty.toString === 'function') { + dirty = dirty.toString(); + if (typeof dirty !== 'string') { + throw typeErrorCreate('dirty is not a string, aborting'); + } + } else { + throw typeErrorCreate('toString is not a function'); + } + } + /* Return dirty HTML if DOMPurify cannot run */ + if (!DOMPurify.isSupported) { + return dirty; + } + /* Assign config vars */ + if (!SET_CONFIG) { + _parseConfig(cfg); + } + /* Clean up removed elements */ + DOMPurify.removed = []; + /* Check if dirty is correctly typed for IN_PLACE */ + if (typeof dirty === 'string') { + IN_PLACE = false; + } + if (IN_PLACE) { + /* Do some early pre-sanitization to avoid unsafe root nodes */ + if (dirty.nodeName) { + const tagName = transformCaseFunc(dirty.nodeName); + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place'); + } + } + } else if (dirty instanceof Node) { + /* If dirty is a DOM element, append to an empty document to avoid + elements being stripped by the parser */ + body = _initDocument(''); + importedNode = body.ownerDocument.importNode(dirty, true); + if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') { + /* Node is already a body, use as is */ + body = importedNode; + } else if (importedNode.nodeName === 'HTML') { + body = importedNode; + } else { + // eslint-disable-next-line unicorn/prefer-dom-node-append + body.appendChild(importedNode); + } + } else { + /* Exit directly if we have nothing to do */ + if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && + // eslint-disable-next-line unicorn/prefer-includes + dirty.indexOf('<') === -1) { + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty; + } + /* Initialize the document to work on */ + body = _initDocument(dirty); + /* Check we have a DOM node from the data */ + if (!body) { + return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : ''; + } + } + /* Remove first element node (ours) if FORCE_BODY is set */ + if (body && FORCE_BODY) { + _forceRemove(body.firstChild); + } + /* Get node iterator */ + const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body); + /* Now start iterating over the created document */ + while (currentNode = nodeIterator.nextNode()) { + /* Sanitize tags and elements */ + _sanitizeElements(currentNode); + /* Check attributes next */ + _sanitizeAttributes(currentNode); + /* Shadow DOM detected, sanitize it */ + if (currentNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(currentNode.content); + } + } + /* If we sanitized `dirty` in-place, return it. */ + if (IN_PLACE) { + return dirty; + } + /* Return sanitized string or DOM */ + if (RETURN_DOM) { + if (RETURN_DOM_FRAGMENT) { + returnNode = createDocumentFragment.call(body.ownerDocument); + while (body.firstChild) { + // eslint-disable-next-line unicorn/prefer-dom-node-append + returnNode.appendChild(body.firstChild); + } + } else { + returnNode = body; + } + if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) { + /* + AdoptNode() is not used because internal state is not reset + (e.g. the past names map of a HTMLFormElement), this is safe + in theory but we would rather not risk another attack vector. + The state that is cloned by importNode() is explicitly defined + by the specs. + */ + returnNode = importNode.call(originalDocument, returnNode, true); + } + return returnNode; + } + let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML; + /* Serialize doctype if allowed */ + if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) { + serializedHTML = '\n' + serializedHTML; + } + /* Sanitize final string template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + serializedHTML = stringReplace(serializedHTML, expr, ' '); + }); + } + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML; + }; + DOMPurify.setConfig = function () { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _parseConfig(cfg); + SET_CONFIG = true; + }; + DOMPurify.clearConfig = function () { + CONFIG = null; + SET_CONFIG = false; + }; + DOMPurify.isValidAttribute = function (tag, attr, value) { + /* Initialize shared config vars if necessary. */ + if (!CONFIG) { + _parseConfig({}); + } + const lcTag = transformCaseFunc(tag); + const lcName = transformCaseFunc(attr); + return _isValidAttribute(lcTag, lcName, value); + }; + DOMPurify.addHook = function (entryPoint, hookFunction) { + if (typeof hookFunction !== 'function') { + return; + } + arrayPush(hooks[entryPoint], hookFunction); + }; + DOMPurify.removeHook = function (entryPoint, hookFunction) { + if (hookFunction !== undefined) { + const index = arrayLastIndexOf(hooks[entryPoint], hookFunction); + return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0]; + } + return arrayPop(hooks[entryPoint]); + }; + DOMPurify.removeHooks = function (entryPoint) { + hooks[entryPoint] = []; + }; + DOMPurify.removeAllHooks = function () { + hooks = _createHooksMap(); + }; + return DOMPurify; + } + var purify = createDOMPurify(); + + return purify; + +})); +//# sourceMappingURL=purify.js.map diff --git a/public/js/purify.js.map b/public/js/purify.js.map new file mode 100644 index 0000000..77cd530 --- /dev/null +++ b/public/js/purify.js.map @@ -0,0 +1 @@ +{"version":3,"file":"purify.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/public/js/purify.min.js b/public/js/purify.min.js new file mode 100644 index 0000000..b472a86 --- /dev/null +++ b/public/js/purify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=R(Array.prototype.forEach),m=R(Array.prototype.lastIndexOf),p=R(Array.prototype.pop),f=R(Array.prototype.push),d=R(Array.prototype.splice),h=R(String.prototype.toLowerCase),g=R(String.prototype.toString),T=R(String.prototype.match),y=R(String.prototype.replace),E=R(String.prototype.indexOf),A=R(String.prototype.trim),_=R(Object.prototype.hasOwnProperty),S=R(RegExp.prototype.test),b=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:h;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function O(e){for(let t=0;t/gm),G=a(/\$\{[\w\W]*/gm),Y=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),j=a(/^aria-[\-\w]+$/),X=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),q=a(/^(?:\w+script|data):/i),$=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),K=a(/^html$/i),V=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var Z=Object.freeze({__proto__:null,ARIA_ATTR:j,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:V,DATA_ATTR:Y,DOCTYPE_NAME:K,ERB_EXPR:W,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:q,MUSTACHE_EXPR:B,TMPLIT_EXPR:G});const J=1,Q=3,ee=7,te=8,ne=9,oe=function(){return"undefined"==typeof window?null:window};var re=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe();const o=e=>t(e);if(o.version="3.2.4",o.removed=[],!n||!n.document||n.document.nodeType!==ne||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:R,Element:O,NodeFilter:B,NamedNodeMap:W=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:G,DOMParser:Y,trustedTypes:j}=n,q=O.prototype,$=v(q,"cloneNode"),V=v(q,"remove"),re=v(q,"nextSibling"),ie=v(q,"childNodes"),ae=v(q,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let le,ce="";const{implementation:se,createNodeIterator:ue,createDocumentFragment:me,getElementsByTagName:pe}=r,{importNode:fe}=a;let de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof ae&&se&&void 0!==se.createHTMLDocument;const{MUSTACHE_EXPR:he,ERB_EXPR:ge,TMPLIT_EXPR:Te,DATA_ATTR:ye,ARIA_ATTR:Ee,IS_SCRIPT_OR_DATA:Ae,ATTR_WHITESPACE:_e,CUSTOM_ELEMENT:Se}=Z;let{IS_ALLOWED_URI:be}=Z,Ne=null;const Re=w({},[...L,...C,...x,...k,...U]);let we=null;const Oe=w({},[...z,...P,...H,...F]);let De=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,Le=null,Ce=!0,xe=!0,Me=!1,ke=!0,Ie=!1,Ue=!0,ze=!1,Pe=!1,He=!1,Fe=!1,Be=!1,We=!1,Ge=!0,Ye=!1,je=!0,Xe=!1,qe={},$e=null;const Ke=w({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Ve=null;const Ze=w({},["audio","video","img","source","image","track"]);let Je=null;const Qe=w({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),et="http://www.w3.org/1998/Math/MathML",tt="http://www.w3.org/2000/svg",nt="http://www.w3.org/1999/xhtml";let ot=nt,rt=!1,it=null;const at=w({},[et,tt,nt],g);let lt=w({},["mi","mo","mn","ms","mtext"]),ct=w({},["annotation-xml"]);const st=w({},["title","style","font","a","script"]);let ut=null;const mt=["application/xhtml+xml","text/html"];let pt=null,ft=null;const dt=r.createElement("form"),ht=function(e){return e instanceof RegExp||e instanceof Function},gt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ft||ft!==e){if(e&&"object"==typeof e||(e={}),e=D(e),ut=-1===mt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,pt="application/xhtml+xml"===ut?g:h,Ne=_(e,"ALLOWED_TAGS")?w({},e.ALLOWED_TAGS,pt):Re,we=_(e,"ALLOWED_ATTR")?w({},e.ALLOWED_ATTR,pt):Oe,it=_(e,"ALLOWED_NAMESPACES")?w({},e.ALLOWED_NAMESPACES,g):at,Je=_(e,"ADD_URI_SAFE_ATTR")?w(D(Qe),e.ADD_URI_SAFE_ATTR,pt):Qe,Ve=_(e,"ADD_DATA_URI_TAGS")?w(D(Ze),e.ADD_DATA_URI_TAGS,pt):Ze,$e=_(e,"FORBID_CONTENTS")?w({},e.FORBID_CONTENTS,pt):Ke,ve=_(e,"FORBID_TAGS")?w({},e.FORBID_TAGS,pt):{},Le=_(e,"FORBID_ATTR")?w({},e.FORBID_ATTR,pt):{},qe=!!_(e,"USE_PROFILES")&&e.USE_PROFILES,Ce=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,Me=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ke=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ie=e.SAFE_FOR_TEMPLATES||!1,Ue=!1!==e.SAFE_FOR_XML,ze=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,Be=e.RETURN_DOM_FRAGMENT||!1,We=e.RETURN_TRUSTED_TYPE||!1,He=e.FORCE_BODY||!1,Ge=!1!==e.SANITIZE_DOM,Ye=e.SANITIZE_NAMED_PROPS||!1,je=!1!==e.KEEP_CONTENT,Xe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||X,ot=e.NAMESPACE||nt,lt=e.MATHML_TEXT_INTEGRATION_POINTS||lt,ct=e.HTML_INTEGRATION_POINTS||ct,De=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(De.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(De.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(De.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ie&&(xe=!1),Be&&(Fe=!0),qe&&(Ne=w({},U),we=[],!0===qe.html&&(w(Ne,L),w(we,z)),!0===qe.svg&&(w(Ne,C),w(we,P),w(we,F)),!0===qe.svgFilters&&(w(Ne,x),w(we,P),w(we,F)),!0===qe.mathMl&&(w(Ne,k),w(we,H),w(we,F))),e.ADD_TAGS&&(Ne===Re&&(Ne=D(Ne)),w(Ne,e.ADD_TAGS,pt)),e.ADD_ATTR&&(we===Oe&&(we=D(we)),w(we,e.ADD_ATTR,pt)),e.ADD_URI_SAFE_ATTR&&w(Je,e.ADD_URI_SAFE_ATTR,pt),e.FORBID_CONTENTS&&($e===Ke&&($e=D($e)),w($e,e.FORBID_CONTENTS,pt)),je&&(Ne["#text"]=!0),ze&&w(Ne,["html","head","body"]),Ne.table&&(w(Ne,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');le=e.TRUSTED_TYPES_POLICY,ce=le.createHTML("")}else void 0===le&&(le=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(j,c)),null!==le&&"string"==typeof ce&&(ce=le.createHTML(""));i&&i(e),ft=e}},Tt=w({},[...C,...x,...M]),yt=w({},[...k,...I]),Et=function(e){f(o.removed,{element:e});try{ae(e).removeChild(e)}catch(t){V(e)}},At=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Fe||Be)try{Et(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},_t=function(e){let t=null,n=null;if(He)e=""+e;else{const t=T(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ut&&ot===nt&&(e=''+e+"");const o=le?le.createHTML(e):e;if(ot===nt)try{t=(new Y).parseFromString(o,ut)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(ot,"template",null);try{t.documentElement.innerHTML=rt?ce:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),ot===nt?pe.call(t,ze?"html":"body")[0]:ze?t.documentElement:i},St=function(e){return ue.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},bt=function(e){return e instanceof G&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof W)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Nt=function(e){return"function"==typeof R&&e instanceof R};function Rt(e,t,n){u(e,(e=>{e.call(o,t,n,ft)}))}const wt=function(e){let t=null;if(Rt(de.beforeSanitizeElements,e,null),bt(e))return Et(e),!0;const n=pt(e.nodeName);if(Rt(de.uponSanitizeElement,e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return Et(e),!0;if(e.nodeType===ee)return Et(e),!0;if(Ue&&e.nodeType===te&&S(/<[/\w]/g,e.data))return Et(e),!0;if(!Ne[n]||ve[n]){if(!ve[n]&&Dt(n)){if(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n))return!1;if(De.tagNameCheck instanceof Function&&De.tagNameCheck(n))return!1}if(je&&!$e[n]){const t=ae(e)||e.parentNode,n=ie(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=$(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,re(e))}}}return Et(e),!0}return e instanceof O&&!function(e){let t=ae(e);t&&t.tagName||(t={namespaceURI:ot,tagName:"template"});const n=h(e.tagName),o=h(t.tagName);return!!it[e.namespaceURI]&&(e.namespaceURI===tt?t.namespaceURI===nt?"svg"===n:t.namespaceURI===et?"svg"===n&&("annotation-xml"===o||lt[o]):Boolean(Tt[n]):e.namespaceURI===et?t.namespaceURI===nt?"math"===n:t.namespaceURI===tt?"math"===n&&ct[o]:Boolean(yt[n]):e.namespaceURI===nt?!(t.namespaceURI===tt&&!ct[o])&&!(t.namespaceURI===et&&!lt[o])&&!yt[n]&&(st[n]||!Tt[n]):!("application/xhtml+xml"!==ut||!it[e.namespaceURI]))}(e)?(Et(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!S(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ie&&e.nodeType===Q&&(t=e.textContent,u([he,ge,Te],(e=>{t=y(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),Rt(de.afterSanitizeElements,e,null),!1):(Et(e),!0)},Ot=function(e,t,n){if(Ge&&("id"===t||"name"===t)&&(n in r||n in dt))return!1;if(xe&&!Le[t]&&S(ye,t));else if(Ce&&S(Ee,t));else if(!we[t]||Le[t]){if(!(Dt(e)&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,e)||De.tagNameCheck instanceof Function&&De.tagNameCheck(e))&&(De.attributeNameCheck instanceof RegExp&&S(De.attributeNameCheck,t)||De.attributeNameCheck instanceof Function&&De.attributeNameCheck(t))||"is"===t&&De.allowCustomizedBuiltInElements&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n)||De.tagNameCheck instanceof Function&&De.tagNameCheck(n))))return!1}else if(Je[t]);else if(S(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!Ve[e]){if(Me&&!S(Ae,y(n,_e,"")));else if(n)return!1}else;return!0},Dt=function(e){return"annotation-xml"!==e&&T(e,Se)},vt=function(e){Rt(de.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||bt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:we,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=pt(a);let m="value"===a?c:A(c);if(n.attrName=s,n.attrValue=m,n.keepAttr=!0,n.forceKeepAttr=void 0,Rt(de.uponSanitizeAttribute,e,n),m=n.attrValue,!Ye||"id"!==s&&"name"!==s||(At(a,e),m="user-content-"+m),Ue&&S(/((--!?|])>)|<\/(style|title)/i,m)){At(a,e);continue}if(n.forceKeepAttr)continue;if(At(a,e),!n.keepAttr)continue;if(!ke&&S(/\/>/i,m)){At(a,e);continue}Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")}));const f=pt(e.nodeName);if(Ot(f,s,m)){if(le&&"object"==typeof j&&"function"==typeof j.getAttributeType)if(l);else switch(j.getAttributeType(f,s)){case"TrustedHTML":m=le.createHTML(m);break;case"TrustedScriptURL":m=le.createScriptURL(m)}try{l?e.setAttributeNS(l,a,m):e.setAttribute(a,m),bt(e)?Et(e):p(o.removed)}catch(e){}}}Rt(de.afterSanitizeAttributes,e,null)},Lt=function e(t){let n=null;const o=St(t);for(Rt(de.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)Rt(de.uponSanitizeShadowNode,n,null),wt(n),vt(n),n.content instanceof s&&e(n.content);Rt(de.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(rt=!e,rt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Nt(e)){if("function"!=typeof e.toString)throw b("toString is not a function");if("string"!=typeof(e=e.toString()))throw b("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Pe||gt(t),o.removed=[],"string"==typeof e&&(Xe=!1),Xe){if(e.nodeName){const t=pt(e.nodeName);if(!Ne[t]||ve[t])throw b("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof R)n=_t("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===J&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Fe&&!Ie&&!ze&&-1===e.indexOf("<"))return le&&We?le.createHTML(e):e;if(n=_t(e),!n)return Fe?null:We?ce:""}n&&He&&Et(n.firstChild);const c=St(Xe?e:n);for(;i=c.nextNode();)wt(i),vt(i),i.content instanceof s&&Lt(i.content);if(Xe)return e;if(Fe){if(Be)for(l=me.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(we.shadowroot||we.shadowrootmode)&&(l=fe.call(a,l,!0)),l}let m=ze?n.outerHTML:n.innerHTML;return ze&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&S(K,n.ownerDocument.doctype.name)&&(m="\n"+m),Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")})),le&&We?le.createHTML(m):m},o.setConfig=function(){gt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Pe=!0},o.clearConfig=function(){ft=null,Pe=!1},o.isValidAttribute=function(e,t,n){ft||gt({});const o=pt(e),r=pt(t);return Ot(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&f(de[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(de[e],t);return-1===n?void 0:d(de[e],n,1)[0]}return p(de[e])},o.removeHooks=function(e){de[e]=[]},o.removeAllHooks=function(){de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return re})); +//# sourceMappingURL=purify.min.js.map diff --git a/public/js/purify.min.js.map b/public/js/purify.min.js.map new file mode 100644 index 0000000..6e941de --- /dev/null +++ b/public/js/purify.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"purify.min.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"} \ No newline at end of file diff --git a/public/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png b/public/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png new file mode 100644 index 0000000..e78494a Binary files /dev/null and b/public/posts/2025-03-04-dezentrale-oep-oer/dezentrale-oep-oer.png differ diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..fe3b598 --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,389 @@ + + + + + + + +Posts | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
    +
    + Ein in den Sand gezeichneter Strauß mit den Buchstaben 'OER' – ein Sinnbild für offene Bildung und freien Wissensaustausch. Die Wortspiel-Verbindung zu 'Nostr' (das dezentralisierte Kommunikationsprotokoll) liegt nahe: 'Nostr' klingt wie ein Teil von 'Ostrich' (Englisch für Strauß). So wie der Ichthys-Fisch einst als geheimes Erkennungszeichen diente, steht dieses Symbol für eine Gemeinschaft, die Wissen offen teilt – frei, unabhängig und widerstandsfähig. +
    +
    +

    Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter +

    +
    +
    +

    Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft +Warum wir eine neue Perspektive brauchen Die aktuelle digitale Bildungslandschaft gleicht einem Flickenteppich isolierter Plattformen, die zwar öffentlich zugänglich, aber jeweils unterschiedlich verortet und mit verschiedenen Laufzeiten finanziert als große Einzelprojekte im digitalen Raum stehen. Diese „Datensilos“ verhindern nicht nur die Auffindbarkeit von Ressourcen und ihre gemeinschaftliche Weiternutzung, sondern gefährden auch die Nachhaltigkeit offener Bildung: Wenn Fördergelder auslaufen, verschwinden mit den Plattformen nicht nur Materialien sondern auch wertvolle Nutzerinteraktionen wie Kommentare, Sammlungen und auch die kollaborativen Weiterentwicklungen der Bildungsmaterialien aus den Communities. +...

    +
    +
    März 4, 2025 · Jörg Lohrer, Steffen Rörtgen, Bastian Granas
    + +
    + +
    +
    + Das Foto des Roboters, der seine Reflexion im Wasser betrachtet referenziert auf Narziss aus der griechischen Mythologie, der die Liebe anderer zurückwies und sich in sein eigenes Spiegelbild verliebte und die Illustration von Caravaggio [(siehe wikipedia #Narziss)](https://de.wikipedia.org/wiki/Narziss#) erstellt mit der KI Midjourney und dem Prompt: *photographed with the Canon EOS 5D Mark IV a young robot boy with his head down, looking at his reflection in water --v6.0* +
    +
    +

    KIBedenken - Bewusstsein +

    +
    +
    +

    #KIBedenken - Bewusstsein Den für mich derzeit wichtigsten Impuls über KI nachzudenken lieferte vor einigen Wochen Yuval Noah Harari an der University of Cambridge am Ende eines Podiumsgesprächs hier ab 1:15 h auf youtube: +Ich denke, wir müssen die Frage des Bewusstseins in den Mittelpunkt der Diskussion stellen. Es gibt eine riesige, riesige Verwirrung in der Terminologie, auch in der Welt der KI, zwischen Bewusstsein und Intelligenz. Aber es sind zwei verschiedene Dinge. Intelligenz ist die Fähigkeit, Probleme zu lösen und Ziele zu erreichen. Bewusstsein ist die Fähigkeit, Dinge zu fühlen, wie Schmerz oder Freude oder Liebe oder Hass. Wir neigen dazu, die beiden zu verwechseln, weil bei Menschen und auch bei anderen Säugetieren, Vögeln und anderen Tieren Bewusstsein und Intelligenz zusammengehören. Wir lösen Probleme durch unsere Gefühle. Computer waren bisher sehr anders. Sie sind in einigen Bereichen bereits intelligenter als wir, haben aber, soweit wir wissen, kein Bewusstsein. Soweit wir wissen, können sie überhaupt keinen Schmerz, keine Freude, keine Liebe oder keinen Hass empfinden. Niemand weiß, was in Zukunft passieren wird. Es gibt Modelle und Theorien, die argumentieren, dass KIs irgendwann auch bewusst oder empfindsam werden. Sie werden anfangen, Dinge zu fühlen. Sie werden anfangen, Schmerz oder Liebe oder Hass zu empfinden. Es gibt andere Modelle und Theorien, die sagen, nein. Sie könnten weit intelligenter werden als wir und immer noch null Bewusstsein haben. Das kann in der Evolution des Lebens sein. Wenn man darüber nachdenkt, die lange Entwicklung von Milliarden von Jahren der Evolution. Die Entwicklung der Intelligenz ist im Falle von Tieren wie uns und Schimpansen und Hunden und Schweinen und so weiter durch die Entwicklung des Bewusstseins verlaufen. Aber das ist kein universelles Gesetz der Evolution der Intelligenz. Vielleicht gibt es alternative Wege, die zu Superintelligenz ohne jegliches Bewusstsein führen. Einfach einen anderen, einen fremden Weg gehen. Und wir könnten an einen Punkt gelangen, an dem sie superintelligent sind und trotzdem null Bewusstsein haben. Und die Gefahr besteht dann darin, dass sie nicht nur die menschliche Zivilisation zerstören könnten, sondern das ganze Licht des Bewusstseins, um das gesamte ökologische System nach ihren Bedürfnissen umzugestalten, wofür sie kein Bewusstsein brauchen. Sie funktionieren auf eine völlig andere Weise. Sie könnten sich sogar von der Erde auf andere Planeten, auf andere Galaxien ausbreiten. Sie werden das Universum mit Intelligenz füllen, aber es wird ein völlig dunkles Universum ohne Bewusstsein sein. Wieder hohe Intelligenz, fähig, Raumschiffe zu bauen, die mit Lichtgeschwindigkeit fliegen und was auch immer, aber es gibt null Gefühl. Niemand, keine Entität fühlt Schmerz oder Freude, Liebe oder Hass. Für mich ist das ein schreckliches Szenario. Das schlimmste Szenario von allen ist dies. Dass wir ein Universum voller Intelligenz und völlig ohne Bewusstsein haben werden, denn ich denke, dass von den beiden das Bewusstsein weitaus wichtiger, weitaus wertvoller ist. Und es ist eine gute Erinnerung daran, dass wir das zumindest heute mit vielen anderen Tieren teilen, aber nicht mit den Computern, nicht mit den KIs. Wir sind also immer noch im selben Team wie die Würmer und die Affen, nicht im selben Team wie die Computer. +...

    +
    +
    April 3, 2024 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    BottomUp -> MarkDown - 5V-Power für deine OER! +

    +
    +
    +

    Eine Session-Idee auf dem #OERcamp 24 in Hamburg Entfessele deine kreative Superkraft und erstelle Open Educational Resources (OER) mit Markdown! +In dieser Session tauchst du ein in die Welt der 5V-Freiheiten von Open Content und lernst gleichzeitig die Markdown-Sprache kennen – dein perfektes Werkzeug, um diese Freiheiten zu nutzen! +BottomUp MarkDown: Verwahren & Vervielfältigen: Gestalte direkt online ohne Software, Registrierungen oder Anmeldungen. Lade deine OER herunter, sichere sie und erstelle so viele Kopien, wie du benötigst – ganz ohne Limits! Mit Markdown speicherst du deine Inhalte im praktischen und leicht editierbaren Textformat. Verwenden: Ob im Unterricht, in Lerngruppen oder online – bringe deine OER in allen erdenklichen Kontexten zum Einsatz! Markdown macht deine Inhalte überall zugänglich und flexibel. Auch Vorlagen von Lehrenden, die Lernende übernehmen und anpassen können sind einfach bereitgestellt. Verarbeiten: Bearbeite deine Inhalte, passe sie an deine Bedürfnisse an und kreiere neue Lernmaterialien – deiner Fantasie sind keine Grenzen gesetzt! Markdown bietet dir die Freiheit, deine OER ständig weiterzuentwickeln, zu versionieren und zu verändern. Vermischen: Kombiniere deine OER mit anderen offenen Inhalten, erweitere sie mit Bildern, Videos und Musik (sogar urheberrechtlich geschützten Werken) und schaffe einzigartige Lernerlebnisse! Markdown lässt sich nahtlos mit anderen Formaten und Medien kombinieren. Verbreiten: Teile deine OER mit der Welt! Veröffentliche sie online, versende sie an Freunde und Kollegen und trage zur globalen Wissensgemeinschaft bei! Mit Markdown präsentierst du deine OER im Web in einem ansprechenden und nutzerfreundlichen Format, das barrierefrei weiternutzbar ist unanbhängig von technischer Infrastruktur oder Plattformen. In dieser Session: Entfessele die Markdown-Mania: Lerne die Syntax der Sprache kennen und erstelle im Handumdrehen deine ersten OER. Gestalte deine Inhalte mit Superkräften: Formatiere Texte, füge Bilder und Tabellen ein und erstelle interaktive Elemente. Markdown gibt dir alle Werkzeuge dafür an die Hand. Veröffentliche deine OER im Internet: Erfahre, wie du deine Materialien online zugänglich machst und mit anderen teilst. Mit Markdown ist die Veröffentlichung deiner OER ein Kinderspiel. Werde Teil der OER-Community: Vernetze dich mit anderen Lernenden und Lehrenden und profitiere vom Austausch in der Community. Gemeinsam gestalten wir die Zukunft des Lernens mit Markdown! ...

    +
    +
    März 5, 2024 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Offenheit - das Wesentliche +

    +
    +
    +

    Offenheit - das Wesentliche 1. Einleitung: Persönliche Reflexion über Offenheit Wenn ich auf das Jahr 2023 zurückblicke, gewinne ich den Eindruck, dass das Wesentliche in meinem Berufs- und Privatleben in den Verbindungen mit anderen Menschen liegt. Dashalb ist die Offenheit für Andere, mit und an denen ich lerne nicht nur ein abstraktes Ideal oder eine berufliche Anforderung, sondern ein wesentlicher Bestandteil meiner täglichen Existenz. Dieses Bewusstsein hat mich dazu inspiriert, meine Neujahrsvorsätze für 2024 um das Thema Offenheit herum zu gestalten. +...

    +
    +
    Januar 26, 2024 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    WordPress statt Padlet oder TaskCards +

    +
    +
    +

    Eine Sammlung von Liedern für den Religionsunterricht ist auf Instagram in Zusammenarbeit von @relimomente @ezpz.lemon.sqz und @colibri260 entstanden und wurde zunächst hier auf TaskCards veröffentlicht. +Weil TaskCards weder exportiert noch importiert werden können, es nur 2 kostenfreie gibt und somit kein #OER damit erstellt werden kann, haben wir uns Gedanken gemacht, wie man das Ganze in Wordpress umsetzen kann: +https://blogs.rpi-virtuell.de/rulieder Als Bonus sind +einzelnen Spalten jetzt auch in jeweiligen Kategorienseiten aufrufbar : Mensch sein, Lebensweg, Liebe / Beziehung, Gemeinschaft, Belastungen, Hoffnung / Gerechtigkeit / Frieden, Wunder, Schöpfung, Die Frage nach Gott, Tod / Jenseitsvorstellungen, Biblische Geschichten, Songs zum Kirchenjahr Es gibt eine Übersicht zu allen Lieder mit Unterrichtsimpuls von @45minuten. Und man kann weitere Lieder einreichen Alles was es dazu braucht ist: 1. “horizontales Scrollen” einfach umsetzbar mit verschiedenen WordPress-Plugins. Hier wurde der “horizontal Scroller” von Stackable benutzt. +...

    +
    +
    Juli 25, 2023 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Hefefreuden - Dampfnudeln & Minihefezopf +

    +
    +
    +

    Dampfnudeln & Minihefezopf Zutaten 400 ml Milch 120g Zucker 1 Pkg Hefe (42g) 3 Eier (ca 150g Vollei) 1000g Mehl (300g Weizen Type 405 & 700g Dinkel Type 630) 10 g Salz 120 g Butter Rezept Milch, Zucker, Hefe handwarm mischen Eier dazu und in der Knetmaschine 5 Minuten lang das Mehl unterkneten Salz dazu und die in Streifen geschnittene Butter weitere 10 Minuten verkneten Mindestens 30 Minuten gehen lassen Dampfnudeln 6 x 135g Stücke vom Teig abstechen, rundschleifen und auf gelochtes Dampfgarblech aufsetzen: weitere 30 Minuten gehen lassen dann bei 100°Celsius für 30 Minuten dampfgaren fertig mit Vanillesoße servieren Hefezopf Die restlichen ca 900-1000g Teig in 3 gleiche Teile abwiegen und zu einem Zopf flechten Mit Küchenhandtuch abgedeckt mindestens 30 Minuten gehen lassen Mit Ei abstreichen und im auf 220° vorgeheizten Backofen direkt bei einschießen auf 180° reduzieren Nach 10 Minuten Back-Temperatur auf 160° reduzieren Entweder backen bis 93° Kerntemperatur erreicht ist oder nach ca weiteren 30 Minuten

    +
    +
    April 7, 2023 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Das Gleichnis vom Sämann +

    +
    +
    +

    Das Gleichnis vom Sämann erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle +Bild 1: “Der liebevolle Sämann und die vier Böden: Eine Ernte voller Hoffnung” alternativ: Ein freundlicher Bauer steht in einem offenen Feld, eine Hand voll Samen in seiner Hand. Er streut die Samen weit und breit, um eine Ernte zu säen. Hinter ihm sieht man vier verschiedene Böden: einen felsigen, einen dornigen, einen von Vögeln umgebenen und einen fruchtbaren. +...

    +
    +
    März 23, 2023 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Jojos Schoko-Zimt-Schnecken +

    +
    +
    +

    Schoko-Schnecken Hefeteig 200g Milch handwarm ½ Pk Vanillezucker 60g Zucker 22g Hefe verrühren 1 Ei Größe L dazu in der Teigknetmaschine 120g Weizenmehl 405 380g Dinkelmehl 630 dazu und wenn es ein fester Teig ist 5g Salz zugeben und 60g Butter kalt in Streifen schneiden und 5-10 Minuten einketen (-> Fenstertest) danach Teig 30-60 Minuten ruhen/gehen lassen +Füllung in der Zwischenzeit 10g brauner Zucker 30g Rohrohrzucker 50g weißer Zucker 100g Butter ½ Pk Vanillezucker 2 Teelöffel Zimt 5 Teelöffel Kaba verkneten zu einer cremigen Masse +...

    +
    +
    Februar 26, 2023 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern +

    +
    +
    +

    Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern Instanz erstellen auf https://console.cloud.google.com/ Name, Region und Zone auswählen E2 4 vCPU, 16GB Arbeitsspeicher - 0,17$ pro Stunde Betriebssystem Ubuntu 20.04 LTS Ubuntu Desktop auf Google Cloud Plattform installieren https://ubuntu.com/blog/launch-ubuntu-desktop-on-google-cloud https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#gnome https://bytexd.com/install-chrome-remote-desktop-headless/ https://cloud.google.com/architecture/chrome-desktop-remote-on-compute-engine#automating_the_installation_process +Via SSH/Terminal Update, Tasksel und Google Remote Desktop installieren: sudo apt update sudo apt install --assume-yes wget tasksel wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb sudo apt-get install --assume-yes ./chrome-remote-desktop_current_amd64.deb Cinnamon Desktop installieren sudo DEBIAN_FRONTEND=noninteractive \ apt install --assume-yes cinnamon-core desktop-base dbus-x11 sudo bash -c 'echo "exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d" > /etc/chrome-remote-desktop-session' +...

    +
    +
    März 19, 2022 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Moodle Server mit Ubuntu 20 LTS und Iomad +

    +
    +
    +

    Moodle Server mit Ubuntu 20 LTS und Iomad Ubuntu Server-Image herunterladen https://releases.ubuntu.com/20.04/ +Virtualbox mit dem Ubuntu Image einrichten Netzwerkbrücke aktivieren IP-Adresse ermitteln ifconfig -> 192.168.178.132 +Auf dem Mac (oder PC) die Auflösung des Hosts verknüpfen auf dem Mac sudo nano /etc/hosts die IP eintragen und moodle.local zuweisen: Moodle Server auf Virtualbox vorbereiten sudo -iwechselt auf root +SSH Zugriff ermöglichen Allow SSH root login on Ubuntu 20.04 Focal Fossa Linux +...

    +
    +
    Februar 16, 2022 · Jörg Lohrer
    + +
    + +
    + + + + + + + + + + + + + + diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..987321f --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1,138 @@ + + + + Posts on Jörg Lohrer + http://localhost:1313/posts/ + Recent content in Posts on Jörg Lohrer + Hugo -- gohugo.io + de + Tue, 04 Mar 2025 00:00:00 +0000 + + + Gemeinsam die Bildungszukunft gestalten: Dezentrale OEP und OER als Wegbereiter + http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/ + Tue, 04 Mar 2025 00:00:00 +0000 + http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/ + Einladung zum offenen Denken und Handeln in der Bildungsgemeinschaft. Der Beitrag diskutiert, warum eine dezentrale Infrastruktur für Open Educational Resources (OER) und Open Educational Practices (OEP) notwendig ist, um nachhaltige, resiliente und interoperable Bildungsräume zu schaffen. Dabei wird das Potenzial des Nostr-Protokolls für Bildungsnetzwerke beleuchtet + + + KIBedenken - Bewusstsein + http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/ + Wed, 03 Apr 2024 00:00:00 +0000 + http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/ + Intelligenz oder Bewusstsein? + + + BottomUp -> MarkDown - 5V-Power für deine OER! + http://localhost:1313/2024/03/05/bottomup-markdown.html/ + Tue, 05 Mar 2024 00:00:00 +0000 + http://localhost:1313/2024/03/05/bottomup-markdown.html/ + Open Educational Resources mit MarkDown + + + Offenheit - das Wesentliche + http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/ + Fri, 26 Jan 2024 00:00:00 +0000 + http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/ + Ein Beitrag zu Teil 1 “Mein (schulisches) Motto für 2024” der EduBlogparade + + + WordPress statt Padlet oder TaskCards + http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/ + Tue, 25 Jul 2023 00:00:00 +0000 + http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/ + Mit WordPress, horizontalem Scrolling und Beitragskategorien Sammlungen im Kanban-Style erstellen + + + Hefefreuden - Dampfnudeln & Minihefezopf + http://localhost:1313/2023/04/07/dampfnudeln.html/ + Fri, 07 Apr 2023 00:00:00 +0000 + http://localhost:1313/2023/04/07/dampfnudeln.html/ + Rezept und Backanleitung + + + Das Gleichnis vom Sämann + http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/ + Thu, 23 Mar 2023 00:00:00 +0000 + http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/ + erstellt mit ChatGPT, Deepl und Midjourney Prompts im Stil von Eric Carle + + + Jojos Schoko-Zimt-Schnecken + http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/ + Sun, 26 Feb 2023 00:00:00 +0000 + http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/ + Rezept und Backanleitung + + + Auf Google Cloud Platform mit Ubuntu Desktop via Chrome Remote Desktop OBS und Zoom fernsteuern + http://localhost:1313/2022/03/19/ob-virtualcam.html/ + Sat, 19 Mar 2022 00:00:00 +0000 + http://localhost:1313/2022/03/19/ob-virtualcam.html/ + Via Konsole Instanz in aufsetzen, Desktop-Linux installieren, Apps einrichten und konfigurieren + + + Moodle Server mit Ubuntu 20 LTS und Iomad + http://localhost:1313/2022/02/16/moodle-iomad-linux.html/ + Wed, 16 Feb 2022 00:00:00 +0000 + http://localhost:1313/2022/02/16/moodle-iomad-linux.html/ + Installation von Iomad zur Moodle-Instanz-Verwaltung + + + Bibelfußball - Nachschlage-Quiz zur Bibel + http://localhost:1313/2021/12/03/bibelfussball.html/ + Fri, 03 Dec 2021 00:00:00 +0000 + http://localhost:1313/2021/12/03/bibelfussball.html/ + Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. + + + WordPress Werkstatt PHP + http://localhost:1313/2021/11/17/wordpress-werkstatt.html/ + Wed, 17 Nov 2021 00:00:00 +0000 + http://localhost:1313/2021/11/17/wordpress-werkstatt.html/ + Advanced Custom Fields und Formulareingaben + + + VR - Virtual Reality + http://localhost:1313/2021/08/15/virtual-reality.html/ + Sun, 15 Aug 2021 00:00:00 +0000 + http://localhost:1313/2021/08/15/virtual-reality.html/ + Tutorials der Oculus Quest 2 + + + Pflanzenschild mit QR-Code + http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/ + Tue, 26 Mar 2019 00:00:00 +0000 + http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/ + Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen + + + Lutherkürbis - Reformation an Halloween + http://localhost:1313/2017/10/31/lutherkuerbis.html/ + Tue, 31 Oct 2017 00:00:00 +0000 + http://localhost:1313/2017/10/31/lutherkuerbis.html/ + Schablone und Bastelanleitung für einen Kürbis zur Reformation + + + Telegram Bot für Octopi + http://localhost:1313/2017/10/23/telegram-octopi.html/ + Mon, 23 Oct 2017 00:00:00 +0000 + http://localhost:1313/2017/10/23/telegram-octopi.html/ + Schnittstelle zwischen Telegram und OctoPrint + + + Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven + http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/ + Wed, 29 May 2013 00:00:00 +0000 + http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/ + Artikel unter CC-BY Lizenz + + + Premium, Freemium, Mium mium mium + http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/ + Thu, 07 Feb 2013 00:00:00 +0000 + http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/ + Zur Produktion von sattmachenden Bildungsinhalten + + + diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html new file mode 100644 index 0000000..bca59f4 --- /dev/null +++ b/public/posts/page/1/index.html @@ -0,0 +1,10 @@ + + + + http://localhost:1313/posts/ + + + + + + diff --git a/public/posts/page/2/index.html b/public/posts/page/2/index.html new file mode 100644 index 0000000..0a17ee7 --- /dev/null +++ b/public/posts/page/2/index.html @@ -0,0 +1,349 @@ + + + + + + + +Posts | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
    +
    + +
    +
    +

    Bibelfußball - Nachschlage-Quiz zur Bibel +

    +
    +
    +

    Bibelfußball: Nachschlage-Quiz zur Bibel Bibelfußball ist ein einfaches und begeisterndes Quizduell, bei dem die Lehrperson die Klasse in zwei Hälften teilt, die wie beim Fußball gegeneinander spielen. Das Fußballfeld mit seinen entsprechenden Linien wird dabei an die Wandtafel gezeichnet und der Ball wird durch einen Magnetknopf symbolisiert. Gepunktet wird, indem der Lehrer eine Frage stellt und eine Bibelstelle nennt, die es nachzuschlagen gilt. Wer die Stelle zuerst findet und die Antwort ruft, dessen Mannschaft darf den Ball eine Linie weiterrücken in Richtung des gegnerischen Tores. Wurde ein Tor geschossen, beginnt das Spiel von neuem an der Mittellinie. ...

    +
    +
    Dezember 3, 2021 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    WordPress Werkstatt PHP +

    +
    +
    +

    WordPress Werkstatt PHP Zunächst wird auf relilab.org das kostenfreie Plugin ACF - Advanced Custom Fields installiert und aktiviert. Dies ermöglicht weitere individuelle Beitragsfelder für die Beiträge. Nun kann manuell aktiviert oder eine Feldgruppe importiert werden - hier mittels dieser JSON-Datei, die das abkürzt: mit dem Ergebnis, dass unter allen WordPress-Beiträgen jetzt zwei Terminfelder erscheinen, die ausgefüllt werden können: Zudem gibt es neu eine Kategorie “Termine”, die aktiviert werden kann mit Unterkategorien, die später Übersichtsseiten ermöglichen: Jetzt wird das Plugin relilab-termine installiert und aktiviert Nun kann mittels Shortcode [relilab_termine] eine Terminübersicht als WordPress-Block erzeugt werden: ...

    +
    +
    November 17, 2021 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    VR - Virtual Reality +

    +
    +
    +

    VR - Virtual Reality Ausschreibung Torsten & Jörg Ausgehend vom Lernbaustein https://relilab.org/vr/ beschäftigen wir uns in diesem Workshop mit Immersion und praktischen Beispielen im Themenbereich VR/AR. Neben der Vermittlung von theoretischen Grundlagen besprechen wir die Einsatzmöglichkeit im Religionsunterricht am Beispiel einer Reihe zu Schöpfungsmythen. Darüber hinnaus bieten wir die Gelegenheit zu Erfahrungsaustausch, Diskussion und exemplarischen Erlebnismöglichkeiten in der virtuellen Realität. +Theorie Immersion & Präsenz https://www.immersivelearning.institute/ https://omnia360.de/blog/was-ist-immersion/ https://en.wikipedia.org/wiki/Immersive_learning https://www.sciencedirect.com/science/article/pii/S0360131519303276 +Forschung A Public Database of 360 Videos with Corresponding Ratings of Arousal and Valence https://vhil.stanford.edu/360-video-database/ +...

    +
    +
    August 15, 2021 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Pflanzenschild mit QR-Code +

    +
    +
    +

    Pflanzenschild mit QR-Code Mit einem QR-Code-Generator lassen sich verlustfrei skalierbare Vektorgrafiken (SVG) erstellen: Dann noch mit Thingiverse ein Dreieck designen (80x40x1.4mm) und den QR-Code obendrauf: Mit dem Cura-Plugin Change Filament at Z den 3D-Druck im Layer unterbrechen, wo ein Filament(Farb)-Wechsel stattfinden soll: Et voilà:

    +
    +
    März 26, 2019 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Lutherkürbis - Reformation an Halloween +

    +
    +
    +

    Lutherkürbis - Reformation an Halloween Das Symbol der Lutherrose ist auch heute noch in vielen Wappen enthalten und wird als Dekoelement genutzt (Quelle: epd/imago) +Aus einer Fotovorlage der Lutherrose wird mit einem Online-Konverter eine Schablone als verlustfrei skalierbare Vektorgrafik erzeugt: +Lutherrose PDF-Vorlage +Bastel-Anleitung Einen Kürbis aufschneiden: entkernen und aushöhlen: Schablone aufbringen: Ausschneiden: Mit Kerze oder elektrischem Licht ausstatten: Fertig! +Diese Idee inklusive der Schablone steht unter CC0-Lizenz. Du darfst das Werk kopieren, verändern, verbreiten und aufführen, sogar zu kommerziellen Zwecken, ohne um weitere Erlaubnis bitten zu müssen. +...

    +
    +
    Oktober 31, 2017 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Telegram Bot für Octopi +

    +
    +
    +

    Das OctoPrint-Telegram-Plugin schafft eine Schnittstelle zwischen Telegram und OctoPrint. Hier die Anleitung auf Englisch: https://github.com/fabianonline/OctoPrint-Telegram/blob/stable/README.md +Das dauert eine Weile: Token eingeben: Heisst aber nicht, dass jetzt alles gleich klappt: Es müssen dem Benutzer noch die Rechte “Command” und “Notify” gegeben werden:

    +
    +
    Oktober 23, 2017 · Jörg Lohrer
    + +
    + +
    +
    +

    Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven +

    +
    +
    +

    Erlebnispädagogik im Handbuch Jugend – Evangelische Perspektiven Das Handbuch Jugend – Evangelische Perspektiven, welches 2013 erschienen ist, hat auf Seite 343-345 folgenden Artikel von mir zur Erlebnispädagogik abgedruckt. CC BY Jörg Lohrer +Erlebnispädagogik Ziele und Arbeitsformen Erlebnispädagogik arbeitet mit einem pädagogischen Konzept zielorientiert und bevorzugt in der Natur oder dem naturnahen Raum vorrangig an der Förderung von Selbst- und Sozialkompetenzen. Dabei grenzt sich Erlebnispädagogik bewusst von ‚Nervenkitzel-Aktionismus‘ und der eskalierenden Suche nach dem Kick nach immer mehr und phantastischeren Erlebnissen ab. Die Förderung von Zutrauen in die eigenen Fähigkeiten, der Umgang mit Ängsten, das Erfahren und Überwinden von Grenzen, die Vemittlung von sozialen Kompetenzen können Zielsetzungen für erlebnispädagogische Maßnahmen in der evangelischen Jugendbildung sein. Dabei geht es auch immer um eine Erweiterung der eigenen Handlungskompetenzen zur Lebensbewältigung durch ein angstfreies Lernen in der Gruppe. +...

    +
    +
    Mai 29, 2013 · Jörg Lohrer
    + +
    + +
    +
    + +
    +
    +

    Premium, Freemium, Mium mium mium +

    +
    +
    +

    Premium, Freemium, Mium mium mium Wer leckere Bildungsangebote macht, findet immer reichlich Abnehmer. Und im digitalen Zeitalter kann ein einzelnes Produkt dank der vorhandenen Replikatormaschinen unendlich vervielfacht konsumiert werden. Das ist kein Traum mehr, sondern längst cloudgewordene Wirklichkeit. +Nun wird versucht über ein komplexes Rechtemanagement den Produzenten ein lukratives Einkommen zu sichern. Doch während im Dienstleitungssektor der Bildung die einen noch an Vertriebswegen tüfteln, sind die Teilnehmenden in den offenen und massiven Online-Kursen (MOOCs) schon einen Schritt weiter. Hier wird allmählich begriffen, dass nicht die Her- und Bereitstellung, Aufbereitung und didaktische Darbietung von Bildung sich in barer Münze auszahlt, sondern das vernetzende Lernen selbst, also der Prozess, die eigentliche Qualität darstellt, die ihr Geld wirklich wert wäre. +...

    +
    +
    Februar 7, 2013 · Jörg Lohrer
    + +
    + +
    + + + + + + + + + + + + + + diff --git a/public/search/index.html b/public/search/index.html new file mode 100644 index 0000000..7e661ff --- /dev/null +++ b/public/search/index.html @@ -0,0 +1,223 @@ + + + + + + + +Suche | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + + +
    + + + + + + + + + + + + + + diff --git a/public/series/index.html b/public/series/index.html new file mode 100644 index 0000000..b8a22b9 --- /dev/null +++ b/public/series/index.html @@ -0,0 +1,213 @@ + + + + + + + +Series | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
      +
    +
    + + + + + + + + + + + + + + diff --git a/public/series/index.xml b/public/series/index.xml new file mode 100644 index 0000000..8fefb57 --- /dev/null +++ b/public/series/index.xml @@ -0,0 +1,11 @@ + + + + Series on Jörg Lohrer + http://localhost:1313/series/ + Recent content in Series on Jörg Lohrer + Hugo -- gohugo.io + de + + + diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..7838fb0 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,78 @@ + + + + http://localhost:1313/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/ + 2025-03-04T00:00:00+00:00 + + http://localhost:1313/ + 2025-03-04T00:00:00+00:00 + + http://localhost:1313/posts/ + 2025-03-04T00:00:00+00:00 + + http://localhost:1313/2024/04/03/kibedenken-bewusstsein.html/ + 2024-04-03T00:00:00+00:00 + + http://localhost:1313/2024/03/05/bottomup-markdown.html/ + 2024-03-05T00:00:00+00:00 + + http://localhost:1313/2024/01/26/offenheit-das-wesentliche.html/ + 2024-01-26T00:00:00+00:00 + + http://localhost:1313/2023/07/25/wordpress-statt-padlet-oder-taskcards.html/ + 2023-07-25T00:00:00+00:00 + + http://localhost:1313/2023/04/07/dampfnudeln.html/ + 2023-04-07T00:00:00+00:00 + + http://localhost:1313/2023/03/23/gleichnis-vom-saemann.html/ + 2023-03-23T00:00:00+00:00 + + http://localhost:1313/2023/02/26/jojos-schoko-zimt-schnecken.html/ + 2023-02-26T00:00:00+00:00 + + http://localhost:1313/2022/03/19/ob-virtualcam.html/ + 2022-03-19T00:00:00+00:00 + + http://localhost:1313/2022/02/16/moodle-iomad-linux.html/ + 2022-02-16T00:00:00+00:00 + + http://localhost:1313/2021/12/03/bibelfussball.html/ + 2021-12-03T00:00:00+00:00 + + http://localhost:1313/2021/11/17/wordpress-werkstatt.html/ + 2021-11-17T00:00:00+00:00 + + http://localhost:1313/2021/08/15/virtual-reality.html/ + 2021-08-15T00:00:00+00:00 + + http://localhost:1313/2019/03/26/pflanzenschild-qr-code.html/ + 2019-03-26T00:00:00+00:00 + + http://localhost:1313/2017/10/31/lutherkuerbis.html/ + 2017-10-31T00:00:00+00:00 + + http://localhost:1313/2017/10/23/telegram-octopi.html/ + 2017-10-23T00:00:00+00:00 + + http://localhost:1313/2013/05/29/erlebnispadagogik-im-handbuch-jugend-evangelische-perspektive.html/ + 2013-05-29T00:00:00+00:00 + + http://localhost:1313/2013/02/07/premium-freemium-mium-mium-mium.html/ + 2013-02-07T00:00:00+00:00 + + http://localhost:1313/impressum/ + 2013-01-01T00:00:00+00:00 + + http://localhost:1313/archives/ + + http://localhost:1313/category/ + + http://localhost:1313/series/ + + http://localhost:1313/search/ + + http://localhost:1313/tag/ + + diff --git a/public/tag/index.html b/public/tag/index.html new file mode 100644 index 0000000..1b35a6c --- /dev/null +++ b/public/tag/index.html @@ -0,0 +1,213 @@ + + + + + + + +Tag | Jörg Lohrer + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
      +
    +
    + + + + + + + + + + + + + + diff --git a/public/tag/index.xml b/public/tag/index.xml new file mode 100644 index 0000000..e6a2a71 --- /dev/null +++ b/public/tag/index.xml @@ -0,0 +1,11 @@ + + + + Tag on Jörg Lohrer + http://localhost:1313/tag/ + Recent content in Tag on Jörg Lohrer + Hugo -- gohugo.io + de + + + diff --git a/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg new file mode 100644 index 0000000..b3e600e Binary files /dev/null and b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_462c59f0b44c0605.jpg differ diff --git a/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg new file mode 100644 index 0000000..4ae2037 Binary files /dev/null and b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_6cfc5d8c25698662.jpg differ diff --git a/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg new file mode 100644 index 0000000..17a7b53 Binary files /dev/null and b/resources/_gen/images/2013/02/07/premium-freemium-mium-mium-mium.html/my-very-hungry-caterpillar_hu_ab0726ad94ee6ecc.jpg differ diff --git a/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png new file mode 100644 index 0000000..37cfe5c Binary files /dev/null and b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_3949ad182f9e856f.png differ diff --git a/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png new file mode 100644 index 0000000..1e54a3e Binary files /dev/null and b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_81f00315a449d1b.png differ diff --git a/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png new file mode 100644 index 0000000..5f42f4e Binary files /dev/null and b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_a40f896992ee71ac.png differ diff --git a/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png new file mode 100644 index 0000000..20b1014 Binary files /dev/null and b/resources/_gen/images/2017/10/23/telegram-octopi.html/octopi1_hu_d8c902d783b3636a.png differ diff --git a/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg b/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg new file mode 100644 index 0000000..2c7c874 Binary files /dev/null and b/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_965dae2ff919693a.jpg differ diff --git a/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg b/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg new file mode 100644 index 0000000..3cac92d Binary files /dev/null and b/resources/_gen/images/2017/10/31/lutherkuerbis.html/kuerbis-titelbild_hu_fd21564383e7b35c.jpg differ diff --git a/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png new file mode 100644 index 0000000..8ba8641 Binary files /dev/null and b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_40cb6f992a53cf7e.png differ diff --git a/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png new file mode 100644 index 0000000..fed01ea Binary files /dev/null and b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_729a4c80e7af4ca2.png differ diff --git a/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png new file mode 100644 index 0000000..20e0a00 Binary files /dev/null and b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_7c08e12c66e85b4f.png differ diff --git a/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png new file mode 100644 index 0000000..d0cc21d Binary files /dev/null and b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_beccc64376258d22.png differ diff --git a/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png new file mode 100644 index 0000000..474c8fb Binary files /dev/null and b/resources/_gen/images/2019/03/26/pflanzenschild-qr-code.html/cura-plugin-change-filment-at-z_hu_c8825be8d784bc2e.png differ diff --git a/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg new file mode 100644 index 0000000..f6a9e66 Binary files /dev/null and b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_1dfcfe78fc9fe5e3.jpg differ diff --git a/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg new file mode 100644 index 0000000..1735075 Binary files /dev/null and b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_5d6d9484efaef630.jpg differ diff --git a/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg new file mode 100644 index 0000000..8bac4bb Binary files /dev/null and b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_b0d515763010e548.jpg differ diff --git a/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg new file mode 100644 index 0000000..e5584f6 Binary files /dev/null and b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_c760999d4152ea8d.jpg differ diff --git a/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg new file mode 100644 index 0000000..83aab92 Binary files /dev/null and b/resources/_gen/images/2021/08/15/virtual-reality.html/04-aframe_hu_fd29f0a2d5d5d6c5.jpg differ diff --git a/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png new file mode 100644 index 0000000..3036164 Binary files /dev/null and b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_10d171ed75ea1064.png differ diff --git a/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png new file mode 100644 index 0000000..62b73d3 Binary files /dev/null and b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_76b59ae104e8ad4.png differ diff --git a/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png new file mode 100644 index 0000000..35a478b Binary files /dev/null and b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_d84b3ea31f65de04.png differ diff --git a/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png new file mode 100644 index 0000000..958fc04 Binary files /dev/null and b/resources/_gen/images/2021/11/17/wordpress-werkstatt.html/04-termine-neu_hu_ecfff05140c1e1bf.png differ diff --git a/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png new file mode 100644 index 0000000..b6fcb7d Binary files /dev/null and b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_69d21ef4a17ef29f.png differ diff --git a/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png new file mode 100644 index 0000000..021ab56 Binary files /dev/null and b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_8de13e8b84e096da.png differ diff --git a/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png new file mode 100644 index 0000000..a0300b7 Binary files /dev/null and b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_cfc0d14e0ade4d5d.png differ diff --git a/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png new file mode 100644 index 0000000..9a76e4f Binary files /dev/null and b/resources/_gen/images/2021/12/03/bibelfussball.html/bibelfussball1_hu_e5c07b8f3cc53a7c.png differ diff --git a/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif new file mode 100644 index 0000000..c1fbeb3 Binary files /dev/null and b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_43abefe0d448fea9.gif differ diff --git a/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif new file mode 100644 index 0000000..c8bab1a Binary files /dev/null and b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_4dee7bac889e75c.gif differ diff --git a/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif new file mode 100644 index 0000000..a297e4a Binary files /dev/null and b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_678411e5b6d7a72f.gif differ diff --git a/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif new file mode 100644 index 0000000..b2cb5be Binary files /dev/null and b/resources/_gen/images/2022/02/16/moodle-iomad-linux.html/title-gif_hu_bf4f906b30475a32.gif differ diff --git a/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg new file mode 100644 index 0000000..7ef92a8 Binary files /dev/null and b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_501dd4177a668bc.jpg differ diff --git a/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg new file mode 100644 index 0000000..4b63a37 Binary files /dev/null and b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_8c2a859da22221b6.jpg differ diff --git a/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg new file mode 100644 index 0000000..14e7d6d Binary files /dev/null and b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_b440119272b11c89.jpg differ diff --git a/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg new file mode 100644 index 0000000..3e54163 Binary files /dev/null and b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e6e295f9945366aa.jpg differ diff --git a/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg new file mode 100644 index 0000000..d3ca19f Binary files /dev/null and b/resources/_gen/images/2022/03/19/ob-virtualcam.html/29-autostartordner_hu_e9a6869798f2e72b.jpg differ diff --git a/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg new file mode 100644 index 0000000..9664230 Binary files /dev/null and b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_ae30c829f5365f12.jpg differ diff --git a/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg new file mode 100644 index 0000000..6888e8f Binary files /dev/null and b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_bd1cc2d0e9ee9609.jpg differ diff --git a/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg new file mode 100644 index 0000000..0703a7c Binary files /dev/null and b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_c37b70d4e207a955.jpg differ diff --git a/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg new file mode 100644 index 0000000..961516d Binary files /dev/null and b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_f74390a8e3a232d.jpg differ diff --git a/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg new file mode 100644 index 0000000..bd91bee Binary files /dev/null and b/resources/_gen/images/2023/02/26/jojos-schoko-zimt-schnecken.html/schneckennudeln-titel_hu_fb9280ee4a63fc1a.jpg differ diff --git a/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg new file mode 100644 index 0000000..5e628a0 Binary files /dev/null and b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_2cdc86888799663e.jpg differ diff --git a/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg new file mode 100644 index 0000000..d24c97c Binary files /dev/null and b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_7f1e56efa7effbaf.jpg differ diff --git a/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg new file mode 100644 index 0000000..f07c937 Binary files /dev/null and b/resources/_gen/images/2023/03/23/gleichnis-vom-saemann.html/saemann-title_hu_cdb4758e4816ceeb.jpg differ diff --git a/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg new file mode 100644 index 0000000..79d44b8 Binary files /dev/null and b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_2de206b506beeb0b.jpg differ diff --git a/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg new file mode 100644 index 0000000..c88fbaf Binary files /dev/null and b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_50b88d6e688e4f04.jpg differ diff --git a/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg new file mode 100644 index 0000000..e2756ce Binary files /dev/null and b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_7171013652ec903f.jpg differ diff --git a/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg new file mode 100644 index 0000000..be0c992 Binary files /dev/null and b/resources/_gen/images/2023/04/07/dampfnudeln.html/Hefefreuden_hu_aea43730e0a654f7.jpg differ diff --git a/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png new file mode 100644 index 0000000..94249ab Binary files /dev/null and b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_9f8387cc36991f0b.png differ diff --git a/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png new file mode 100644 index 0000000..461f7fd Binary files /dev/null and b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_dfa0a93531bbd5ec.png differ diff --git a/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png new file mode 100644 index 0000000..b7c0601 Binary files /dev/null and b/resources/_gen/images/2024/01/26/offenheit-das-wesentliche.html/offenheit-wesentlich_hu_e9d2e1e0a4ad2353.png differ diff --git a/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png new file mode 100644 index 0000000..6af802a Binary files /dev/null and b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_416a995fc1e1a178.png differ diff --git a/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png new file mode 100644 index 0000000..1d21918 Binary files /dev/null and b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_646ea7b88a9cd64b.png differ diff --git a/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png new file mode 100644 index 0000000..2cc48e2 Binary files /dev/null and b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_654ee7bc51ec82a3.png differ diff --git a/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png new file mode 100644 index 0000000..109d84a Binary files /dev/null and b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_bf20d8d38d5b89b3.png differ diff --git a/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png new file mode 100644 index 0000000..c4f0ee1 Binary files /dev/null and b/resources/_gen/images/2024/03/05/bottomup-markdown.html/bottomup-markdown_hu_e741eb9eecca2f90.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu1330295933764801991.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu1330295933764801991.png new file mode 100644 index 0000000..69d246b Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu1330295933764801991.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2254589655933059499.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2254589655933059499.png new file mode 100644 index 0000000..a170e31 Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2254589655933059499.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2679023933623724386.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2679023933623724386.png new file mode 100644 index 0000000..0c531e5 Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu2679023933623724386.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png new file mode 100644 index 0000000..a170e31 Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_11a75069a9c1aee8.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png new file mode 100644 index 0000000..69d246b Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_3b73dc800dd9f742.png differ diff --git a/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png new file mode 100644 index 0000000..0c531e5 Binary files /dev/null and b/resources/_gen/images/2024/04/03/kibedenken-bewusstsein.html/kibedenken_hu_c6fdb364e96b682f.png differ diff --git a/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png new file mode 100644 index 0000000..99ff94d Binary files /dev/null and b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_13b04365feb44576.png differ diff --git a/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png new file mode 100644 index 0000000..14fd20e Binary files /dev/null and b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_36c2284576ffc16a.png differ diff --git a/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png new file mode 100644 index 0000000..dda0f3a Binary files /dev/null and b/resources/_gen/images/2025/03/04/gemeinsam-die-bildungszukunft-gestalten-dezentrale-oep-und-oer-als-wegbereiter.html/dezentrale-oep-oer_hu_fe493968681d734.png differ diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100755 index 0000000..bf8f3d8 Binary files /dev/null and b/static/android-chrome-192x192.png differ diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png new file mode 100755 index 0000000..ec3a77c Binary files /dev/null and b/static/android-chrome-512x512.png differ diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100755 index 0000000..af60fcd Binary files /dev/null and b/static/apple-touch-icon.png differ diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png new file mode 100755 index 0000000..7411c58 Binary files /dev/null and b/static/favicon-16x16.png differ diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100755 index 0000000..37aeaa5 Binary files /dev/null and b/static/favicon-32x32.png differ diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100755 index 0000000..58e9669 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/joerg-profil-2024.webp b/static/joerg-profil-2024.webp new file mode 100644 index 0000000..c025a5f Binary files /dev/null and b/static/joerg-profil-2024.webp differ diff --git a/static/js/purify.js b/static/js/purify.js new file mode 100644 index 0000000..a03f326 --- /dev/null +++ b/static/js/purify.js @@ -0,0 +1,1346 @@ +/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory()); +})(this, (function () { 'use strict'; + + const { + entries, + setPrototypeOf, + isFrozen, + getPrototypeOf, + getOwnPropertyDescriptor + } = Object; + let { + freeze, + seal, + create + } = Object; // eslint-disable-line import/no-mutable-exports + let { + apply, + construct + } = typeof Reflect !== 'undefined' && Reflect; + if (!freeze) { + freeze = function freeze(x) { + return x; + }; + } + if (!seal) { + seal = function seal(x) { + return x; + }; + } + if (!apply) { + apply = function apply(fun, thisValue, args) { + return fun.apply(thisValue, args); + }; + } + if (!construct) { + construct = function construct(Func, args) { + return new Func(...args); + }; + } + const arrayForEach = unapply(Array.prototype.forEach); + const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf); + const arrayPop = unapply(Array.prototype.pop); + const arrayPush = unapply(Array.prototype.push); + const arraySplice = unapply(Array.prototype.splice); + const stringToLowerCase = unapply(String.prototype.toLowerCase); + const stringToString = unapply(String.prototype.toString); + const stringMatch = unapply(String.prototype.match); + const stringReplace = unapply(String.prototype.replace); + const stringIndexOf = unapply(String.prototype.indexOf); + const stringTrim = unapply(String.prototype.trim); + const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty); + const regExpTest = unapply(RegExp.prototype.test); + const typeErrorCreate = unconstruct(TypeError); + /** + * Creates a new function that calls the given function with a specified thisArg and arguments. + * + * @param func - The function to be wrapped and called. + * @returns A new function that calls the given function with a specified thisArg and arguments. + */ + function unapply(func) { + return function (thisArg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return apply(func, thisArg, args); + }; + } + /** + * Creates a new function that constructs an instance of the given constructor function with the provided arguments. + * + * @param func - The constructor function to be wrapped and called. + * @returns A new function that constructs an instance of the given constructor function with the provided arguments. + */ + function unconstruct(func) { + return function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return construct(func, args); + }; + } + /** + * Add properties to a lookup table + * + * @param set - The set to which elements will be added. + * @param array - The array containing elements to be added to the set. + * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set. + * @returns The modified set with added elements. + */ + function addToSet(set, array) { + let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase; + if (setPrototypeOf) { + // Make 'in' and truthy checks like Boolean(set.constructor) + // independent of any properties defined on Object.prototype. + // Prevent prototype setters from intercepting set as a this value. + setPrototypeOf(set, null); + } + let l = array.length; + while (l--) { + let element = array[l]; + if (typeof element === 'string') { + const lcElement = transformCaseFunc(element); + if (lcElement !== element) { + // Config presets (e.g. tags.js, attrs.js) are immutable. + if (!isFrozen(array)) { + array[l] = lcElement; + } + element = lcElement; + } + } + set[element] = true; + } + return set; + } + /** + * Clean up an array to harden against CSPP + * + * @param array - The array to be cleaned. + * @returns The cleaned version of the array + */ + function cleanArray(array) { + for (let index = 0; index < array.length; index++) { + const isPropertyExist = objectHasOwnProperty(array, index); + if (!isPropertyExist) { + array[index] = null; + } + } + return array; + } + /** + * Shallow clone an object + * + * @param object - The object to be cloned. + * @returns A new object that copies the original. + */ + function clone(object) { + const newObject = create(null); + for (const [property, value] of entries(object)) { + const isPropertyExist = objectHasOwnProperty(object, property); + if (isPropertyExist) { + if (Array.isArray(value)) { + newObject[property] = cleanArray(value); + } else if (value && typeof value === 'object' && value.constructor === Object) { + newObject[property] = clone(value); + } else { + newObject[property] = value; + } + } + } + return newObject; + } + /** + * This method automatically checks if the prop is function or getter and behaves accordingly. + * + * @param object - The object to look up the getter function in its prototype chain. + * @param prop - The property name for which to find the getter function. + * @returns The getter function found in the prototype chain or a fallback function. + */ + function lookupGetter(object, prop) { + while (object !== null) { + const desc = getOwnPropertyDescriptor(object, prop); + if (desc) { + if (desc.get) { + return unapply(desc.get); + } + if (typeof desc.value === 'function') { + return unapply(desc.value); + } + } + object = getPrototypeOf(object); + } + function fallbackValue() { + return null; + } + return fallbackValue; + } + + const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); + const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']); + const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); + // List of SVG elements that are disallowed by default. + // We still need to know them so that we can do namespace + // checks properly in case one wants to add them to + // allow-list. + const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']); + const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']); + // Similarly to SVG, we want to know all MathML elements, + // even those that we disallow by default. + const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']); + const text = freeze(['#text']); + + const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']); + const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']); + const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']); + const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']); + + // eslint-disable-next-line unicorn/better-regex + const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode + const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); + const TMPLIT_EXPR = seal(/\$\{[\w\W]*/gm); // eslint-disable-line unicorn/better-regex + const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape + const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape + const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape + ); + const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); + const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex + ); + const DOCTYPE_NAME = seal(/^html$/i); + const CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i); + + var EXPRESSIONS = /*#__PURE__*/Object.freeze({ + __proto__: null, + ARIA_ATTR: ARIA_ATTR, + ATTR_WHITESPACE: ATTR_WHITESPACE, + CUSTOM_ELEMENT: CUSTOM_ELEMENT, + DATA_ATTR: DATA_ATTR, + DOCTYPE_NAME: DOCTYPE_NAME, + ERB_EXPR: ERB_EXPR, + IS_ALLOWED_URI: IS_ALLOWED_URI, + IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA, + MUSTACHE_EXPR: MUSTACHE_EXPR, + TMPLIT_EXPR: TMPLIT_EXPR + }); + + /* eslint-disable @typescript-eslint/indent */ + // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + const NODE_TYPE = { + element: 1, + attribute: 2, + text: 3, + cdataSection: 4, + entityReference: 5, + // Deprecated + entityNode: 6, + // Deprecated + progressingInstruction: 7, + comment: 8, + document: 9, + documentType: 10, + documentFragment: 11, + notation: 12 // Deprecated + }; + const getGlobal = function getGlobal() { + return typeof window === 'undefined' ? null : window; + }; + /** + * Creates a no-op policy for internal use only. + * Don't export this function outside this module! + * @param trustedTypes The policy factory. + * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix). + * @return The policy created (or null, if Trusted Types + * are not supported or creating the policy failed). + */ + const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) { + if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') { + return null; + } + // Allow the callers to control the unique policy name + // by adding a data-tt-policy-suffix to the script element with the DOMPurify. + // Policy creation with duplicate names throws in Trusted Types. + let suffix = null; + const ATTR_NAME = 'data-tt-policy-suffix'; + if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) { + suffix = purifyHostElement.getAttribute(ATTR_NAME); + } + const policyName = 'dompurify' + (suffix ? '#' + suffix : ''); + try { + return trustedTypes.createPolicy(policyName, { + createHTML(html) { + return html; + }, + createScriptURL(scriptUrl) { + return scriptUrl; + } + }); + } catch (_) { + // Policy creation failed (most likely another DOMPurify script has + // already run). Skip creating the policy, as this will only cause errors + // if TT are enforced. + console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); + return null; + } + }; + const _createHooksMap = function _createHooksMap() { + return { + afterSanitizeAttributes: [], + afterSanitizeElements: [], + afterSanitizeShadowDOM: [], + beforeSanitizeAttributes: [], + beforeSanitizeElements: [], + beforeSanitizeShadowDOM: [], + uponSanitizeAttribute: [], + uponSanitizeElement: [], + uponSanitizeShadowNode: [] + }; + }; + function createDOMPurify() { + let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); + const DOMPurify = root => createDOMPurify(root); + DOMPurify.version = '3.2.4'; + DOMPurify.removed = []; + if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) { + // Not running in a browser, provide a factory function + // so that you can pass your own Window + DOMPurify.isSupported = false; + return DOMPurify; + } + let { + document + } = window; + const originalDocument = document; + const currentScript = originalDocument.currentScript; + const { + DocumentFragment, + HTMLTemplateElement, + Node, + Element, + NodeFilter, + NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap, + HTMLFormElement, + DOMParser, + trustedTypes + } = window; + const ElementPrototype = Element.prototype; + const cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); + const remove = lookupGetter(ElementPrototype, 'remove'); + const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); + const getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); + const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); + // As per issue #47, the web-components registry is inherited by a + // new document created via createHTMLDocument. As per the spec + // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries) + // a new empty registry is used when creating a template contents owner + // document, so we use that as our parent document to ensure nothing + // is inherited. + if (typeof HTMLTemplateElement === 'function') { + const template = document.createElement('template'); + if (template.content && template.content.ownerDocument) { + document = template.content.ownerDocument; + } + } + let trustedTypesPolicy; + let emptyHTML = ''; + const { + implementation, + createNodeIterator, + createDocumentFragment, + getElementsByTagName + } = document; + const { + importNode + } = originalDocument; + let hooks = _createHooksMap(); + /** + * Expose whether this browser supports running the full DOMPurify. + */ + DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined; + const { + MUSTACHE_EXPR, + ERB_EXPR, + TMPLIT_EXPR, + DATA_ATTR, + ARIA_ATTR, + IS_SCRIPT_OR_DATA, + ATTR_WHITESPACE, + CUSTOM_ELEMENT + } = EXPRESSIONS; + let { + IS_ALLOWED_URI: IS_ALLOWED_URI$1 + } = EXPRESSIONS; + /** + * We consider the elements and attributes below to be safe. Ideally + * don't add any new ones but feel free to remove unwanted ones. + */ + /* allowed element names */ + let ALLOWED_TAGS = null; + const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); + /* Allowed attribute names */ + let ALLOWED_ATTR = null; + const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); + /* + * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements. + * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements) + * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list) + * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`. + */ + let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, { + tagNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + attributeNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + allowCustomizedBuiltInElements: { + writable: true, + configurable: false, + enumerable: true, + value: false + } + })); + /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */ + let FORBID_TAGS = null; + /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */ + let FORBID_ATTR = null; + /* Decide if ARIA attributes are okay */ + let ALLOW_ARIA_ATTR = true; + /* Decide if custom data attributes are okay */ + let ALLOW_DATA_ATTR = true; + /* Decide if unknown protocols are okay */ + let ALLOW_UNKNOWN_PROTOCOLS = false; + /* Decide if self-closing tags in attributes are allowed. + * Usually removed due to a mXSS issue in jQuery 3.0 */ + let ALLOW_SELF_CLOSE_IN_ATTR = true; + /* Output should be safe for common template engines. + * This means, DOMPurify removes data attributes, mustaches and ERB + */ + let SAFE_FOR_TEMPLATES = false; + /* Output should be safe even for XML used within HTML and alike. + * This means, DOMPurify removes comments when containing risky content. + */ + let SAFE_FOR_XML = true; + /* Decide if document with ... should be returned */ + let WHOLE_DOCUMENT = false; + /* Track whether config is already set on this instance of DOMPurify. */ + let SET_CONFIG = false; + /* Decide if all elements (e.g. style, script) must be children of + * document.body. By default, browsers might move them to document.head */ + let FORCE_BODY = false; + /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported). + * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead + */ + let RETURN_DOM = false; + /* Decide if a DOM `DocumentFragment` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported) */ + let RETURN_DOM_FRAGMENT = false; + /* Try to return a Trusted Type object instead of a string, return a string in + * case Trusted Types are not supported */ + let RETURN_TRUSTED_TYPE = false; + /* Output should be free from DOM clobbering attacks? + * This sanitizes markups named with colliding, clobberable built-in DOM APIs. + */ + let SANITIZE_DOM = true; + /* Achieve full DOM Clobbering protection by isolating the namespace of named + * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules. + * + * HTML/DOM spec rules that enable DOM Clobbering: + * - Named Access on Window (§7.3.3) + * - DOM Tree Accessors (§3.1.5) + * - Form Element Parent-Child Relations (§4.10.3) + * - Iframe srcdoc / Nested WindowProxies (§4.8.5) + * - HTMLCollection (§4.2.10.2) + * + * Namespace isolation is implemented by prefixing `id` and `name` attributes + * with a constant string, i.e., `user-content-` + */ + let SANITIZE_NAMED_PROPS = false; + const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-'; + /* Keep element content when removing element? */ + let KEEP_CONTENT = true; + /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead + * of importing it into a new Document and returning a sanitized copy */ + let IN_PLACE = false; + /* Allow usage of profiles like html, svg and mathMl */ + let USE_PROFILES = {}; + /* Tags to ignore content of when KEEP_CONTENT is true */ + let FORBID_CONTENTS = null; + const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']); + /* Tags that are safe for data: URIs */ + let DATA_URI_TAGS = null; + const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); + /* Attributes safe for values like "javascript:" */ + let URI_SAFE_ATTRIBUTES = null; + const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']); + const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; + const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; + const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; + /* Document namespace */ + let NAMESPACE = HTML_NAMESPACE; + let IS_EMPTY_INPUT = false; + /* Allowed XHTML+XML namespaces */ + let ALLOWED_NAMESPACES = null; + const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString); + let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); + let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']); + // Certain elements are allowed in both SVG and HTML + // namespace. We need to specify them explicitly + // so that they don't get erroneously deleted from + // HTML namespace. + const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']); + /* Parsing of strict XHTML documents */ + let PARSER_MEDIA_TYPE = null; + const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html']; + const DEFAULT_PARSER_MEDIA_TYPE = 'text/html'; + let transformCaseFunc = null; + /* Keep a reference to config to pass to hooks */ + let CONFIG = null; + /* Ideally, do not touch anything below this line */ + /* ______________________________________________ */ + const formElement = document.createElement('form'); + const isRegexOrFunction = function isRegexOrFunction(testValue) { + return testValue instanceof RegExp || testValue instanceof Function; + }; + /** + * _parseConfig + * + * @param cfg optional config literal + */ + // eslint-disable-next-line complexity + const _parseConfig = function _parseConfig() { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (CONFIG && CONFIG === cfg) { + return; + } + /* Shield configuration object from tampering */ + if (!cfg || typeof cfg !== 'object') { + cfg = {}; + } + /* Shield configuration object from prototype pollution */ + cfg = clone(cfg); + PARSER_MEDIA_TYPE = + // eslint-disable-next-line unicorn/prefer-includes + SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE; + // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is. + transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase; + /* Set configuration parameters */ + ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS; + ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR; + ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES; + URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES; + DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS; + FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS; + FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {}; + FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {}; + USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false; + ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true + ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true + ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false + ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true + SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false + SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true + WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false + RETURN_DOM = cfg.RETURN_DOM || false; // Default false + RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false + RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false + FORCE_BODY = cfg.FORCE_BODY || false; // Default false + SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true + SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false + KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true + IN_PLACE = cfg.IN_PLACE || false; // Default false + IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI; + NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; + MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS; + HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS; + CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {}; + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { + CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { + CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') { + CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; + } + if (SAFE_FOR_TEMPLATES) { + ALLOW_DATA_ATTR = false; + } + if (RETURN_DOM_FRAGMENT) { + RETURN_DOM = true; + } + /* Parse profile info */ + if (USE_PROFILES) { + ALLOWED_TAGS = addToSet({}, text); + ALLOWED_ATTR = []; + if (USE_PROFILES.html === true) { + addToSet(ALLOWED_TAGS, html$1); + addToSet(ALLOWED_ATTR, html); + } + if (USE_PROFILES.svg === true) { + addToSet(ALLOWED_TAGS, svg$1); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.svgFilters === true) { + addToSet(ALLOWED_TAGS, svgFilters); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.mathMl === true) { + addToSet(ALLOWED_TAGS, mathMl$1); + addToSet(ALLOWED_ATTR, mathMl); + addToSet(ALLOWED_ATTR, xml); + } + } + /* Merge configuration parameters */ + if (cfg.ADD_TAGS) { + if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { + ALLOWED_TAGS = clone(ALLOWED_TAGS); + } + addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc); + } + if (cfg.ADD_ATTR) { + if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { + ALLOWED_ATTR = clone(ALLOWED_ATTR); + } + addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc); + } + if (cfg.ADD_URI_SAFE_ATTR) { + addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc); + } + if (cfg.FORBID_CONTENTS) { + if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { + FORBID_CONTENTS = clone(FORBID_CONTENTS); + } + addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc); + } + /* Add #text in case KEEP_CONTENT is set to true */ + if (KEEP_CONTENT) { + ALLOWED_TAGS['#text'] = true; + } + /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */ + if (WHOLE_DOCUMENT) { + addToSet(ALLOWED_TAGS, ['html', 'head', 'body']); + } + /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */ + if (ALLOWED_TAGS.table) { + addToSet(ALLOWED_TAGS, ['tbody']); + delete FORBID_TAGS.tbody; + } + if (cfg.TRUSTED_TYPES_POLICY) { + if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + } + if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + } + // Overwrite existing TrustedTypes policy. + trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY; + // Sign local variables required by `sanitize`. + emptyHTML = trustedTypesPolicy.createHTML(''); + } else { + // Uninitialized policy, attempt to initialize the internal dompurify policy. + if (trustedTypesPolicy === undefined) { + trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript); + } + // If creating the internal policy succeeded sign internal variables. + if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') { + emptyHTML = trustedTypesPolicy.createHTML(''); + } + } + // Prevent further manipulation of configuration. + // Not available in IE8, Safari 5, etc. + if (freeze) { + freeze(cfg); + } + CONFIG = cfg; + }; + /* Keep track of all possible SVG and MathML tags + * so that we can perform the namespace checks + * correctly. */ + const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]); + const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]); + /** + * @param element a DOM element whose namespace is being checked + * @returns Return false if the element has a + * namespace that a spec-compliant parser would never + * return. Return true otherwise. + */ + const _checkValidNamespace = function _checkValidNamespace(element) { + let parent = getParentNode(element); + // In JSDOM, if we're inside shadow DOM, then parentNode + // can be null. We just simulate parent in this case. + if (!parent || !parent.tagName) { + parent = { + namespaceURI: NAMESPACE, + tagName: 'template' + }; + } + const tagName = stringToLowerCase(element.tagName); + const parentTagName = stringToLowerCase(parent.tagName); + if (!ALLOWED_NAMESPACES[element.namespaceURI]) { + return false; + } + if (element.namespaceURI === SVG_NAMESPACE) { + // The only way to switch from HTML namespace to SVG + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'svg'; + } + // The only way to switch from MathML to SVG is via` + // svg if parent is either or MathML + // text integration points. + if (parent.namespaceURI === MATHML_NAMESPACE) { + return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); + } + // We only allow elements that are defined in SVG + // spec. All others are disallowed in SVG namespace. + return Boolean(ALL_SVG_TAGS[tagName]); + } + if (element.namespaceURI === MATHML_NAMESPACE) { + // The only way to switch from HTML namespace to MathML + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'math'; + } + // The only way to switch from SVG to MathML is via + // and HTML integration points + if (parent.namespaceURI === SVG_NAMESPACE) { + return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; + } + // We only allow elements that are defined in MathML + // spec. All others are disallowed in MathML namespace. + return Boolean(ALL_MATHML_TAGS[tagName]); + } + if (element.namespaceURI === HTML_NAMESPACE) { + // The only way to switch from SVG to HTML is via + // HTML integration points, and from MathML to HTML + // is via MathML text integration points + if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { + return false; + } + if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { + return false; + } + // We disallow tags that are specific for MathML + // or SVG and should never appear in HTML namespace + return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); + } + // For XHTML and XML documents that support custom namespaces + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) { + return true; + } + // The code should never reach this place (this means + // that the element somehow got namespace that is not + // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES). + // Return false just in case. + return false; + }; + /** + * _forceRemove + * + * @param node a DOM node + */ + const _forceRemove = function _forceRemove(node) { + arrayPush(DOMPurify.removed, { + element: node + }); + try { + // eslint-disable-next-line unicorn/prefer-dom-node-remove + getParentNode(node).removeChild(node); + } catch (_) { + remove(node); + } + }; + /** + * _removeAttribute + * + * @param name an Attribute name + * @param element a DOM node + */ + const _removeAttribute = function _removeAttribute(name, element) { + try { + arrayPush(DOMPurify.removed, { + attribute: element.getAttributeNode(name), + from: element + }); + } catch (_) { + arrayPush(DOMPurify.removed, { + attribute: null, + from: element + }); + } + element.removeAttribute(name); + // We void attribute values for unremovable "is" attributes + if (name === 'is') { + if (RETURN_DOM || RETURN_DOM_FRAGMENT) { + try { + _forceRemove(element); + } catch (_) {} + } else { + try { + element.setAttribute(name, ''); + } catch (_) {} + } + } + }; + /** + * _initDocument + * + * @param dirty - a string of dirty markup + * @return a DOM, filled with the dirty markup + */ + const _initDocument = function _initDocument(dirty) { + /* Create a HTML document */ + let doc = null; + let leadingWhitespace = null; + if (FORCE_BODY) { + dirty = '' + dirty; + } else { + /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */ + const matches = stringMatch(dirty, /^[\r\n\t ]+/); + leadingWhitespace = matches && matches[0]; + } + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) { + // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict) + dirty = '' + dirty + ''; + } + const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; + /* + * Use the DOMParser API by default, fallback later if needs be + * DOMParser not work for svg when has multiple root element. + */ + if (NAMESPACE === HTML_NAMESPACE) { + try { + doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); + } catch (_) {} + } + /* Use createHTMLDocument in case DOMParser is not available */ + if (!doc || !doc.documentElement) { + doc = implementation.createDocument(NAMESPACE, 'template', null); + try { + doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload; + } catch (_) { + // Syntax error if dirtyPayload is invalid xml + } + } + const body = doc.body || doc.documentElement; + if (dirty && leadingWhitespace) { + body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); + } + /* Work on whole document or just its body */ + if (NAMESPACE === HTML_NAMESPACE) { + return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; + } + return WHOLE_DOCUMENT ? doc.documentElement : body; + }; + /** + * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. + * + * @param root The root element or node to start traversing on. + * @return The created NodeIterator + */ + const _createNodeIterator = function _createNodeIterator(root) { + return createNodeIterator.call(root.ownerDocument || root, root, + // eslint-disable-next-line no-bitwise + NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null); + }; + /** + * _isClobbered + * + * @param element element to check for clobbering attacks + * @return true if clobbered, false if safe + */ + const _isClobbered = function _isClobbered(element) { + return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function'); + }; + /** + * Checks whether the given object is a DOM node. + * + * @param value object to check whether it's a DOM node + * @return true is object is a DOM node + */ + const _isNode = function _isNode(value) { + return typeof Node === 'function' && value instanceof Node; + }; + function _executeHooks(hooks, currentNode, data) { + arrayForEach(hooks, hook => { + hook.call(DOMPurify, currentNode, data, CONFIG); + }); + } + /** + * _sanitizeElements + * + * @protect nodeName + * @protect textContent + * @protect removeChild + * @param currentNode to check for permission to exist + * @return true if node was killed, false if left alive + */ + const _sanitizeElements = function _sanitizeElements(currentNode) { + let content = null; + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeElements, currentNode, null); + /* Check if element is clobbered or can clobber */ + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Now let's check the element's type and name */ + const tagName = transformCaseFunc(currentNode.nodeName); + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeElement, currentNode, { + tagName, + allowedTags: ALLOWED_TAGS + }); + /* Detect mXSS attempts abusing namespace confusion */ + if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { + _forceRemove(currentNode); + return true; + } + /* Remove any occurrence of processing instructions */ + if (currentNode.nodeType === NODE_TYPE.progressingInstruction) { + _forceRemove(currentNode); + return true; + } + /* Remove any kind of possibly harmful comments */ + if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\w]/g, currentNode.data)) { + _forceRemove(currentNode); + return true; + } + /* Remove element if anything forbids its presence */ + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + /* Check if we have a custom element to handle */ + if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) { + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) { + return false; + } + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) { + return false; + } + } + /* Keep content except for bad-listed elements */ + if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) { + const parentNode = getParentNode(currentNode) || currentNode.parentNode; + const childNodes = getChildNodes(currentNode) || currentNode.childNodes; + if (childNodes && parentNode) { + const childCount = childNodes.length; + for (let i = childCount - 1; i >= 0; --i) { + const childClone = cloneNode(childNodes[i], true); + childClone.__removalCount = (currentNode.__removalCount || 0) + 1; + parentNode.insertBefore(childClone, getNextSibling(currentNode)); + } + } + } + _forceRemove(currentNode); + return true; + } + /* Check whether element has a valid namespace */ + if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Make sure that older browsers don't get fallback-tag mXSS */ + if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\/no(script|embed|frames)/i, currentNode.innerHTML)) { + _forceRemove(currentNode); + return true; + } + /* Sanitize element content to be template-safe */ + if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) { + /* Get the element's text content */ + content = currentNode.textContent; + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + content = stringReplace(content, expr, ' '); + }); + if (currentNode.textContent !== content) { + arrayPush(DOMPurify.removed, { + element: currentNode.cloneNode() + }); + currentNode.textContent = content; + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeElements, currentNode, null); + return false; + }; + /** + * _isValidAttribute + * + * @param lcTag Lowercase tag name of containing element. + * @param lcName Lowercase attribute name. + * @param value Attribute value. + * @return Returns true if `value` is valid, otherwise false. + */ + // eslint-disable-next-line complexity + const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) { + /* Make sure attribute cannot clobber */ + if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) { + return false; + } + /* Allow valid data-* attributes: At least one character after "-" + (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes) + XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804) + We don't need to check the value; it's always URI safe. */ + if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) { + if ( + // First condition does a very basic check if a) it's basically a valid custom element tagname AND + // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck + _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || + // Alternative, second condition checks if it's an `is`-attribute, AND + // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else { + return false; + } + /* Check value is safe. First, is attr inert? If so, is safe */ + } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) { + return false; + } else ; + return true; + }; + /** + * _isBasicCustomElement + * checks if at least one dash is included in tagName, and it's not the first char + * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name + * + * @param tagName name of the tag of the node to sanitize + * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false. + */ + const _isBasicCustomElement = function _isBasicCustomElement(tagName) { + return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT); + }; + /** + * _sanitizeAttributes + * + * @protect attributes + * @protect nodeName + * @protect removeAttribute + * @protect setAttribute + * + * @param currentNode to sanitize + */ + const _sanitizeAttributes = function _sanitizeAttributes(currentNode) { + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null); + const { + attributes + } = currentNode; + /* Check if we have attributes; if not we might have a text node */ + if (!attributes || _isClobbered(currentNode)) { + return; + } + const hookEvent = { + attrName: '', + attrValue: '', + keepAttr: true, + allowedAttributes: ALLOWED_ATTR, + forceKeepAttr: undefined + }; + let l = attributes.length; + /* Go backwards over all attributes; safely remove bad ones */ + while (l--) { + const attr = attributes[l]; + const { + name, + namespaceURI, + value: attrValue + } = attr; + const lcName = transformCaseFunc(name); + let value = name === 'value' ? attrValue : stringTrim(attrValue); + /* Execute a hook if present */ + hookEvent.attrName = lcName; + hookEvent.attrValue = value; + hookEvent.keepAttr = true; + hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set + _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent); + value = hookEvent.attrValue; + /* Full DOM Clobbering protection via namespace isolation, + * Prefix id and name attributes with `user-content-` + */ + if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) { + // Remove the attribute with this value + _removeAttribute(name, currentNode); + // Prefix the value and later re-create the attribute with the sanitized value + value = SANITIZE_NAMED_PROPS_PREFIX + value; + } + /* Work around a security issue with comments inside attributes */ + if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title)/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Did the hooks approve of the attribute? */ + if (hookEvent.forceKeepAttr) { + continue; + } + /* Remove attribute */ + _removeAttribute(name, currentNode); + /* Did the hooks approve of the attribute? */ + if (!hookEvent.keepAttr) { + continue; + } + /* Work around a security issue in jQuery 3.0 */ + if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Sanitize attribute content to be template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + value = stringReplace(value, expr, ' '); + }); + } + /* Is `value` valid for this attribute? */ + const lcTag = transformCaseFunc(currentNode.nodeName); + if (!_isValidAttribute(lcTag, lcName, value)) { + continue; + } + /* Handle attributes that require Trusted Types */ + if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') { + if (namespaceURI) ; else { + switch (trustedTypes.getAttributeType(lcTag, lcName)) { + case 'TrustedHTML': + { + value = trustedTypesPolicy.createHTML(value); + break; + } + case 'TrustedScriptURL': + { + value = trustedTypesPolicy.createScriptURL(value); + break; + } + } + } + } + /* Handle invalid data-* attribute set by try-catching it */ + try { + if (namespaceURI) { + currentNode.setAttributeNS(namespaceURI, name, value); + } else { + /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */ + currentNode.setAttribute(name, value); + } + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + } else { + arrayPop(DOMPurify.removed); + } + } catch (_) {} + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeAttributes, currentNode, null); + }; + /** + * _sanitizeShadowDOM + * + * @param fragment to iterate over recursively + */ + const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) { + let shadowNode = null; + const shadowIterator = _createNodeIterator(fragment); + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null); + while (shadowNode = shadowIterator.nextNode()) { + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null); + /* Sanitize tags and elements */ + _sanitizeElements(shadowNode); + /* Check attributes next */ + _sanitizeAttributes(shadowNode); + /* Deep shadow DOM detected */ + if (shadowNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(shadowNode.content); + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null); + }; + // eslint-disable-next-line complexity + DOMPurify.sanitize = function (dirty) { + let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let body = null; + let importedNode = null; + let currentNode = null; + let returnNode = null; + /* Make sure we have a string to sanitize. + DO NOT return early, as this will return the wrong type if + the user has requested a DOM object rather than a string */ + IS_EMPTY_INPUT = !dirty; + if (IS_EMPTY_INPUT) { + dirty = ''; + } + /* Stringify, in case dirty is an object */ + if (typeof dirty !== 'string' && !_isNode(dirty)) { + if (typeof dirty.toString === 'function') { + dirty = dirty.toString(); + if (typeof dirty !== 'string') { + throw typeErrorCreate('dirty is not a string, aborting'); + } + } else { + throw typeErrorCreate('toString is not a function'); + } + } + /* Return dirty HTML if DOMPurify cannot run */ + if (!DOMPurify.isSupported) { + return dirty; + } + /* Assign config vars */ + if (!SET_CONFIG) { + _parseConfig(cfg); + } + /* Clean up removed elements */ + DOMPurify.removed = []; + /* Check if dirty is correctly typed for IN_PLACE */ + if (typeof dirty === 'string') { + IN_PLACE = false; + } + if (IN_PLACE) { + /* Do some early pre-sanitization to avoid unsafe root nodes */ + if (dirty.nodeName) { + const tagName = transformCaseFunc(dirty.nodeName); + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place'); + } + } + } else if (dirty instanceof Node) { + /* If dirty is a DOM element, append to an empty document to avoid + elements being stripped by the parser */ + body = _initDocument(''); + importedNode = body.ownerDocument.importNode(dirty, true); + if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') { + /* Node is already a body, use as is */ + body = importedNode; + } else if (importedNode.nodeName === 'HTML') { + body = importedNode; + } else { + // eslint-disable-next-line unicorn/prefer-dom-node-append + body.appendChild(importedNode); + } + } else { + /* Exit directly if we have nothing to do */ + if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && + // eslint-disable-next-line unicorn/prefer-includes + dirty.indexOf('<') === -1) { + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty; + } + /* Initialize the document to work on */ + body = _initDocument(dirty); + /* Check we have a DOM node from the data */ + if (!body) { + return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : ''; + } + } + /* Remove first element node (ours) if FORCE_BODY is set */ + if (body && FORCE_BODY) { + _forceRemove(body.firstChild); + } + /* Get node iterator */ + const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body); + /* Now start iterating over the created document */ + while (currentNode = nodeIterator.nextNode()) { + /* Sanitize tags and elements */ + _sanitizeElements(currentNode); + /* Check attributes next */ + _sanitizeAttributes(currentNode); + /* Shadow DOM detected, sanitize it */ + if (currentNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(currentNode.content); + } + } + /* If we sanitized `dirty` in-place, return it. */ + if (IN_PLACE) { + return dirty; + } + /* Return sanitized string or DOM */ + if (RETURN_DOM) { + if (RETURN_DOM_FRAGMENT) { + returnNode = createDocumentFragment.call(body.ownerDocument); + while (body.firstChild) { + // eslint-disable-next-line unicorn/prefer-dom-node-append + returnNode.appendChild(body.firstChild); + } + } else { + returnNode = body; + } + if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) { + /* + AdoptNode() is not used because internal state is not reset + (e.g. the past names map of a HTMLFormElement), this is safe + in theory but we would rather not risk another attack vector. + The state that is cloned by importNode() is explicitly defined + by the specs. + */ + returnNode = importNode.call(originalDocument, returnNode, true); + } + return returnNode; + } + let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML; + /* Serialize doctype if allowed */ + if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) { + serializedHTML = '\n' + serializedHTML; + } + /* Sanitize final string template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + serializedHTML = stringReplace(serializedHTML, expr, ' '); + }); + } + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML; + }; + DOMPurify.setConfig = function () { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _parseConfig(cfg); + SET_CONFIG = true; + }; + DOMPurify.clearConfig = function () { + CONFIG = null; + SET_CONFIG = false; + }; + DOMPurify.isValidAttribute = function (tag, attr, value) { + /* Initialize shared config vars if necessary. */ + if (!CONFIG) { + _parseConfig({}); + } + const lcTag = transformCaseFunc(tag); + const lcName = transformCaseFunc(attr); + return _isValidAttribute(lcTag, lcName, value); + }; + DOMPurify.addHook = function (entryPoint, hookFunction) { + if (typeof hookFunction !== 'function') { + return; + } + arrayPush(hooks[entryPoint], hookFunction); + }; + DOMPurify.removeHook = function (entryPoint, hookFunction) { + if (hookFunction !== undefined) { + const index = arrayLastIndexOf(hooks[entryPoint], hookFunction); + return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0]; + } + return arrayPop(hooks[entryPoint]); + }; + DOMPurify.removeHooks = function (entryPoint) { + hooks[entryPoint] = []; + }; + DOMPurify.removeAllHooks = function () { + hooks = _createHooksMap(); + }; + return DOMPurify; + } + var purify = createDOMPurify(); + + return purify; + +})); +//# sourceMappingURL=purify.js.map diff --git a/static/js/purify.js.map b/static/js/purify.js.map new file mode 100644 index 0000000..77cd530 --- /dev/null +++ b/static/js/purify.js.map @@ -0,0 +1 @@ +{"version":3,"file":"purify.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/static/js/purify.min.js b/static/js/purify.min.js new file mode 100644 index 0000000..b472a86 --- /dev/null +++ b/static/js/purify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=R(Array.prototype.forEach),m=R(Array.prototype.lastIndexOf),p=R(Array.prototype.pop),f=R(Array.prototype.push),d=R(Array.prototype.splice),h=R(String.prototype.toLowerCase),g=R(String.prototype.toString),T=R(String.prototype.match),y=R(String.prototype.replace),E=R(String.prototype.indexOf),A=R(String.prototype.trim),_=R(Object.prototype.hasOwnProperty),S=R(RegExp.prototype.test),b=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:h;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function O(e){for(let t=0;t/gm),G=a(/\$\{[\w\W]*/gm),Y=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),j=a(/^aria-[\-\w]+$/),X=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),q=a(/^(?:\w+script|data):/i),$=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),K=a(/^html$/i),V=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var Z=Object.freeze({__proto__:null,ARIA_ATTR:j,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:V,DATA_ATTR:Y,DOCTYPE_NAME:K,ERB_EXPR:W,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:q,MUSTACHE_EXPR:B,TMPLIT_EXPR:G});const J=1,Q=3,ee=7,te=8,ne=9,oe=function(){return"undefined"==typeof window?null:window};var re=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe();const o=e=>t(e);if(o.version="3.2.4",o.removed=[],!n||!n.document||n.document.nodeType!==ne||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:R,Element:O,NodeFilter:B,NamedNodeMap:W=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:G,DOMParser:Y,trustedTypes:j}=n,q=O.prototype,$=v(q,"cloneNode"),V=v(q,"remove"),re=v(q,"nextSibling"),ie=v(q,"childNodes"),ae=v(q,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let le,ce="";const{implementation:se,createNodeIterator:ue,createDocumentFragment:me,getElementsByTagName:pe}=r,{importNode:fe}=a;let de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof ae&&se&&void 0!==se.createHTMLDocument;const{MUSTACHE_EXPR:he,ERB_EXPR:ge,TMPLIT_EXPR:Te,DATA_ATTR:ye,ARIA_ATTR:Ee,IS_SCRIPT_OR_DATA:Ae,ATTR_WHITESPACE:_e,CUSTOM_ELEMENT:Se}=Z;let{IS_ALLOWED_URI:be}=Z,Ne=null;const Re=w({},[...L,...C,...x,...k,...U]);let we=null;const Oe=w({},[...z,...P,...H,...F]);let De=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,Le=null,Ce=!0,xe=!0,Me=!1,ke=!0,Ie=!1,Ue=!0,ze=!1,Pe=!1,He=!1,Fe=!1,Be=!1,We=!1,Ge=!0,Ye=!1,je=!0,Xe=!1,qe={},$e=null;const Ke=w({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Ve=null;const Ze=w({},["audio","video","img","source","image","track"]);let Je=null;const Qe=w({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),et="http://www.w3.org/1998/Math/MathML",tt="http://www.w3.org/2000/svg",nt="http://www.w3.org/1999/xhtml";let ot=nt,rt=!1,it=null;const at=w({},[et,tt,nt],g);let lt=w({},["mi","mo","mn","ms","mtext"]),ct=w({},["annotation-xml"]);const st=w({},["title","style","font","a","script"]);let ut=null;const mt=["application/xhtml+xml","text/html"];let pt=null,ft=null;const dt=r.createElement("form"),ht=function(e){return e instanceof RegExp||e instanceof Function},gt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ft||ft!==e){if(e&&"object"==typeof e||(e={}),e=D(e),ut=-1===mt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,pt="application/xhtml+xml"===ut?g:h,Ne=_(e,"ALLOWED_TAGS")?w({},e.ALLOWED_TAGS,pt):Re,we=_(e,"ALLOWED_ATTR")?w({},e.ALLOWED_ATTR,pt):Oe,it=_(e,"ALLOWED_NAMESPACES")?w({},e.ALLOWED_NAMESPACES,g):at,Je=_(e,"ADD_URI_SAFE_ATTR")?w(D(Qe),e.ADD_URI_SAFE_ATTR,pt):Qe,Ve=_(e,"ADD_DATA_URI_TAGS")?w(D(Ze),e.ADD_DATA_URI_TAGS,pt):Ze,$e=_(e,"FORBID_CONTENTS")?w({},e.FORBID_CONTENTS,pt):Ke,ve=_(e,"FORBID_TAGS")?w({},e.FORBID_TAGS,pt):{},Le=_(e,"FORBID_ATTR")?w({},e.FORBID_ATTR,pt):{},qe=!!_(e,"USE_PROFILES")&&e.USE_PROFILES,Ce=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,Me=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ke=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ie=e.SAFE_FOR_TEMPLATES||!1,Ue=!1!==e.SAFE_FOR_XML,ze=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,Be=e.RETURN_DOM_FRAGMENT||!1,We=e.RETURN_TRUSTED_TYPE||!1,He=e.FORCE_BODY||!1,Ge=!1!==e.SANITIZE_DOM,Ye=e.SANITIZE_NAMED_PROPS||!1,je=!1!==e.KEEP_CONTENT,Xe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||X,ot=e.NAMESPACE||nt,lt=e.MATHML_TEXT_INTEGRATION_POINTS||lt,ct=e.HTML_INTEGRATION_POINTS||ct,De=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(De.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(De.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(De.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ie&&(xe=!1),Be&&(Fe=!0),qe&&(Ne=w({},U),we=[],!0===qe.html&&(w(Ne,L),w(we,z)),!0===qe.svg&&(w(Ne,C),w(we,P),w(we,F)),!0===qe.svgFilters&&(w(Ne,x),w(we,P),w(we,F)),!0===qe.mathMl&&(w(Ne,k),w(we,H),w(we,F))),e.ADD_TAGS&&(Ne===Re&&(Ne=D(Ne)),w(Ne,e.ADD_TAGS,pt)),e.ADD_ATTR&&(we===Oe&&(we=D(we)),w(we,e.ADD_ATTR,pt)),e.ADD_URI_SAFE_ATTR&&w(Je,e.ADD_URI_SAFE_ATTR,pt),e.FORBID_CONTENTS&&($e===Ke&&($e=D($e)),w($e,e.FORBID_CONTENTS,pt)),je&&(Ne["#text"]=!0),ze&&w(Ne,["html","head","body"]),Ne.table&&(w(Ne,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');le=e.TRUSTED_TYPES_POLICY,ce=le.createHTML("")}else void 0===le&&(le=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(j,c)),null!==le&&"string"==typeof ce&&(ce=le.createHTML(""));i&&i(e),ft=e}},Tt=w({},[...C,...x,...M]),yt=w({},[...k,...I]),Et=function(e){f(o.removed,{element:e});try{ae(e).removeChild(e)}catch(t){V(e)}},At=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Fe||Be)try{Et(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},_t=function(e){let t=null,n=null;if(He)e=""+e;else{const t=T(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ut&&ot===nt&&(e=''+e+"");const o=le?le.createHTML(e):e;if(ot===nt)try{t=(new Y).parseFromString(o,ut)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(ot,"template",null);try{t.documentElement.innerHTML=rt?ce:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),ot===nt?pe.call(t,ze?"html":"body")[0]:ze?t.documentElement:i},St=function(e){return ue.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},bt=function(e){return e instanceof G&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof W)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Nt=function(e){return"function"==typeof R&&e instanceof R};function Rt(e,t,n){u(e,(e=>{e.call(o,t,n,ft)}))}const wt=function(e){let t=null;if(Rt(de.beforeSanitizeElements,e,null),bt(e))return Et(e),!0;const n=pt(e.nodeName);if(Rt(de.uponSanitizeElement,e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return Et(e),!0;if(e.nodeType===ee)return Et(e),!0;if(Ue&&e.nodeType===te&&S(/<[/\w]/g,e.data))return Et(e),!0;if(!Ne[n]||ve[n]){if(!ve[n]&&Dt(n)){if(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n))return!1;if(De.tagNameCheck instanceof Function&&De.tagNameCheck(n))return!1}if(je&&!$e[n]){const t=ae(e)||e.parentNode,n=ie(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=$(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,re(e))}}}return Et(e),!0}return e instanceof O&&!function(e){let t=ae(e);t&&t.tagName||(t={namespaceURI:ot,tagName:"template"});const n=h(e.tagName),o=h(t.tagName);return!!it[e.namespaceURI]&&(e.namespaceURI===tt?t.namespaceURI===nt?"svg"===n:t.namespaceURI===et?"svg"===n&&("annotation-xml"===o||lt[o]):Boolean(Tt[n]):e.namespaceURI===et?t.namespaceURI===nt?"math"===n:t.namespaceURI===tt?"math"===n&&ct[o]:Boolean(yt[n]):e.namespaceURI===nt?!(t.namespaceURI===tt&&!ct[o])&&!(t.namespaceURI===et&&!lt[o])&&!yt[n]&&(st[n]||!Tt[n]):!("application/xhtml+xml"!==ut||!it[e.namespaceURI]))}(e)?(Et(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!S(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ie&&e.nodeType===Q&&(t=e.textContent,u([he,ge,Te],(e=>{t=y(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),Rt(de.afterSanitizeElements,e,null),!1):(Et(e),!0)},Ot=function(e,t,n){if(Ge&&("id"===t||"name"===t)&&(n in r||n in dt))return!1;if(xe&&!Le[t]&&S(ye,t));else if(Ce&&S(Ee,t));else if(!we[t]||Le[t]){if(!(Dt(e)&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,e)||De.tagNameCheck instanceof Function&&De.tagNameCheck(e))&&(De.attributeNameCheck instanceof RegExp&&S(De.attributeNameCheck,t)||De.attributeNameCheck instanceof Function&&De.attributeNameCheck(t))||"is"===t&&De.allowCustomizedBuiltInElements&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n)||De.tagNameCheck instanceof Function&&De.tagNameCheck(n))))return!1}else if(Je[t]);else if(S(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!Ve[e]){if(Me&&!S(Ae,y(n,_e,"")));else if(n)return!1}else;return!0},Dt=function(e){return"annotation-xml"!==e&&T(e,Se)},vt=function(e){Rt(de.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||bt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:we,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=pt(a);let m="value"===a?c:A(c);if(n.attrName=s,n.attrValue=m,n.keepAttr=!0,n.forceKeepAttr=void 0,Rt(de.uponSanitizeAttribute,e,n),m=n.attrValue,!Ye||"id"!==s&&"name"!==s||(At(a,e),m="user-content-"+m),Ue&&S(/((--!?|])>)|<\/(style|title)/i,m)){At(a,e);continue}if(n.forceKeepAttr)continue;if(At(a,e),!n.keepAttr)continue;if(!ke&&S(/\/>/i,m)){At(a,e);continue}Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")}));const f=pt(e.nodeName);if(Ot(f,s,m)){if(le&&"object"==typeof j&&"function"==typeof j.getAttributeType)if(l);else switch(j.getAttributeType(f,s)){case"TrustedHTML":m=le.createHTML(m);break;case"TrustedScriptURL":m=le.createScriptURL(m)}try{l?e.setAttributeNS(l,a,m):e.setAttribute(a,m),bt(e)?Et(e):p(o.removed)}catch(e){}}}Rt(de.afterSanitizeAttributes,e,null)},Lt=function e(t){let n=null;const o=St(t);for(Rt(de.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)Rt(de.uponSanitizeShadowNode,n,null),wt(n),vt(n),n.content instanceof s&&e(n.content);Rt(de.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(rt=!e,rt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Nt(e)){if("function"!=typeof e.toString)throw b("toString is not a function");if("string"!=typeof(e=e.toString()))throw b("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Pe||gt(t),o.removed=[],"string"==typeof e&&(Xe=!1),Xe){if(e.nodeName){const t=pt(e.nodeName);if(!Ne[t]||ve[t])throw b("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof R)n=_t("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===J&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Fe&&!Ie&&!ze&&-1===e.indexOf("<"))return le&&We?le.createHTML(e):e;if(n=_t(e),!n)return Fe?null:We?ce:""}n&&He&&Et(n.firstChild);const c=St(Xe?e:n);for(;i=c.nextNode();)wt(i),vt(i),i.content instanceof s&&Lt(i.content);if(Xe)return e;if(Fe){if(Be)for(l=me.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(we.shadowroot||we.shadowrootmode)&&(l=fe.call(a,l,!0)),l}let m=ze?n.outerHTML:n.innerHTML;return ze&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&S(K,n.ownerDocument.doctype.name)&&(m="\n"+m),Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")})),le&&We?le.createHTML(m):m},o.setConfig=function(){gt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Pe=!0},o.clearConfig=function(){ft=null,Pe=!1},o.isValidAttribute=function(e,t,n){ft||gt({});const o=pt(e),r=pt(t);return Ot(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&f(de[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(de[e],t);return-1===n?void 0:d(de[e],n,1)[0]}return p(de[e])},o.removeHooks=function(e){de[e]=[]},o.removeAllHooks=function(){de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return re})); +//# sourceMappingURL=purify.min.js.map diff --git a/static/js/purify.min.js.map b/static/js/purify.min.js.map new file mode 100644 index 0000000..6e941de --- /dev/null +++ b/static/js/purify.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"purify.min.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"} \ No newline at end of file diff --git a/themes/.DS_Store b/themes/.DS_Store new file mode 100644 index 0000000..2623ec5 Binary files /dev/null and b/themes/.DS_Store differ diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/bug_report.md b/themes/PaperMod/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..d88b750 --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,50 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + + + +**Describe the bug** + + + - Device/Os: [e.g. Android 10] + - Type: [e.g. Desktop/Mobile] + - Browser and version [e.g. Chrome 86.0]: + - Hugo Version [ >=0.112.4 expected]: + - Theme Version [e.g. v4.0, master, or commit-id ]: + +**Steps to reproduce the behavior:** + + +**Expected behavior**: + + +**Repo/Source where this issue can be reproduced**: + + +**Screenshots** + + +**Additional context** + diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml b/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..1a4dd9b --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: PaperMod Discussions + url: https://github.com/adityatelange/hugo-PaperMod/discussions + about: Please ask and answer questions/doubts here, do not open an issue for questions. diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/new-blank-issue.md b/themes/PaperMod/.github/ISSUE_TEMPLATE/new-blank-issue.md new file mode 100644 index 0000000..dbc48f1 --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/new-blank-issue.md @@ -0,0 +1,7 @@ +--- +name: New Blank Issue +about: Anything other than bug report +title: "" +labels: "" +assignees: "" +--- diff --git a/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md b/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..00b856c --- /dev/null +++ b/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,44 @@ + + + +**What does this PR change? What problem does it solve?** + + + + +**Was the change discussed in an issue or in the Discussions before?** + + + + +## PR Checklist + +- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-). +- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork). +- [ ] I have verified that the code works as described/as intended. +- [ ] This change adds a Social Icon which has a permissive license to use it. +- [ ] This change **does not** include any CDN resources/links. +- [ ] This change **does not** include any unrelated scripts such as bash and python scripts. +- [ ] This change updates the overridden internal templates from HUGO's repository. diff --git a/themes/PaperMod/.github/stale.yml b/themes/PaperMod/.github/stale.yml new file mode 100644 index 0000000..7b5f571 --- /dev/null +++ b/themes/PaperMod/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 7 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 3 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - keep +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/themes/PaperMod/.github/workflows/gh-pages.yml b/themes/PaperMod/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..6a43bcd --- /dev/null +++ b/themes/PaperMod/.github/workflows/gh-pages.yml @@ -0,0 +1,77 @@ +name: Deploy Hugo PaperMod Demo to Pages + +on: + push: + paths-ignore: + - "images/**" + - "LICENSE" + - "README.md" + branches: + - master + - exampleSite + workflow_dispatch: + # manual run + inputs: + hugoVersion: + description: "Hugo Version" + required: false + default: "0.112.4" + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +# Default to bash +defaults: + run: + shell: bash + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: ${{ github.event.inputs.hugoVersion || '0.112.4' }} + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Checkout + uses: actions/checkout@v3 + with: + ref: exampleSite + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Get Theme + run: git submodule update --init --recursive + - name: Update theme to Latest commit + run: git submodule update --remote --merge + - name: Build with Hugo + run: | + hugo \ + --buildDrafts --gc \ + --baseURL ${{ steps.pages.outputs.base_url }} + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: ./public + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/themes/PaperMod/LICENSE b/themes/PaperMod/LICENSE new file mode 100644 index 0000000..07edff3 --- /dev/null +++ b/themes/PaperMod/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2020 nanxiaobei and adityatelange +Copyright (c) 2021-2024 adityatelange + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/PaperMod/README.md b/themes/PaperMod/README.md new file mode 100644 index 0000000..afcb2ad --- /dev/null +++ b/themes/PaperMod/README.md @@ -0,0 +1,105 @@ +

    Hugo PaperMod | Demo

    + +

    ☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive

    +
    + +> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper/tree/4330c8b12aa48bfdecbcad6ad66145f679a430b3).
    +> The goal of this project is to add more features and customization to the og theme. + +**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki) + +**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source. + +[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/) +[![Minimum Hugo Version](https://img.shields.io/static/v1?label=min-HUGO-version&message=>=v0.112.4&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.112.4) +[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord&logo=discord)](https://discord.gg/ahpmTvhVmp) +[![GitHub](https://img.shields.io/github/license/adityatelange/hugo-PaperMod)](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE) +![code-size](https://img.shields.io/github/languages/code-size/adityatelange/hugo-PaperMod) +[![X (formerly Twitter) URL](https://img.shields.io/badge/-Share%20on%20X-gray?style=flat&logo=x)](https://x.com/intent/tweet/?text=Checkout%20Hugo%20PaperMod%20%E2%9C%A8%0AA%20fast,%20clean,%20responsive%20Hugo%20theme.&url=https://github.com/adityatelange/hugo-PaperMod&hashtags=Hugo,PaperMod) + + +--- + +

    + Mockup image +

    + +--- + +## Features/Mods 💥 + +- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default. +- 3 Modes: + - [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode) + - [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode) + - [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode) +- Table of Content Generation (newer implementation). +- Archive of posts. +- Social Icons (home-info and profile-mode) +- Social-Media Share buttons on posts. +- Menu location indicator. +- Multilingual support. (with language selector) +- Taxonomies +- Cover image for each post (with Responsive image support). +- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button). +- SEO Friendly. +- Multiple Author support. +- Search Page with Fuse.js +- Other Posts suggestion below a post +- Breadcrumb Navigation +- Code Block Copy buttons +- No webpack, nodejs and other dependencies are required to edit the theme. + +Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)** + +--- + +## Install/Update 📥 + +Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)** + +--- + +## FAQs / How To's Guide 🙋 + +Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)** + +--- + +## Social-Icons/Share-Icons 🖼️ + +Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)** + +--- + +## Release Changelog 📃 + +Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)** + +--- + +## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀 + +--- + +## Support 🫶 + +- Star 🌟 this repository. +- Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️ +- You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange). + +--- + +## Special Thanks 🌟 + +- [**Highlight.js**](https://github.com/highlightjs/highlight.js) +- [**Fuse.js**](https://github.com/krisk/fuse) +- [**Feather Icons**](https://github.com/feathericons/feather) +- [**Simple Icons**](https://github.com/simple-icons/simple-icons) +- **All Contributors and Supporters** + +--- + +## Stargazers over time 📈 + +[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg?variant=adaptive)](https://starchart.cc/adityatelange/hugo-PaperMod) diff --git a/themes/PaperMod/assets/css/common/404.css b/themes/PaperMod/assets/css/common/404.css new file mode 100644 index 0000000..8a23430 --- /dev/null +++ b/themes/PaperMod/assets/css/common/404.css @@ -0,0 +1,11 @@ +.not-found { + position: absolute; + left: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + height: 80%; + font-size: 160px; + font-weight: 700; +} diff --git a/themes/PaperMod/assets/css/common/archive.css b/themes/PaperMod/assets/css/common/archive.css new file mode 100644 index 0000000..7e7e245 --- /dev/null +++ b/themes/PaperMod/assets/css/common/archive.css @@ -0,0 +1,44 @@ +.archive-posts { + width: 100%; + font-size: 16px; +} + +.archive-year { + margin-top: 40px; +} + +.archive-year:not(:last-of-type) { + border-bottom: 2px solid var(--border); +} + +.archive-month { + display: flex; + align-items: flex-start; + padding: 10px 0; +} + +.archive-month-header { + margin: 25px 0; + width: 200px; +} + +.archive-month:not(:last-of-type) { + border-bottom: 1px solid var(--border); +} + +.archive-entry { + position: relative; + padding: 5px; + margin: 10px 0; +} + +.archive-entry-title { + margin: 5px 0; + font-weight: 400; +} + +.archive-count, +.archive-meta { + color: var(--secondary); + font-size: 14px; +} diff --git a/themes/PaperMod/assets/css/common/footer.css b/themes/PaperMod/assets/css/common/footer.css new file mode 100644 index 0000000..5addb1e --- /dev/null +++ b/themes/PaperMod/assets/css/common/footer.css @@ -0,0 +1,60 @@ +.footer, +.top-link { + font-size: 12px; + color: var(--secondary); +} + +.footer { + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap); + text-align: center; + line-height: 24px; +} + +.footer span { + margin-inline-start: 1px; + margin-inline-end: 1px; +} + +.footer span:last-child { + white-space: nowrap; +} + +.footer a { + color: inherit; + border-bottom: 1px solid var(--secondary); +} + +.footer a:hover { + border-bottom: 1px solid var(--primary); +} + +.top-link { + visibility: hidden; + position: fixed; + bottom: 60px; + right: 30px; + z-index: 99; + background: var(--tertiary); + width: 42px; + height: 42px; + padding: 12px; + border-radius: 64px; + transition: visibility 0.5s, opacity 0.8s linear; +} + +.top-link, +.top-link svg { + filter: drop-shadow(0px 0px 0px var(--theme)); +} + +.footer a:hover, +.top-link:hover { + color: var(--primary); +} + +.top-link:focus, +#theme-toggle:focus { + outline: 0; +} diff --git a/themes/PaperMod/assets/css/common/header.css b/themes/PaperMod/assets/css/common/header.css new file mode 100644 index 0000000..64894da --- /dev/null +++ b/themes/PaperMod/assets/css/common/header.css @@ -0,0 +1,93 @@ +.nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + max-width: calc(var(--nav-width) + var(--gap) * 2); + margin-inline-start: auto; + margin-inline-end: auto; + line-height: var(--header-height); +} + +.nav a { + display: block; +} + +.logo, +#menu { + display: flex; + margin: auto var(--gap); +} + +.logo { + flex-wrap: inherit; +} + +.logo a { + font-size: 24px; + font-weight: 700; +} + +.logo a img, .logo a svg { + display: inline; + vertical-align: middle; + pointer-events: none; + transform: translate(0, -10%); + border-radius: 6px; + margin-inline-end: 8px; +} + +button#theme-toggle { + font-size: 26px; + margin: auto 4px; +} + +body.dark #moon { + vertical-align: middle; + display: none; +} + +body:not(.dark) #sun { + display: none; +} + +#menu { + list-style: none; + word-break: keep-all; + overflow-x: auto; + white-space: nowrap; +} + +#menu li + li { + margin-inline-start: var(--gap); +} + +#menu a { + font-size: 16px; +} + +#menu .active { + font-weight: 500; + border-bottom: 2px solid currentColor; +} + +.lang-switch li, +.lang-switch ul, +.logo-switches { + display: inline-flex; + margin: auto 4px; +} + +.lang-switch { + display: flex; + flex-wrap: inherit; +} + +.lang-switch a { + margin: auto 3px; + font-size: 16px; + font-weight: 500; +} + +.logo-switches { + flex-wrap: inherit; +} diff --git a/themes/PaperMod/assets/css/common/main.css b/themes/PaperMod/assets/css/common/main.css new file mode 100644 index 0000000..25ae4da --- /dev/null +++ b/themes/PaperMod/assets/css/common/main.css @@ -0,0 +1,66 @@ +.main { + position: relative; + min-height: calc(100vh - var(--header-height) - var(--footer-height)); + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: var(--gap); +} + +.page-header h1 { + font-size: 40px; +} + +.pagination { + display: flex; +} + +.pagination a { + color: var(--theme); + font-size: 13px; + line-height: 36px; + background: var(--primary); + border-radius: calc(36px / 2); + padding: 0 16px; +} + +.pagination .next { + margin-inline-start: auto; +} + + +.social-icons a { + display: inline-flex; + padding: 10px; +} + +.social-icons a svg { + height: 26px; + width: 26px; +} + +code { + direction: ltr; +} + +div.highlight, +pre { + position: relative; +} + +.copy-code { + display: none; + position: absolute; + top: 4px; + right: 4px; + color: rgba(255, 255, 255, 0.8); + background: rgba(78, 78, 78, 0.8); + border-radius: var(--radius); + padding: 0 5px; + font-size: 14px; + user-select: none; +} + +div.highlight:hover .copy-code, +pre:hover .copy-code { + display: block; +} diff --git a/themes/PaperMod/assets/css/common/post-entry.css b/themes/PaperMod/assets/css/common/post-entry.css new file mode 100644 index 0000000..c3cba37 --- /dev/null +++ b/themes/PaperMod/assets/css/common/post-entry.css @@ -0,0 +1,108 @@ +.first-entry { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + min-height: 320px; + margin: var(--gap) 0 calc(var(--gap) * 2) 0; +} + +.first-entry .entry-header { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +.first-entry .entry-header h1 { + font-size: 34px; + line-height: 1.3; +} + +.first-entry .entry-content { + margin: 14px 0; + font-size: 16px; + -webkit-line-clamp: 3; +} + +.first-entry .entry-footer { + font-size: 14px; +} + +.home-info .entry-content { + -webkit-line-clamp: unset; +} + +.post-entry { + position: relative; + margin-bottom: var(--gap); + padding: var(--gap); + background: var(--entry); + border-radius: var(--radius); + transition: transform 0.1s; + border: 1px solid var(--border); +} + +.post-entry:active { + transform: scale(0.96); +} + +.tag-entry .entry-cover { + display: none; +} + +.entry-header h2 { + font-size: 24px; + line-height: 1.3; +} + +.entry-content { + margin: 8px 0; + color: var(--secondary); + font-size: 14px; + line-height: 1.6; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.entry-footer { + color: var(--secondary); + font-size: 13px; +} + +.entry-link { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.entry-hint { + color: var(--secondary); +} + +.entry-hint-parent { + display: flex; + justify-content: space-between; +} + +.entry-cover { + font-size: 14px; + margin-bottom: var(--gap); + text-align: center; +} + +.entry-cover img { + border-radius: var(--radius); + pointer-events: none; + width: 100%; + height: auto; +} + +.entry-cover a { + color: var(--secondary); + box-shadow: 0 1px 0 var(--primary); +} diff --git a/themes/PaperMod/assets/css/common/post-single.css b/themes/PaperMod/assets/css/common/post-single.css new file mode 100644 index 0000000..e421aec --- /dev/null +++ b/themes/PaperMod/assets/css/common/post-single.css @@ -0,0 +1,448 @@ +.page-header, +.post-header { + margin: 24px auto var(--content-gap) auto; +} + +.post-title { + margin-bottom: 2px; + font-size: 40px; +} + +.post-description { + margin-top: 10px; + margin-bottom: 5px; +} + +.post-meta, +.breadcrumbs { + color: var(--secondary); + font-size: 14px; + display: flex; + flex-wrap: wrap; +} + +.post-meta .i18n_list li { + display: inline-flex; + list-style: none; + margin: auto 3px; + box-shadow: 0 1px 0 var(--secondary); +} + +.breadcrumbs a { + font-size: 16px; +} + +.post-content { + color: var(--content); +} + +.post-content h3, +.post-content h4, +.post-content h5, +.post-content h6 { + margin: 24px 0 16px; +} + +.post-content h1 { + margin: 40px auto 32px; + font-size: 40px; +} + +.post-content h2 { + margin: 32px auto 24px; + font-size: 32px; +} + +.post-content h3 { + font-size: 24px; +} + +.post-content h4 { + font-size: 16px; +} + +.post-content h5 { + font-size: 14px; +} + +.post-content h6 { + font-size: 12px; +} + +.post-content a, +.toc a:hover { + box-shadow: 0 1px 0; + box-decoration-break: clone; + -webkit-box-decoration-break: clone; +} + +.post-content a code { + margin: auto 0; + border-radius: 0; + box-shadow: 0 -1px 0 var(--primary) inset; +} + +.post-content del { + text-decoration: line-through; +} + +.post-content dl, +.post-content ol, +.post-content p, +.post-content figure, +.post-content ul { + margin-bottom: var(--content-gap); +} + +.post-content ol, +.post-content ul { + padding-inline-start: 20px; +} + +.post-content li { + margin-top: 5px; +} + +.post-content li p { + margin-bottom: 0; +} + +.post-content dl { + display: flex; + flex-wrap: wrap; + margin: 0; +} + +.post-content dt { + width: 25%; + font-weight: 700; +} + +.post-content dd { + width: 75%; + margin-inline-start: 0; + padding-inline-start: 10px; +} + +.post-content dd ~ dd, +.post-content dt ~ dt { + margin-top: 10px; +} + +.post-content table { + margin-bottom: var(--content-gap); +} + +.post-content table th, +.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td { + min-width: 80px; + padding: 8px 5px; + line-height: 1.5; + border-bottom: 1px solid var(--border); +} + +.post-content table th { + text-align: start; +} + +.post-content table:not(.highlighttable) td code:only-child { + margin: auto 0; +} + +.post-content .highlight table { + border-radius: var(--radius); +} + +.post-content .highlight:not(table) { + margin: 10px auto; + background: var(--code-block-bg) !important; + border-radius: var(--radius); + direction: ltr; +} + +.post-content li > .highlight { + margin-inline-end: 0; +} + +.post-content ul pre { + margin-inline-start: calc(var(--gap) * -2); +} + +.post-content .highlight pre { + margin: 0; +} + +.post-content .highlighttable { + table-layout: fixed; +} + +.post-content .highlighttable td:first-child { + width: 40px; +} + +.post-content .highlighttable td .linenodiv { + padding-inline-end: 0 !important; +} + +.post-content .highlighttable td .highlight, +.post-content .highlighttable td .linenodiv pre { + margin-bottom: 0; +} + +.post-content code { + margin: auto 4px; + padding: 4px 6px; + font-size: 0.78em; + line-height: 1.5; + background: var(--code-bg); + border-radius: 2px; +} + +.post-content pre code { + display: grid; + margin: auto 0; + padding: 10px; + color: rgb(213, 213, 214); + background: var(--code-block-bg) !important; + border-radius: var(--radius); + overflow-x: auto; + word-break: break-all; +} + +.post-content blockquote { + margin: 20px 0; + padding: 0 14px; + border-inline-start: 3px solid var(--primary); +} + +.post-content hr { + margin: 30px 0; + height: 2px; + background: var(--tertiary); + border: 0; +} + +.post-content iframe { + max-width: 100%; +} + +.post-content img { + border-radius: 4px; + margin: 1rem 0; +} + +.post-content img[src*="#center"] { + margin: 1rem auto; +} + +.post-content figure.align-center { + text-align: center; +} + +.post-content figure > figcaption { + color: var(--primary); + font-size: 16px; + font-weight: bold; + margin: 8px 0 16px; +} + +.post-content figure > figcaption > p { + color: var(--secondary); + font-size: 14px; + font-weight: normal; +} + +.toc { + margin: 0 2px 40px 2px; + border: 1px solid var(--border); + background: var(--code-bg); + border-radius: var(--radius); + padding: 0.4em; +} + +.dark .toc { + background: var(--entry); +} + +.toc details summary { + cursor: zoom-in; + margin-inline-start: 20px; +} + +.toc details[open] summary { + cursor: zoom-out; +} + +.toc .details { + display: inline; + font-weight: 500; +} + +.toc .inner { + margin: 0 20px; + padding: 10px 20px; +} + +.toc li ul { + margin-inline-start: var(--gap); +} + +.toc summary:focus { + outline: 0; +} + +.post-footer { + margin-top: 56px; +} + +.post-footer>* { + margin-bottom: 10px; +} + +.post-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.post-tags li { + display: inline-block; +} + +.post-tags a, +.share-buttons, +.paginav { + border-radius: var(--radius); + background: var(--code-bg); + border: 1px solid var(--border); +} + +.post-tags a { + display: block; + padding: 0 14px; + color: var(--secondary); + font-size: 14px; + line-height: 34px; + background: var(--code-bg); +} + +.post-tags a:hover, +.paginav a:hover { + background: var(--border); +} + +.share-buttons { + padding: 10px; + display: flex; + justify-content: center; + overflow-x: auto; + gap: 10px; +} + +.share-buttons li, +.share-buttons a { + display: inline-flex; +} + +.share-buttons a:not(:last-of-type) { + margin-inline-end: 12px; +} + +h1:hover .anchor, +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + display: inline-flex; + color: var(--secondary); + margin-inline-start: 8px; + font-weight: 500; + user-select: none; +} + +.paginav { + display: flex; + line-height: 30px; +} + +.paginav a { + padding-inline-start: 14px; + padding-inline-end: 14px; + border-radius: var(--radius); +} + +.paginav .title { + letter-spacing: 1px; + text-transform: uppercase; + font-size: small; + color: var(--secondary); +} + +.paginav .prev, +.paginav .next { + width: 50%; +} + +.paginav span:hover:not(.title) { + box-shadow: 0 1px 0; +} + +.paginav .next { + margin-inline-start: auto; + text-align: right; +} + +[dir="rtl"] .paginav .next { + text-align: left; +} + +h1>a>svg { + display: inline; +} + +img.in-text { + display: inline; + margin: auto; +} + +.mastodon-comment { + color: #000; + margin: 0.4rem; + padding: 0.4rem; + opacity: 0.8; + display: flex; + flex-direction: column; + } + + .mastodon-comment .author { + display: flex; + } + + .mastodon-comment .author .details { + margin: 10px; + padding: 10px; + } + + .mastodon-comment .author .date { + margin-left: auto; + font-size: small; + } + + .mastodon-comment .author a:link, .mastodon-comment .author a:visited, .mastodon-comment .status a:link { + text-decoration: none; + border-bottom: 0px; + } + + .mastodon-comment .content { + padding: 5px; + } + + .mastodon-comment .status { + display: block; + } + + .mastodon-comment .status > div { + display: inline-block; + margin-right: 15px; + } \ No newline at end of file diff --git a/themes/PaperMod/assets/css/common/profile-mode.css b/themes/PaperMod/assets/css/common/profile-mode.css new file mode 100644 index 0000000..9e98df5 --- /dev/null +++ b/themes/PaperMod/assets/css/common/profile-mode.css @@ -0,0 +1,43 @@ +.buttons, +.main .profile { + display: flex; + justify-content: center; +} + +.main .profile { + align-items: center; + min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2)); + text-align: center; +} + +.profile .profile_inner { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; +} + +.profile img { + border-radius: 50%; +} + +.buttons { + flex-wrap: wrap; + max-width: 400px; +} + +.button { + background: var(--tertiary); + border-radius: var(--radius); + margin: 8px; + padding: 6px; + transition: transform 0.1s; +} + +.button-inner { + padding: 0 8px; +} + +.button:active { + transform: scale(0.96); +} diff --git a/themes/PaperMod/assets/css/common/search.css b/themes/PaperMod/assets/css/common/search.css new file mode 100644 index 0000000..38d5b6b --- /dev/null +++ b/themes/PaperMod/assets/css/common/search.css @@ -0,0 +1,45 @@ +#searchbox input { + padding: 4px 10px; + width: 100%; + color: var(--primary); + font-weight: bold; + border: 2px solid var(--tertiary); + border-radius: var(--radius); +} + +#searchbox input:focus { + border-color: var(--secondary); +} + +#searchResults li { + list-style: none; + border-radius: var(--radius); + padding: 10px; + margin: 10px 0; + position: relative; + font-weight: 500; +} + +#searchResults { + margin: 10px 0; + width: 100%; +} + +#searchResults li:active { + transition: transform 0.1s; + transform: scale(0.98); +} + +#searchResults a { + position: absolute; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + outline: none; +} + +#searchResults .focus { + transform: scale(0.98); + border: 2px solid var(--tertiary); +} diff --git a/themes/PaperMod/assets/css/common/terms.css b/themes/PaperMod/assets/css/common/terms.css new file mode 100644 index 0000000..244614b --- /dev/null +++ b/themes/PaperMod/assets/css/common/terms.css @@ -0,0 +1,18 @@ +.terms-tags li { + display: inline-block; + margin: 10px; + font-weight: 500; +} + +.terms-tags a { + display: block; + padding: 3px 10px; + background: var(--tertiary); + border-radius: 6px; + transition: transform 0.1s; +} + +.terms-tags a:active { + background: var(--tertiary); + transform: scale(0.96); +} diff --git a/themes/PaperMod/assets/css/core/license.css b/themes/PaperMod/assets/css/core/license.css new file mode 100644 index 0000000..fb3dfec --- /dev/null +++ b/themes/PaperMod/assets/css/core/license.css @@ -0,0 +1,6 @@ +/* + PaperMod v7 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2024 adityatelange +*/ diff --git a/themes/PaperMod/assets/css/core/reset.css b/themes/PaperMod/assets/css/core/reset.css new file mode 100644 index 0000000..7393d57 --- /dev/null +++ b/themes/PaperMod/assets/css/core/reset.css @@ -0,0 +1,118 @@ +*, +::after, +::before { + box-sizing: border-box; +} + +html { + -webkit-tap-highlight-color: transparent; + overflow-y: scroll; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; +} + +a, +button, +body, +h1, +h2, +h3, +h4, +h5, +h6 { + color: var(--primary); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-size: 18px; + line-height: 1.6; + word-break: break-word; + background: var(--theme); +} + +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +table { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin-top: 0; + margin-bottom: 0; +} + +ul { + padding: 0; +} + +a { + text-decoration: none; +} + +body, +figure, +ul { + margin: 0; +} + +table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow-x: auto; + word-break: keep-all; +} + +button, +input, +textarea { + padding: 0; + font: inherit; + background: 0 0; + border: 0; +} + +input, +textarea { + outline: 0; +} + +button, +input[type=button], +input[type=submit] { + cursor: pointer; +} + +input:-webkit-autofill, +textarea:-webkit-autofill { + box-shadow: 0 0 0 50px var(--theme) inset; +} + +img { + display: block; + max-width: 100%; +} diff --git a/themes/PaperMod/assets/css/core/theme-vars.css b/themes/PaperMod/assets/css/core/theme-vars.css new file mode 100644 index 0000000..db1845d --- /dev/null +++ b/themes/PaperMod/assets/css/core/theme-vars.css @@ -0,0 +1,38 @@ +:root { + --gap: 24px; + --content-gap: 20px; + --nav-width: 1024px; + --main-width: 720px; + --header-height: 60px; + --footer-height: 60px; + --radius: 8px; + --theme: rgb(255, 255, 255); + --entry: rgb(255, 255, 255); + --primary: rgb(30, 30, 30); + --secondary: rgb(108, 108, 108); + --tertiary: rgb(214, 214, 214); + --content: rgb(31, 31, 31); + --code-block-bg: rgb(28, 29, 33); + --code-bg: rgb(245, 245, 245); + --border: rgb(238, 238, 238); +} + +.dark { + --theme: rgb(29, 30, 32); + --entry: rgb(46, 46, 51); + --primary: rgb(218, 218, 219); + --secondary: rgb(155, 156, 157); + --tertiary: rgb(65, 66, 68); + --content: rgb(196, 196, 197); + --code-block-bg: rgb(46, 46, 51); + --code-bg: rgb(55, 56, 62); + --border: rgb(51, 51, 51); +} + +.list { + background: var(--code-bg); +} + +.dark.list { + background: var(--theme); +} diff --git a/themes/PaperMod/assets/css/core/zmedia.css b/themes/PaperMod/assets/css/core/zmedia.css new file mode 100644 index 0000000..a68fd71 --- /dev/null +++ b/themes/PaperMod/assets/css/core/zmedia.css @@ -0,0 +1,55 @@ +@media screen and (max-width: 768px) { + /* theme-vars */ + :root { + --gap: 14px; + } + + /* profile-mode */ + .profile img { + transform: scale(0.85); + } + + /* post-entry */ + .first-entry { + min-height: 260px; + } + + /* archive */ + .archive-month { + flex-direction: column; + } + + .archive-year { + margin-top: 20px; + } + + /* footer */ + .footer { + padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap); + } +} + +/* footer */ +@media screen and (max-width: 900px) { + .list .top-link { + transform: translateY(-5rem); + } +} + +@media screen and (max-width: 340px) { + .share-buttons { + justify-content: unset; + } +} + +@media (prefers-reduced-motion) { + /* terms; profile-mode; post-single; post-entry; post-entry; search; search */ + .terms-tags a:active, + .button:active, + .post-entry:active, + .top-link, + #searchResults .focus, + #searchResults li:active { + transform: none; + } +} diff --git a/themes/PaperMod/assets/css/extended/blank.css b/themes/PaperMod/assets/css/extended/blank.css new file mode 100644 index 0000000..a577295 --- /dev/null +++ b/themes/PaperMod/assets/css/extended/blank.css @@ -0,0 +1,5 @@ +/* +This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles + +Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info +*/ diff --git a/themes/PaperMod/assets/css/includes/chroma-mod.css b/themes/PaperMod/assets/css/includes/chroma-mod.css new file mode 100644 index 0000000..ad89b96 --- /dev/null +++ b/themes/PaperMod/assets/css/includes/chroma-mod.css @@ -0,0 +1,24 @@ +.chroma { + background-color: unset !important; +} + +.chroma .hl { + display: flex; +} + +.chroma .lnt { + padding: 0 0 0 12px; +} + +.highlight pre.chroma code { + padding: 8px 0; +} + +.highlight pre.chroma .line .cl, +.chroma .ln { + padding: 0 10px; +} + +.chroma .lntd:last-of-type { + width: 100%; +} diff --git a/themes/PaperMod/assets/css/includes/chroma-styles.css b/themes/PaperMod/assets/css/includes/chroma-styles.css new file mode 100644 index 0000000..63a73ab --- /dev/null +++ b/themes/PaperMod/assets/css/includes/chroma-styles.css @@ -0,0 +1,86 @@ +/* Background */ .bg { color: #cad3f5; background-color: #24273a; } +/* PreWrapper */ .chroma { color: #cad3f5; background-color: #24273a; } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { color: #ed8796 } +/* CodeLine */ .chroma .cl { } +/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #474733 } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 } +/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #c6a0f6 } +/* KeywordConstant */ .chroma .kc { color: #f5a97f } +/* KeywordDeclaration */ .chroma .kd { color: #ed8796 } +/* KeywordNamespace */ .chroma .kn { color: #8bd5ca } +/* KeywordPseudo */ .chroma .kp { color: #c6a0f6 } +/* KeywordReserved */ .chroma .kr { color: #c6a0f6 } +/* KeywordType */ .chroma .kt { color: #ed8796 } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #8aadf4 } +/* NameBuiltin */ .chroma .nb { color: #91d7e3 } +/* NameBuiltinPseudo */ .chroma .bp { color: #91d7e3 } +/* NameClass */ .chroma .nc { color: #eed49f } +/* NameConstant */ .chroma .no { color: #eed49f } +/* NameDecorator */ .chroma .nd { color: #8aadf4; font-weight: bold } +/* NameEntity */ .chroma .ni { color: #8bd5ca } +/* NameException */ .chroma .ne { color: #f5a97f } +/* NameFunction */ .chroma .nf { color: #8aadf4 } +/* NameFunctionMagic */ .chroma .fm { color: #8aadf4 } +/* NameLabel */ .chroma .nl { color: #91d7e3 } +/* NameNamespace */ .chroma .nn { color: #f5a97f } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { color: #f5a97f } +/* NameTag */ .chroma .nt { color: #c6a0f6 } +/* NameVariable */ .chroma .nv { color: #f4dbd6 } +/* NameVariableClass */ .chroma .vc { color: #f4dbd6 } +/* NameVariableGlobal */ .chroma .vg { color: #f4dbd6 } +/* NameVariableInstance */ .chroma .vi { color: #f4dbd6 } +/* NameVariableMagic */ .chroma .vm { color: #f4dbd6 } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #a6da95 } +/* LiteralStringAffix */ .chroma .sa { color: #ed8796 } +/* LiteralStringBacktick */ .chroma .sb { color: #a6da95 } +/* LiteralStringChar */ .chroma .sc { color: #a6da95 } +/* LiteralStringDelimiter */ .chroma .dl { color: #8aadf4 } +/* LiteralStringDoc */ .chroma .sd { color: #6e738d } +/* LiteralStringDouble */ .chroma .s2 { color: #a6da95 } +/* LiteralStringEscape */ .chroma .se { color: #8aadf4 } +/* LiteralStringHeredoc */ .chroma .sh { color: #6e738d } +/* LiteralStringInterpol */ .chroma .si { color: #a6da95 } +/* LiteralStringOther */ .chroma .sx { color: #a6da95 } +/* LiteralStringRegex */ .chroma .sr { color: #8bd5ca } +/* LiteralStringSingle */ .chroma .s1 { color: #a6da95 } +/* LiteralStringSymbol */ .chroma .ss { color: #a6da95 } +/* LiteralNumber */ .chroma .m { color: #f5a97f } +/* LiteralNumberBin */ .chroma .mb { color: #f5a97f } +/* LiteralNumberFloat */ .chroma .mf { color: #f5a97f } +/* LiteralNumberHex */ .chroma .mh { color: #f5a97f } +/* LiteralNumberInteger */ .chroma .mi { color: #f5a97f } +/* LiteralNumberIntegerLong */ .chroma .il { color: #f5a97f } +/* LiteralNumberOct */ .chroma .mo { color: #f5a97f } +/* Operator */ .chroma .o { color: #91d7e3; font-weight: bold } +/* OperatorWord */ .chroma .ow { color: #91d7e3; font-weight: bold } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #6e738d; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #6e738d; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #6e738d; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #6e738d; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #6e738d; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #6e738d; font-style: italic } +/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: #363a4f } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericError */ .chroma .gr { color: #ed8796 } +/* GenericHeading */ .chroma .gh { color: #f5a97f; font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: #363a4f } +/* GenericOutput */ .chroma .go { } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #f5a97f; font-weight: bold } +/* GenericTraceback */ .chroma .gt { color: #ed8796 } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { } diff --git a/themes/PaperMod/assets/css/includes/scroll-bar.css b/themes/PaperMod/assets/css/includes/scroll-bar.css new file mode 100644 index 0000000..f6e577d --- /dev/null +++ b/themes/PaperMod/assets/css/includes/scroll-bar.css @@ -0,0 +1,63 @@ +/* from reset */ +::-webkit-scrollbar-track { + background: 0 0; +} + +.list:not(.dark)::-webkit-scrollbar-track { + background: var(--code-bg); +} + +::-webkit-scrollbar-thumb { + background: var(--tertiary); + border: 5px solid var(--theme); + border-radius: var(--radius); +} + +.list:not(.dark)::-webkit-scrollbar-thumb { + border: 5px solid var(--code-bg); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--secondary); +} + +::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) { + background: var(--theme); +} + +/* from post-single */ +.post-content .highlighttable td .highlight pre code::-webkit-scrollbar { + display: none; +} + +.post-content :not(table) ::-webkit-scrollbar-thumb { + border: 2px solid var(--code-block-bg); + background: rgb(113, 113, 117); +} + +.post-content :not(table) ::-webkit-scrollbar-thumb:hover { + background: rgb(163, 163, 165); +} + +.gist table::-webkit-scrollbar-thumb { + border: 2px solid rgb(255, 255, 255); + background: rgb(173, 173, 173); +} + +.gist table::-webkit-scrollbar-thumb:hover { + background: rgb(112, 112, 112); +} + +.post-content table::-webkit-scrollbar-thumb { + border-width: 2px; +} + +/* from zmedia */ +@media screen and (min-width: 768px) { + + /* reset */ + ::-webkit-scrollbar { + width: 19px; + height: 11px; + } +} diff --git a/themes/PaperMod/assets/js/fastsearch.js b/themes/PaperMod/assets/js/fastsearch.js new file mode 100644 index 0000000..9484e75 --- /dev/null +++ b/themes/PaperMod/assets/js/fastsearch.js @@ -0,0 +1,152 @@ +import * as params from '@params'; + +let fuse; // holds our search engine +let resList = document.getElementById('searchResults'); +let sInput = document.getElementById('searchInput'); +let first, last, current_elem = null +let resultsAvailable = false; + +// load our search index +window.onload = function () { + let xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + let data = JSON.parse(xhr.responseText); + if (data) { + // fuse.js options; check fuse.js website for details + let options = { + distance: 100, + threshold: 0.4, + ignoreLocation: true, + keys: [ + 'title', + 'permalink', + 'summary', + 'content' + ] + }; + if (params.fuseOpts) { + options = { + isCaseSensitive: params.fuseOpts.iscasesensitive ?? false, + includeScore: params.fuseOpts.includescore ?? false, + includeMatches: params.fuseOpts.includematches ?? false, + minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1, + shouldSort: params.fuseOpts.shouldsort ?? true, + findAllMatches: params.fuseOpts.findallmatches ?? false, + keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'], + location: params.fuseOpts.location ?? 0, + threshold: params.fuseOpts.threshold ?? 0.4, + distance: params.fuseOpts.distance ?? 100, + ignoreLocation: params.fuseOpts.ignorelocation ?? true + } + } + fuse = new Fuse(data, options); // build the index from the json file + } + } else { + console.log(xhr.responseText); + } + } + }; + xhr.open('GET', "../index.json"); + xhr.send(); +} + +function activeToggle(ae) { + document.querySelectorAll('.focus').forEach(function (element) { + // rm focus class + element.classList.remove("focus") + }); + if (ae) { + ae.focus() + document.activeElement = current_elem = ae; + ae.parentElement.classList.add("focus") + } else { + document.activeElement.parentElement.classList.add("focus") + } +} + +function reset() { + resultsAvailable = false; + resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults + sInput.focus(); // shift focus to input box +} + +// execute search as each character is typed +sInput.onkeyup = function (e) { + // run a search query (for "term") every time a letter is typed + // in the search box + if (fuse) { + let results; + if (params.fuseOpts) { + results = fuse.search(this.value.trim(), {limit: params.fuseOpts.limit}); // the actual query being run using fuse.js along with options + } else { + results = fuse.search(this.value.trim()); // the actual query being run using fuse.js + } + if (results.length !== 0) { + // build our html if result exists + let resultSet = ''; // our results bucket + + for (let item in results) { + resultSet += `
  • ${results[item].item.title} »
    ` + + `
  • ` + } + + resList.innerHTML = resultSet; + resultsAvailable = true; + first = resList.firstChild; + last = resList.lastChild; + } else { + resultsAvailable = false; + resList.innerHTML = ''; + } + } +} + +sInput.addEventListener('search', function (e) { + // clicked on x + if (!this.value) reset() +}) + +// kb bindings +document.onkeydown = function (e) { + let key = e.key; + let ae = document.activeElement; + + let inbox = document.getElementById("searchbox").contains(ae) + + if (ae === sInput) { + let elements = document.getElementsByClassName('focus'); + while (elements.length > 0) { + elements[0].classList.remove('focus'); + } + } else if (current_elem) ae = current_elem; + + if (key === "Escape") { + reset() + } else if (!resultsAvailable || !inbox) { + return + } else if (key === "ArrowDown") { + e.preventDefault(); + if (ae == sInput) { + // if the currently focused element is the search input, focus the of first
  • + activeToggle(resList.firstChild.lastChild); + } else if (ae.parentElement != last) { + // if the currently focused element's parent is last, do nothing + // otherwise select the next search result + activeToggle(ae.parentElement.nextSibling.lastChild); + } + } else if (key === "ArrowUp") { + e.preventDefault(); + if (ae.parentElement == first) { + // if the currently focused element is first item, go to input box + activeToggle(sInput); + } else if (ae != sInput) { + // if the currently focused element is input box, do nothing + // otherwise select the previous search result + activeToggle(ae.parentElement.previousSibling.lastChild); + } + } else if (key === "ArrowRight") { + ae.click(); // click on active link + } +} diff --git a/themes/PaperMod/assets/js/fuse.basic.min.js b/themes/PaperMod/assets/js/fuse.basic.min.js new file mode 100644 index 0000000..7457721 --- /dev/null +++ b/themes/PaperMod/assets/js/fuse.basic.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,f(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();f(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j=$;z-=1){var J=z-1,R=n[e.charAt(J)];if(L&&(S[J]=+!!R),K[z]=(K[z+1]<<1|1)&R,P&&(K[z]|=(A[z+1]|A[z])<<1|1|A[z+1]),K[z]&N&&(E=I(t,{errors:P,currentLocation:J,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=J)<=M)break;$=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=K}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}var K=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=T(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=T(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return K.version="7.0.0",K.createIndex=E,K.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},K.config=O,K},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/themes/PaperMod/assets/js/license.js b/themes/PaperMod/assets/js/license.js new file mode 100644 index 0000000..fb3dfec --- /dev/null +++ b/themes/PaperMod/assets/js/license.js @@ -0,0 +1,6 @@ +/* + PaperMod v7 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2024 adityatelange +*/ diff --git a/themes/PaperMod/go.mod b/themes/PaperMod/go.mod new file mode 100644 index 0000000..af95855 --- /dev/null +++ b/themes/PaperMod/go.mod @@ -0,0 +1,3 @@ +module github.com/adityatelange/hugo-PaperMod + +go 1.12 diff --git a/themes/PaperMod/i18n/ar.yaml b/themes/PaperMod/i18n/ar.yaml new file mode 100644 index 0000000..52990c2 --- /dev/null +++ b/themes/PaperMod/i18n/ar.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "السابق" + +- id: next_page + translation: "التالي" + +- id: read_time + translation: + one: "دقيقة واحدة" + two: "دقيقتان" + few: "بضع ثوان" + zero: "الآن" + other: "دقائق {{ .Count }}" + +- id: toc + translation: "فهرس المحتوى" + +- id: translations + translation: "ترجمات أخرى" + +- id: home + translation: "الصفحة الرئيسية" + +- id: code_copied + translation: "تم النسخ!" + +- id: code_copy + translation: "نسخ الكود" diff --git a/themes/PaperMod/i18n/be.yaml b/themes/PaperMod/i18n/be.yaml new file mode 100644 index 0000000..22902ab --- /dev/null +++ b/themes/PaperMod/i18n/be.yaml @@ -0,0 +1,39 @@ +- id: prev_page + translation: "Папярэдняя" + +- id: next_page + translation: "Наступная" + +- id: read_time + translation: + zero: "0 хвілін" + one: "1 хвіліна" + few: "{{ .Count }} хвіліны" + many: "{{ .Count }} хвілін" + other: "{{ .Count }} хвілін" + +- id: words + translation: + zero: "няма слоў" + one: "1 слова" + few: "{{ .Count }} слова" + many: "{{ .Count }} слоў" + other: "{{ .Count }} слова" + +- id: toc + translation: "Змест" + +- id: translations + translation: "Пераклады" + +- id: home + translation: "Галоўная" + +- id: edit_post + translation: "Рэдагаваць" + +- id: code_copy + translation: "капіяваць" + +- id: code_copied + translation: "скапіявана!" diff --git a/themes/PaperMod/i18n/bg.yaml b/themes/PaperMod/i18n/bg.yaml new file mode 100644 index 0000000..1e314af --- /dev/null +++ b/themes/PaperMod/i18n/bg.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Предишна страница" + +- id: next_page + translation: "Следваща страница" + +- id: read_time + translation: + one : "1 мин" + other: "{{ .Count }} мин" + +- id: toc + translation: "Съдържание" + +- id: translations + translation: "Преводи" diff --git a/themes/PaperMod/i18n/bn.yaml b/themes/PaperMod/i18n/bn.yaml new file mode 100644 index 0000000..f42780f --- /dev/null +++ b/themes/PaperMod/i18n/bn.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "পূর্ববর্তী" + +- id: next_page + translation: "পরবর্তী" + +- id: read_time + translation: + one : "১ মিনিট" + other: "{{ .Count }} মিনিট" + +- id: words + translation: + one : "১ টি শব্দ" + other: "{{ .Count }} টি শব্দ" + +- id: toc + translation: "সূচিপত্র" + +- id: translations + translation: "অনুবাদসমূহ" + +- id: home + translation: "হোম" + +- id: edit_post + translation: "সম্পাদনা করুন" + +- id: code_copy + translation: "কপি করুন" + +- id: code_copied + translation: "কপি হয়েছে!" diff --git a/themes/PaperMod/i18n/ca.yaml b/themes/PaperMod/i18n/ca.yaml new file mode 100644 index 0000000..15713e1 --- /dev/null +++ b/themes/PaperMod/i18n/ca.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "Pàgina anterior" + +- id: next_page + translation: "Pàgina següent" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Taula de Continguts" + +- id: translations + translation: "Traduccions" + +- id: home + translation: "Inici" diff --git a/themes/PaperMod/i18n/ckb.yaml b/themes/PaperMod/i18n/ckb.yaml new file mode 100644 index 0000000..25789d1 --- /dev/null +++ b/themes/PaperMod/i18n/ckb.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "پەڕەی پێشتر" + +- id: next_page + translation: "پەڕەی دواتر" + +- id: read_time + translation: + one : "1 خولەک" + other: "{{ .Count }} خولەک" + +- id: toc + translation: "پێڕست" + +- id: translations + translation: "وەرگێڕانەکان" + +- id: home + translation: "ماڵەوە" + +- id: code_copy + translation: "لەبەری بگرەوە" + +- id: code_copied + translation: "لەبەر گیرایەوە!" diff --git a/themes/PaperMod/i18n/cs.yaml b/themes/PaperMod/i18n/cs.yaml new file mode 100644 index 0000000..058c3a1 --- /dev/null +++ b/themes/PaperMod/i18n/cs.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Předchozí" + +- id: next_page + translation: "Další" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "slovo" + other: "{{ .Count }} slov" + +- id: toc + translation: "Obsah" + +- id: translations + translation: "Překlady" + +- id: home + translation: "Domů" + +- id: edit_post + translation: "Upravit" + +- id: code_copy + translation: "kopírovat" + +- id: code_copied + translation: "zkopírováno!" diff --git a/themes/PaperMod/i18n/da.yaml b/themes/PaperMod/i18n/da.yaml new file mode 100644 index 0000000..03b0abe --- /dev/null +++ b/themes/PaperMod/i18n/da.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Forrige Side" + +- id: next_page + translation: "Næste Side" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Indholdsfortegnelse" + +- id: translations + translation: "Oversættelser" + +- id: home + translation: "Start" + +- id: edit_post + translation: "Rediger" + +- id: code_copy + translation: "kopier" + +- id: code_copied + translation: "kopieret!" diff --git a/themes/PaperMod/i18n/de.yaml b/themes/PaperMod/i18n/de.yaml new file mode 100644 index 0000000..f64aad9 --- /dev/null +++ b/themes/PaperMod/i18n/de.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorherige" + +- id: next_page + translation: "Nächste" + +- id: read_time + translation: + one: "1 Minute" + other: "{{ .Count }} Minuten" + +- id: words + translation: + one : "Wort" + other: "{{ .Count }} Wörter" + +- id: toc + translation: "Inhaltsverzeichnis" + +- id: translations + translation: "Übersetzungen" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Bearbeiten" + +- id: code_copy + translation: "Kopieren" + +- id: code_copied + translation: "Kopiert!" diff --git a/themes/PaperMod/i18n/el.yaml b/themes/PaperMod/i18n/el.yaml new file mode 100644 index 0000000..4257bac --- /dev/null +++ b/themes/PaperMod/i18n/el.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Προηγούμενο" + +- id: next_page + translation: "Επόμενο" + +- id: read_time + translation: + one: "1 λεπτό" + other: "{{ .Count }} λεπτά" + +- id: words + translation: + one: "λέξη" + other: "{{ .Count }} λέξεις" + +- id: toc + translation: "Πίνακας Περιεχομένων" + +- id: translations + translation: "Μεταφράσεις" + +- id: home + translation: "Αρχική" + +- id: edit_post + translation: "Επεξεργασία" + +- id: code_copy + translation: "αντιγραφή" + +- id: code_copied + translation: "αντιγράφηκε!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/en.yaml b/themes/PaperMod/i18n/en.yaml new file mode 100644 index 0000000..3a1e215 --- /dev/null +++ b/themes/PaperMod/i18n/en.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prev" + +- id: next_page + translation: "Next" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "word" + other: "{{ .Count }} words" + +- id: toc + translation: "Table of Contents" + +- id: translations + translation: "Translations" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Edit" + +- id: code_copy + translation: "copy" + +- id: code_copied + translation: "copied!" diff --git a/themes/PaperMod/i18n/eo.yaml b/themes/PaperMod/i18n/eo.yaml new file mode 100644 index 0000000..de5d744 --- /dev/null +++ b/themes/PaperMod/i18n/eo.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "antaŭa paĝo" + +- id: next_page + translation: "sekva paĝo" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Enhavo" + +- id: translations + translation: "tradukoj" + +- id: home + translation: "ĉefpaĝo" + +- id: code_copy + translation: "kopii" + +- id: code_copied + translation: "kopiite!" diff --git a/themes/PaperMod/i18n/es.yaml b/themes/PaperMod/i18n/es.yaml new file mode 100644 index 0000000..52a559c --- /dev/null +++ b/themes/PaperMod/i18n/es.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Anterior" + +- id: next_page + translation: "Siguiente" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "palabra" + other: "{{ .Count }} palabras" + +- id: toc + translation: "Tabla de Contenidos" + +- id: translations + translation: "Traducciones" + +- id: home + translation: "Inicio" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "¡copiado!" diff --git a/themes/PaperMod/i18n/fa.yaml b/themes/PaperMod/i18n/fa.yaml new file mode 100644 index 0000000..3fd5927 --- /dev/null +++ b/themes/PaperMod/i18n/fa.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "صفحه قبلی" + +- id: next_page + translation: "صفحه بعدی" + +- id: read_time + translation: + one: "۱ دقیقه" + other: "{{ .Count }} دقیقه" + +- id: toc + translation: "فهرست مطالب" + +- id: translations + translation: "ترجمه ها" + +- id: home + translation: "خانه" + +- id: edit_post + translation: "ویرایش" + +- id: code_copy + translation: "کپی" + +- id: code_copied + translation: "کپی شد!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/fr.yaml b/themes/PaperMod/i18n/fr.yaml new file mode 100644 index 0000000..e48d8e9 --- /dev/null +++ b/themes/PaperMod/i18n/fr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Précédent" + +- id: next_page + translation: "Suivant" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "mot" + other: "{{ .Count }} mots" + +- id: toc + translation: "Table des matières" + +- id: translations + translation: "Traductions" + +- id: home + translation: "Accueil" + +- id: edit_post + translation: "Modifier" + +- id: code_copy + translation: "Copier" + +- id: code_copied + translation: "Copié !" diff --git a/themes/PaperMod/i18n/he.yaml b/themes/PaperMod/i18n/he.yaml new file mode 100644 index 0000000..3912fb8 --- /dev/null +++ b/themes/PaperMod/i18n/he.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "קודם" + +- id: next_page + translation: "הבא" + +- id: read_time + translation: + one : "דקה אחת" + other: "דקות {{ .Count }}" + +- id: words + translation: + one : "word" + other: "מילים {{ .Count }} " + +- id: toc + translation: "תוכן העניינים" + +- id: translations + translation: "תרגומים" + +- id: home + translation: "בית" + +- id: edit_post + translation: "ערוך" + +- id: code_copy + translation: "העתק" + +- id: code_copied + translation: "!הועתק" diff --git a/themes/PaperMod/i18n/hi.yaml b/themes/PaperMod/i18n/hi.yaml new file mode 100644 index 0000000..681efdc --- /dev/null +++ b/themes/PaperMod/i18n/hi.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "पिछला" + +- id: next_page + translation: "अगला" + +- id: read_time + translation: + one : "एक मिनट" + other: "{{ .Count }} मिनट" + +- id: edit_post + translation: "सुधारें" + +- id: toc + translation: "विषय - सूची" + +- id: translations + translation: "अनुवाद" diff --git a/themes/PaperMod/i18n/hr.yaml b/themes/PaperMod/i18n/hr.yaml new file mode 100644 index 0000000..2f2d228 --- /dev/null +++ b/themes/PaperMod/i18n/hr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prethodna stranica" + +- id: next_page + translation: "Sljedeća stranica" + +- id: read_time + translation: + one : "1 minuta" + other: "{{ .Count }} minute" + +- id: words + translation: + one : "riječ" + other: "{{ .Count }} riječi" + +- id: toc + translation: "Tablica Sadržaja" + +- id: translations + translation: "Prijevodi" + +- id: home + translation: "Početna stranica" + +- id: edit_post + translation: "Promjeni" + +- id: code_copy + translation: "kopiraj" + +- id: code_copied + translation: "kopirano!" diff --git a/themes/PaperMod/i18n/hu.yaml b/themes/PaperMod/i18n/hu.yaml new file mode 100644 index 0000000..a039dda --- /dev/null +++ b/themes/PaperMod/i18n/hu.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Előző oldal" + +- id: next_page + translation: "Következő oldal" + +- id: read_time + translation: + one: "1 perc" + other: "{{ .Count }} perc" + +- id: toc + translation: "Tartalomjegyzék" + +- id: translations + translation: "Fordítások" diff --git a/themes/PaperMod/i18n/id.yaml b/themes/PaperMod/i18n/id.yaml new file mode 100644 index 0000000..93d34f5 --- /dev/null +++ b/themes/PaperMod/i18n/id.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Sebelumnya" + +- id: next_page + translation: "Selanjutnya" + +- id: read_time + translation: + one : "1 menit" + other: "{{ .Count }} menit" + +- id: words + translation: + one : "kata" + other: "{{ .Count }} kata" + +- id: toc + translation: "Daftar isi" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Beranda" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "salin" + +- id: code_copied + translation: "disalin!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/it.yaml b/themes/PaperMod/i18n/it.yaml new file mode 100644 index 0000000..c87c95d --- /dev/null +++ b/themes/PaperMod/i18n/it.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Precedente" + +- id: next_page + translation: "Successivo" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minuti" + +- id: words + translation: + one : "parola" + other: "{{ .Count }} parole" + +- id: toc + translation: "Indice contenuti" + +- id: translations + translation: "Traduzioni" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Modifica" + +- id: code_copy + translation: "copia" + +- id: code_copied + translation: "copiato!" diff --git a/themes/PaperMod/i18n/ja.yaml b/themes/PaperMod/i18n/ja.yaml new file mode 100644 index 0000000..93948d3 --- /dev/null +++ b/themes/PaperMod/i18n/ja.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "前へ" + +- id: next_page + translation: "次へ" + +- id: read_time + translation: + one : "1 分" + other: "{{ .Count }} 分" + +- id: words + translation: + one: "文字" + other: "{{ .Count }} 文字" + +- id: toc + translation: "目次" + +- id: translations + translation: "言語" + +- id: home + translation: "ホーム" + +- id: edit_post + translation: "編集" + +- id: code_copy + translation: "コピー" + +- id: code_copied + translation: "コピーされました!" diff --git a/themes/PaperMod/i18n/ko.yaml b/themes/PaperMod/i18n/ko.yaml new file mode 100644 index 0000000..777dd93 --- /dev/null +++ b/themes/PaperMod/i18n/ko.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "이전 페이지" + +- id: next_page + translation: "다음 페이지" + +- id: read_time + translation: + one : "1 분" + other: "{{ .Count }} 분" + +- id: words + translation: + one : "단어" + other: "{{ .Count }} 단어" + +- id: toc + translation: "목차" + +- id: translations + translation: "번역" + +- id: home + translation: "홈" + +- id: edit_post + translation: "편집" + +- id: code_copy + translation: "복사" + +- id: code_copied + translation: "복사 완료!" diff --git a/themes/PaperMod/i18n/ku.yaml b/themes/PaperMod/i18n/ku.yaml new file mode 100644 index 0000000..d1d30a5 --- /dev/null +++ b/themes/PaperMod/i18n/ku.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Rûpela Paş" + +- id: next_page + translation: "Rûpela Pêş" + +- id: read_time + translation: + one : "1 xulek" + other: "{{ .Count }} xulek" + +- id: toc + translation: "Pêrist" + +- id: translations + translation: "Wergeran" + +- id: home + translation: "Xanî" + +- id: code_copy + translation: "Jê bigire" + +- id: code_copied + translation: "Hat jêgirtin!" diff --git a/themes/PaperMod/i18n/mn.yaml b/themes/PaperMod/i18n/mn.yaml new file mode 100644 index 0000000..dbce2ce --- /dev/null +++ b/themes/PaperMod/i18n/mn.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Ѳмнѳх" + +- id: next_page + translation: "Дараах" + +- id: read_time + translation: + one : "1 МИН" + other: "{{ .Count }} МИН" + +- id: toc + translation: "Агуулга" + +- id: translations + translation: "Орчуулга" + +- id: home + translation: "Нүүр" + +- id: code_copy + translation: "хуулах" + +- id: code_copied + translation: "хуулсан!" diff --git a/themes/PaperMod/i18n/ms.yaml b/themes/PaperMod/i18n/ms.yaml new file mode 100644 index 0000000..d8a9eff --- /dev/null +++ b/themes/PaperMod/i18n/ms.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Halaman Sebelumnya" + +- id: next_page + translation: "Halaman Seterusnya" + +- id: read_time + translation: + one: "1 minit" + other: "{{ .Count }} minit" + +- id: toc + translation: "Isi Kandungan" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "Salin" + +- id: code_copied + translation: "Disalin!" diff --git a/themes/PaperMod/i18n/nl.yaml b/themes/PaperMod/i18n/nl.yaml new file mode 100644 index 0000000..e9d06fa --- /dev/null +++ b/themes/PaperMod/i18n/nl.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorige" + +- id: next_page + translation: "Volgende" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "woord" + other: "{{ .Count }} woorden" + +- id: toc + translation: "Inhoudsopgave" + +- id: translations + translation: "Vertalingen" + +- id: home + translation: "Startpagina" + +- id: edit_post + translation: "Bewerk" + +- id: code_copy + translation: "kopieer" + +- id: code_copied + translation: "gekopieerd!" diff --git a/themes/PaperMod/i18n/no.yaml b/themes/PaperMod/i18n/no.yaml new file mode 100644 index 0000000..2400348 --- /dev/null +++ b/themes/PaperMod/i18n/no.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Forrige Side" + +- id: next_page + translation: "Neste Side" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one: "ord" + other: "{{ .Count }} ord" + +- id: toc + translation: "Innholdsfortegnelse" + +- id: translations + translation: "Oversettelser" + +- id: home + translation: "Hjem" + +- id: edit_post + translation: "Rediger" + +- id: code_copy + translation: "Kopier" + +- id: code_copied + translation: "Kopiert!" diff --git a/themes/PaperMod/i18n/pa.yaml b/themes/PaperMod/i18n/pa.yaml new file mode 100644 index 0000000..32192c5 --- /dev/null +++ b/themes/PaperMod/i18n/pa.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "ਪਿਛਲਾ" + +- id: next_page + translation: "ਅਗਲਾ" + +- id: read_time + translation: + one: "1 ਮਿੰਟ" + other: "{{ .Count }} ਮਿੰਟ" + +- id: words + translation: + one: "ਸ਼ਬਦ" + other: "{{ .Count }} ਸ਼ਬਦ" + +- id: toc + translation: "ਤਤਕਰਾ" + +- id: translations + translation: "ਅਨੁਵਾਦ" + +- id: home + translation: "ਘਰ" + +- id: edit_post + translation: "ਸੋਧ" + +- id: code_copy + translation: "ਕਾਪੀ" + +- id: code_copied + translation: "ਕਾਪੀ ਕੀਤੀ ਗਈ!!" diff --git a/themes/PaperMod/i18n/pl.yaml b/themes/PaperMod/i18n/pl.yaml new file mode 100644 index 0000000..81b0e77 --- /dev/null +++ b/themes/PaperMod/i18n/pl.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Poprzednia" + +- id: next_page + translation: "Następna" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "słowo" + other: "{{ .Count }} słów" + +- id: toc + translation: "Spis treści" + +- id: translations + translation: "Tłumaczenia" + +- id: home + translation: "Strona Główna" + +- id: edit_post + translation: "Edytuj" + +- id: code_copy + translation: "Kopiuj" + +- id: code_copied + translation: "Skopiowano!" diff --git a/themes/PaperMod/i18n/pnb.yaml b/themes/PaperMod/i18n/pnb.yaml new file mode 100644 index 0000000..fa2f8a8 --- /dev/null +++ b/themes/PaperMod/i18n/pnb.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "پِچھلا" + +- id: next_page + translation: "اگلا" + +- id: read_time + translation: + one: "ایک منٹ" + other: "مِنٹ {{ .Count }}" + +- id: words + translation: + one: "لفظ" + other: "لفظ {{ .Count }}" + +- id: toc + translation: "تتکرا" + +- id: translations + translation: "انوواد" + +- id: home + translation: "گھر" + +- id: edit_post + translation: "سودھ" + +- id: code_copy + translation: "کاپی" + +- id: code_copied + translation: "کاپی کیتی گئی!" diff --git a/themes/PaperMod/i18n/pt.yaml b/themes/PaperMod/i18n/pt.yaml new file mode 100644 index 0000000..ab06429 --- /dev/null +++ b/themes/PaperMod/i18n/pt.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Página Anterior" + +- id: next_page + translation: "Próxima Página" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minutos" + +- id: words + translation: + one : "palavra" + other: "{{ .Count }} palavras" + +- id: toc + translation: "Conteúdo" + +- id: translations + translation: "Traduções" + +- id: home + translation: "Início" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "copiado!" diff --git a/themes/PaperMod/i18n/ro.yaml b/themes/PaperMod/i18n/ro.yaml new file mode 100644 index 0000000..694f20b --- /dev/null +++ b/themes/PaperMod/i18n/ro.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Înapoi" + +- id: next_page + translation: "Înainte" + +- id: read_time + translation: + one : "1 minut" + other: "{{ .Count }} minute" + +- id: words + translation: + one : "cuvânt" + other: "{{ .Count }} cuvinte" + +- id: toc + translation: "Sumar" + +- id: translations + translation: "Traduceri" + +- id: home + translation: "Acasă" + +- id: edit_post + translation: "Editează" + +- id: code_copy + translation: "copiază" + +- id: code_copied + translation: "copiat!" diff --git a/themes/PaperMod/i18n/ru.yaml b/themes/PaperMod/i18n/ru.yaml new file mode 100644 index 0000000..a5dbb5c --- /dev/null +++ b/themes/PaperMod/i18n/ru.yaml @@ -0,0 +1,39 @@ +- id: prev_page + translation: "Предыдущая" + +- id: next_page + translation: "Следующая" + +- id: read_time + translation: + zero: "0 минут" + one: "1 минута" + few: "{{ .Count }} минуты" + many: "{{ .Count }} минут" + other: "{{ .Count }} минута" + +- id: words + translation: + zero: "0 слов" + one: "1 слово" + few: "{{ .Count }} слова" + many: "{{ .Count }} слов" + other: "{{ .Count }} слово" + +- id: toc + translation: "Оглавление" + +- id: translations + translation: "Переводы" + +- id: home + translation: "Главная" + +- id: edit_post + translation: "Редактировать" + +- id: code_copy + translation: "копировать" + +- id: code_copied + translation: "скопировано!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/sk.yaml b/themes/PaperMod/i18n/sk.yaml new file mode 100644 index 0000000..f129d37 --- /dev/null +++ b/themes/PaperMod/i18n/sk.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Predch" + +- id: next_page + translation: "Ďaľší" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "slovo" + other: "{{ .Count }} slov" + +- id: toc + translation: "Obsah" + +- id: translations + translation: "Preklady" + +- id: home + translation: "Domov" + +- id: edit_post + translation: "Upraviť" + +- id: code_copy + translation: "kopírovať" + +- id: code_copied + translation: "skopírované!" diff --git a/themes/PaperMod/i18n/sv.yaml b/themes/PaperMod/i18n/sv.yaml new file mode 100644 index 0000000..65ce422 --- /dev/null +++ b/themes/PaperMod/i18n/sv.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Förra Sidan" + +- id: next_page + translation: "Nästa Sida" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Innehållsförteckning" + +- id: translations + translation: "Översättningar" + +- id: home + translation: "Hem" + +- id: edit_post + translation: "Redigera" + +- id: code_copy + translation: "kopiera" + +- id: code_copied + translation: "kopierad!" diff --git a/themes/PaperMod/i18n/sw.yaml b/themes/PaperMod/i18n/sw.yaml new file mode 100644 index 0000000..5fceb1a --- /dev/null +++ b/themes/PaperMod/i18n/sw.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Uliopita" + +- id: next_page + translation: "Ujao" + +- id: read_time + translation: + one : "dakika 1" + other: "dakika {{ .Count }}" + +- id: words + translation: + one : "neno" + other: "maneno {{ .Count }}" + +- id: toc + translation: "Jedwali la Yaliyomo" + +- id: translations + translation: "Tafsiri" + +- id: home + translation: "Mwanzo" + +- id: edit_post + translation: "Hariri" + +- id: code_copy + translation: "nakili" + +- id: code_copied + translation: "nakiliwa!" diff --git a/themes/PaperMod/i18n/th.yaml b/themes/PaperMod/i18n/th.yaml new file mode 100644 index 0000000..d8036ae --- /dev/null +++ b/themes/PaperMod/i18n/th.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "ก่อนหน้า" + +- id: next_page + translation: "ถัดไป" + +- id: read_time + translation: + one : "1 นาที" + other: "{{ .Count }} นาที" + +- id: words + translation: + one : "คำ" + other: "{{ .Count }} คำ" + +- id: toc + translation: "สารบัญ" + +- id: translations + translation: "การแปล" + +- id: home + translation: "หน้าหลัก" + +- id: edit_post + translation: "แก้ไข" + +- id: code_copy + translation: "คัดลอก" + +- id: code_copied + translation: "คัดลอกแล้ว!" diff --git a/themes/PaperMod/i18n/tr.yaml b/themes/PaperMod/i18n/tr.yaml new file mode 100644 index 0000000..d11ef21 --- /dev/null +++ b/themes/PaperMod/i18n/tr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Önceki" + +- id: next_page + translation: "Sonraki" + +- id: read_time + translation: + one : "1 dk" + other: "{{ .Count }} dk" + +- id: words + translation: + one : "kelime" + other: "{{ .Count }} kelime" + +- id: toc + translation: "İçindekiler" + +- id: translations + translation: "Çeviriler" + +- id: home + translation: "Anasayfa" + +- id: edit_post + translation: "Düzenle" + +- id: code_copy + translation: "Kopyala" + +- id: code_copied + translation: "Kopyalandı!" diff --git a/themes/PaperMod/i18n/uk.yaml b/themes/PaperMod/i18n/uk.yaml new file mode 100644 index 0000000..41be964 --- /dev/null +++ b/themes/PaperMod/i18n/uk.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Попередня" + +- id: next_page + translation: "Наступна" + +- id: read_time + translation: + one : "1 хвилина" + other: "{{ .Count }} хвилин" + +- id: toc + translation: "Зміст" + +- id: translations + translation: "Переклади" + +- id: home + translation: "Головна" + +- id: code_copy + translation: "копіювати" + +- id: code_copied + translation: "скопійовано!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/uz.yaml b/themes/PaperMod/i18n/uz.yaml new file mode 100644 index 0000000..c9f2375 --- /dev/null +++ b/themes/PaperMod/i18n/uz.yaml @@ -0,0 +1,20 @@ +- id: prev_page + translation: "Oldingi sahifa" + +- id: next_page + translation: "Keyingi sahifa" + +- id: read_time + translation: + one : "Bir daqiqa" + other: "{{ .Count }} daqiqa" + +- id: toc + translation: "Mundarija" + +- id: translations + translation: "Tarjimalar" + +- id: home + translation: "Bosh sahifa" + diff --git a/themes/PaperMod/i18n/vi.yaml b/themes/PaperMod/i18n/vi.yaml new file mode 100644 index 0000000..2eb05d0 --- /dev/null +++ b/themes/PaperMod/i18n/vi.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Trang trước" + +- id: next_page + translation: "Trang tiếp theo" + +- id: read_time + translation: + one: "1 phút" + other: "{{ .Count }} phút" + +- id: words + translation: + one: "từ" + other: "{{ .Count }} từ" + +- id: toc + translation: "Mục lục" + +- id: translations + translation: "Bản dịch" + +- id: home + translation: "Trang chủ" + +- id: edit_post + translation: "Chỉnh sửa" + +- id: code_copy + translation: "Sao chép" + +- id: code_copied + translation: "Đã sao chép!" diff --git a/themes/PaperMod/i18n/zh-tw.yaml b/themes/PaperMod/i18n/zh-tw.yaml new file mode 100644 index 0000000..48b84d2 --- /dev/null +++ b/themes/PaperMod/i18n/zh-tw.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一頁" + +- id: next_page + translation: "下一頁" + +- id: read_time + translation: + one : "1 分鐘" + other: "{{ .Count }} 分鐘" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目錄" + +- id: translations + translation: "語言" + +- id: home + translation: "首頁" + +- id: edit_post + translation: "編輯" + +- id: code_copy + translation: "複製" + +- id: code_copied + translation: "已複製!" diff --git a/themes/PaperMod/i18n/zh.yaml b/themes/PaperMod/i18n/zh.yaml new file mode 100644 index 0000000..0280425 --- /dev/null +++ b/themes/PaperMod/i18n/zh.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一页" + +- id: next_page + translation: "下一页" + +- id: read_time + translation: + one : "1 分钟" + other: "{{ .Count }} 分钟" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目录" + +- id: translations + translation: "语言" + +- id: home + translation: "主页" + +- id: edit_post + translation: "编辑" + +- id: code_copy + translation: "复制" + +- id: code_copied + translation: "已复制!" diff --git a/themes/PaperMod/images/screenshot.png b/themes/PaperMod/images/screenshot.png new file mode 100644 index 0000000..a37c485 Binary files /dev/null and b/themes/PaperMod/images/screenshot.png differ diff --git a/themes/PaperMod/images/tn.png b/themes/PaperMod/images/tn.png new file mode 100644 index 0000000..cf83179 Binary files /dev/null and b/themes/PaperMod/images/tn.png differ diff --git a/themes/PaperMod/layouts/404.html b/themes/PaperMod/layouts/404.html new file mode 100644 index 0000000..a405573 --- /dev/null +++ b/themes/PaperMod/layouts/404.html @@ -0,0 +1,3 @@ +{{- define "main" }} +
    404
    +{{- end }}{{/* end main */ -}} diff --git a/themes/PaperMod/layouts/_default/_markup/render-image.html b/themes/PaperMod/layouts/_default/_markup/render-image.html new file mode 100644 index 0000000..1acb87d --- /dev/null +++ b/themes/PaperMod/layouts/_default/_markup/render-image.html @@ -0,0 +1 @@ +{{ .Text }} diff --git a/themes/PaperMod/layouts/_default/archives.html b/themes/PaperMod/layouts/_default/archives.html new file mode 100644 index 0000000..b38e39a --- /dev/null +++ b/themes/PaperMod/layouts/_default/archives.html @@ -0,0 +1,74 @@ +{{- define "main" }} + +
    + +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} + +{{- if site.Params.ShowAllPagesInArchive }} +{{- $pages = site.RegularPages }} +{{- end }} + +{{- range $pages.GroupByPublishDate "2006" }} +{{- if ne .Key "0001" }} +
    +

    + {{- replace .Key "0001" "" }}  {{ len .Pages }} +

    + {{- range .Pages.GroupByDate "January" }} +
    +

    {{- .Key }}  {{ len .Pages }}

    +
    + {{- range .Pages }} + {{- if eq .Kind "page" }} +
    +

    + {{- .Title | markdownify }} + {{- if .Draft }} + + + + + + {{- end }} +

    +
    + {{- partial "post_meta.html" . -}} +
    + +
    + {{- end }} + {{- end }} +
    +
    + {{- end }} +
    +{{- end }} +{{- end }} + +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/_default/baseof.html b/themes/PaperMod/layouts/_default/baseof.html new file mode 100644 index 0000000..df611bf --- /dev/null +++ b/themes/PaperMod/layouts/_default/baseof.html @@ -0,0 +1,27 @@ +{{- if lt hugo.Version "0.112.4" }} +{{- errorf "=> hugo v0.112.4 or greater is required for hugo-PaperMod to build " }} +{{- end -}} + + + + + + {{- partial "head.html" . }} + + + + {{- partialCached "header.html" . .Page -}} +
    + {{- block "main" . }}{{ end }} +
    + {{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}} + + + diff --git a/themes/PaperMod/layouts/_default/index.json b/themes/PaperMod/layouts/_default/index.json new file mode 100644 index 0000000..feeb437 --- /dev/null +++ b/themes/PaperMod/layouts/_default/index.json @@ -0,0 +1,7 @@ +{{- $.Scratch.Add "index" slice -}} +{{- range site.RegularPages -}} + {{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }} + {{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}} + {{- end }} +{{- end -}} +{{- $.Scratch.Get "index" | jsonify -}} diff --git a/themes/PaperMod/layouts/_default/list.html b/themes/PaperMod/layouts/_default/list.html new file mode 100644 index 0000000..81aea6e --- /dev/null +++ b/themes/PaperMod/layouts/_default/list.html @@ -0,0 +1,121 @@ +{{- define "main" }} + +{{- if (and site.Params.profileMode.enabled .IsHome) }} +{{- partial "index_profile.html" . }} +{{- else }} {{/* if not profileMode */}} + +{{- if not .IsHome | and .Title }} + +{{- end }} + +{{- if .Content }} +
    + {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
    +{{- end }} + +{{- $pages := union .RegularPages .Sections }} + +{{- if .IsHome }} +{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true" }} +{{- end }} + +{{- $paginator := .Paginate $pages }} + +{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }} +{{- partial "home_info.html" . }} +{{- end }} + +{{- $term := .Data.Term }} +{{- range $index, $page := $paginator.Pages }} + +{{- $class := "post-entry" }} + +{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }} +{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }} +{{- $class = "first-entry" }} +{{- else if $term }} +{{- $class = "post-entry tag-entry" }} +{{- end }} + +
    + {{- $isHidden := (.Param "cover.hiddenInList") | default (.Param "cover.hidden") | default false }} + {{- partial "cover.html" (dict "cxt" . "IsSingle" false "isHidden" $isHidden) }} +
    +

    + {{- .Title }} + {{- if .Draft }} + + + + + + {{- end }} +

    +
    + {{- if (ne (.Param "hideSummary") true) }} +
    +

    {{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}

    +
    + {{- end }} + {{- if not (.Param "hideMeta") }} +
    + {{- partial "post_meta.html" . -}} +
    + {{- end }} + +
    +{{- end }} + +{{- if gt $paginator.TotalPages 1 }} + +{{- end }} + +{{- end }}{{/* end profileMode */}} + +{{- end }}{{- /* end main */ -}} diff --git a/themes/PaperMod/layouts/_default/rss.xml b/themes/PaperMod/layouts/_default/rss.xml new file mode 100644 index 0000000..89dec2c --- /dev/null +++ b/themes/PaperMod/layouts/_default/rss.xml @@ -0,0 +1,83 @@ +{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}} +{{- $authorEmail := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .email }} + {{- $authorEmail = . }} + {{- end }} + {{- end }} +{{- else }} + {{- with site.Author.email }} + {{- $authorEmail = . }} + {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }} + {{- end }} +{{- end }} + +{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}} +{{- $authorName := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .name }} + {{- $authorName = . }} + {{- end }} + {{- else }} + {{- $authorName = . }} + {{- end }} +{{- else }} + {{- with site.Author.name }} + {{- $authorName = . }} + {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }} + {{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} + + + {{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }} + {{- with site.Params.images }} + + {{ site.Title }} + {{ index . 0 | absURL }} + {{ index . 0 | absURL }} + + {{- end }} + Hugo -- gohugo.io + {{ site.Language.LanguageCode }}{{ with $authorEmail }} + {{.}}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} + {{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with site.Copyright }} + {{ . }}{{ end }}{{ if not .Date.IsZero }} + {{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end }} + {{- range $pages }} + {{- if and (ne .Layout `search`) (ne .Layout `archives`) }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} + {{ .Permalink }} + {{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}} + {{- if and site.Params.ShowFullTextinRSS .Content }} + {{ (printf "" .Content) | safeHTML }} + {{- end }} + + {{- end }} + {{- end }} + + diff --git a/themes/PaperMod/layouts/_default/search.html b/themes/PaperMod/layouts/_default/search.html new file mode 100644 index 0000000..bb7d436 --- /dev/null +++ b/themes/PaperMod/layouts/_default/search.html @@ -0,0 +1,29 @@ +{{- define "main" }} + + + + + +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/_default/single.html b/themes/PaperMod/layouts/_default/single.html new file mode 100644 index 0000000..19a624f --- /dev/null +++ b/themes/PaperMod/layouts/_default/single.html @@ -0,0 +1,65 @@ +{{- define "main" }} + +
    +
    + {{ partial "breadcrumbs.html" . }} +

    + {{ .Title }} + {{- if .Draft }} + + + + + + {{- end }} +

    + {{- if .Description }} +
    + {{ .Description }} +
    + {{- end }} + {{- if not (.Param "hideMeta") }} + + {{- end }} +
    + {{- $isHidden := (.Param "cover.hiddenInSingle") | default (.Param "cover.hidden") | default false }} + {{- partial "cover.html" (dict "cxt" . "IsSingle" true "isHidden" $isHidden) }} + {{- if (.Param "ShowToc") }} + {{- partial "toc.html" . }} + {{- end }} + + {{- if .Content }} +
    + {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
    + {{- end }} + +
    + {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }} + + {{- if (.Param "ShowPostNavLinks") }} + {{- partial "post_nav_links.html" . }} + {{- end }} + {{- if (and site.Params.ShowShareButtons (ne .Params.disableShare true)) }} + {{- partial "share_icons.html" . -}} + {{- end }} +
    + + {{- if (.Param "comments") }} + {{- partial "comments.html" . }} + {{- end }} +
    + +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/_default/terms.html b/themes/PaperMod/layouts/_default/terms.html new file mode 100644 index 0000000..6fd2654 --- /dev/null +++ b/themes/PaperMod/layouts/_default/terms.html @@ -0,0 +1,27 @@ +{{- define "main" }} + +{{- if .Title }} + +{{- end }} + +
      + {{- $type := .Type }} + {{- range $key, $value := .Data.Terms.Alphabetical }} + {{- $name := .Name }} + {{- $count := .Count }} + {{- with site.GetPage (printf "/%s/%s" $type $name) }} +
    • + {{ .Name }} {{ $count }} +
    • + {{- end }} + {{- end }} +
    + +{{- end }}{{/* end main */ -}} diff --git a/themes/PaperMod/layouts/partials/anchored_headings.html b/themes/PaperMod/layouts/partials/anchored_headings.html new file mode 100644 index 0000000..377af89 --- /dev/null +++ b/themes/PaperMod/layouts/partials/anchored_headings.html @@ -0,0 +1,2 @@ +{{- /* formats .Content headings by adding an anchor */ -}} +{{ . | replaceRE "()" "${1}${3}" | safeHTML }} diff --git a/themes/PaperMod/layouts/partials/author.html b/themes/PaperMod/layouts/partials/author.html new file mode 100644 index 0000000..8f2758f --- /dev/null +++ b/themes/PaperMod/layouts/partials/author.html @@ -0,0 +1,9 @@ +{{- if or .Params.author site.Params.author }} +{{- $author := (.Params.author | default site.Params.author) }} +{{- $author_type := (printf "%T" $author) }} +{{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }} +{{- (delimit $author ", " ) }} +{{- else }} +{{- $author }} +{{- end }} +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/breadcrumbs.html b/themes/PaperMod/layouts/partials/breadcrumbs.html new file mode 100644 index 0000000..2686ca0 --- /dev/null +++ b/themes/PaperMod/layouts/partials/breadcrumbs.html @@ -0,0 +1,19 @@ +{{- if (.Param "ShowBreadCrumbs") -}} + +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/comments.html b/themes/PaperMod/layouts/partials/comments.html new file mode 100644 index 0000000..918451a --- /dev/null +++ b/themes/PaperMod/layouts/partials/comments.html @@ -0,0 +1,3 @@ +{{- /* Comments area start */ -}} +{{- /* to add comments read => https://gohugo.io/content-management/comments/ */ -}} +{{- /* Comments area end */ -}} diff --git a/themes/PaperMod/layouts/partials/cover.html b/themes/PaperMod/layouts/partials/cover.html new file mode 100644 index 0000000..e92b555 --- /dev/null +++ b/themes/PaperMod/layouts/partials/cover.html @@ -0,0 +1,43 @@ +{{- with .cxt}} {{/* Apply proper context from dict */}} +{{- if (and .Params.cover.image (not $.isHidden)) }} +{{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }} +{{- $loading := cond $.IsSingle "eager" "lazy" }} +
    + {{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }} + {{- $addLink := (and site.Params.cover.linkFullImages $.IsSingle) }} + {{- $pageBundleCover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }} + {{- $globalResourcesCover := (resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }} + {{- $cover := (or $pageBundleCover $globalResourcesCover)}} + {{- if $cover -}}{{/* i.e it is present in page bundle */}} + {{- if $addLink }}{{ end -}} + {{- $sizes := (slice "360" "480" "720" "1080" "1500") }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }} + {{ $alt }} + {{- else }}{{/* Unprocessable image or responsive images disabled */}} + {{ $alt }} + {{- end }} + {{- else }}{{/* For absolute urls and external links, no img processing here */}} + {{- if $addLink }}{{ end -}} + {{ $alt }} + {{- end }} + {{- if $addLink }}{{ end -}} + {{/* Display Caption */}} + {{- if $.IsSingle }} + {{ with .Params.cover.caption }}

    {{ . | markdownify }}

    {{- end }} + {{- end }} +
    +{{- end }}{{/* End image */}} +{{- end -}}{{/* End context */ -}} diff --git a/themes/PaperMod/layouts/partials/edit_post.html b/themes/PaperMod/layouts/partials/edit_post.html new file mode 100644 index 0000000..4f2c4de --- /dev/null +++ b/themes/PaperMod/layouts/partials/edit_post.html @@ -0,0 +1,8 @@ +{{- if and (or .Params.editPost.URL site.Params.editPost.URL) (not (.Param "editPost.disabled")) -}} +{{- $fileUrlPath := path.Join .File.Path }} + +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated }} | {{- end -}} + + {{- .Params.editPost.Text | default (site.Params.editPost.Text | default (i18n "edit_post" | default "Edit")) -}} + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/extend_footer.html b/themes/PaperMod/layouts/partials/extend_footer.html new file mode 100644 index 0000000..0519748 --- /dev/null +++ b/themes/PaperMod/layouts/partials/extend_footer.html @@ -0,0 +1,3 @@ +{{- /* Footer custom content area start */ -}} +{{- /* Insert any custom code web-analytics, resources, etc. here */ -}} +{{- /* Footer custom content area end */ -}} diff --git a/themes/PaperMod/layouts/partials/extend_head.html b/themes/PaperMod/layouts/partials/extend_head.html new file mode 100644 index 0000000..150cbef --- /dev/null +++ b/themes/PaperMod/layouts/partials/extend_head.html @@ -0,0 +1,4 @@ +{{- /* Head custom content area start */ -}} +{{- /* Insert any custom code (web-analytics, resources, etc.) - it will appear in the section of every page. */ -}} +{{- /* Can be overwritten by partial with the same name in the global layouts. */ -}} +{{- /* Head custom content area end */ -}} diff --git a/themes/PaperMod/layouts/partials/footer.html b/themes/PaperMod/layouts/partials/footer.html new file mode 100644 index 0000000..bc8e1e7 --- /dev/null +++ b/themes/PaperMod/layouts/partials/footer.html @@ -0,0 +1,136 @@ +{{- if not (.Param "hideFooter") }} + +{{- end }} + +{{- if (not site.Params.disableScrollToTop) }} + + + + + +{{- end }} + +{{- partial "extend_footer.html" . }} + + + +{{- if (not site.Params.disableScrollToTop) }} + +{{- end }} + +{{- if (not site.Params.disableThemeToggle) }} + +{{- end }} + +{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }} + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/head.html b/themes/PaperMod/layouts/partials/head.html new file mode 100644 index 0000000..3e55c67 --- /dev/null +++ b/themes/PaperMod/layouts/partials/head.html @@ -0,0 +1,157 @@ + + + +{{- if hugo.IsProduction | or (eq site.Params.env "production") | and (ne .Params.robotsNoIndex true) }} + +{{- else }} + +{{- end }} + +{{- /* Title */}} +{{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }} + +{{- /* Meta */}} +{{- if .IsHome }} +{{ with site.Params.keywords -}}{{ end }} +{{- else }} + +{{- end }} + + + +{{- if site.Params.analytics.google.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.yandex.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.bing.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.naver.SiteVerificationTag }} + +{{- end }} + +{{- /* Styles */}} + +{{- /* includes */}} +{{- $includes := slice }} +{{- $includes = $includes | append (" " | resources.FromString "assets/css/includes-blank.css")}} + +{{- if not (eq site.Params.assets.disableScrollBarStyle true) }} + {{- $ScrollStyle := (resources.Get "css/includes/scroll-bar.css") }} + {{- $includes = (append $ScrollStyle $includes) }} +{{- end }} + +{{- $includes_all := $includes | resources.Concat "assets/css/includes.css" }} + +{{- $theme_vars := (resources.Get "css/core/theme-vars.css") }} +{{- $reset := (resources.Get "css/core/reset.css") }} +{{- $media := (resources.Get "css/core/zmedia.css") }} +{{- $license_css := (resources.Get "css/core/license.css") }} +{{- $common := (resources.Match "css/common/*.css") | resources.Concat "assets/css/common.css" }} + +{{- /* markup.highlight.noClasses should be set to `false` */}} +{{- $chroma_styles := (resources.Get "css/includes/chroma-styles.css") }} +{{- $chroma_mod := (resources.Get "css/includes/chroma-mod.css") }} + +{{- /* order is important */}} +{{- $core := (slice $theme_vars $reset $common $chroma_styles $chroma_mod $includes_all $media) | resources.Concat "assets/css/core.css" | resources.Minify }} +{{- $extended := (resources.Match "css/extended/*.css") | resources.Concat "assets/css/extended.css" | resources.Minify }} + +{{- /* bundle all required css */}} +{{- /* Add extended css after theme style */ -}} +{{- $stylesheet := (slice $license_css $core $extended) | resources.Concat "assets/css/stylesheet.css" }} + +{{- if not site.Params.assets.disableFingerprinting }} +{{- $stylesheet := $stylesheet | fingerprint }} + +{{- else }} + +{{- end }} + +{{- /* Search */}} +{{- if (eq .Layout `search`) -}} + +{{- $fastsearch := resources.Get "js/fastsearch.js" | js.Build (dict "params" (dict "fuseOpts" site.Params.fuseOpts)) | resources.Minify }} +{{- $fusejs := resources.Get "js/fuse.basic.min.js" }} +{{- $license_js := resources.Get "js/license.js" }} +{{- if not site.Params.assets.disableFingerprinting }} +{{- $search := (slice $fusejs $license_js $fastsearch ) | resources.Concat "assets/js/search.js" | fingerprint }} + +{{- else }} +{{- $search := (slice $fusejs $fastsearch ) | resources.Concat "assets/js/search.js" }} + +{{- end }} +{{- end -}} + +{{- /* Favicons */}} + + + + + + + + +{{- /* RSS */}} +{{ range .AlternativeOutputFormats -}} + +{{ end -}} +{{- range .AllTranslations -}} + +{{ end -}} + + + +{{- partial "extend_head.html" . -}} + +{{- /* Misc */}} +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +{{- template "_internal/google_analytics.html" . }} +{{- template "partials/templates/opengraph.html" . }} +{{- template "partials/templates/twitter_cards.html" . }} +{{- template "partials/templates/schema_json.html" . }} +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/header.html b/themes/PaperMod/layouts/partials/header.html new file mode 100644 index 0000000..4a7291e --- /dev/null +++ b/themes/PaperMod/layouts/partials/header.html @@ -0,0 +1,149 @@ +{{- /* theme-toggle is enabled */}} +{{- if (not site.Params.disableThemeToggle) }} +{{- /* theme is light */}} +{{- if (eq site.Params.defaultTheme "light") }} + +{{- /* theme is dark */}} +{{- else if (eq site.Params.defaultTheme "dark") }} + +{{- else }} +{{- /* theme is auto */}} + +{{- end }} +{{- /* theme-toggle is disabled and theme is auto */}} +{{- else if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark"))}} + +{{- end }} + +
    + +
    diff --git a/themes/PaperMod/layouts/partials/home_info.html b/themes/PaperMod/layouts/partials/home_info.html new file mode 100644 index 0000000..199dfb7 --- /dev/null +++ b/themes/PaperMod/layouts/partials/home_info.html @@ -0,0 +1,13 @@ +{{- with site.Params.homeInfoParams }} +
    +
    +

    {{ .Title | markdownify }}

    +
    +
    + {{ .Content | markdownify }} +
    +
    + {{ partial "social_icons.html" (dict "align" site.Params.homeInfoParams.AlignSocialIconsTo) }} +
    +
    +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/index_profile.html b/themes/PaperMod/layouts/partials/index_profile.html new file mode 100644 index 0000000..6882f39 --- /dev/null +++ b/themes/PaperMod/layouts/partials/index_profile.html @@ -0,0 +1,58 @@ +
    + {{- with site.Params.profileMode }} +
    + {{- if .imageUrl -}} + {{- $img := "" }} + {{- if not (urls.Parse .imageUrl).IsAbs }} + {{- $img = resources.Get .imageUrl }} + {{- end }} + {{- if $img }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}} + {{- if (not (and (not .imageHeight) (not .imageWidth))) }} + {{- $img = $img.Resize (printf "%dx%d" .imageWidth .imageHeight) }} + {{- else if .imageHeight }} + {{- $img = $img.Resize (printf "x%d" .imageHeight) }} + {{ else if .imageWidth }} + {{- $img = $img.Resize (printf "%dx" .imageWidth) }} + {{ else }} + {{- $img = $img.Resize "150x150" }} + {{- end }} + {{- end }} + {{ .imageTitle | default + {{- else }} + {{ .imageTitle | default + {{- end }} + {{- end }} +

    {{ .title | default site.Title | markdownify }}

    + {{ .subtitle | markdownify }} + {{- partial "social_icons.html" -}} + + {{- with .buttons }} + + {{- end }} +
    + {{- end}} +
    diff --git a/themes/PaperMod/layouts/partials/post_canonical.html b/themes/PaperMod/layouts/partials/post_canonical.html new file mode 100644 index 0000000..abfc1e3 --- /dev/null +++ b/themes/PaperMod/layouts/partials/post_canonical.html @@ -0,0 +1,9 @@ +{{ if and (.Params.canonicalURL) (.Params.ShowCanonicalLink ) -}} +{{ $url := urls.Parse .Params.canonicalURL }} + +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated (or .Params.editPost.URL site.Params.editPost.URL) }} | {{- end -}} + + {{- (site.Params.CanonicalLinkText | default .Params.CanonicalLinkText) | default "Originally published at" -}} +  {{ $url.Host }} + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/post_meta.html b/themes/PaperMod/layouts/partials/post_meta.html new file mode 100644 index 0000000..b0c0417 --- /dev/null +++ b/themes/PaperMod/layouts/partials/post_meta.html @@ -0,0 +1,23 @@ +{{- $scratch := newScratch }} + +{{- if not .Date.IsZero -}} +{{- $scratch.Add "meta" (slice (printf "%s" (.Date) (.Date | time.Format (default "January 2, 2006" site.Params.DateFormat)))) }} +{{- end }} + +{{- if (.Param "ShowReadingTime") -}} +{{- $scratch.Add "meta" (slice (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime))) }} +{{- end }} + +{{- if (.Param "ShowWordCount") -}} +{{- $scratch.Add "meta" (slice (i18n "words" .WordCount | default (printf "%d words" .WordCount))) }} +{{- end }} + +{{- if not (.Param "hideAuthor") -}} +{{- with (partial "author.html" .) }} +{{- $scratch.Add "meta" (slice .) }} +{{- end }} +{{- end }} + +{{- with ($scratch.Get "meta") }} +{{- delimit . " · " | safeHTML -}} +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/post_nav_links.html b/themes/PaperMod/layouts/partials/post_nav_links.html new file mode 100644 index 0000000..b988641 --- /dev/null +++ b/themes/PaperMod/layouts/partials/post_nav_links.html @@ -0,0 +1,19 @@ +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- if and (gt (len $pages) 1) (in $pages . ) }} + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/share_icons.html b/themes/PaperMod/layouts/partials/share_icons.html new file mode 100644 index 0000000..910ba7f --- /dev/null +++ b/themes/PaperMod/layouts/partials/share_icons.html @@ -0,0 +1,95 @@ +{{- $pageurl := .Permalink }} +{{- $title := .Title }} + +{{- $.Scratch.Set "tags" ""}} + +{{- with .Params.Tags }} +{{- $hashtags := newScratch}} +{{- range . }}{{ $hashtags.Add "tags" (slice (replaceRE "(\\s)" "" . ))}}{{end}} +{{- $.Scratch.Set "tags" (delimit ($hashtags.Get "tags") ",") }} +{{- end -}} + +{{- $custom := false }} +{{- $ShareButtons := (.Param "ShareButtons")}} +{{- with $ShareButtons }}{{ $custom = true }}{{ end }} + + diff --git a/themes/PaperMod/layouts/partials/social_icons.html b/themes/PaperMod/layouts/partials/social_icons.html new file mode 100644 index 0000000..ce76a30 --- /dev/null +++ b/themes/PaperMod/layouts/partials/social_icons.html @@ -0,0 +1,8 @@ + diff --git a/themes/PaperMod/layouts/partials/svg.html b/themes/PaperMod/layouts/partials/svg.html new file mode 100644 index 0000000..64051e5 --- /dev/null +++ b/themes/PaperMod/layouts/partials/svg.html @@ -0,0 +1,808 @@ +{{- $icon_name := ( trim .name " " | lower )}} +{{- if (eq $icon_name "123rf") -}} + + + + +{{- else if (eq $icon_name "adobestock") -}} + + + + +{{- else if (eq $icon_name "anilist") -}} + + + +{{- else if (eq $icon_name "applemusic") -}} + + + +{{- else if (eq $icon_name "applepodcasts") -}} + + + +{{- else if (eq $icon_name "behance") -}} + + + +{{- else if (eq $icon_name "bilibili") -}} + + + + + + + +{{- else if (eq $icon_name "bitcoin") -}} + + + +{{- else if (eq $icon_name "bluesky") -}} + + + +{{- else if (eq $icon_name "bugcrowd") -}} + + + +{{- else if (eq $icon_name "buttondown") -}} + + + + + + + + + + +{{- else if (eq $icon_name "buymeacoffee") -}} + + + + + + + + + + + + + + + + +{{- else if (eq $icon_name "codeberg") -}} + + + +{{- else if (eq $icon_name "codepen") -}} + + + + + + + +{{- else if (eq $icon_name "codeforces") -}} + + + +{{- else if (eq $icon_name "cryptohack") -}} + + + + + + +{{- else if (eq $icon_name "ctftime") -}} + + + + + + +{{- else if (eq $icon_name "cv") -}} + + + + + + +{{- else if (eq $icon_name "dev") -}} + + + +{{- else if (eq $icon_name "deviantart") -}} + + + +{{- else if (eq $icon_name "deezer") -}} + + + +{{- else if (eq $icon_name "discogs") -}} + + + +{{- else if (eq $icon_name "discord") -}} + + + +{{- else if (eq $icon_name "douban") -}} + + + + + +{{- else if (eq $icon_name "dreamstime") -}} + + + +{{- else if (eq $icon_name "dribbble") -}} + + + + + +{{- else if (eq $icon_name "email") -}} + + + + +{{- else if (eq $icon_name "facebook") -}} + + + +{{- else if (eq $icon_name "fediverse") -}} + + + +{{- else if (eq $icon_name "firefish") -}} + + + +{{- else if (eq $icon_name "flickr") -}} + + + +{{- else if (eq $icon_name "freepik") -}} + + + + + + +{{- else if (eq $icon_name "git") -}} + + + +{{- else if (eq $icon_name "gitea") -}} + + + +{{- else if (eq $icon_name "github") -}} + + + + +{{- else if (eq $icon_name "gitlab") -}} + + + + +{{- else if (eq $icon_name "goodreads") -}} + + + +{{- else if (eq $icon_name "googleplaystore") -}} + + + +{{- else if (eq $icon_name "googlepodcasts") -}} + + + +{{- else if (eq $icon_name "googlescholar") -}} + + + +{{- else if (eq $icon_name "gurushots") -}} + + + + + + + + + + + + +{{- else if (eq $icon_name "hackerone") -}} + + + +{{- else if (eq $icon_name "hackerrank") -}} + + + + + + +{{- else if (eq $icon_name "hackthebox") -}} + + + + + + +{{- else if (eq $icon_name "instagram") -}} + + + + + +{{- else if (eq $icon_name "intigriti") -}} + + + +{{- else if (eq $icon_name "itchio") -}} + + + +{{- else if (eq $icon_name "juejin") -}} + + + +{{- else if (eq $icon_name "kaggle") -}} + + + +{{- else if (eq $icon_name "kakaotalk") -}} + + + + + + + +{{- else if (eq $icon_name "keybase") -}} + + + +{{- else if (eq $icon_name "kofi") -}} + + + +{{- else if (eq $icon_name "komoot") -}} + + + +{{- else if (eq $icon_name "lastfm") -}} + + + +{{- else if (eq $icon_name "leetcode") -}} + + + +{{- else if (eq $icon_name "letterboxd") -}} + + + +{{- else if (eq $icon_name "liberapay") -}} + + + + + + +{{- else if (eq $icon_name "lichess" ) -}} + + + +{{- else if (eq $icon_name "linkedin") -}} + + + + + +{{- else if (eq $icon_name "mastodon") -}} + + + + +{{- else if (eq $icon_name "matrix") -}} + + + +{{- else if (eq $icon_name "medium") -}} + + + + + +{{- else if (eq $icon_name "microblog") -}} + + + + + + +{{- else if (eq $icon_name "mixcloud") -}} + + + +{{- else if (eq $icon_name "monero") -}} + + + +{{- else if (eq $icon_name "neteasecloudmusic") -}} + + + +{{- else if (eq $icon_name "nuget") -}} + + + + + + + + +{{- else if (eq $icon_name "orcid") -}} + + + +{{- else if (eq $icon_name "osu!") -}} + + + + + + +{{- else if (eq $icon_name "overcast") -}} + + + +{{- else if (eq $icon_name "patreon") -}} + + + +{{- else if (eq $icon_name "paypal") -}} + + + +{{- else if (eq $icon_name "peertube") -}} + + + +{{- else if or (eq $icon_name "pgpkey") (eq $icon_name "key") -}} + + + + +{{- else if (eq $icon_name "phone") -}} + + + + + +{{- else if (eq $icon_name "pocketcasts") -}} + + + +{{- else if (eq $icon_name "polywork") -}} + +{{- else if (eq $icon_name "printables") -}} + + + +{{- else if (eq $icon_name "pixelfed") -}} + + + +{{- else if (eq $icon_name "pleroma") -}} + + + +{{- else if (eq $icon_name "qq") -}} + + + + +{{- else if (eq $icon_name "reddit") -}} + + + +{{- else if (eq $icon_name "researchgate") -}} + + + +{{- else if (eq $icon_name "rootme") -}} + + + + +{{- else if (eq $icon_name "rss") -}} + + + + + +{{- else if (eq $icon_name "serverfault") -}} + + + +{{- else if (eq $icon_name "sessionmessenger") -}} + + + + +{{- else if (eq $icon_name "soundcloud") -}} + + + +{{- else if (eq $icon_name "shutterstock") -}} + + + + +{{- else if (eq $icon_name "sketchfab") -}} + + + +{{- else if (eq $icon_name "slack") -}} + + + + + + + +{{- else if (eq $icon_name "snapchat") -}} + + + +{{- else if (eq $icon_name "sourcehut") -}} + + + + +{{- else if (eq $icon_name "spotify") -}} + + + +{{- else if (eq $icon_name "stackoverflow") -}} + + + +{{- else if (eq $icon_name "steam") -}} + + + + + + + + + +{{- else if (eq $icon_name "strava") -}} + + + + +{{- else if (eq $icon_name "substack") -}} + + + +{{- else if (eq $icon_name "tableau") -}} + + + + + + + + + + +{{- else if (eq $icon_name "telegram") -}} + + + +{{- else if (eq $icon_name "thingiverse") -}} + + + +{{- else if (eq $icon_name "threads") -}} + + + +{{- else if (eq $icon_name "threema") -}} + + + +{{- else if (eq $icon_name "tidal") -}} + + + +{{- else if (eq $icon_name "tiktok") -}} + + + +{{- else if (eq $icon_name "tryhackme") -}} + + + +{{- else if (eq $icon_name "tumblr") -}} + + + +{{- else if (eq $icon_name "twitch") -}} + + + +{{- else if (eq $icon_name "twitter") -}} + + + + +{{- else if (eq $icon_name "unsplash") -}} + + + + +{{- else if (eq $icon_name "vimeo") -}} + + + +{{- else if or (eq $icon_name "vk") (eq $icon_name "vkontakte") -}} + + + +{{- else if (eq $icon_name "wantedly") -}} + + + +{{- else if (eq $icon_name "wechat") -}} + + + + +{{- else if (eq $icon_name "wordpress") -}} + + + +{{- else if (eq $icon_name "x") -}} + + + + +{{- else if (eq $icon_name "xda") -}} + + + +{{- else if (eq $icon_name "xing") -}} + + + + +{{- else if (eq $icon_name "xmpp") -}} + + + + +{{- else if (eq $icon_name "ycombinator") -}} + + + +{{- else if (eq $icon_name "youtube") -}} + + + + + +{{- else if (eq $icon_name "zhihu") -}} + + + +{{- else if $icon_name -}} + + + + +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/templates/opengraph.html b/themes/PaperMod/layouts/partials/templates/opengraph.html new file mode 100644 index 0000000..38fbd24 --- /dev/null +++ b/themes/PaperMod/layouts/partials/templates/opengraph.html @@ -0,0 +1,67 @@ + + + + +{{- if .Params.cover.image -}} +{{- if (ne .Params.cover.relative true) }} + +{{- else}} + +{{- end}} +{{- else }} + +{{- with $.Params.images -}} +{{- range first 6 . }}{{ end -}} +{{- else -}} +{{- $images := $.Resources.ByType "image" -}} +{{- $featured := $images.GetMatch "*feature*" -}} +{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} +{{- with $featured -}} + +{{- else -}} +{{- with site.Params.images }}{{ end -}} +{{- end -}} +{{- end -}} +{{- end }} + +{{- if .IsPage }} +{{- $iso8601 := "2006-01-02T15:04:05-07:00" -}} + +{{ with .PublishDate }}{{ end }} +{{ with .Lastmod }}{{ end }} +{{- end -}} + +{{- with .Params.audio }}{{ end }} +{{- with .Params.locale }}{{ end }} +{{- with site.Params.title }}{{ end }} +{{- with .Params.videos }}{{- range . }} + +{{ end }}{{ end }} + +{{- /* If it is part of a series, link to related articles */}} +{{- $permalink := .Permalink }} +{{- $siteSeries := site.Taxonomies.series }} +{{- if $siteSeries }} +{{ with .Params.series }}{{- range $name := . }} + {{- $series := index $siteSeries ($name | urlize) }} + {{- range $page := first 6 $series.Pages }} + {{- if ne $page.Permalink $permalink }}{{ end }} + {{- end }} +{{ end }}{{ end }} +{{- end }} + +{{- /* Deprecate site.Social.facebook_admin in favor of site.Params.social.facebook_admin */}} +{{- $facebookAdmin := "" }} +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- $facebookAdmin = .facebook_admin }} + {{- end }} +{{- else }} + {{- with site.Social.facebook_admin }} + {{- $facebookAdmin = . }} + {{- warnf "The social key in site configuration is deprecated. Use params.social.facebook_admin instead." }} + {{- end }} +{{- end }} + +{{- /* Facebook Page Admin ID for Domain Insights */}} +{{ with $facebookAdmin }}{{ end }} diff --git a/themes/PaperMod/layouts/partials/templates/schema_json.html b/themes/PaperMod/layouts/partials/templates/schema_json.html new file mode 100644 index 0000000..3e6565d --- /dev/null +++ b/themes/PaperMod/layouts/partials/templates/schema_json.html @@ -0,0 +1,119 @@ +{{ if .IsHome }} + +{{- else if (or .IsPage .IsSection) }} +{{/* BreadcrumbList */}} +{{- $url := replace .Parent.Permalink ( printf "%s" site.Home.Permalink) "" }} +{{- $lang_url := strings.TrimPrefix ( printf "%s/" .Lang) $url }} +{{- $bc_list := (split $lang_url "/")}} + +{{- $scratch := newScratch }} + +{{- if .IsPage }} + +{{- end }}{{/* .IsPage end */}} + +{{- end -}} diff --git a/themes/PaperMod/layouts/partials/templates/twitter_cards.html b/themes/PaperMod/layouts/partials/templates/twitter_cards.html new file mode 100644 index 0000000..0e7760a --- /dev/null +++ b/themes/PaperMod/layouts/partials/templates/twitter_cards.html @@ -0,0 +1,50 @@ +{{- if .Params.cover.image -}} + +{{- if (ne $.Params.cover.relative true) }} + +{{- else }} + +{{- end}} +{{- else }} +{{- with $.Params.images -}} + + +{{ else -}} +{{- $images := $.Resources.ByType "image" -}} +{{- $featured := $images.GetMatch "*feature*" -}} +{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} +{{- with $featured -}} + + +{{- else -}} +{{- with site.Params.images -}} + + +{{ else -}} + +{{- end -}} +{{- end -}} +{{- end }} +{{- end }} + + +{{- /* Deprecate site.Social.twitter in favor of site.Params.social.twitter */}} +{{- $twitterSite := "" }} +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- $twitterSite = .twitter }} + {{- end }} +{{- else }} + {{- with site.Social.twitter }} + {{- $twitterSite = . }} + {{- warnf "The social key in site configuration is deprecated. Use params.social.twitter instead." }} + {{- end }} +{{- end }} + +{{- with $twitterSite }} + {{- $content := . }} + {{- if not (strings.HasPrefix . "@") }} + {{- $content = printf "@%v" $twitterSite }} + {{- end }} + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/toc.html b/themes/PaperMod/layouts/partials/toc.html new file mode 100644 index 0000000..28f8694 --- /dev/null +++ b/themes/PaperMod/layouts/partials/toc.html @@ -0,0 +1,97 @@ +{{- $headers := findRE "(.|\n])+?
    " .Content -}} +{{- $has_headers := ge (len $headers) 1 -}} +{{- if $has_headers -}} +
    +
    + + {{- i18n "toc" | default "Table of Contents" }} + + +
    + {{- if (.Param "UseHugoToc") }} + {{- .TableOfContents -}} + {{- else }} + {{- $largest := 6 -}} + {{- range $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + {{- if lt $headerLevel $largest -}} + {{- $largest = $headerLevel -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} + + {{- $.Scratch.Set "bareul" slice -}} +
      + {{- range seq (sub $firstHeaderLevel $largest) -}} +
        + {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}} + {{- end -}} + {{- range $i, $header := $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + + {{/* get id="xyz" */}} + {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }} + + {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}} + {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }} + {{- $header := replaceRE "((.|\n])+?)" "$1" $header -}} + + {{- if ne $i 0 -}} + {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}} + {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} + {{- if gt $headerLevel $prevHeaderLevel -}} + {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} +
          + {{/* the first should not be recorded */}} + {{- if ne $prevHeaderLevel . -}} + {{- $.Scratch.Add "bareul" . -}} + {{- end -}} + {{- end -}} + {{- else -}} + + {{- if lt $headerLevel $prevHeaderLevel -}} + {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} + {{- if in ($.Scratch.Get "bareul") . -}} +
        + {{/* manually do pop item */}} + {{- $tmp := $.Scratch.Get "bareul" -}} + {{- $.Scratch.Delete "bareul" -}} + {{- $.Scratch.Set "bareul" slice}} + {{- range seq (sub (len $tmp) 1) -}} + {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}} + {{- end -}} + {{- else -}} +
      + + {{- end -}} + {{- end -}} + {{- end -}} + {{- end }} +
    • + {{- $header | plainify | safeHTML -}} + {{- else }} +
    • + {{- $header | plainify | safeHTML -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := $largest }} + {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }} +
    • + {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} + {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }} +
    + {{- else }} + +
  • + {{- end -}} + {{- end }} + + {{- end }} + + + +{{- end }} diff --git a/themes/PaperMod/layouts/partials/translation_list.html b/themes/PaperMod/layouts/partials/translation_list.html new file mode 100644 index 0000000..0028251 --- /dev/null +++ b/themes/PaperMod/layouts/partials/translation_list.html @@ -0,0 +1,19 @@ +{{- if .IsTranslated -}} +{{- if (ne .Layout "search") }} +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) }} | {{- end -}} +{{- end }} +{{- i18n "translations" | default "Translations" }}: + +{{- end -}} diff --git a/themes/PaperMod/layouts/robots.txt b/themes/PaperMod/layouts/robots.txt new file mode 100644 index 0000000..f26f508 --- /dev/null +++ b/themes/PaperMod/layouts/robots.txt @@ -0,0 +1,7 @@ +User-agent: * +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +Disallow: +{{- else }} +Disallow: / +{{- end }} +Sitemap: {{ "sitemap.xml" | absURL }} diff --git a/themes/PaperMod/layouts/shortcodes/collapse.html b/themes/PaperMod/layouts/shortcodes/collapse.html new file mode 100644 index 0000000..17d8d3b --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/collapse.html @@ -0,0 +1,8 @@ +{{ if .Get "summary" }} +{{ else }} +{{ warnf "missing value for param 'summary': %s" .Position }} +{{ end }} +

    + {{ .Get "summary" | markdownify }} + {{ .Inner | markdownify }} +

    diff --git a/themes/PaperMod/layouts/shortcodes/figure.html b/themes/PaperMod/layouts/shortcodes/figure.html new file mode 100644 index 0000000..8c93eff --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/figure.html @@ -0,0 +1,31 @@ + + {{- if .Get "link" -}} + + {{- end }} + {{ with .Get + {{- if .Get "link" }}{{ end -}} + {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}} +
    + {{ with (.Get "title") -}} + {{ . }} + {{- end -}} + {{- if or (.Get "caption") (.Get "attr") -}}

    + {{- .Get "caption" | markdownify -}} + {{- with .Get "attrlink" }} + + {{- end -}} + {{- .Get "attr" | markdownify -}} + {{- if .Get "attrlink" }}{{ end }}

    + {{- end }} +
    + {{- end }} + diff --git a/themes/PaperMod/layouts/shortcodes/inTextImg.html b/themes/PaperMod/layouts/shortcodes/inTextImg.html new file mode 100644 index 0000000..0239fd6 --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/inTextImg.html @@ -0,0 +1,5 @@ +{{- $Img := (.Get "url") }} +{{- $height := (.Get "height") }} +{{- $alt := (.Get "alt") }} + +{{$alt}} diff --git a/themes/PaperMod/layouts/shortcodes/ltr.html b/themes/PaperMod/layouts/shortcodes/ltr.html new file mode 100644 index 0000000..4ad7682 --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/ltr.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
    + {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
    diff --git a/themes/PaperMod/layouts/shortcodes/rawhtml.html b/themes/PaperMod/layouts/shortcodes/rawhtml.html new file mode 100644 index 0000000..9350c13 --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/rawhtml.html @@ -0,0 +1,2 @@ + +{{- .Inner -}} \ No newline at end of file diff --git a/themes/PaperMod/layouts/shortcodes/rtl.html b/themes/PaperMod/layouts/shortcodes/rtl.html new file mode 100644 index 0000000..a69b8ce --- /dev/null +++ b/themes/PaperMod/layouts/shortcodes/rtl.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
    + {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
    diff --git a/themes/PaperMod/theme.toml b/themes/PaperMod/theme.toml new file mode 100644 index 0000000..f659f5c --- /dev/null +++ b/themes/PaperMod/theme.toml @@ -0,0 +1,51 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "PaperMod" +license = "MIT" +licenselink = "https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE" +description = "A fast, clean, responsive Hugo theme" +homepage = "https://adityatelange.github.io/hugo-PaperMod/" +tags = [ + "responsive", + "simple", + "clean", + "light", + "dark", + "blog", + "minimalist", + "highlight.js", + "search" +] +features = [ + "responsive", + "single-column", + "blog", + "cover-image", + "table-of-contents", + "opengraph", + "highlight.js", + "favicon", + "archive", + "share-icons", + "cover", + "multilingual", + "social-icons", + "minified-assets", + "theme-toggle", + "menu-location-indicator", + "scroll-to-top", + "search" +] +min_version = "0.112.4" + +[author] + name = "Aditya Telange" + homepage = "https://github.com/adityatelange/" + +# If porting an existing theme +[original] + name = "Paper" + author = "nanxiaobei" + homepage = "https://github.com/nanxiaobei" + repo = "https://github.com/nanxiaobei/hugo-paper/" diff --git a/themes/tailwind b/themes/tailwind new file mode 160000 index 0000000..451055d --- /dev/null +++ b/themes/tailwind @@ -0,0 +1 @@ +Subproject commit 451055daa591b13b4274d4052fc97397bce47b18