<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Netz - Rettung - Recht (Artikel mit Tag webdesign)</title>
    <link>https://netz-rettung-recht.de/</link>
    <description>Netzleben, Rettungs- und Rechtswesen</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Tue, 17 May 2022 06:35:03 GMT</pubDate>

    <image>
    <url>https://netz-rettung-recht.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: Netz - Rettung - Recht - Netzleben, Rettungs- und Rechtswesen</title>
    <link>https://netz-rettung-recht.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>Versionierung von Webseiten</title>
    <link>https://netz-rettung-recht.de/archives/2416-Versionierung-von-Webseiten.html</link>
            <category>Netzleben</category>
    
    <comments>https://netz-rettung-recht.de/archives/2416-Versionierung-von-Webseiten.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2416</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2416</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bei der Überschrift &amp;#8220;Versionierung von Webseiten&amp;#8221; könnte man annehmen, dass es in diesem Beitrag um Versionsverwaltungssysteme wie &lt;em&gt;git&lt;/em&gt;, &lt;em&gt;SVN&lt;/em&gt;, und Co. gehen wird, mit denen eben die Dateien, die eine Website ausmachen, verwaltet werden. Doch dem ist nicht so; ich bin vielmehr dieser Tage auf eine interessante Variante gestoßen, alte Versionen (und vor allem Inhalte) einer Webpräsenz online verfügbar zu halten.&lt;/p&gt;

&lt;h3 id=&quot;cool-uris-don-t-change&quot;&gt;Cool URIs don&amp;#8217;t change&lt;/h3&gt;

&lt;p&gt;&amp;#8220;Linkrot&amp;#8221; ist eine ständig weiter um sich greifende Pest: zunehmend verschwinden Inhalte aus dem Netz - nicht nur, weil eine Webpräsenz oder ein Blog ganz aufgegeben wird oder sich jemand aus dem WWW zurückzieht, sondern auch, weil ein &amp;#8220;Relaunch&amp;#8221; erfolgt, eine Webpräsenz also technisch, optisch oder organisatorisch runderneut oder ein Blog auf eine neue Software umgestellt wird, oder weil (insbesondere bei Blogs) ein inhaltlicher Schnitt gemacht und thematisch neu begonnen werden soll. Bedauerlicherweise gehen dann Links auf die bisherigen Inhalte ins Leere - das widerspricht dem Urpinzip des Webs, das ein &lt;a href=&quot;https://de.wikipedia.org/wiki/Hypertext&quot; title=&quot;&quot;&gt;Hypertext&lt;/a&gt;-System darstellt, wie sich schon aus den Bezeichnungen &amp;#8220;Hypertext Markup Language&amp;#8221; (HTML) oder &amp;#8220;World Wide Web&amp;#8221; ergibt, und davon lebt, dass Inhalte miteinander verknüpft (und nicht kopiert) werden.&lt;/p&gt;

&lt;p&gt;Schon 1998 veröffentlichte &lt;a href=&quot;https://de.wikipedia.org/wiki/Tim_Berners-Lee&quot; title=&quot;&quot;&gt;Sir Tim Berners-Lee&lt;/a&gt;, der &amp;#8220;Vater&amp;#8221; des Webs, den Aufsatz &lt;a href=&quot;https://www.w3.org/Provider/Style/URI&quot; title=&quot;Hypertext Style: Cool URIs don&#039;t change.&quot;&gt;&lt;strong&gt;Cool URIs don&amp;#8217;t change&lt;/strong&gt;&lt;/a&gt;, der - mit Ausnahme technischer Implementationsdetails - auch heute noch Geltung hat: Netzadressen sollten so permanent wie nur möglich sein.&lt;/p&gt;

&lt;p&gt;Ich habe mich bemüht, das umzusetzen; seit über 20 Jahren setze ich bei jeder Änderung meiner Homepage Redirects von der alten auf die neue Struktur, soweit das irgendwie möglich ist. Ich halte sogar weiterhin einen seit 2005 ungenutzten Account bei &lt;em&gt;inka.de&lt;/em&gt;, weil meine Seiten bis &lt;a href=&quot;https://th-h.de/about/changelog/v4/#changes-2004&quot; title=&quot;Changelog der Version 4 | th-h.de&quot;&gt;Ende 2004&lt;/a&gt; dort lagen und &lt;em&gt;th-h.de&lt;/em&gt; nur als Forwarder agierte, so dass verschiedene Links (insbesondere auf alte FAQs und vergleichbare Texte) noch nach dort zeigen. Auch beim &lt;a href=&quot;https://netz-rettung-recht.de/archives/2209-15-Jahre-Serendipity.html&quot; title=&quot;&quot;&gt;Wechsel meines Blogsystem&lt;/a&gt; von &lt;em&gt;Sunlog&lt;/em&gt; zu &lt;em&gt;Serendipity&lt;/em&gt; habe ich nicht nur die Beiträge übernommen, sondern auch durch einen speziellen Forwarder dafür gesorgt, dass auch die meisten alten Links noch funktionieren.&lt;/p&gt;

&lt;p&gt;Auf der einen Seite erfüllt das seinen Zweck, auf der anderen Seite wäre es natürlich auch manchmal nett, sich - quasi museal - noch einmal frühere Versionen der Seiten (mit dem alten Design, Theme oder Template, mit der alten Struktur) anschauen und in die Vergangenheit abtauchen zu können. Da kann ich nur mit Screenshots jeweils der Startseite dienen, die einen gewissen Eindruck vermittelt, aber nicht das komplette &amp;#8220;Feeling&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Manches geht über die &lt;a href=&quot;http://web.archive.org/&quot; title=&quot;Wayback Machine&quot;&gt;&lt;em&gt;Wayback Machine&lt;/em&gt;&lt;/a&gt; des &lt;a href=&quot;http://archive.org/&quot; title=&quot;Internet Archive: Digital Library of Free &amp;amp; Borrowable Texts, Movies, Music &amp;amp; Wayback Machine&quot;&gt;&lt;em&gt;Internet Archive&lt;/em&gt;&lt;/a&gt;, die man nicht genug loben kann. Manche lassen ihr altes Blog - meistens sind es Blogs und keine ganzen Websites - einfach komplett online und fangen unter einer neuen Domain oder Subdomain neu an.&lt;/p&gt;

&lt;h3 id=&quot;versionierung-ber-die-subdomain&quot;&gt;Versionierung über die Subdomain&lt;/h3&gt;

&lt;p&gt;Erstmals bin ich jetzt - und damit schaffe ich hoffentlich den Bogen zurück zur Einleitung - auf eine systematische Versionierung gestoßen. &lt;em&gt;Chris Krycho&lt;/em&gt; stellt sein aktuelles Blog / seine aktuelle Website unter der URL &lt;a href=&quot;https://v5.chriskrycho.com/&quot; title=&quot;Sympolymathesy, by Chris Krycho&quot;&gt;https://v5.chriskrycho.com/&lt;/a&gt; online. Und wie der Name schon andeutet: die Vorversionen sind (weitgehend) unter &lt;a href=&quot;https://v4.chriskrycho.com/&quot; title=&quot;Chris Krycho&quot;&gt;https://v4.chriskrycho.com/&lt;/a&gt;, &lt;a href=&quot;https://v2.chriskrycho.com/&quot; title=&quot;Chris Krycho { Web Design &amp;amp; Photography }&quot;&gt;https://v2.chriskrycho.com/&lt;/a&gt; und &lt;a href=&quot;https://v1.chriskrycho.com/&quot; title=&quot;…nope, not anymore.&quot;&gt;https://v1.chriskrycho.com/&lt;/a&gt; verfügbar. Weil die &amp;#8220;Versionsnummer&amp;#8221; von Anfang an Teil der URL ist, bleiben alle Links valide, auch wenn später einmal &amp;#8220;v8&amp;#8221; die aktuelle Version sein wird.&lt;/p&gt;

&lt;p&gt;Diese Vorgehensweise hat einerseits - technisch gesehen - Charme. Andererseits ist sie mir, fürchte ich, zu technisch; ich schätze gut gewählte, passende Namen, und wenn ich mein Blog &amp;#8220;Sympolymathesy&amp;#8221; genannte hätte, dann würde ich auch als URL &lt;code&gt;sympolymathesy.chriskrycho.com&lt;/code&gt; haben wollen. Dennoch: eine Variante, über die man nachdenken kann.&lt;/p&gt;

&lt;p&gt;Am wichtigsten aber ist: wenn man Content online bringt, den andere verlinken oder den Google findet, dann sollte man nach Möglichkeit dafür sorgen, dass dieser Content auch verfügbar bleibt, so lange das möglich ist.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © jro-grafik - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/7eefa412f3dd40b0ad69ed05215e7781&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 05 May 2022 04:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2416-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>FLOSS'n'net - Aktivitäten im Jahr 2021 (und 2020)</title>
    <link>https://netz-rettung-recht.de/archives/2374-FLOSSnnet-Aktivitaeten-im-Jahr-2021-und-2020.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2374-FLOSSnnet-Aktivitaeten-im-Jahr-2021-und-2020.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2374</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2374</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Meine Reihe &lt;em&gt;FLOSS&amp;#8217;n&amp;#8217;net&lt;/em&gt; ist in den letzten fast zwei Jahren auch mehr oder weniger der Pandemie zum Opfer gefallen; der letzte der üblicherweise jedes Quartal veröffentlichen Beiträge datiert vom April 2020 und gehört mit zu den letzten vor der &amp;#8220;Aufholjagd&amp;#8221; noch veröffentlichten (bzw. verfassten) Beiträgen. Entweder als Schlusspunkt oder als Neubeginn - je nachdem, wie 2022 werden wird &amp;#8230; - möchte ich daher einen kurzen Rückblick über das vergangene Jahr (und auch das Jahr 2020) geben.&lt;/p&gt;

&lt;p&gt;2020 endeten meine Aktivitäten - vor allem rund um &lt;em&gt;Serendipity&lt;/em&gt; - mehr oder weniger im April. 2021 habe ich nichts an &lt;em&gt;Serendipity&lt;/em&gt; getan, aber das eine oder andere sonst rund ums Netz. Im Einzelnen sieht das dann so aus:&lt;/p&gt;

&lt;h3 id=&quot;serendipity-s9y-&quot;&gt;Serendipity (&lt;em&gt;s9y&lt;/em&gt;)&lt;/h3&gt;

&lt;p&gt;Das Blogsystem &lt;a href=&quot;https://docs.s9y.org/&quot; title=&quot;Serendipity -  A reliable, secure and extensible PHP blog | Serendipity Blog System&quot;&gt;&lt;em&gt;Serendipity&lt;/em&gt;&lt;/a&gt; werkelt auch hinter diesem Blog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alle Änderungen hier stammen noch aus dem April 2020.&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;-s9y-kern&quot;&gt;&lt;em&gt;s9y&lt;/em&gt;-Kern&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Es ist mir endlich gelungen, einen schwer zu reproduzierenden Fehler zu finden, der mich seit Jahren wahnsinnig gemacht hat. Ich nutze für meine Blogbeiträge recht intensiv &amp;#8220;erweiterte Eigenschaften von Artikeln&amp;#8221;, also &lt;em&gt;entryproperties&lt;/em&gt;, bspw. die HTML-Meta-Description und Social-Media-Bilder - und diese &amp;#8220;verschwanden&amp;#8221; regelmäßig in vorbereiteten Einträgen, was einerseits ärgerlich ist und andererseits oft unbemerkt bleibt. Das ging so weit, dass ich vorbereitete Einträge (Entwürfe) nicht mehr in &lt;em&gt;s9y&lt;/em&gt; selbst gespeichert habe, sondern extern, und sie dann erst zur Veröffentlichung dort hineinkopierte. Das wurde seit 2018 im &lt;a href=&quot;https://github.com/s9y/Serendipity/issues/577&quot; title=&quot;Meta-Description gets &amp;quot;lost&amp;quot; constantly · Issue #577 · s9y/Serendipity · GitHub&quot;&gt;Issue #577&lt;/a&gt; getrackt, aber ohne richtige Lösung (auch weil mir die Zeit zum Debugging fehlte). Am Ende hatten wir 2019 die richtige Ecke gefunden, aber das Problem nicht wirklich behoben. Das gelang aber jetzt (endlich!), und rückblickend war das eine gute Sache, hatte ich doch im Rahmen der &amp;#8220;Aufholjagd&amp;#8221; 2020/2021 oft mehrere Dutzend komplett postingfertige Beiträge &amp;#8220;gebunkert&amp;#8221;.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/Serendipity/issues/688&quot; title=&quot;Scheduled entries lose all entryproperty information on publish date · Issue #688 · s9y/Serendipity · GitHub&quot;&gt;Scheduled entries lose all entryproperty information on publish date.&lt;/a&gt; mit&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/695&quot; title=&quot;Fix accidental deletion of extended properties. by th-h · Pull Request #695 · s9y/Serendipity · GitHub&quot;&gt;Fix accidental deletion of extended properties.&lt;/a&gt; und&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/Serendipity/issues/696&quot; title=&quot;[event_trackback] Draft entries should not be saved in delayed_trackbacks · Issue #696 · s9y/Serendipity · GitHub&quot;&gt;[event_trackback] Draft entries should not be saved in delayed_trackbacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eine mit &lt;em&gt;s9y&lt;/em&gt; 2.3.3 releaste Änderung hatte ein Designproblem im Code aufgedeckt, das zu Fehlern im Plugin &lt;em&gt;History&lt;/em&gt; führte, einem der wenigen mit &lt;em&gt;s9y&lt;/em&gt; gebundleten Plugins.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/694&quot; title=&quot;Fix SQL error in plugin_history. by th-h · Pull Request #694 · s9y/Serendipity · GitHub&quot;&gt;[plugin_history] Fix SQL error in plugin_history.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;plugins&quot;&gt;Plugins&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Der Bugfix für die &lt;em&gt;entryproperties&lt;/em&gt; erforderte auch Änderungen in den entsprechenden Plugins:&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/pull/113&quot; title=&quot;Fix accidental deletion of extended properties. by th-h · Pull Request #113 · s9y/additional_plugins · GitHub&quot;&gt;[event_metadesc] [event_social] Fix accidental deletion of extended properties.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/commit/a6d340cdf2ae64da4eaaef364d08104c28aa3467&quot; title=&quot;Fix draft check. · s9y/additional_plugins@a6d340c · GitHub&quot;&gt;[event_trackback] Fix draft check.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Das Plugin, das &lt;em&gt;Sitemaps&lt;/em&gt; erstellt, sollte in diese Maps keine Übersichtsseiten für getaggte Artikel aufnehmen, die gar nicht existieren (weil das entsprechende Tag zwar vergeben wurde, aber nur für Entwürfe).&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/commit/b946b3daa2ad18bc1ef61149469f1031f4b2fd9b&quot; title=&quot;[sitemap] Don&amp;#39;t add tag pages with draft tags. · s9y/additional_plugins@b946b3d · GitHub&quot;&gt;[event_sitemap] Don&amp;#8217;t add tag pages with draft tags.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;releases&quot;&gt;Releases&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ich habe alle geeigneten Änderungen aus der aktuellen Entwicklungsversion in den 2.3er-Zweig übernommen und dann &lt;a href=&quot;https://github.com/s9y/Serendipity/releases/tag/2.3.5&quot; title=&quot;Release Serendipity 2.3.5 · s9y/Serendipity · GitHub&quot;&gt;&lt;em&gt;Serendipity&lt;/em&gt; 2.3.5&lt;/a&gt; releast sowie die Release-Notes, einen Blog- und einen Forenbeitrag verfasst.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;usenet-und-co-&quot;&gt;Usenet und Co.&lt;/h3&gt;

&lt;p&gt;Zum Jahresende 2021 hin habe ich eine notwendige Änderung der &lt;strong&gt;Einrichtungsregeln&lt;/strong&gt; für Newsgroups im deutschsprachigen Usenet vorgeschlagen, die Abstimmung dazu durchgeführt und sie umgesetzt.&lt;/p&gt;

&lt;h4 id=&quot;faqs&quot;&gt;FAQs&lt;/h4&gt;

&lt;p&gt;Ich habe 2020 und 2021 die Pflege weiterer FAQs und vergleichbarer Text übernommen und dann auch regelmäßig eine ganze Reihe Änderungen eingearbeitet:&lt;/p&gt;

&lt;h5 id=&quot;2020&quot;&gt;2020&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2225-UEbernahme-der-Newsreader-FAQ.html&quot; title=&quot;Übernahme der Newsreader-FAQ | Netz - Rettung - Recht&quot;&gt;Übernahme der Newsreader-FAQ&lt;/a&gt;&lt;br /&gt;
(verfügbar in einem &lt;a href=&quot;https://code.th-h.de/?p=faqs/newsreader-faq.git&quot; title=&quot;301 Moved Permanently&quot;&gt;Git-Repository&lt;/a&gt; auch mit allen alten Fassungen seit 2000)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://th-h.de/about/changelog/#changes-2020-09-02&quot; title=&quot;Aktuelle Änderungen | th-h.de&quot;&gt;Übernahme der Newsserverliste&lt;/a&gt;&lt;br /&gt;
(verfügbar in einem &lt;a href=&quot;https://code.th-h.de/?p=faqs/newsserverliste.git&quot; title=&quot;301 Moved Permanently&quot;&gt;Git-Repository&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;2021&quot;&gt;2021&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2373-UEbernahme-der-Einrichtungsregeln.html&quot; title=&quot;&quot;&gt;Übernahme der Einrichtungsregeln&lt;/a&gt;&lt;br /&gt;
(verfügbar in einem &lt;a href=&quot;https://code.th-h.de/?p=faqs/einrichtung.git&quot; title=&quot;301 Moved Permanently&quot;&gt;Git-Repository&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;moderation-von-de-alt-netdigest-&quot;&gt;Moderation von &lt;em&gt;de.alt.netdigest&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Zum 01.07.2021 habe ich die Moderation der Newsgroup &lt;em&gt;de.alt.netdigest&lt;/em&gt; übernommen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2314-Moderation-von-de.alt.netdigest.html&quot; title=&quot;&quot;&gt;Moderation von de.alt.netdigest&lt;/a&gt; und &lt;a href=&quot;https://netz-rettung-recht.de/archives/2315-de.alt.netdigest-Hinter-den-Kulissen.html&quot; title=&quot;&quot;&gt;de.alt.netdigest: Hinter den Kulissen&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2316-Webseiten-fuer-de.alt.netdigest.html&quot; title=&quot;Webseiten für de.alt.netdigest | Netz - Rettung - Recht&quot;&gt;Webseiten für de.alt.netdigest&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;sonstiges&quot;&gt;Sonstiges&lt;/h4&gt;

&lt;p&gt;Seit April 2021 bin ich einer der &lt;a href=&quot;https://netz-rettung-recht.de/archives/2308-Machs-Dir-doch-selbst!.html&quot; title=&quot;&quot;&gt;Newsmaster von &lt;em&gt;bawue.net&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;relaunch-von-webseiten&quot;&gt;Relaunch von Webseiten&lt;/h3&gt;

&lt;p&gt;Nicht nur für die Newsgroup &lt;em&gt;de.alt.netdigest&lt;/em&gt; habe ich Webseiten erstellt, sondern auch die Webseiten (und die damit verbundene Hintergrunddtechnik) meines Newsservers und von &lt;em&gt;szaf.org&lt;/em&gt; komplett überarbeitet und erneuert.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2305-Relaunch-der-Webseiten-von-news.szaf.org.html&quot; title=&quot;&quot;&gt;Relaunch der Webseiten von &lt;em&gt;news.szaf.org&lt;/em&gt;&lt;/a&gt; und &lt;a href=&quot;https://netz-rettung-recht.de/archives/2306-news.szaf.org-Relaunch-abgeschlossen.html&quot; title=&quot;&quot;&gt;&lt;em&gt;news.szaf.org&lt;/em&gt;: Relaunch abgeschlossen&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2307-Relaunch-der-Webseiten-von-szaf.org.html&quot; title=&quot;&quot;&gt;Relaunch der Webseiten von &lt;em&gt;szaf.org&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vorherige Aktivitäten-Übersicht: &lt;a href=&quot;https://netz-rettung-recht.de/archives/2235-FLOSSnnet-Aktivitaeten-im-1.-Quartal-2020.html&quot; title=&quot;&quot;&gt;I/2020&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wir werden sehen, ob und wie es 2022 weitergeht &amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © momius - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/b1e76201e1524e5cbe6a718ff9b7afcc&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 30 Dec 2021 06:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2374-guid.html</guid>
    <category>flossnet</category>
<category>s9y</category>
<category>usenet</category>
<category>webdesign</category>

</item>
<item>
    <title>Webseiten für de.alt.netdigest</title>
    <link>https://netz-rettung-recht.de/archives/2316-Webseiten-fuer-de.alt.netdigest.html</link>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2316-Webseiten-fuer-de.alt.netdigest.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2316</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2316</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Zwar ist das Usenet deutlich älter als das &lt;em&gt;World Wide Web&lt;/em&gt; und braucht es - grundsätzlich - auch nicht; dennoch finde ich es hilfreich, Informationen nicht nur im Usenet, sondern auch im Web bereitzustellen. Das Usenet hat seine Stärken in Austausch und Diskussion; für die Bereithaltung (aktueller) Informationen zum Abruf ist es nicht die erste Wahl. Natürlich gab es immer schon FAQs und Infopostings, die regelmäßig (jede Woche, jeden Monat) veröffentlicht werden, damit sie immer in der Gruppe zur Verfügung stehen; natürlich kann man in regelmäßigen Abständen einen Status oder Updates in einer Newsgroup veröffentlichen. Bequemer - solange eine Internetverbindung besteht - und jedenfalls eine sinnvolle Ergänzung ist es aber auch, diese Informationen zusätzlich (ggf. auch in erweiterter Form) online als Webseiten anzubieten.&lt;/p&gt;

&lt;p&gt;Daher gibt es jetzt auch eine &lt;a href=&quot;https://netdigest.de/&quot; title=&quot;de.alt.netdigest im Web&quot;&gt;Website für de.alt.netdigest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;!-- s9ymdb:967 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1080&quot; height=&quot;214&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/entry-images/netdigest.png&quot; title=&quot;netdigest.png&quot; alt=&quot;&quot;&gt;
Im Gegensatz zu dem Relaunch der Webseiten um Ostern diesen Jahres herum ist das wieder eine mit dem Webseitengenerator &lt;em&gt;Nanoc&lt;/em&gt; erstellte Webpräsenz, diesmal allerdings - im Gegensatz zu meinen anderen &lt;em&gt;Nanoc&lt;/em&gt;-basierten Webseiten - auf Grundlage von &lt;em&gt;Bootstrap 5&lt;/em&gt; und daher mit &lt;em&gt;SASS&lt;/em&gt; statt &lt;em&gt;LESS&lt;/em&gt;. Zudem liegen die Seiten auf einem Server, auf dem bisher Ruby und &lt;em&gt;Nanoc&lt;/em&gt; noch nicht installiert waren; der Aufwand war also doch etwas größer, als ich gedacht hatte, zumal es eine ältere Version von &lt;em&gt;Nanoc&lt;/em&gt; sein musste, weil die Ruby-Version aus Debian &lt;em&gt;Stable&lt;/em&gt; nicht aktuell genug ist. Immerhin aber mal ein schöner Anlass, mich wieder einmal näher mit &lt;em&gt;Nanoc&lt;/em&gt; vertraut zu machen, eine passende &lt;code&gt;Rules&lt;/code&gt;-Datei zu erzeugen und kleine Helper zu schreiben.&lt;/p&gt;

&lt;p&gt;Die Webseiten enthalten (eine weitere) Web-Fassung der auch in der Gruppe geposteten FAQ, einen historischen Überblick über die Geschichte der Gruppe und auf der Startseite eine kurze Einführung einschließlich des Füllzustands der Warteschlange, der bei der täglichen Neuerzeugung der Webseiten ausgelesen wird. Mir gefallen die Inhalte und das - bewusst eher schlicht gehaltene - Design; für Ergänzungen und Kritik habe ich aber natürlich ein offenes Ohr.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im Oktober 2021.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/e24c0cb24b924ae3926f6853dc191dc9&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 08 Jul 2021 21:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2316-guid.html</guid>
    <category>usenet</category>
<category>webdesign</category>

</item>
<item>
    <title>Relaunch der Webseiten von szaf.org</title>
    <link>https://netz-rettung-recht.de/archives/2307-Relaunch-der-Webseiten-von-szaf.org.html</link>
            <category>Bits'n'Bytes</category>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2307-Relaunch-der-Webseiten-von-szaf.org.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2307</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2307</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Wie ich bereits Ende März in meinem Beitrag über die &lt;a href=&quot;https://netz-rettung-recht.de/archives/2304-Naives-MVC.html&quot; title=&quot;&quot;&gt;Vorbereitungen&lt;/a&gt; zum &lt;a href=&quot;https://netz-rettung-recht.de/archives/2305-Relaunch-der-Webseiten-von-news.szaf.org.html&quot; title=&quot;&quot;&gt;Relaunch&lt;/a&gt; der Webseiten von &lt;em&gt;news.szaf.org&lt;/em&gt; angedeutet hatte, ging es dabei nicht nur um eine Präsenz, sondern mehrere miteinander zusammenhängende Angebote. Und so habe ich die letzten Tage damit verbracht, auch die Webseiten von &lt;em&gt;szaf.org&lt;/em&gt; auf das neue System umzustellen.&lt;/p&gt;

&lt;p&gt;Das Design ist identisch - und soll es auch sein -, die technische Lösung ist weitgehend vergleichbar: wieder gibt es eine Vielzahl aus &lt;em&gt;Markdown&lt;/em&gt; mit &lt;em&gt;YAML front matter&lt;/em&gt; generierter Seiten, es gibt Benutzerdaten und ein Administrationsinterface mit einer Liste aller Nutzer, hinzu kommen aber weitere Funktionalitäten: teilweise nur Ausgaben aus einer Datenbank (deren Inhalte sich in den letzten 15 Jahren so selten geändert haben, dass es sich nicht lohnt, dafür ein Formular mit der dahinterstehenden Logik anzubieten), aber auch eine Zitatsammlung aus dem IRC und anderen Quellen, die die Ausgabe der Zitate, verschiedene Filter sowie Änderungen und Neuanlagen von Zitaten unterstützen muss.
Viel Code ließ sich recyclen (entweder modular oder, wenn projektspezifisch, per copy &amp;amp; paste mit entsprechenden Abwandlungen), und &amp;#8220;von außen&amp;#8221; sieht alles sehr ähnlich aus (und ja, das war schon vorher so und soll auch so sein):&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1409px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:959 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1409&quot; height=&quot;918&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/szaf-org-2021.png&quot; title=&quot;szaf.org 2021&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Der öffentliche Teil von &lt;i&gt;szaf.org&lt;/i&gt;.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Mehr als das - und die Login-Seite - bekommt man von außen allerdings auch nicht zu sehen. Mit Login ist die Optik im Wesentlichen der von &lt;em&gt;news.szaf.org&lt;/em&gt; vergleichbar. Es gibt aber auch eine schöne Möglichkeit, die neuen &amp;#8220;Cards&amp;#8221; von &lt;em&gt;Bootstrap&lt;/em&gt; zu verwenden, nämlich um eine Übersicht der verschiedenen Dienste zusammenzustellen, jeweils mit Links zu weiteren Informationen:&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1367px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:960 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1367&quot; height=&quot;590&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/szaf-org-2021-dienste.png&quot; title=&quot;szaf.org: Dienstübersicht&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Ein Ausschnitt aus der Dienste-Übersicht.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Ein paar Webseiten sind noch übrig, die der Umstellung harren, aber insgesamt bin ich sowohl mit dem Ergebnis als auch mit der zugrundeliegenden &amp;#8220;Technik&amp;#8221; und ihrer Wiederverwendbarkeit sehr zufrieden.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im September 2021.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/bf9329031aea4dc89652891ee9b232b9&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 09 Apr 2021 19:05:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2307-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>news.szaf.org: Relaunch abgeschlossen</title>
    <link>https://netz-rettung-recht.de/archives/2306-news.szaf.org-Relaunch-abgeschlossen.html</link>
            <category>Bits'n'Bytes</category>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2306-news.szaf.org-Relaunch-abgeschlossen.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2306</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2306</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Pünktlich zu Ostern habe ich den &lt;a href=&quot;https://netz-rettung-recht.de/archives/2305-Relaunch-der-Webseiten-von-news.szaf.org.html&quot; title=&quot;&quot;&gt;Relaunch&lt;/a&gt; der Webseiten von &lt;em&gt;news.szaf.org&lt;/em&gt; abgeschlossen.&lt;/p&gt;

&lt;p&gt;Der interne Bereich war schon früh fertig, unterstützt jetzt aber auch (wieder) die Bearbeitung der eigenen Daten:&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1367px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:958 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1367&quot; height=&quot;618&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/nso-2021-intern.png&quot; title=&quot;news.szaf.org: interner Bereich&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Der interne Bereich für angemeldete Nutzer.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Nach dem Login wechselt die Login-Box zur Anzeige von Benutzer und Status und bietet einen Logout-Button. Die Benutzerdaten werden angezeigt, Mailadresse und Passwort können geändert werden. Die Navigation links bietet allen Benutzern Links zu den Serverstatistiken und den Benutzungsbedingungen an, aber den Link zur &lt;em&gt;Administration&lt;/em&gt; nur den Benutzern mit administrativen Rechten - und nur für die sind diese Seiten auch zugänglich.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1392px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:957 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1392&quot; height=&quot;486&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/nso-2021-admin.png&quot; title=&quot;news.szaf.org: Admin-Interface&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Das Administrations-Interface.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Im Administrationsbereich wird eine Liste aller vorhandenen Benutzer angezeigt (Login, Name, Status, letzte Anmeldung am Newsserver - nicht an den Webseiten); mit dem Button am Anfang jeder Zeile können die Nutzerdaten aufgerufen und bearbeitet werden. Das Datum des letzten Logins ist farbig hinterlegt; rot markierte Nutzer haben sich noch nie eingeloggt, gelb markierte zuletzt vor mehr als drei Monaten, grün markierte innerhalb der letzten zwei Tage. Gesperrte Nutzer sind ebenfalls farbig hervorgehoben. Hinter dem Fingerabdruck-Symbol ist ein eindeutiger Code hinterlegt, mit dem sich Postings jedes Nutzers diesem zuordnen lassen. Neue Benutzer lassen sich per Klick auf den entsprechenden Button oben auf der Seite anlegen.&lt;/p&gt;

&lt;p&gt;Besonders gefallen mir die Suchfelder für Benutzernamen und Hashes; diese sind mit einer Javascript-Funktion hinterlegt, die auf Eingaben reagiert und alle Zeilen der Tabelle ausblendet, die die entsprechenden Zeichen nicht enthalten. So lässt sich ein bestimmter Nutzer ganz einfach mit wenigen Tastendrücken finden.&lt;/p&gt;

&lt;p&gt;Auch im öffentlichen Bereich kam noch eine neue Funktion hinzu, nämlich ein &lt;a href=&quot;https://news.szaf.org/nso/changelog/&quot; title=&quot;Veränderungen&quot;&gt;Changelog&lt;/a&gt;. Auf der entsprechenden Seite sind diverse Änderungen - meistens neue oder wegfallende Peeringpartner - zusammengestellt. Das allein wäre nichts besonderes; die Seite wird aber aus einzelnen &lt;em&gt;Markdown&lt;/em&gt;-Dateien für jede Änderung zusammengebaut, die Datum und Titel im &lt;em&gt;YAML front matter&lt;/em&gt; tragen, wobei die Änderungen automatisch nach den Daten sortiert und in eine Navigation aufgenommen werden. Das finde ich sehr praktisch.&lt;/p&gt;

&lt;p&gt;Mit dem Ergebnis des Relaunchs bin ich weiterhin sehr zufrieden.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im September 2021.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/8113949a67e14f0c9f2942f1319e35d8&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 05 Apr 2021 16:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2306-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>Relaunch der Webseiten von news.szaf.org</title>
    <link>https://netz-rettung-recht.de/archives/2305-Relaunch-der-Webseiten-von-news.szaf.org.html</link>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2305-Relaunch-der-Webseiten-von-news.szaf.org.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2305</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2305</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/763-Szafisze-Neuigkeitenverbreitung.html&quot; title=&quot;&quot;&gt;Seit 2005&lt;/a&gt; betreibe ich einen &amp;#8220;richtigen&amp;#8221; Newsserver, also einen solchen, der die großen (und ein paar kleine) Hierarchien mit dem Rest der Welt peered und auch für andere Nutzer aus meinem Umkreis zur Verfügung steht: &lt;strong&gt;news.szaf.org&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Die zugehörigen Webseiten allerdings, die fast so alt waren, hätten schon lange ein Update vertragen können - weniger inhaltlich als vielmehr optisch und funktionell. Lange stand das auf meiner Todo-Liste, erwies sich dann aber doch als eher größeres Projekt; die Hintergründe habe ich in meinem &lt;a href=&quot;https://netz-rettung-recht.de/archives/2304-Naives-MVC.html&quot; title=&quot;&quot;&gt;vorherigen Blogbeitrag&lt;/a&gt; beschrieben. Mittlerweile ist das dort beschriebene Projekt veröffentlichungsreif. Ich präsentiere daher die neuen Webseiten für &lt;em&gt;news.szaf.org&lt;/em&gt;.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1417px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:953 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1417&quot; height=&quot;917&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/nso-2021.png&quot; title=&quot;news.szaf.org 2021&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Die aktuellen Webseiten von &lt;i&gt;news.szaf.org&lt;/i&gt;.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Ich finde, es ist mir dabei gut gelungen, das bisherige Farbschema und generelle &amp;#8220;look and feel&amp;#8221; der Seite beizubehalten, aber in eine ansehnliche(re) Form zu transformieren - zum Vergleich die Fassung von 2006:&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1281px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:952 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1281&quot; height=&quot;717&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/nso-2006.png&quot; title=&quot;news.szaf.org 2006&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;&lt;i&gt;news.szaf.org&lt;/i&gt; früher (seit 2006).&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Und natürlich erkennt man die Design-Elemente von &lt;em&gt;Bootstrap&lt;/em&gt;; aber zumindest für mich sieht es mehr nach einem optischen Update der bisherigen Seiten als &amp;#8220;yet another Bootstrap site&amp;#8221; aus.&lt;/p&gt;

&lt;p&gt;Auch die Login-Seite ist auf der einen Seite absoluter Standard, wirkt aber andererseits (wie ich finde) trotzdem optisch hübsch:&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 876px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:954 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;876&quot; height=&quot;636&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2021/nso-2021-login.png&quot; title=&quot;news.szaf.org: Login&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Loginseite.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Mir jedenfalls gefällt sie sehr. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So hat sich der investierte Aufwand bisher gelohnt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im August 2021.]&lt;/em&gt;&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Tue, 30 Mar 2021 19:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2305-guid.html</guid>
    <category>usenet</category>
<category>webdesign</category>

</item>
<item>
    <title>Naives MVC</title>
    <link>https://netz-rettung-recht.de/archives/2304-Naives-MVC.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2304-Naives-MVC.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2304</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2304</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Seit 2014 setze ich sowohl bei neuen Websites als auch bei der &amp;#8220;Renovierung&amp;#8221; alter auf &lt;em&gt;static site generators&lt;/em&gt;, also &lt;a href=&quot;https://netz-rettung-recht.de/archives/1755-Generatoren-fuer-statische-Websites.html&quot; title=&quot;&quot;&gt;Generatoren für statische Webseiten&lt;/a&gt;, die aus Templates und Inhalten in verschiedenen Markups, aus Helper-Klassen und ggf. auch Datenbankinhalten HTML-Seiten generieren, die dann auf den Server hochgeladen werden. Das hat verschiedene Vorteile ggü. CMS oder selbstgeschriebenem Code: weil nur statisches HTML ausgeliefert wird, muss auf dem Server keine Scriptsprache wie PHP laufen, was die Last vermindert und vor allem auch aus Sicherheitsgründen angenehm ist, denn wo kein Code läuft, gibt es auch keine Sicherheitslücken. Außerdem bringen Generatoren wie &lt;em&gt;Nanoc&lt;/em&gt;, mein bevorzugtes Werkzeug, ein ganzes Toolset wie Helper-Klassen für häufige Aufgaben und Filter für die verschiedensten Markup-Formate mit. So habe ich mich daran gewöhnt, dass ich das Grundgerüst einer Website in Form von Templates, meistens in &lt;em&gt;HAML&lt;/em&gt;, erstelle, für die optische Gestaltung CSS-Frameworks wie &lt;em&gt;Bootstrap&lt;/em&gt; nutzen kann, wobei ein LESS-Compiler automatisch mitkommt, und dass ich die eigentlichen Inhalte in &lt;em&gt;Markdown&lt;/em&gt; (oder in einer Kombination aus &lt;em&gt;HAML&lt;/em&gt; und &lt;em&gt;Markdown&lt;/em&gt;) erstellen kann. Auf diese Weise habe ich mir einen gut funktionierenden &lt;a href=&quot;https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html&quot; title=&quot;&quot;&gt;Workflow&lt;/a&gt; geschaffen.&lt;/p&gt;

&lt;p&gt;Das alles erfüllt seinen Zweck im Grundsatz sehr gut, auch für in begrenztem Umfang dynamische Elemtente: es genügt ja, die Webseitengenerierung in regelmäßigen Abständen neu anzustoßen, bspw. nachts, oder wenn man will auch stündlich. &lt;em&gt;Nanoc&lt;/em&gt; kann man zudem aus Datenbanken speisen, und auch beim bloßen Umgang mit Textdateien lassen sich deren Metadaten auswerten, um bspw. die letzten Änderungen zu verlinken, Termine anzukündigen (aber nur, solange sie noch bevorstehen), Zeitangaben automatisch zu ersetzen (&amp;#8220;Diese Seiten stehen schon seit x Jahren online&amp;#8221;) und anderes mehr. Man kann auch mal ein PHP-Script dazwischenmixen, beispielsweise für ein Kontaktformular. Ihre Grenzen erreicht die Technik erst, wenn es um tatsächlich dynamische Seiten geht, also bspw. die Suche in Datenbanken (bei der man die Einträge nicht schlicht insgesamt vorab als statische Seiten erzeugen kann) - oder wenn ein Passwortschutz (jenseits von &lt;em&gt;Basic Auth&lt;/em&gt;) oder ein Session-Management implementiert werden soll. Dann braucht es etwas anderes. Nur was?&lt;/p&gt;

&lt;p&gt;Bestimmt fünf Jahre lang habe ich die Überarbeitung verschiedener Webseiten vor mir hergeschoben, deren Anforderungen über die Möglichkeit von &lt;em&gt;static site generators&lt;/em&gt; hinausgehen. Der ursprüngliche Ansatz aus meinen ersten (und zweiten) Schritten mit PHP - jede Seite ein Mix von HTML und PHP, letzteres vor allem Funktionen zum Generieren der Seitenstruktur (Header, Footer) und Navigation als &amp;#8220;Templating für Arme&amp;#8221; - kam natürlich nicht mehr in Betracht; natürlich machen allein &lt;a href=&quot;https://netz-rettung-recht.de/archives/1821-Templates-und-Template-Engines.html&quot; title=&quot;&quot;&gt;Templates&lt;/a&gt; in diesem Zusammenhang Sinn. Aber ich wollte die Inhalte auch nicht mehr in HTML verfassen, sondern zumindest in &lt;em&gt;Markdown&lt;/em&gt;; und ein CSS-Baukasten wie &lt;em&gt;Bootstrap&lt;/em&gt; sollte sich auch einbinden lassen, was einen Preprocessor wie LESS oder SASS zumindest wünschenswert macht. Über die Jahre habe ich mit vielen Gedanken gespielt, bspw. an &lt;a href=&quot;https://netz-rettung-recht.de/archives/1822-Webseiten-und-Webapplikationen-erstellen-und-pflegen.html&quot; title=&quot;&quot;&gt;Frameworks&lt;/a&gt; wie &lt;em&gt;Laravel&lt;/em&gt; oder &lt;em&gt;Symfony&lt;/em&gt;; früher hatte ich über viele Jahre die &lt;em&gt;CakePHP&lt;/em&gt;-Mailingliste abonniert. Das erschien mir dann aber doch vergleichsweise aufwendig, um letztlich einen Passwortschutz und ein paar Formulare bzw. Datenbankausgaben zu implementieren.&lt;/p&gt;

&lt;p&gt;Nach langer Pause und Stagnation wollte ich das Thema dieses Jahr über die Osterzeit aber noch einmal angehen. Dazu gehörten mehrere Schritte: Zunächst waren einige eng verbundene Webseiten zu entkoppeln, die gemeinsame Ressourcen nutzten, also bspw. alle dieselbe CSS-Datei eingebunden hatten. Danach brauchte es ein Design, das optisch den bisherigen Webseiten ähnlich sein sollte, nur schicker und möglichst unter Verwendung von &lt;em&gt;Bootstrap&lt;/em&gt; - und dafür wiederum musste ich mich mit &lt;em&gt;Bootstrap 5&lt;/em&gt; auseinandersetzen (meine bisherigen Webseiten setzen alle noch auf die Version 3 auf), und dafür wiederum von &lt;em&gt;LESS&lt;/em&gt; auf &lt;em&gt;SASS&lt;/em&gt; wechseln. Der wiederum nächste Schritt wäre dann ein PHP-basiertes Templating-System, und dann musste all das zusammengesetzt und um die notwendige Funktionalität erweitert werden.&lt;/p&gt;

&lt;h3 id=&quot;-bootstrap-5-und-sass-&quot;&gt;&lt;em&gt;Bootstrap 5&lt;/em&gt; und &lt;em&gt;SASS&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Bootstrap 5&lt;/em&gt; erwies sich als gar nicht so anders; klar, das Grid ist neu und setzt auf Flexbox, es gibt einen Haufen Utility-Klassen für Abstände und bei den Komponenten hat das neue &amp;#8220;Card&amp;#8221;-Element einige bisherige Elemente ersetzt, aber die einzige Neuerung mit Umstellungs- und Änderungsbedarf war der Wechsel von &lt;em&gt;LESS&lt;/em&gt; als CSS-Preporzessor zu &lt;em&gt;SASS&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ich habe also zunächst die &lt;a href=&quot;https://getbootstrap.com/docs/5.0/getting-started/download/#source-files&quot; title=&quot;Download · Bootstrap v5.0&quot;&gt;Quell-Dateien&lt;/a&gt; heruntergeladen und mich damit vertraut gemacht und mir dann eines der &lt;a href=&quot;https://getbootstrap.com/docs/5.0/examples/&quot; title=&quot;Examples · Bootstrap v5.0&quot;&gt;Beispiele&lt;/a&gt; ausgesucht, um davon ausgehend einen groben Design-Entwurf zu puzzeln. Das war dann auch der Zeitpunkt, wo ich einen &lt;em&gt;SASS&lt;/em&gt;-Compiler brauchte. Das erwies sich als überraschend einfach: &lt;a href=&quot;https://sass-lang.com/dart-sass&quot; title=&quot;Document moved&quot;&gt;Dart Sass&lt;/a&gt; bietet Pakete für Windows an. Herunterladen, &lt;code&gt;dart.exe&lt;/code&gt; und &lt;code&gt;sass.snapshot&lt;/code&gt; in ein &lt;code&gt;bin/&lt;/code&gt;-Verzeichnis packen, eine Batch-Datei mit &lt;code&gt;bin/dart.exe bin/sass.snapshot mein.scss mein.css&lt;/code&gt; ins Hauptverzeichnis des Projekts, und schon kann ich aus &lt;code&gt;mein.scss&lt;/code&gt; eine CSS-Datei zaubern. In der &lt;code&gt;.scss&lt;/code&gt;-Datei importiere ich dann die notwendigen &lt;em&gt;Bootstrap&lt;/em&gt;-Komponenten (oder auch einfach alles), ggf. weitere Elemente (wie &lt;em&gt;Font Awesome&lt;/em&gt;), passe Variablen an (insbesondere das Farbschema), ergänze eigenes CSS - et voilá. Und all das kann ich dann direkt lokal auf meinem unter Windows laufenden Entwicklungsrechner testen: Änderungen vornehmen, Build-Script starten, HTML-Datei im Browser neu laden - und ggf. von vorne.&lt;/p&gt;

&lt;p&gt;Eine solche &lt;code&gt;.scss&lt;/code&gt;-Datei kann dann beispielsweise so anfangen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/* --------------------------------------------------------
 *  SCSS styles and Bootstrap import
 */

// custom variables
$primary:   #314e8c;
$secondary: #bad1e1;
$info:      #ced4da; /* gray-400 */
$body-bg:   $secondary;

// import from Bootstrap
@import &quot;bootstrap/scss/bootstrap.scss&quot;;

// import from FontAwesome (Solid)
@import &quot;fontawesome/scss/fontawesome.scss&quot;;
@import &quot;fontawesome/scss/solid.scss&quot;;

// custom SCSS
/* --------------------------------------------------------
 * Text elements
 */

h1, h2, h3, h4, h5, h6 {
  color: $primary;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit werden die gewünschten Primär- und Sekundärfarben gesetzt, die ich aus dem bisherigen Design übernommen habe, die Farbe für &amp;#8220;Info&amp;#8221;-Boxen auf einen Grauton umgestellt und der Hintergrund in der Sekundärfarbe eingefärbt. Dann ziehe ich das komplette &lt;em&gt;Bootstrap&lt;/em&gt;-Framework und &lt;em&gt;Font Awesome&lt;/em&gt; als Webfont ein (hier kann man sich natürlich auf die Elemente beschränken, die man nutzt; das macht alles schlanker), und danach folgen die Anpassungen und eigenen Elemente. So färbe ich bspw. die Überschriften gerne in der Primärfarbe der jeweiligen Website ein.&lt;/p&gt;

&lt;p&gt;Das war, ehrlich gesagt, im Ergebnis dann sehr viel einfacher als ich befürchtet habe, und es gelang mir überraschend schnell, ein brauchbares Mockup zu erstellen. Feinheiten folgen dann, wie immer, sobald sie für bestimmte Elemente oder Situationen benötigt werden.&lt;/p&gt;

&lt;p&gt;Den ganzen Kram - &lt;em&gt;Bootstrap&lt;/em&gt;-Quellcode, &lt;em&gt;Font-Awesome&lt;/em&gt;-Quellcode, die ausführbaren Dateien von &lt;em&gt;Dart Sass&lt;/em&gt; und meine &lt;code&gt;.scss&lt;/code&gt;-Datei - habe ich natürlich in ein Git-Repository gepackt. Dabei haben sowohl &lt;em&gt;Bootstrap&lt;/em&gt; als auch &lt;em&gt;Font Awesome&lt;/em&gt; als auch &lt;em&gt;Dart Sass&lt;/em&gt; jeweils nach dem initialen Einkopieren der Dateien einen eigenen Branch erhalten. Wenn ich nun bspw. eine neue &lt;em&gt;Bootstrap&lt;/em&gt;-Version einspielen will, genügt es, den Bootstrap-Branch auszuchecken, die neuen Dateien einzukopieren und ihn in den Master-Branch zu mergen. So sehe ich sofort alle Änderungen und kann ggf. Anpassungen vornehmen.&lt;/p&gt;

&lt;p&gt;Die am Ende dieser Operationen erzeugte &lt;code&gt;mein.css&lt;/code&gt;-Datei kann ich dann jeweils in das Repository (oder die Repositories) für den Quellcode der einzelnen Webseiten einkopieren.&lt;/p&gt;

&lt;h3 id=&quot;templates&quot;&gt;Templates&lt;/h3&gt;

&lt;p&gt;So weit, so gut. Im nächsten Schritt sollte ich dann aus dem Mockup ein Template machen, in das sich Inhalte einbinden lassen. Davor bedarf es aber eines Template-Systems, das diesen Schritt (Template laden, mit Inhalten füllen) technisch umsetzt.&lt;/p&gt;

&lt;p&gt;Für eine simple interne Seite - Erzeugen von Mailboxen und Mailadressen über ein Webinterface - hatte ich 2017 bei der Renovierung des ursprünglich aus dem Jahr 2009 stammenden &lt;a href=&quot;https://netz-rettung-recht.de/archives/1475-Personalisierte-Mailadressen.html&quot; title=&quot;&quot;&gt;Codes&lt;/a&gt; auf &lt;a href=&quot;http://platesphp.com/&quot; title=&quot;Plates - Native PHP Templates&quot;&gt;&lt;em&gt;Plates&lt;/em&gt;&lt;/a&gt;, ein einfaches PHP-Templating-System, gesetzt. Zusammen mit &lt;em&gt;Bootstrap&lt;/em&gt; sah das hübsch aus und war funktional, wenn auch vielleicht von der Funktionalität her eher überschaubar. So richtig wollte das aber nichts werden; schon das Einbinden machte mir Schwierigkeiten, und mit dem Templating-System wurde ich ebenfalls nicht warm.&lt;/p&gt;

&lt;p&gt;Also dachte ich mir, warum nicht etwas verwenden, von dem ich weiß, dass es sich anderswo bereits bewährt hat? So habe ich mich dann für &lt;a href=&quot;https://www.smarty.net/&quot; title=&quot;PHP Template Engine | Smarty&quot;&gt;&lt;em&gt;Smarty&lt;/em&gt;&lt;/a&gt; entschieden, denn was für &lt;em&gt;Serendipity&lt;/em&gt; gut ist, kann für ein simples Projekt nicht schlecht sein. Außerdem kann ich dann das, was ich lerne, direkt noch anderswo zum Einsatz bringen. Das funktionierte dann auch direkt sehr schön, zumal &lt;em&gt;Smarty&lt;/em&gt; das Einbinden von Teil-Templates (Partials) in Templates unterstützt; man kann sich also das endgültige Template aus wiederverwertbaren Bausteinen zusammenstückeln. Einen Wermutstropfen gibt es freilich: die Templates sind kein &lt;em&gt;HAML&lt;/em&gt;, sondern HTML und &lt;em&gt;Smarty&lt;/em&gt;, aber das passt - so viele Templates braucht man ja in der Regel nicht.&lt;/p&gt;

&lt;p&gt;Wichtiger war mir, die Inhalte nicht komplett als HTML verfassen zu müssen; &lt;em&gt;Markdown&lt;/em&gt; ist da meine Standardlösung. Und wenn ich mich schon an &lt;em&gt;Serendipity&lt;/em&gt; bediene, warum dann nicht auch hier? Das &lt;em&gt;Markdown&lt;/em&gt;-Plugin dort nutzt &lt;a href=&quot;https://michelf.ca/projects/php-markdown/&quot; title=&quot;PHP Markdown&quot;&gt;PHP Markdown&lt;/a&gt;, und das lässt sich natürlich auch sehr schön in meinem Projekt verwenden.&lt;/p&gt;

&lt;h3 id=&quot;model-view-controller&quot;&gt;Model-View-Controller&lt;/h3&gt;

&lt;p&gt;Jetzt mussten alle diese Einzelteile &amp;#8220;nur noch&amp;#8221; sinnvoll zusammengeführt werden. In meinem schon angesprochenen &lt;em&gt;Plates&lt;/em&gt;-Projekt hatte ich für jede Webseite weiterhin jeweils eine gesonderte PHP-Datei, die im Prinzip aber nichts anderes machte, als das Template aufzurufen und mit Inhalten zu füllen. Außerdem gab es für jede Seite dann ein gesondertes Template, dass auf ein Standard-Template aufsetzte. Das kann aber natürlich nicht die Lösung sein. Nicht nur &lt;em&gt;Serendipity&lt;/em&gt; macht das anders: im Prinzip gibt es primär eine PHP-Datei, nämlich eine &lt;code&gt;index.php&lt;/code&gt; im Webroot, die als Parameter die jeweils anzuzeigende Webseite übergeben bekommt und sich dann um den Rest kümmert.&lt;/p&gt;

&lt;p&gt;Im Grundsatz ist das ein &lt;a href=&quot;https://de.wikipedia.org/wiki/Model_View_Controller&quot; title=&quot;&quot;&gt;&lt;em&gt;Model-View-Controller&lt;/em&gt;&lt;/a&gt;-Pattern, kurz &lt;em&gt;MVC&lt;/em&gt;. Das &lt;em&gt;Model&lt;/em&gt; liefert die Daten, sorgt also in einer Applikation üblicherweise für die Abbildung in einer Datenbank. &lt;em&gt;Views&lt;/em&gt; sind die Präsentation, die Templates, die mit Inhalten gefüllt werden. Und der &lt;em&gt;Controller&lt;/em&gt; führt beides zusammen. Natürlich kann man das mehr oder weniger ausgefeilt betreiben; mir genügte eine weniger ausgefeilte Lösung, die bspw. einzelne Aktionen im &lt;em&gt;Controller&lt;/em&gt; nicht in Funktionen auslagert, sondern im Kern auf ein langes &lt;code&gt;switch&lt;/code&gt;-Statement setzt. Immerhin enthält der Großteil der Webseiten primär einmal Text, der angezeigt werden muss; ich will ja keine Webapp schreiben.&lt;/p&gt;

&lt;p&gt;Am Anfang steht die Frage, wie man die anzuzeigende Webseite als Parameter übergeben möchte. Eine URL wie &lt;code&gt;https://meine-website.example/index.php?page=about/contact&lt;/code&gt; sieht ja wirklich hässlich aus und ist auch unter SEO-Gesichtspunkten keine gute Idee. Stattdessen möchte ich gerne URLS wie &lt;code&gt;https://meine-website.example/about/contact/&lt;/code&gt; haben. Hier kommt &lt;em&gt;mod_rewrite&lt;/em&gt; zu Hilfe:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RewriteEngine On
# rewrite URLs to controller
RewriteCond %{REQUEST_URI} !^/.well-known
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?page=$1 [QSA,L]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die erste der beiden Bedingungen sorgt dafür, dass alle Aufrufe in das Verzeichnis &lt;code&gt;/.well-known/&lt;/code&gt; nicht umgesetzt werden; das ist bspw. erforderlich, damit &lt;code&gt;certbot&lt;/code&gt; von &lt;em&gt;Let&amp;#8217;s encrypt&lt;/em&gt; seine Aufgaben erfüllen kann. Die zweite sorgt dafür, dass tatsächlich physisch vorhandene Dateien angezeigt werden. So lassen sich bspw. Textdateien oder Downloads unterbringen, die &amp;#8220;as is&amp;#8221; ausgeliefert werden sollen. Die darauffolgende Regel schnappt sich den Pfad - im Beispiel also &lt;code&gt;about/contact/&lt;/code&gt; - und ruft die &lt;code&gt;index.php&lt;/code&gt; mit diesem Pfad als Parameter auf. Damit lässt sich arbeiten.&lt;/p&gt;

&lt;p&gt;Im zentralen PHP-Script wird dieser Pfad dann zunächst normalisiert (damit er mit oder ohne abschließenden Slash &amp;#8220;/&amp;#8221; zur selben Seite führt) und auf unerwünschte Zeichen geprüft, damit nicht böse Menschen versuchen, unerwünschte Pfade (&lt;code&gt;../../../../etc/passwd&lt;/code&gt;) zu übergeben. Der Rest des Scripts arbeitet dann mit diesem Pfad weiter. Dazu wird eine weitgehend aus &lt;em&gt;Smarty&lt;/em&gt; abgeleitete Controller-Klasse benutzt, die ein Template-Objekt erzeugt und mit Variablen befüllt; wo erforderlich, steht eine spezialisierte Datenbank-Klasse bereit, die spezifische Funktionen für alle erforderlichen Lese- und Schreib-Operationen bereithält. Für das Session-Management konnte ich auf eine bestehende PHP-Klasse aus dem Jahre 2011 zurückgreifen, die ich damals für ein anderes Projekt geschrieben und bewusst modular aufgebaut hatte; tatsächlich war sie 10 Jahre später mit kleinen Anpassungen - vor allem in bisher nicht oder kaum genutzten Codepfaden - sofort verwendbar. Auth- und Controller-Klasse lassen sich modular wiederverwenden, die Datenbank-Klasse ist weitgehend projektspezifisch.&lt;/p&gt;

&lt;p&gt;Den Hauptteil der &lt;code&gt;index.php&lt;/code&gt; bildet dann tatsächlich ein langes &lt;code&gt;switch&lt;/code&gt;-Statement, das für bestimmte Seiten spezifischen (Datenbank-)Code enthält, in den meisten Fällen aber auf &lt;code&gt;default&lt;/code&gt; zurückfallen und schlicht eine &lt;em&gt;Markdown&lt;/em&gt;-Datei in HTML konvertieren, in ein Template einsetzen und dann anzeigen kann.&lt;/p&gt;

&lt;h3 id=&quot;verzeichnisstruktur&quot;&gt;Verzeichnisstruktur&lt;/h3&gt;

&lt;p&gt;Die Verzeichnisstruktur des Projekts sieht im Grundsatz so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\___ source/
 \
  \__ data/
   \
    \__ web/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das &lt;code&gt;web&lt;/code&gt;-Verzeichnis ist das Webroot; dort finden sich die &lt;code&gt;index.php&lt;/code&gt;, die Unterverzeichniss mit CSS, Javascript, Webfonts, Bildern und Icons und die Downloadverzeichnisse, also alles, was &amp;#8220;as is&amp;#8221; ausgeliefert werden soll.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;source&lt;/code&gt; liegen die Module und externen Elemente: &lt;em&gt;Smarty&lt;/em&gt;, &lt;em&gt;PHP Markdown Extra&lt;/em&gt;, meine eigenen Module und eine Konfigurationsdatei, die etliche Variablen setzt (bspw. für die Datenbankanbindung) und zugleich alle notwendigen Elemente einbindet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;data&lt;/code&gt; schließlich enthält zum einen die Templates (also die typischen &lt;em&gt;Smarty&lt;/em&gt;-Verzeichnisse wie &lt;code&gt;templates&lt;/code&gt;, &lt;code&gt;templates_c&lt;/code&gt;, &lt;code&gt;cache&lt;/code&gt; und Co.) und zum anderen im Verzeichnis &lt;code&gt;content&lt;/code&gt; die eigentlichen Inhalte in Form von &lt;em&gt;Markdown&lt;/em&gt;-Dateien in einer Verzeichnisstruktur, die der der Webseite entspricht. Der Inhalt, der nach Aufruf von &lt;code&gt;https://meine-website.example/about/contact/&lt;/code&gt; angezeigt werden soll, liegt also in &lt;code&gt;data/content/about/contact.md&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;umsetzungsbeispiele&quot;&gt;Umsetzungsbeispiele&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$controller = new Controller($config);
$controller-&amp;gt;assign(&#039;page&#039;,$page);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Auf diese Weise wird ein neues Controller-Element erzeugt, dass den Inhalt des Arrays &lt;code&gt;$config&lt;/code&gt; (aus der zentralen Konfigurationsdatei) und die anzuzeigende Seite (&lt;code&gt;$page&lt;/code&gt;) in &lt;em&gt;Smarty&lt;/em&gt; verfügbar macht. Die &lt;code&gt;assign&lt;/code&gt;-Methode akzeptiert entweder ein Array oder - wie im Beispiel - ein Tupel aus Schlüssel und Wert.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# create pages from Markdown/YAML
$yaml = $controller-&amp;gt;create_from_md($page);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Diese Funktion liest eine Datei ein, konvertiert das enthaltene &lt;em&gt;Markdown&lt;/em&gt; in HTML und kann &lt;em&gt;YAML front matter&lt;/em&gt; verarbeiten, also &lt;a href=&quot;https://yaml.org/&quot; title=&quot;  - YAML Ain&#039;t Markup Language&quot;&gt;&lt;em&gt;YAML&lt;/em&gt;&lt;/a&gt;, das als Vorspann (eingefasst in &lt;code&gt;---&lt;/code&gt;) in einer anderen Datei enthalten ist. Diese Inhalt werden in &lt;em&gt;Smarty&lt;/em&gt; als Variablen bereitgestellt.&lt;/p&gt;

&lt;p&gt;Die technische Umsetzung der Funktion &lt;code&gt;create_from_md()&lt;/code&gt; ist im Kern wirklich einfach:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# parse YAML and copy to Smarty
$yaml = yaml_parse_file($content_file);
$this-&amp;gt;template-&amp;gt;assign($yaml);

# parse Markdown, ignoring YAML front matter, and assign to content
$this-&amp;gt;template-&amp;gt;assign(&#039;content&#039;,Michelf\MarkdownExtra::defaultTransform($this-&amp;gt;read_ignore_frontmatter($content_file)));

# return YAML metadate
return $yaml;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die PHP-Funktion &lt;code&gt;yaml_parse_file()&lt;/code&gt; kann &lt;em&gt;YAML front matter&lt;/em&gt; verarbeiten und ignoriert den Rest. Die selbstgeschriebene Funktion &lt;code&gt;read_ignore_frontmatter()&lt;/code&gt; ist das Gegenstück dazu; sie sorgt dafür, dass beim erneuten Einlesen der Datei diesmal das &lt;em&gt;YAML front matter&lt;/em&gt; übersprungen und nur der &lt;em&gt;Markdown&lt;/em&gt;-Teil verarbeitet wird. Danach werden die eingelesenen &lt;em&gt;YAML&lt;/em&gt;-Daten zurückgegeben und stehen daher nicht nur im &lt;em&gt;Smarty&lt;/em&gt;-Template, sondern auch für den PHP-Code zur Verfügung.&lt;/p&gt;

&lt;p&gt;Auf diese Weise können beispielsweise Titel und Beschreibung der Seite, der Autor usw. übergeben werden. Für die (wenigen) Seiten, die nicht nur aus &lt;em&gt;Markdown&lt;/em&gt; bestehen, sondern weitergehende Funktionalität enthalten, werden diese Daten als Array in der &lt;code&gt;index.php&lt;/code&gt; definiert. Jede Webseite besteht also entweder aus einem speziellen &lt;em&gt;Smarty&lt;/em&gt;-Template mit zusätzlichem Code in der &lt;code&gt;index.php&lt;/code&gt; oder aus dem Inhalt einer &lt;em&gt;Markdown&lt;/em&gt;-Datei, die in das Default-Template eingesetzt wird.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# check for protected pages
if(isset($yaml[&#039;login&#039;])) $auth-&amp;gt;check_session();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wenn im &lt;em&gt;YAML&lt;/em&gt;-Vorspann &lt;code&gt;login&lt;/code&gt; gesetzt ist, wird geprüft, ob ein berechtigter Benutzer eingeloggt ist; ansonsten erfolgt die Umleitung zur Anmeldeseite.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# display template
$controller-&amp;gt;display(&#039;index.tpl&#039;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Am Schluss wird das mit Inhalt gefüllte Template angezeigt.&lt;/p&gt;

&lt;h3 id=&quot;ein-paar-worte-zum-schluss&quot;&gt;Ein paar Worte zum Schluss&lt;/h3&gt;

&lt;p&gt;Das Konzept stand natürlich nicht von Anfang an in der hier präsentierten Form, sondern ist dynamisch gewachsen - so gab es zunächst nur &lt;em&gt;Smarty&lt;/em&gt;-Templates, dann kam die Möglichkeit von &lt;em&gt;Markdown&lt;/em&gt;-Dateien hinzu, und noch später das Parsing von &lt;em&gt;YAML front matter&lt;/em&gt;. Und natürlich waren viele Tests und etliche Iterationen über einige Abende und ein langes Wochenende notwendig - aber am Ende war ich überrascht, erfreut und beeindruckt, mit wie vergleichsweise geringem Aufwand sich ein solches doch (für meine Verhältnisse) einigermaßen komplexes Projekt umsetzen lässt. Frei verfügbare externe Projekte und Frameworks - &lt;em&gt;Smarty&lt;/em&gt;, &lt;em&gt;PHP Markdown&lt;/em&gt;, &lt;em&gt;Bootstrap&lt;/em&gt;, &lt;em&gt;SASS&lt;/em&gt; und natürlich am Ende auch &lt;em&gt;PHP&lt;/em&gt; selbst -, eigene kleine Module und ein bißchen Klebstoff, um das alles miteinander zu verbinden, dazu ein altes Design zum Aufhübschen und die bestehenden Inhalte, die ergänzt und übernommen werden, sind eine ebenso mächtige wie vielseitige Kombination.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im August 2021.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © pripir - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/1f21a4874f62403e99eb8b517e2fa29e&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 25 Mar 2021 21:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2304-guid.html</guid>
    <category>bootstrap</category>
<category>php</category>
<category>webdesign</category>

</item>
<item>
    <title>Der Teufel steckt im Detail</title>
    <link>https://netz-rettung-recht.de/archives/2246-Der-Teufel-steckt-im-Detail.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2246-Der-Teufel-steckt-im-Detail.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2246</wfw:comment>

    <slash:comments>8</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2246</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Vor einigen Tagen hatte ich &lt;a href=&quot;https://netz-rettung-recht.de/archives/2240-Details-ganz-einfach.html&quot; title=&quot;&quot;&gt;berichtet&lt;/a&gt;, wie sich mithilfe der &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;- und &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;-Elemente von &lt;em&gt;HTML 5&lt;/em&gt; ganz leicht &amp;#8220;ausklappbare&amp;#8221; Erläuterungen - nur mit HTML und ggf. CSS, ohne Javascript - erzeugen lassen. Danach ist mir aufgefallen, dass wir - also vor allem vermutlich &lt;em&gt;yellowled&lt;/em&gt; - das in &lt;em&gt;Serendipity&lt;/em&gt; auch schon nutzen: im &lt;em&gt;2k11&lt;/em&gt;-Theme wird damit im Blog die einblendbare &amp;#8220;Vorschau&amp;#8221; der Trackback realisiert, und im Backend findet derselbe Mechanismus bei der Einblendung weiterer Informationen in den Plugin-Boxen Anwendung.&lt;/p&gt;

&lt;p&gt;In einem &lt;a href=&quot;https://netz-rettung-recht.de/archives/2240-Details-ganz-einfach.html#c5139&quot; title=&quot;&quot;&gt;Kommentar&lt;/a&gt; zu meinen Blogeintrag hatte &lt;em&gt;Beat&lt;/em&gt; dann vorgeschlagen, statt der Screenshots doch lieber ein Live-Beispiel im Blog zu zeigen. Das wollte ich dann &amp;#8220;mal eben schnell&amp;#8221; nachholen - und natürlich ging das dann nicht &amp;#8220;mal eben&amp;#8221;, und nicht richtig schnell, so dass ich daran dann länger geknobelt habe. Mittlerweile tut es aber.&lt;/p&gt;

&lt;h3 id=&quot;-details-und-summary-in-der-praxis&quot;&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; in der Praxis&lt;/h3&gt;

&lt;details&gt;

&lt;summary&gt;Lorem ipsum!&lt;/summary&gt;

&lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,&lt;/li&gt;
&lt;li&gt;vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan&lt;/li&gt;
&lt;li&gt;et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.&lt;/p&gt;

&lt;/details&gt;

&lt;p&gt;Der &amp;#8220;Quellcode&amp;#8221; dafür sieht wie folgt aus (mit &lt;code&gt;serendipity_event_markdown&lt;/code&gt; und &lt;em&gt;Markdown Extra&lt;/em&gt;, damit Markdown auch innerhalb von HTML geparsed werden kann):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;details markdown=&quot;1&quot;&amp;gt;&amp;lt;summary&amp;gt;Lorem ipsum!&amp;lt;/summary&amp;gt;

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

* Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
* vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan
* et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Natürlich geht das auch ohne Markdown; dann müsste man eben bspw. komplett HTML verwenden, etwa so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;Lorem ipsum!&amp;lt;/summary&amp;gt;
&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.&amp;lt;/p&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So weit, so gut; es passen auch Listen und alles mögliche anderen Elemente in einen &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;-Abschnitt.&lt;/p&gt;

&lt;p&gt;Das ganze hat allerdings, wie schon geschildert, nicht ganz auf Anhieb geklappt.&lt;/p&gt;

&lt;h3 id=&quot;anpassungen-am-css&quot;&gt;Anpassungen am CSS&lt;/h3&gt;

&lt;p&gt;Initial war kaum erkennbar, dass dort etwas &amp;#8220;ausklappbar&amp;#8221; ist; es fehlte nämlich das typische &amp;#8220;Dreieck&amp;#8221; vor dem &lt;em&gt;summary&lt;/em&gt;. Das liegt daran, dass das Stylesheet von &lt;em&gt;2k11&lt;/em&gt; für das &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;-Element im Frontend &lt;code&gt;display: block;&lt;/code&gt; vorsieht, es also nicht als Liste anzeigt. Es dürfte zu erwägen sein, das auf die Darstellung der Trackbacks zu begrenzen. Bis dahin kann man in einem User-Stylesheet (&lt;code&gt;user.css&lt;/code&gt;) Abhilfe schaffen, zum Beispiel so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/* restore browser defaults for details &amp;amp; summary */
.content details &amp;gt; summary:first-of-type {
  display: list-item;
  counter-increment: list-item 0;
  list-style: disclosure-closed inside;
}

.content details[open] &amp;gt; summary:first-of-type {
  list-style-type: disclosure-open;
}

.content details &amp;gt; summary:first-of-type &amp;gt; *|* {
  /* Cancel &quot;list-style-position: inside&quot; inherited from summary. */
  list-style-position: initial;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das entspricht dem Browser-Stylesheet des &lt;em&gt;Firefox&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update vom 25.04.2020&lt;/strong&gt;: Die vorstehende Änderung ist nicht mehr nötig, weil das Stylesheet von &lt;em&gt;2k11&lt;/em&gt; mit der Version &lt;strong&gt;2.3.5&lt;/strong&gt; von &lt;em&gt;Serendipity&lt;/em&gt; entsprechend angepasst wurde.&lt;/p&gt;

&lt;p&gt;Außerdem finde ich persönlich es schick, wenn die Überschrift des &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;-Elements, also &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;, durch Fettschrift hervorgehoben und das gesamte Element etwas kleiner (und mit verringertem Zeilenabstand) dargestellt wird. Dementsprechend müssen dann auch die Abstände zwischen den Absätzen kleiner sein. Außerdem möchte ich nicht, dass der &amp;#8220;ausklappbare&amp;#8221; Bereich bzw. - solange nichts ausgeklappt ist - die Überschrift nach innen eingerückt sind; beides soll vielmehr auf der linken Seite bündig abschließen. Das alles habe ich im &lt;code&gt;user.css&lt;/code&gt; so gelöst:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/* details &amp;amp; summary */
.content details {
    font-size: 80%;       
    line-height: 1.6em;   
    padding-left: 1em;
}

.content details &amp;gt; summary {
    font-weight: bold;
    margin-left: -1em;
    margin-bottom: 0.5em; 
}

.content details p, 
.content details ul,
.content details ol {
    margin-bottom: 0.2em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;anpassungen-am-markdown-plugin-bzw-an-php-markdown-&quot;&gt;Anpassungen am Markdown-Plugin bzw. an &lt;em&gt;PHP Markdown&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Die Darstellung sah immer noch nicht richtig aus; eine genauere Betrachtung ergab, dass um die einzelnen Teile des &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;-Elements &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;-Elemente verstreut waren. Das kann nicht richtig sein; ich hielt erst &lt;code&gt;serendipity_event_nl2br&lt;/code&gt; für den Bösewicht, es stellte sich aber heraus, dass der Fehler in Wahrheit im Markdown-Parser von &lt;code&gt;serendipity_event_markdown&lt;/code&gt; lag. Trotz Probieren ließ sich dafür keine Abhilfe schaffen; also musste ich einen Blick in die Innereien von &lt;em&gt;PHP Markdown&lt;/em&gt; werfen - das ist die Bibliothek, auf die das Markdown-Plugin aufsetzt.&lt;/p&gt;

&lt;p&gt;Offenbar wurde &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; im Gegensatz zu bspw. &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; nicht als Block-Level-Element erkannt. Die Lektüre im Issue-Tracker des &lt;em&gt;PHP-Markdown&lt;/em&gt;-Projekts ergab Hinweise auf eine mögliche Lösung, die ich dann getestet und umgesetzt habe. Die Änderung wurde bereits in den &lt;em&gt;PHP-Markdown&lt;/em&gt;-Code &lt;a href=&quot;https://github.com/michelf/php-markdown/pull/329&quot; title=&quot;Treat &amp;lt;details&amp;gt; and &amp;lt;summary&amp;gt; as block level. by th-h · Pull Request #329 · michelf/php-markdown · GitHub&quot;&gt;übernommen&lt;/a&gt;. Um nicht auf ein neues Release warten zu müssen, habe ich die Änderungen direkt in die Code-Kopie in unserem Markdown-Plugin kopiert, so dass sie für &lt;em&gt;Serendipity&lt;/em&gt; direkt nach dem Update des Plugins zur Verfügung stehen.&lt;/p&gt;

&lt;p&gt;Nun funktioniert&amp;#8217;s in meinem Blog so, wie das sein soll.&lt;/p&gt;

&lt;p&gt;Wer einen &amp;#8220;grafischen&amp;#8221; &lt;em&gt;WYSIWYG&lt;/em&gt;-Editor verwendet, muss ggf. darauf achten, dass dieser &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; erkennt und nicht ausfiltert. Ob der mit &lt;em&gt;Serendipity&lt;/em&gt; ausgelieferte Editor das kann, weiß ich nicht, weil ich ihn nicht verwende (und bislang den Code des Editors auch nicht recht durchschaut habe).&lt;/p&gt;

&lt;p&gt;Danke jedenfalls nochmal an &lt;em&gt;Beat&lt;/em&gt; für seinen Vorschlag, das direkt im Blog zu demonstrieren, wenn die Umsetzung auch mehrere ungeplante &amp;#8220;Abstecher&amp;#8221; nach sich zog.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © pripir - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/d9d3571d2a16424091054dc75da68ba6&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 23 Apr 2020 06:15:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2246-guid.html</guid>
    <category>s9y</category>
<category>webdesign</category>

</item>
<item>
    <title>Details - ganz einfach</title>
    <link>https://netz-rettung-recht.de/archives/2240-Details-ganz-einfach.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2240-Details-ganz-einfach.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2240</wfw:comment>

    <slash:comments>7</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2240</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Meistens ist es so: Ich habe eine Idee, die ich gerne auf einer meiner Webseiten umsetzen würde - sei es, dass ich das irgendwo anders gesehen habe und diese Funktion auch gerne hätte, sei es, dass mir ein eigener Gedanke gekommen ist. Dann recherchiere ich und stelle fest: das ist alles ziemlich kompliziert. Klar, wenn man HTML einigermaßen, CSS oberflächlich und JS gar nicht beherrscht, ist man zumeist auf &lt;em&gt;copy&amp;amp;paste&lt;/em&gt; oder viel Ausprobieren angewiesen, und der Teufel steckt ohnehin immer im Detail.&lt;/p&gt;

&lt;p&gt;Manchmal aber ist es auch umgekehrt: ich mache mich auf, um nach Lösungen zur Umsetzung einer Idee zu suchen - und finde heraus, dass eigentlich gar nichts mehr umzusetzen ist, weil alles schon fertig ist. So ging es mir bei einer meiner letzten Ideen, als ich eine Möglichkeit suchte, weitergehende Erläuterungen in einem längeren Text erst auf Wunsch einzublenden.&lt;/p&gt;

&lt;p&gt;Das Prinzip ist nicht neu (und aus manchen Lehrbüchern und Kommentaren vertraut): Wichtige Begriffe werden drucktechnisch hervorgehoben, sei es durch Fett- oder Kursivdruck, sei es gar durch Randsymbole oder Kästchen. Auf der anderen Seite gibt es aber auch Details, die zum Verständnis nicht unbedingt erforderlich sind, aber weitergehende Hintergrundinformationen zur Vertiefung liefern, die nicht jeden Leser interessieren. Üblicherweise werden diese Abschnitte in einer kleineren Schriftgröße mit verringertem Zeilenabstand gedruckt - das Kleingedruckte, quasi.&lt;/p&gt;

&lt;p&gt;Wie überträgt man dieses Konzept in die digitale Welt? Der Beck-Verlag, der in seinem Online-Dienst &lt;em&gt;beck-online&lt;/em&gt; bereits seit Jahren juristische Kommentare als reine Onlineversionen anbietet (&lt;em&gt;&amp;#8220;Beck&amp;#8217;sche Online-Kommentare&amp;#8221;&lt;/em&gt;, kurz &lt;em&gt;BeckOK&lt;/em&gt;), kombiniert in der sog. &amp;#8220;Detail-Ebene&amp;#8221; die kleinere Schriftgröße und den verringerten Zeilenabstand mit dem Ausblenden der Hintergrundinformationen - eine gute Idee, finde ich.&lt;/p&gt;

&lt;ul class=&quot;s9y_gallery plainList&quot;&gt;&lt;li class=&quot;s9y_gallery_item&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot;  rel=&quot;lightbox[2240]&quot; href=&quot;https://netz-rettung-recht.de/uploads/articles/2020/beck-ok-details.png&quot; title=&quot;&quot;&gt;&lt;!-- s9ymdb:819 --&gt;&lt;img class=&quot;s9y_gallery_image&quot; src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/beck-ok-details.serendipityThumb.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;s9y_gallery_item&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot;  rel=&quot;lightbox[2240]&quot; href=&quot;https://netz-rettung-recht.de/uploads/articles/2020/beck-ok-details-expanded.png&quot; title=&quot;&quot;&gt;&lt;!-- s9ymdb:820 --&gt;&lt;img class=&quot;s9y_gallery_image&quot; src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/beck-ok-details-expanded.serendipityThumb.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Das würde ich gerne für längere Texte übernehmen.&lt;/p&gt;

&lt;p&gt;Mein erster Gedanke war, dass sich dafür eine Javascript-Lösung anbieten würde, mit der man beim Anklicken einen vorher per CSS auf &lt;code&gt;visibility: hidden&lt;/code&gt; gesetzten Bereich sichtbar macht. So etwas müsste es ja eigentlich bereits in fertiger Form geben, dachte ich mir, und suchte bei Google nach &amp;#8220;&lt;code&gt;css details ausklappen&lt;/code&gt;&amp;#8221;. Nur um festzustellen, dass es im Prinzip gar keiner Javascript-Verrenkungen bedarf: HTML 5 kennt ein &lt;code&gt;details&lt;/code&gt;-Element! Und das funktioniert im Prinzip ganz genau so, wie ich mir das denke:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!-- https://wiki.selfhtml.org/wiki/HTML/Interaktiv/details --&amp;gt;
&amp;lt;details&amp;gt;
  &amp;lt;summary&amp;gt;
    Hintergrundinformationen
  &amp;lt;/summary&amp;gt;
  &amp;lt;p&amp;gt;
    Das neue &amp;amp;lt;details&amp;amp;gt;-Element ermöglicht es, ganz ohne den Einsatz von JavaScript,
    ursprünglich verborgene Textinhalte aufzuklappen.
  &amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul class=&quot;s9y_gallery plainList&quot;&gt;&lt;li class=&quot;s9y_gallery_item&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot;  rel=&quot;lightbox[2240]&quot; href=&quot;https://netz-rettung-recht.de/uploads/articles/2020/details.png&quot; title=&quot;&quot;&gt;&lt;!-- s9ymdb:821 --&gt;&lt;img class=&quot;s9y_gallery_image&quot; src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/details.serendipityThumb.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;s9y_gallery_item&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot;  rel=&quot;lightbox[2240]&quot; href=&quot;https://netz-rettung-recht.de/uploads/articles/2020/details-expanded.png&quot; title=&quot;&quot;&gt;&lt;!-- s9ymdb:822 --&gt;&lt;img class=&quot;s9y_gallery_image&quot; src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/details-expanded.serendipityThumb.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Will man den Text standardmäßig eingeblendet, aber ausblendbar haben, ergänzt man im &lt;code&gt;details&lt;/code&gt;-Element noch ein &lt;code&gt;open&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;details open&amp;gt;
  [...]
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Natürlich kann man das ganze noch mit etwas CSS stylen, aber im Prinzip ist das ganz genau das, was ich will. Und am besten: das Konzept ist viele, viele Jahre alt und wird mittlerweile breit von Browsern unterstützt. Auf der praktischen Website &lt;a href=&quot;https://caniuse.com/&quot; title=&quot;Can I use... Support tables for HTML5, CSS3, etc&quot;&gt;&lt;em&gt;Can I use &amp;#8230;?&lt;/em&gt;&lt;/a&gt; lässt sich &lt;a href=&quot;https://caniuse.com/#feat=details&quot; title=&quot;Can I use... Support tables for HTML5, CSS3, etc&quot;&gt;nachvollziehen&lt;/a&gt;, dass die entsprechende Untersützung in &lt;em&gt;Firefox&lt;/em&gt; (seit Version 49 von 2016), &lt;em&gt;Chrome&lt;/em&gt; (im Prinzip seit Version 12 von 2011, vollständig seit Version 36 von 2014) und &lt;em&gt;Safari&lt;/em&gt; (im Prinzip seit Version 6 von 2012, vollständig seit Version 12 von 2018) in auch nur halbwegs aktuellen Versionen vorhanden ist. Auch bei den mobilen Browsern unter iOS und Android sieht es gut aus. Problemkind ist wie immer Microsoft - aber die aktuellsten Versionen von Edge (leider erst seit Anfang 2020) untertützen das Element auch. Immerhin &gt; 93% der Nutzer, so die Seite, sollten insofern mit dem Element klarkommen.&lt;/p&gt;

&lt;p&gt;Wer auch für die restlichen 7% vorsorgen will, kann das mittels eines &lt;a href=&quot;https://de.wikipedia.org/wiki/Polyfill&quot; title=&quot;&quot;&gt;Polyfills&lt;/a&gt; tun. Beschreibungen dazu sind im &lt;a href=&quot;https://wiki.selfhtml.org/wiki/HTML/Interaktiv/details#Quellen&quot; title=&quot;HTML/Interaktiv/details – SELFHTML-Wiki&quot;&gt;SELFHTML-Wiki&lt;/a&gt; und im &lt;a href=&quot;https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#details-and-summary&quot; title=&quot;HTML5 Cross Browser Polyfills · Modernizr/Modernizr Wiki · GitHub&quot;&gt;&lt;em&gt;Modernizr&lt;/em&gt;-Github-Wiki&lt;/a&gt; verlinkt.&lt;/p&gt;

&lt;p&gt;Das war mal ausnahmsweise eine angenehm schnelle Lösung für ein Problem!&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/f70b18b89b3d4dec80380a034e133c8d&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 21 Apr 2020 06:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2240-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>Goodbye, JUHMAIL</title>
    <link>https://netz-rettung-recht.de/archives/2216-Goodbye,-JUHMAIL.html</link>
            <category>Aus dem Leben</category>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2216-Goodbye,-JUHMAIL.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2216</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2216</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ich bin nicht besonders gut darin, Dinge aufzugeben - aber immerhin habe ich 2019 damit begonnen, einige alte Projekte, die sich lange überlebt haben, zu beenden. Im September war das &lt;a href=&quot;https://netz-rettung-recht.de/archives/2172-Man-muss-auch-loslassen-koennen.html&quot; title=&quot;&quot;&gt;&lt;em&gt;KRG-online&lt;/em&gt;&lt;/a&gt;, die Ehemaligen-Seiten meiner alten Schule (deutlich älter als &lt;em&gt;Stayfriends&lt;/em&gt; und Konsorten), zum Jahreswechsel ist es mein wohl ältestes Projekt: die 1997 gestartete &lt;em&gt;JUH-Mailingliste&lt;/em&gt; &lt;a href=&quot;https://juhmail.de/&quot; title=&quot;JUHMAIL - Die Johanniter-Community&quot;&gt;&lt;strong&gt;JUHMAIL&lt;/strong&gt;&lt;/a&gt; und die zugehörigen Webseiten.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1066px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:785 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1066&quot; height=&quot;1031&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/juhmail-2001.png&quot; title=&quot;JUHMAIL seit 2001&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Das war fast zwei Jahrzehnte lang das Design der &lt;i&gt;JUHMAIL&lt;/i&gt;-Webseiten.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Während der letzten Jahre meiner Schulzeit und durch mein Studium hindurch war ich sehr aktiv bei den &lt;a href=&quot;https://th-h.de/me/juh/&quot; title=&quot;Die Johanniter und ich | th-h.de&quot;&gt;&lt;em&gt;Johannitern&lt;/em&gt;&lt;/a&gt; bzw. der &lt;em&gt;Johanniter-Unfall-Hilfe&lt;/em&gt;, einer der großen deutschen Hilfsorganisationen, noch bevor ich online aktiv wurde. Was lag da näher, als zum Zwecke der Diskussion und Vernetzung (und nach dem Vorbild anderer Organisationen) eine Mailingliste einzurichten? Nach dem Beginn als &lt;em&gt;GMX&lt;/em&gt;-Verteilerliste und einen Monat später im Batch-Betrieb auf dem heimischen Rechner wechselte die Liste noch im ersten Jahr ihres Bestehens auf den &lt;a href=&quot;https://de.wikipedia.org/wiki/Majordomo&quot; title=&quot;&quot;&gt;&lt;em&gt;Majordomo&lt;/em&gt;&lt;/a&gt;-MLM meines damaligen Providers, einer Regionaldomain des &lt;a href=&quot;https://de.wikipedia.org/wiki/Individual_Network&quot; title=&quot;&quot;&gt;&lt;em&gt;Individual Network&lt;/em&gt;&lt;/a&gt;. Wiederum ein Jahr später (1999) kamen dann Webseiten hinzu, zunächst mit einer Beschreibung der Liste und einem Formular zur Anmeldung sowie einem passwortgeschützten Bereich mit (von Hand gepflegter) Mitgliederliste, Webarchiv der Mails und einem Downloadbereich für Dateien, anfänglich alles manuell betrieben. Im Verlauf der nächsten Jahre wurde das Angebot professionalisiert: Mitgliederliste, Downloadbereich, Linkliste, Terminkalender und Kleinanzeigenmarkt waren datenbankgestützt, An- und Abmeldung bei der Mailingliste funktionierten über die Webseiten, weil das für viele einfacher war als kryptische Kommandos per Mail zu schicken, und ab 2001 wurde das ganze auch optisch ansehnlicher gestaltet.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 883px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:784 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;883&quot; height=&quot;472&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/juhmail-2000.png&quot; title=&quot;JUHMAIL anno 1999/2000&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;So sah die erste Version der &lt;i&gt;JUHMAIL&lt;/i&gt;-Webseiten 1999/2000 aus.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Die Webseiten waren allerdings das Ergebnis meiner ersten Gehversuche mit PHP, und in den kommenden Jahren kamen zwar immer mal wieder Neuerungen dazu - so unter anderem eine komplette Datenbank aller Standorte der Organisation mit hierarchischer Einbindung (Ortsverband, Kreisverband, Landesverband) und der Möglichkeit, die Adressdaten, Angebote und verantwortliche Mitarbeiter (wiederum mit Adressdaten) durch den Verband selbst zu pflegen -, es gab aber - obschon oft geplant nie eine wirkliche Überarbeitung oder eine Umstellung auf einen zeitgemäßeren MLM wie bspw. &lt;em&gt;Mailman&lt;/em&gt;. Und so alterte alles vor sich hin; im Laufe der Zeit (in den 10er-Jahren) änderten sich dann auch Nutzungsgewohnheiten und Kenntnisse der Nutzer: Mailinglisten sind heute in der Breite ein völlig unbekanntes Kommunikationsmedium.&lt;/p&gt;

&lt;p&gt;Ich erwog zwischendurch, den Relaunch zugleich mit einer Ergänzung oder gar Umstellung des Kernmediums von einer Mailingliste zu einem Webforum zu verbinden oder gar beides miteinander (und einem Newsserver) zu kombinieren, wie bspw. im - mittlerweile ebenfalls eingeschlafenen bzw. seit 2018 abgeschalteten - &lt;a href=&quot;http://web.archive.org/web/20100406052931/https://wiki.piratenpartei.de/Syncom&quot; title=&quot;Syncom – Piratenwiki&quot;&gt;Syncom-Projekt&lt;/a&gt; der Piratenpartei. All das dauerte aber seine Zeit, und mit den Jahren wurde mir bewusst, dass ich mittlerweile gar nicht mehr der Richtige wäre, ein solches Medium für eine Hilfsorganisation zu betreiben, bei der ich nicht mehr wirklich aktiv bin.&lt;/p&gt;

&lt;p&gt;Der logische Schritt war daher die Abschaltung, die ich zum 31.12.2019 dann vollzogen habe.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1920px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:786 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1920&quot; height=&quot;984&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/juhmail-2020.png&quot; title=&quot;JUHMAIL ab 2020&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Eine moderne Adaption des Designs für die Platzhalterseiten.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Aber jedes Ende ist natürlich auch ein neuer Anfang; so brachte die Ankündigung der geplanten Einstellung viele schöne Erinnerungen, weil seit Jahr(zehnt)en nicht mehr gehörte Aktive und Mitstreiter aus der Anfangszeit das zum Anlass nahmen, sich noch einmal zu melden, und ich habe so auch den zeitgemäßen Nachfolger meines Projekts kennengelernt: &lt;a href=&quot;https://www.4juh.de/&quot; title=&quot;&quot;&gt;4juh&lt;/a&gt;, ein auf &lt;a href=&quot;https://www.coyoapp.com/&quot; title=&quot;&quot;&gt;COYO&lt;/a&gt; basierendes &amp;#8220;Social Intranet&amp;#8221;, das dankenswerterweise diesmal ein Projekt der Organisation selbst ist. Und die Ressourcen eines &amp;#8220;Vereins&amp;#8221; mit mehr als einer Milliarde Jahresumsatz sind natürlich ganz andere als die eines einzelnen Ehrenamtlichen. Es freut mich zu sehen, dass sie - auch - in ein zeitgemäßes Kommunikationsmedium fließen, das neben den Mitarbeitern auch die Ehrenamtlichen einbindet.&lt;/p&gt;

&lt;p&gt;Und so hat alles auch sein Gutes.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/c751a100acc54e70ab26d11e59b7c96c&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 09 Jan 2020 09:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2216-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>Man muss auch loslassen können</title>
    <link>https://netz-rettung-recht.de/archives/2172-Man-muss-auch-loslassen-koennen.html</link>
            <category>Aus dem Leben</category>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2172-Man-muss-auch-loslassen-koennen.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2172</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2172</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Meine spärliche Freizeit teile ich schon lange, vielleicht zu lange auf viele, vielleicht zu viele Hobbys und Projekte auf; und demzufolge gibt es immer etwas, was ich eigentlich schon lange, lange einmal angegangen sein wollte. Und trotz aller Erfolge wächst die Projektliste eher als sie schrumpft.&lt;/p&gt;

&lt;p&gt;Außerdem fällt es mir manchmal schwer, zu der Erkenntnis zu gelangen, dass manche Dinge sich einfach überlebt haben und ich sie loslassen sollte - insbesondere dann, wenn ich sowieso keine Zeit dazu finde. Und so habe ich dieser Tage eine meiner ältesten Websites (neben meiner Homepage, natürlich) endlich aufgegeben.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://krg-online.de/&quot; title=&quot;KRG-online: Ehemalige am KRG Neustadt/Wstr.&quot;&gt;&lt;strong&gt;KRG-online&lt;/strong&gt;&lt;/a&gt; war ein &lt;strong&gt;1998&lt;/strong&gt; begonnenes Angebot für Ehemalige meiner alten Schule, um auch nach dem Abitur weiterhin in Kontakt miteinander - und auch mit Freunden und Bekannten aus anderen Jahrgängen - bleiben zu können. Es sollte für jeden (ehemaligen) Schüler die Möglichkeit bestehen, einen Steckbrief mit persönlichen Daten einschließlich verschiedener Adressen (Heimat und Studienort oder Wohnung und Arbeistplatz), telefonischer Erreichbarkeiten, Mailadressen und Webseiten, Freitextfeldern für einen Lebenslauf und persönliche Bemerkungen und ein Foto online zu stellen.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 800px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:693 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;800&quot; height=&quot;639&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2019/krg-online-2001.png&quot; title=&quot;krg-online-2001.png&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;&lt;i&gt;KRG-online.de&lt;/i&gt; anno 2001.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Die erste Fassung bestand aus von Hand gepflegten HTML-Seiten und stand ungeschützt im Netz; daran dachte man damals noch nicht so wirklich. Ab &lt;strong&gt;2002&lt;/strong&gt; und vor allem nach einer erneuten Überarbeitung &lt;strong&gt;2004&lt;/strong&gt; gab es dann eine datenbankgestützte PHP-Anwendung mit persönlichen Logins und der Möglichkeit, den eigenen Datensatz selbst zu pflegen (und auch Fotos hochzuladen und wieder zu löschen), eine Mailingliste, eine Linksammlung von Webseiten der Abiturjahrgänge und einen Terminkalender; optisch war die Seite an Farbe und Design der damaligen Schul-Homepage angepasst.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1200px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:694 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1200&quot; height=&quot;907&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2019/krg-online-2008.png&quot; title=&quot;krg-online-2008.png&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;&lt;i&gt;KRG-online.de&lt;/i&gt; anno 2008.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Danach teilte die Seite das Schicksal der meisten anderen meiner Webprojekte aus Studien- und Ausbildungszeit: begonnen mit viel Elan, aber wenig Ahnung, und mit Beginn der Berufstätigkeit wurde die freie Zeit zuerst weniger und dann nochmals sehr viel weniger. Eine Überarbeitung hätte Not getan, aber es gab ja noch so viele andere Ideen, Projekte und Arbeitsfelder &amp;#8230; und dann kam allmählich die professionelle Konkurrenz. &lt;strong&gt;2002&lt;/strong&gt; ging &lt;a href=&quot;https://www.stayfriends.de/&quot; title=&quot;StayFriends.de - Schulfreunde finden&quot;&gt;&lt;em&gt;StayFriends&lt;/em&gt;&lt;/a&gt; online, vorher schon &lt;em&gt;Passado&lt;/em&gt;, seit &lt;strong&gt;2005&lt;/strong&gt; gab es den Facebook-Clon &lt;a href=&quot;https://www.studivz.net/&quot; title=&quot;&quot;&gt;&lt;em&gt;StudiVZ&lt;/em&gt;&lt;/a&gt; (erinnert sich noch jemand daran?), &lt;strong&gt;2006&lt;/strong&gt; folgte das gerade in Rheinland-Pfalz sehr populäre &lt;em&gt;wer-kennt-wen&lt;/em&gt;, seit &lt;strong&gt;2008&lt;/strong&gt; gibt es das 2004 veröffentlichte &lt;em&gt;Facebook&lt;/em&gt; mit deutscher Oberfläche, &lt;em&gt;Twitter&lt;/em&gt;, &lt;em&gt;Instagram&lt;/em&gt; und überhaupt das &lt;em&gt;Web 2.0&lt;/em&gt;. Für handgestrickte proprietäre Dienste, die letztlich nur ein Adressverzeichnis ohne weitere Kommunikationsmöglichkeiten bieten, war die Zeit eigentlich vorbei.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2012&lt;/strong&gt; hatte ich daher alle mehr als 400 Nutzer von &lt;em&gt;KRG-online&lt;/em&gt; angeschrieben und die mögliche Einstellung des Dienstes, vor allem aus Zeitmangel meinerseits, angekündigt - soweit es Antworten gab, stimmten die meisten mir zu, dass die Welt sich weitergedreht habe, wenngleich eine Handvoll den Dienst auch vermissen würde. Dazu passt, dass es zwar bis zum Schluss Registrierungen gab, aber aus den Abiturjahrgängen nach 2004 nur noch einzelne Versprengte - und auch für die Abitreffen meines eigenen Jahrgangs mussten wir die aktuellen Mailadressen aus anderer Quelle besorgen, weil die Daten auf &lt;em&gt;KRG-online&lt;/em&gt; von den Nutzern nicht gepflegt wurden. &lt;strong&gt;2014&lt;/strong&gt; habe ich den Dienst daher offline genommen und durch eine Wartungsseite ersetzt, immer in der Hoffnung, vielleicht einen neuen Anlauf starten zu können oder die Seiten einer neuen Nutzung zuzuführen, bspw. als Online-Adress-Portal des Ehemaligenvereins (der immer noch alle paar Jahre sein aktualisiertes Adressverzeichnis per Post verschickt).&lt;/p&gt;

&lt;p&gt;Wiederum fünf Jahre später ist nichts dergleichen geschehen - und ich habe (mindestens!) vier vergleichbar große oder größere Projekte, die für mich mittlerweile höhere Priorität haben (und bei denen sich natürlich auch nichts tut). Und so nützlich es grundsätzlich auch sein mag, eine Plattform zu haben, die nicht von den dort hinterlassenen Daten lebt und auf der man seine Erreichbarkeit mit einer nur überschaubaren Personenzahl teilen kann - ehrlicher wäre es wohl gewesen, den Dienst schon 10 Jahre früher einzustellen.&lt;/p&gt;

&lt;p&gt;Nun also: der Schlussstrich. (Immer noch etwas schweren Herzens. Aber wenigstens ist es ein optisch ansprechender Schlussstrich geworden.) &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;!-- s9ymdb:692 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1214&quot; height=&quot;860&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2019/krg-online.png&quot; title=&quot;krg-online.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/4ffb8f35e52944ffbacca50cd770d8fc&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 10 Sep 2019 13:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2172-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>Shariff - sichere Sharing-Buttons</title>
    <link>https://netz-rettung-recht.de/archives/2077-Shariff-sichere-Sharing-Buttons.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2077-Shariff-sichere-Sharing-Buttons.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2077</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2077</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Im Zeitalter sozialer Netzwerke lebt auch das Web vom &amp;#8220;Teilen&amp;#8221; von Seiten - dem Veröffentlichen von Links zu Webseiten, Blogbeiträgen und anderen Ressourcen in diesen Netzwerken, bei Twitter, Facebook und Co. Das &lt;em&gt;Open Graph Protocol&lt;/em&gt; und &lt;em&gt;Twitter Cards&lt;/em&gt;, die ich vor ungefähr zwei Jahren &lt;a href=&quot;https://netz-rettung-recht.de/archives/1906-Open-Graph-Protocol-und-Twitter-Cards.html&quot; title=&quot;&quot;&gt;vorgestellt habe&lt;/a&gt;, ermöglichen es dabei dem Seitenbetreiber, das Aussehen solcher Links - insbesondere ihren Titel, die textuelle Beschreibung und ein hinzugefügtes Bild - zu steuern; und weil Mobilgeräte zwar regelmäßig aus jeder App heraus (und somit auch aus dem Webbrowser) das &amp;#8220;Teilen&amp;#8221; von Seiten ermöglichen, der auf Desktops und Laptops verwendete Browser aber oft nicht, baut man als Seitenbetreiber gerne Buttons ein, mit denen die Seite &amp;#8220;geteilt&amp;#8221; werden kann.&lt;/p&gt;

&lt;p&gt;Die verschiedenen sozialen Netzwerke bieten dafür in der Regel Codeschnippsel an, die aber den Nachteil haben, bereits beim Aufruf Daten des Nutzers an den jeweiligen Netzwerkanbieter zu übermitteln - nicht nur in Zeiten der Datenschutzgrundverordnung (DSGVO) ein No-Go. Hier hilft das &lt;a href=&quot;https://github.com/heiseonline/shariff&quot; title=&quot;GitHub - heiseonline/shariff: 👮 Shariff enables website users to share their favorite content without compromising their privacy. · GitHub&quot;&gt;&lt;em&gt;Shariff&lt;/em&gt;&lt;/a&gt;-Projekt der &lt;em&gt;c&amp;#8217;t&lt;/em&gt; weiter, das Sharing-Buttons ohne Datenübermittlung an die sozialen Netzwerke anbietet.&lt;/p&gt;

&lt;p&gt;In &lt;em&gt;Serendipity&lt;/em&gt; lassen sich solche Buttons ganz einfach mit dem Plugin &lt;code&gt;serendiptiy_event_social&lt;/code&gt; hinzufügen, das &lt;a href=&quot;https://netz-rettung-recht.de/archives/1924-Social-Media-Buttons-fuer-Serendipity.html&quot; title=&quot;&quot;&gt;seit anderthalb Jahren&lt;/a&gt; auch hier im Blog werkelt. Aber auch auf der eigenen Homepage ist &lt;em&gt;Shariff&lt;/em&gt; schnell eingebaut.&lt;/p&gt;

&lt;h3 id=&quot;installation-von-shariff-&quot;&gt;Installation von &lt;em&gt;Shariff&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Die &lt;a href=&quot;https://github.com/heiseonline/shariff#getting-started&quot; title=&quot;GitHub - heiseonline/shariff: 👮 Shariff enables website users to share their favorite content without compromising their privacy. · GitHub&quot;&gt;Installationsanleitung&lt;/a&gt; findet sich direkt im Github-Repository und ist dort auch &lt;a href=&quot;https://github.com/heiseonline/shariff/blob/develop/README-de.md#erste-schritte&quot; title=&quot;shariff/README-de.md at develop · heiseonline/shariff · GitHub&quot;&gt;auf Deutsch verfügbar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Im Prinzip genügt es, das aktuelle Release herunterzuladen und die dort enthaltenen Dateien auf den eigenen Webspace zu packen; die Schriftdateien von &lt;a href=&quot;https://github.com/FortAwesome/Font-Awesome&quot; title=&quot;GitHub - FortAwesome/Font-Awesome: The iconic SVG, font, and CSS toolkit · GitHub&quot;&gt;&lt;em&gt;Font Awesome&lt;/em&gt;&lt;/a&gt;, das CSS und das Javascript. Verwendet man auf der eigenen Seite bereits &lt;em&gt;Font Awesome&lt;/em&gt;, genügt als CSS-Datei &lt;code&gt;shariff.min.css&lt;/code&gt;; muss &lt;em&gt;Font Awesome&lt;/em&gt; noch eingebunden werden, muss man zu &lt;code&gt;shariff.complete.css&lt;/code&gt; greifen. Ähnlich sieht es mit dem Javascript aus: wird &lt;em&gt;JQuery&lt;/em&gt; bereits verwendet, genügt &lt;code&gt;shariff.min.js&lt;/code&gt;, ansonsten ist &lt;code&gt;shariff.complete.js&lt;/code&gt; erforderlich.&lt;/p&gt;

&lt;p&gt;Packt man die Schriftdateien nicht direkt zum CSS, muss in der CSS-Datei jeweils der Pfad entsprechend angepasst werden.&lt;/p&gt;

&lt;p&gt;Danach müssen CSS (im &lt;code&gt;&amp;lt;HEAD&amp;gt;&lt;/code&gt;) und Javascript (am Ende der Seite) eingebunden werden, und schon ist alles vorbereitet. Jetzt fehlt nur noch das Einfügen der eigentlichen Share-Buttons an der passenden Stelle im Seitengerüst, mit den passenden Parametern, die in der Anleitung erläutert sind.&lt;/p&gt;

&lt;h3 id=&quot;-shariff-backend&quot;&gt;&lt;em&gt;Shariff&lt;/em&gt;-Backend&lt;/h3&gt;

&lt;p&gt;Will man sich nicht auf Buttons beschränken, sondern auch anzeigen, wie oft die Seite im jeweiligen sozialen Netzwerk bereits geteilt wurde, muss zusätzlich ein Backend her, bspw. &lt;a href=&quot;https://github.com/heiseonline/shariff-backend-php&quot; title=&quot;GitHub - heiseonline/shariff-backend-php: 👮 PHP backend for Shariff. Shariff enables website users to share their favorite content without compromising their privacy. · GitHub&quot;&gt;&lt;em&gt;Shariff-Backend-PHP&lt;/em&gt;&lt;/a&gt;. Hier im Blog kann man besichtigen, wie das dann aussehen kann.&lt;/p&gt;

&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;

&lt;p&gt;Auch die Installation des Backends ist vergleichsweise einfach. Es genügt, die Releasedatei zu entpacken und in ein Verzeichnis hochzuladen, in dem PHP-Dateien ausgefürt werden. In der mitgelieferten &lt;code&gt;index.php&lt;/code&gt; sollte man dann noch die Konfiguration anpassen - und schon ist das Backend bereit! Ein Aufruf des Scripts mit der URL einer geteilten Seite als Parameter, bspw. in der Form &lt;code&gt;http://example.com/my-shariff-backend/?url=http%3A%2F%2Fwww.example.com&lt;/code&gt;, sollte dann eine Reihe von Zahlen zurückliefern (nicht aber &lt;code&gt;null&lt;/code&gt;). Funktioniert dieser Test, ist das Backend an sich bereits funktionsfähig.&lt;/p&gt;

&lt;h4 id=&quot;konfiguration-und-dienste&quot;&gt;Konfiguration und Dienste&lt;/h4&gt;

&lt;p&gt;Man möchte es vielleicht noch etwas anpassen - bspw. den Aufruf nur für bestimmte Domains - die eigenen nämlich - gestatten, oder die Liste der unterstützten Dienste einschränken oder erweitern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; wird als Dienst nicht mehr unterstützt, weil keine freie API mehr für solche Abfragen zur Verfügung steht; die Anzahl der Tweets der eigenen Seite lässt sich daher mit &lt;em&gt;Shariff&lt;/em&gt; nicht mehr anzeigen.&lt;/p&gt;

&lt;p&gt;Dies gilt auch für &lt;strong&gt;Google+&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Für die Unterstützung von &lt;strong&gt;Facebook&lt;/strong&gt; muss man sich bei Facebook als Entwickler registrieren und eine Facebook-&amp;#8220;App&amp;#8221; aufsetzen. Der Ablauf ist in der Facebook-Entwicklerdokumentation Schritt für Schritt &lt;a href=&quot;https://developers.facebook.com/docs/apps/register&quot; title=&quot;&quot;&gt;dargestellt&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Als erstes muss man sich bei Facebook einloggen.&lt;/li&gt;
&lt;li&gt;Danach muss man sich zu seinem Account einen Entwickler-Account anlegen&lt;/li&gt;
&lt;li&gt;Als nächstes muss man sich eine App erzeugen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dabei wird eine &lt;em&gt;App-ID&lt;/em&gt; und ein zugehöriger geheimer Key erzeugt. Diese benötigt man für die Konfiguration des &lt;em&gt;Shariff&lt;/em&gt;-Backends. Es ist nicht erforderlich, die App tatsächlich zu aktivieren.&lt;/p&gt;

&lt;p&gt;Auf der eigenen Webseite muss die Adresse des Backends dann noch im Attribut &lt;code&gt;data-backend-url&lt;/code&gt; hinterlegt werden. Dort kann ein relativer Pfad, aber auch eine absolute URL wie &lt;code&gt;https://shariff.example.com/&lt;/code&gt; angegeben werden.&lt;/p&gt;

&lt;h4 id=&quot;fu-angeln&quot;&gt;Fußangeln&lt;/h4&gt;

&lt;p&gt;Wenn das Backend an und für sich funktioniert, aber keine Zähler in den Share-Buttons auf der eigenen Webseite angezeigt werden, sollte man zunächst prüfen, ob man die Ausführung von Javascript freigegeben hat. Das gilt insbesondere dann, wenn das Backend unter einer anderen Domain läuft als die eigenen Webseite, weil man sich bspw. für mehrere Domains ein Backend unter einer einheitlichen Adresse wie &lt;code&gt;https://shariff.example.com/&lt;/code&gt; angelegt hat.&lt;/p&gt;

&lt;p&gt;Im letzteren Fall muss man sich auch noch Gedanken über &lt;em&gt;Cross-Origin Resource Sharing&lt;/em&gt;, kurz &lt;em&gt;CORS&lt;/em&gt;, machen. Im Zweifel sollte man den Webserver für &lt;code&gt;shariff.example.com&lt;/code&gt; einen HTTP-Header &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; übermitteln lassen. Für den Apache-Webserver lässt sich das mit der Zeile&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Header set Access-Control-Allow-Origin &quot;*&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in der &lt;em&gt;vhost&lt;/em&gt;-Konfiguration lösen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/737e139506434c13bce850397ce8ef4b&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 07 May 2018 16:45:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2077-guid.html</guid>
    <category>webdesign</category>

</item>
<item>
    <title>Workflow für die Erstellung und Pflege von Webseiten</title>
    <link>https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1994</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1994</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ich stelle die von mir betriebenen Webseiten, die nicht auf interaktive Funktionen angewiesen sind, Stück für Stück auf statisch generierte Seiten um, zuletzt meine &lt;a href=&quot;https://netz-rettung-recht.de/archives/1987-Relaunch-von-th-h.de.html&quot; title=&quot;&quot;&gt;Homepage&lt;/a&gt;. Dabei setze ich auf einen Workflow, der &lt;em&gt;nanoc&lt;/em&gt; als &lt;em&gt;static site generator&lt;/em&gt; und &lt;em&gt;git&lt;/em&gt; als Versionsverwaltungssystem umfasst und dafür sorgt, dass Änderungen der Seiten automatisch eingespielt werden.&lt;/p&gt;

&lt;h3 id=&quot;entwicklung-test-und-ver-ffentlichung&quot;&gt;Entwicklung, Test und Veröffentlichung&lt;/h3&gt;

&lt;p&gt;Bei Verwendung eines &lt;em&gt;static site generators&lt;/em&gt; werden die Webseiten zunächst aus Quelldateien erzeugt und müssen dann veröffentlicht, d.h. in das passende Verzeichnis des Webservers befördert werden, der sie anzeigen soll. Darüber hinaus ist es generell sinnvoll, &amp;#8220;Code&amp;#8221; im weitesten Sinne - und dazu gehören dann auch HTML- und CSS-Dateien bzw. die Quellen, aus denen diese erzeugt werden - in einem Versionsverwaltungssystem zu speichern, in dem Änderungen nachverfolgbar sind und wo jederzeit auf ältere Versionen zurückgegriffen werden kann. Nimmt man dies zusammen, unterscheiden sich Webseiten damit letztlich kaum mehr von Webapplikationen oder anderer Software: es gibt den Quellcode und das Kompilat (die fertigen Seiten, das ablauffähige Programm), Quellcode muss verwaltet und das Ergebnis getestet und schließlich veröffentlicht (deployed) werden.&lt;/p&gt;

&lt;p&gt;Für die drei Schritte - entwickeln, testen, veröffentlichen - werden zumeist mehrere Rechner (Systeme, Umgebungen) benötigt, die unterschiedlichen Zwecken dienen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Entwicklungsumgebung&lt;br /&gt;
Der Rechner, auf dem die Seiten entworfen, bearbeitet und ggf. auch getestet werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Git&lt;/em&gt;-Server&lt;br /&gt;
&lt;em&gt;Git&lt;/em&gt; ist zwar ein verteiltes Versionsverwaltungssystem, aber es ist generell sinnvoll, das Repository nicht nur auf dem eigenen Arbeitsrechner vorzuhalten, sondern auch auf (mindestens) einem Server. Das schafft Redundanz und ermöglicht es, auf verschiedenen Rechner zu arbeiten und die Ergebnisse jeweils zu synchronisieren.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testumgebung&lt;br /&gt;
Es ist sinnvoll, ein Testsystem vorzuhalten, dass dem Echtsystem weitgehend entspricht, um testen zu können, ob die Webseiten auch wirklich so aussehen und &amp;#8220;funktionieren&amp;#8221;, wie man sich das vorstellt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Echtumgebung&lt;br /&gt;
Am Ende des Tages sollen die Webseiten auf einem Rechner im Netz liegen, der sie mithilfe eines Webservers weltweit abrufbar macht.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grundsätzlich kann man das alles auf ein- und demselben Gerät betreiben: eine im Netz verfügbare Maschine, auf der man sich einloggt und entwickelt, auf der &lt;em&gt;Git&lt;/em&gt; verfügbar ist und die zugleich Test- und Echtumgebung darstellt. Meistens wird man aber doch auf dem heimischen Desktoprechner oder dem Laptop arbeiten wollen und einen Webserver (oder auch nur Webspace) irgendwo angemietet haben. Letzteres gilt auch für mich.&lt;/p&gt;

&lt;h3 id=&quot;mein-workflow&quot;&gt;Mein Workflow&lt;/h3&gt;

&lt;p&gt;Ich &lt;strong&gt;bearbeite&lt;/strong&gt; die Quelldateien (den Sourcecode) meiner Webseiten auf meinem Desktoprechner oder dem Laptop unter Windows, zumeist mit &lt;a href=&quot;http://www.sublimetext.com/&quot; title=&quot;Sublime Text - Text Editing, Done Right&quot;&gt;&lt;em&gt;Sublime Text&lt;/em&gt;&lt;/a&gt;, reine Markdown-Dateien manchmal auch mit &lt;a href=&quot;http://markdownpad.com/&quot; title=&quot;MarkdownPad - The Markdown Editor for Windows&quot;&gt;&lt;em&gt;MarkdownPad&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; unterstützt einen sehr bequemen &lt;strong&gt;Test&lt;/strong&gt;modus mit eingebautem Webserver: nach dem Compilieren mit &lt;code&gt;nanoc&lt;/code&gt; genügt ein &lt;code&gt;nanoc view&lt;/code&gt;, um einen Webserver zu starten, der dann unter &lt;code&gt;http://localhost:3000/&lt;/code&gt; die Website zur Ansicht bereitstellt. Leider funktioniert das für mich noch nicht, denn zwar lässt sich &lt;em&gt;nanoc&lt;/em&gt; grundsätzlich auch &lt;a href=&quot;https://netz-rettung-recht.de/archives/1824-Installation-von-nanoc-unter-Windwows-7.html&quot; title=&quot;&quot;&gt;unter Windows installieren&lt;/a&gt; und betreiben, aber das für den &lt;em&gt;LESS&lt;/em&gt;-Filter erforderliche Ruby-Gem leider nicht - jedenfalls ist mir das nicht gelungen. Daher arbeite ich weiterhin &amp;#8220;nach alter Väter Sitte&amp;#8221; und lade die geänderten Dateien per &lt;em&gt;SCP&lt;/em&gt; bzw. &lt;em&gt;SFTP&lt;/em&gt; entweder auf einen lokalen Linux-Server oder direkt auf den externen Webserver hoch bzw. sorge für eine &lt;a href=&quot;https://netz-rettung-recht.de/archives/1841-WinSCP-und-die-automatische-Synchronisierung.html&quot; title=&quot;&quot;&gt;automatische Synchronisierung mit &lt;em&gt;WinSCP&lt;/em&gt;&lt;/a&gt;. Dort wird dann compiliert und im Browser das Ergebnis angeschaut.&lt;/p&gt;

&lt;p&gt;Auch das &lt;strong&gt;Veröffentlichen&lt;/strong&gt; der Seiten unterstützt &lt;em&gt;nanoc&lt;/em&gt; mit dem Kommando &lt;code&gt;nanoc deploy&lt;/code&gt;, das ein Deployment per &lt;em&gt;git&lt;/em&gt;, per &lt;em&gt;rsync&lt;/em&gt; oder mittels &lt;a href=&quot;http://fog.io/&quot; title=&quot;302 Found&quot;&gt;&lt;em&gt;fog&lt;/em&gt;&lt;/a&gt; unterstützt. Das ist sicherlich sehr nützlich, wenn man die Webseiten auf dem Entwicklungsrechner testet und dann von dort auf den Webserver überspielt; nachdem &lt;em&gt;nanoc&lt;/em&gt; aber auf meinen Windows-Rechnern nicht läuft, gehe ich einen anderen Weg und compiliere direkt auf dem Webserver. Ich lade also den Quellcode hoch, lasse &lt;em&gt;nanoc&lt;/em&gt; auf dem Server laufen und das Ergebnis dann unmittelbar in das Webserver-Verzeichnis ausgeben (in der Regel durch ein passend gesetztes &lt;code&gt;output_dir&lt;/code&gt; in der &lt;code&gt;nanoc.yaml&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ich halte regelmäßig neben der aktuellen Fassung meiner Webseiten auch eine Testfassung vor, die ich über eine passwortgeschützte URL aufrufen kann. Das hat den Vorteil, dass ich von überallher testen kann und zudem die Testumgebung und die Echtumgebung identisch sind, weil sie auf demselben Server (in zwei unterschiedlichen &lt;em&gt;virtual hosts&lt;/em&gt;) laufen.&lt;/p&gt;

&lt;p&gt;Das jeweilige &lt;strong&gt;&lt;em&gt;Git&lt;/em&gt;-Repository&lt;/strong&gt; für eine Website hat daher immer mindestens den &lt;em&gt;master&lt;/em&gt;- und einen &lt;em&gt;staging&lt;/em&gt;-Zweig; im letzteren wird getestet, der erstere enthält die aktuelle Echtversion. Wenn ich einen dieser Zweige per &lt;code&gt;git push&lt;/code&gt; auf meinen &lt;em&gt;Git&lt;/em&gt;-Server schiebe, wird er automatisch auf den Webserver kopiert (in das Quellverzeichnis für die Echtfassung oder dasjenige für die Testversion der Website), dort compiliert und bereitgestellt. Auch für dieses &amp;#8220;Kopieren&amp;#8221; oder generell das Aktualisieren einer Website über &lt;em&gt;git&lt;/em&gt; gibt es eine Reihe von Möglichkeiten: man kann bspw. einfach das &lt;em&gt;Git&lt;/em&gt;-Repository auf dem Webserver auschecken, oder aber man checkt via &lt;code&gt;git archive&lt;/code&gt; wirklich nur den Inhalt des Repositorys aus. Ich habe mich für letzteres entschieden; einziger Nachteil ist, das aus dem Repository entfernte Dateien nicht automatisch gelöscht werden, ggf. also &amp;#8220;Leichen&amp;#8221; verbleiben. Dafür habe ich nicht das komplette Repository mit der ganzen History herumliegen.&lt;/p&gt;

&lt;h3 id=&quot;ein-beispiel&quot;&gt;Ein Beispiel&lt;/h3&gt;

&lt;p&gt;In der Praxis sieht das dann ungefähr so aus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ich aktualisiere mein lokales &lt;em&gt;Git&lt;/em&gt;-Repository auf dem jeweiligen Arbeitsrechner, damit es auf dem aktuellen Stand ist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ich verändere oder ergänze meine Webseiten, indem ich die entsprechenden Dateien auf dem Arbeitsrechner bearbeite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wenn umfangreichere Tests erforderlich sind, lade ich die geänderten Dateien auf meinen Webserver in das Quellverzeichnis für die Test-Instanz der jeweiligen Website hoch und führe - auf dem Server - &lt;em&gt;nanoc&lt;/em&gt; aus, so dass die Testinstanz der jeweiligen Webseiten aktualisiert wird. Im Browser kann ich dann die geänderten Seiten durch Aufruf von &lt;code&gt;http://test.meine-website.example/&lt;/code&gt; ansehen. Alternativ kann ich natürlich auch auf einem anderen Rechner im lokalen Netz testen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wenn ich mit dem Ergebnis zufrieden bin, aktualisiere ich den &lt;em&gt;test&lt;/em&gt;-Zweig meines lokalen &lt;em&gt;Git&lt;/em&gt;-Repositorys und schiebe ihn per &lt;code&gt;git push&lt;/code&gt; auf den externen &lt;em&gt;Git&lt;/em&gt;-Server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dort wird ein &lt;code&gt;post-receive&lt;/code&gt;-Hook ausgeführt, der auf dem richtigen Webserver ein PHP-Script mit den passenden Paramtern aufruft. Das Script sorgt dann dafür, dass die Dateien aus dem &lt;em&gt;Git&lt;/em&gt;-Repository ausgecheckt werden, und führt danach &lt;em&gt;nanoc&lt;/em&gt; aus. Für den &lt;code&gt;test&lt;/code&gt;-Zweig des Repositories &lt;code&gt;websites/meine-website&lt;/code&gt; auf dem Server &lt;code&gt;git.server.example&lt;/code&gt; mit dem Zielverzeichnis &lt;code&gt;/var/www/sources/meine-website/&lt;/code&gt; auf dem Webserver sähe das dann so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git archive --format=tar --remote=ssh://git@git.server.example/websites/meine-website test | tar -C /var/www/sources/test.meine-website.example/ -xf -
$ cd /var/www/sources/test.meine-website.example/
$ nanoc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; hat dann als &lt;code&gt;output_dir&lt;/code&gt; bspw. &lt;code&gt;/var/www/html/test.meine-website.example/&lt;/code&gt; konfiguriert, was zugleich das &lt;code&gt;DocumentRoot&lt;/code&gt; für den &lt;em&gt;virtual host&lt;/em&gt; &lt;code&gt;http://test.meine-website.example/&lt;/code&gt; ist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will ich später die gesammelten Änderungen aus der Testinstanz auf die Echtinstanz übernehmen, geht das ebenfalls ganz einfach: ich bringe sie in den &lt;em&gt;master&lt;/em&gt;-zweig meines Repositorys und veröffentliche diesen: &lt;code&gt;git checkout master; git merge test; git push; git checkout test&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der &lt;code&gt;post-receive&lt;/code&gt;-Hook wird das Deployment-Script mit anderen Parametern aufrufen, so dass nicht der &lt;em&gt;test&lt;/em&gt;-Zweig, sondern der &lt;em&gt;master&lt;/em&gt;-Zweig ausgecheckt und nicht nach &lt;code&gt;/var/www/sources/test.meine-website.example/&lt;/code&gt;, sondern nach &lt;code&gt;/var/www/sources/www.meine-website.example/&lt;/code&gt; kopiert wird. Und das ist dementsprechend das &lt;code&gt;DocumentRoot&lt;/code&gt; für  &lt;code&gt;http://www.meine-website.example/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Die &lt;em&gt;nanoc&lt;/em&gt;-Ausgaben gibt das Deployment-Script aus, so dass der &lt;em&gt;Git&lt;/em&gt;-Server sie an den &lt;em&gt;Git&lt;/em&gt;-Client übermittelt; sollte &lt;em&gt;nanoc&lt;/em&gt; die Compilation also mit einer Fehlermeldung abbrechen, ist das erkennbar und ermöglicht ein manuelles Eingreifen. Ansonsten sind manuelle Eingriffe nur noch erforderlich, wenn eine bereits deployte Datei gelöscht werden muss; es liegt in der Natur der Sache, dass der gewählte Weg über &lt;code&gt;git archive&lt;/code&gt; neue und geänderte Dateien (und Verzeichnisse) anlegt, alte Dateien aber nicht löscht.&lt;/p&gt;

&lt;h3 id=&quot;conclusio&quot;&gt;Conclusio&lt;/h3&gt;

&lt;p&gt;Viele Wege führen nach Rom; dies ist meiner.&lt;/p&gt;

&lt;p&gt;Er lässt sich fraglos vereinfachen; ein Hemmschuh ist insbesondere die Entwicklung unter Windows, die den Workflow erschwert.&lt;/p&gt;

&lt;p&gt;Kommentare und Kritik nehme ich gerne entgegen, ebenso wie andere Wege zum selben Ziel. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/ad21ecfbf841470584fc58c8c5a75c2f&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 17 May 2017 05:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1994-guid.html</guid>
    <category>git</category>
<category>nanoc</category>
<category>webdesign</category>

</item>
<item>
    <title>Markup mit HAML</title>
    <link>https://netz-rettung-recht.de/archives/1990-Markup-mit-HAML.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1990-Markup-mit-HAML.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1990</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1990</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Websites bestehen - hoffentlich - in der Regel aus (wenigen) Templates, die dann mit (vielen verschiedenen) Inhalten gefüllt werden. So arbeiten Blogs und CMS, so arbeitet auch ein &lt;em&gt;static site generator&lt;/em&gt;. Die Templates können dabei HTML-Dateien sein - müssen es aber nicht, wie ich schon anno 2015&amp;#160;&lt;a href=&quot;https://netz-rettung-recht.de/archives/1821-Templates-und-Template-Engines.html&quot; title=&quot;&quot;&gt;beschrieb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bei der Arbeit mit meinen Webseiten habe ich mit HTML-Templates angefangen, die ich dann in der Regel mit &lt;i&gt;Markdown&lt;/i&gt; gefüllt habe - oder, um in der Diktion von &lt;i&gt;nanoc&lt;/i&gt;, dem von mir verwendeten &lt;em&gt;static site generator&lt;/em&gt;, zu bleiben: die Layouts in &lt;code&gt;layouts/&lt;/code&gt; waren HTML-Dateien, die Inhalte in &lt;code&gt;content/&lt;/code&gt; in der Regel &lt;i&gt;Markdown&lt;/i&gt;, beides (soweit erforderlich) kombiniert mit &lt;em&gt;embedded ruby&lt;/em&gt; (&lt;em&gt;ERB&lt;/em&gt;). Beim Compilieren durchliefen die Layouts dementsprechend einen &lt;em&gt;ERB&lt;/em&gt;-Filter, die Inhalte zwei Filter (&lt;i&gt;Markdown&lt;/i&gt; und &lt;em&gt;ERB&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Direkt mit HTML macht die Arbeit aber - gerade bei ein wenig komplexeren Gestaltungen - auf die Dauer nur wenig Spaß: ständig muss man Tags öffnen und schließen (gut, dabei unterstützen Editoren), und die Übersicht leidet. Daher habe ich mich nach kurzer Zeit entschieden, statt auf HTML auf &lt;a href=&quot;http://haml.info/&quot; title=&quot;301 Moved Permanently&quot;&gt;&lt;i&gt;HAML&lt;/i&gt;&lt;/a&gt; zu setzen, eine Template-Sprache, die von HTML abstrahiert.&lt;/p&gt;

&lt;p&gt;Ein typisches Seitengerüst wie&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&#039;de&#039;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&#039;utf-8&#039;&amp;gt;
    &amp;lt;meta content=&#039;IE=edge&#039; http-equiv=&#039;X-UA-Compatible&#039;&amp;gt;
    &amp;lt;meta content=&#039;width=device-width, initial-scale=1&#039; name=&#039;viewport&#039;&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;%= @item[:title] %&amp;gt;&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;div class=&#039;header-container&#039;&amp;gt;
        &amp;lt;div class=&#039;row&#039;&amp;gt;
           [...]
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;div class=&#039;main&#039;&amp;gt;
      &amp;lt;h1&amp;gt;Überschrift&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
        diam nonumy eirmod tempor invidunt ut labore et dolore magna
        aliquyam erat, sed diam voluptua. At vero eos et accusam et
        justo duo dolores et ea rebum. Stet clita kasd gubergren, no
        sea takimata sanctus est. 
      &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;footer class=&#039;footer&#039;&amp;gt;
      [...]
    &amp;lt;/footer&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;sieht in &lt;i&gt;HAML&lt;/i&gt; so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;!!!
%html{:lang =&amp;gt; &quot;de&quot;}
  %head
    %meta{:charset =&amp;gt; &quot;utf-8&quot;}
    %meta{:content =&amp;gt; &quot;IE=edge&quot;, &quot;http-equiv&quot; =&amp;gt; &quot;X-UA-Compatible&quot;}
    %meta{:content =&amp;gt; &quot;width=device-width, initial-scale=1&quot;, :name =&amp;gt; &quot;viewport&quot;}
    %title #{@item[:title]}
  %body
    %header
      .header-container
        .row
          [...]
    .main
      %h1 Überschrift
      %p
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
        diam nonumy eirmod tempor invidunt ut labore et dolore magna
        aliquyam erat, sed diam voluptua. At vero eos et accusam et
        justo duo dolores et ea rebum. Stet clita kasd gubergren, no
        sea takimata sanctus est. 
    %footer
      [...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das ist kürzer, klarer strukturiert - und die logische Struktur wird unmittelbar erkennbar. Außerdem wird das Ende eines Elements nicht durch ein schließendes Tag, sondern das Zeilenende (beziehungsweise das Ende einer Einrückungsebene) gekennzeichnet. &lt;i&gt;HAML&lt;/i&gt; schließt Tags im generierten HTML daher selbständig. Nie mehr vergessene Tags, die sich öffnen, aber nicht wieder schließen! Fehler kann man im Prinzip nur noch beim Einrücken machen - aber fehlerhafte Einrückungen führen zu einem Fehler beim Compilieren und werden daher sofort erkannt. Zudem erhält das aus dem Template generierte HTML wunderbare Einrückungen, die es ebenfalls gut lesbar machen.&lt;/p&gt;

&lt;p&gt;Für Templates ist &lt;i&gt;HAML&lt;/i&gt; demnach hervorragend geeignet - für Inhalte allerdings &lt;a href=&quot;http://chriseppstein.github.io/blog/2010/02/08/haml-sucks-for-content/&quot; title=&quot;Haml Sucks for Content&quot;&gt;nicht so sehr&lt;/a&gt;. Die große Stärke - die klaren Einrückungen - wird bei Texten, die immer wieder innerhalb von Blöcken Textauszeichnungen enthalten, zu einer großen Schwäche.&lt;/p&gt;

&lt;p&gt;Man denke an folgendes Beispiel:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;
  Lorem ipsum dolor sit amet, consetetur &amp;lt;strong&amp;gt;sadipscing&amp;lt;/strong&amp;gt;
  elitr, sed diam nonumy eirmod tempor invidunt ut labore et
  &amp;lt;em&amp;gt;dolore magna&amp;lt;/em&amp;gt; aliquyam erat, sed diam voluptua. At
  &amp;lt;a href=&quot;https://netz-rettung-recht.de/vero/&quot;&amp;gt;&amp;lt;strong&amp;gt;vero&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt; eos et accusam et justo duo
  dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus
  est. 
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das sieht in &lt;i&gt;HAML&lt;/i&gt; dann so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%p
  Lorem ipsum dolor sit amet, consetetur
  %strong sadipscing
  elitr, sed diam nonumy eirmod tempor invidunt ut labore et
  %em dolore magna
  aliquyam erat, sed diam voluptua. At
  %a{:href =&amp;gt; &quot;/vero/&quot;}
    %strong vero
  eos et accusam et justo duo
  dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
  sanctus est.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das ist &amp;#8230; weniger schön, und beim Schreiben nicht mehr angenehm, sondern schnell die Hölle.&lt;/p&gt;

&lt;p&gt;Es fragt sich also, was man am besten tut, wenn &lt;i&gt;Markdown&lt;/i&gt; allein für Inhalte nicht genügt, weil es bspw. keine Elemente wie &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; oder &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; kennt und auch Tabellen nicht ohne weiteres abgebildet werden können. Man könnte natürlich wieder auf HTML zurückgreifen, das sich bekanntlich mit &lt;i&gt;Markdown&lt;/i&gt; mischen lässt.&lt;/p&gt;

&lt;p&gt;Oder man nutzt ein weiteres Feature von &lt;i&gt;HAML&lt;/i&gt;: es unterstützt nämlich Filter, d.h. die Verwendung anderer Markupsprachen innerhalb eines Templates. So kann man die Verwendung von &lt;i&gt;HAML&lt;/i&gt; auf die Templates und Strukturen beschränken und die Inhalte - bspw. - in &lt;i&gt;Markdown&lt;/i&gt; beisteuern:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  %body
    %header
      .header-container
        .row
          [...]
    .main
      %h1 Überschrift
      :markdown
        Lorem ipsum dolor sit amet, consetetur **sadipscing** elitr,
        sed diam nonumy eirmod tempor invidunt ut labore et *dolore
        magna* aliquyam erat, sed diam voluptua. At [**vero**](/vero/)
        eos et accusam et justo duo dolores et ea rebum. Stet clita
        kasd gubergren, no sea takimata sanctus est.
    %footer
      [...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Best of both worlds!&lt;/p&gt;

&lt;p&gt;Außerdem unterstützt &lt;i&gt;HAML&lt;/i&gt; &lt;em&gt;embedded ruby&lt;/em&gt; - statt HTML-Templates und &lt;i&gt;Markdown&lt;/i&gt;-Inhalten bleiben also nur noch &lt;code&gt;.haml&lt;/code&gt;-Dateien, die einen &lt;i&gt;HAML&lt;/i&gt;-Filter durchlaufen. Fertig - &lt;i&gt;Markdown&lt;/i&gt; und &lt;em&gt;ERB&lt;/em&gt; gibt es quasi gratis dazu. (Und &lt;i&gt;Textile&lt;/i&gt;, LESS, SASS und vieles andere, wenn man das möchte, auch.)&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/151573aa979b477cb6673642efd6dcaf&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 08 May 2017 07:15:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1990-guid.html</guid>
    <category>haml</category>
<category>markdown</category>
<category>webdesign</category>

</item>
<item>
    <title>Bootstrap mit nanoc</title>
    <link>https://netz-rettung-recht.de/archives/1991-Bootstrap-mit-nanoc.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1991-Bootstrap-mit-nanoc.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1991</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1991</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Unter anderem für den Relaunch meiner Homepage habe ich mich damit beschäftigt, wie ich das CSS-Framework &lt;a href=&quot;https://getbootstrap.com/&quot; title=&quot;&quot;&gt;&lt;i&gt;Bootstrap&lt;/i&gt;&lt;/a&gt; am besten mit &lt;a href=&quot;https://nanoc.ws/&quot; title=&quot;&quot;&gt;&lt;i&gt;nanoc&lt;/i&gt;&lt;/a&gt;, meinem bevorzugten &lt;em&gt;static site generator&lt;/em&gt;, zur Anwendung bringen kann.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Bootstrap&lt;/i&gt; bringt einen ganzen Haufen CSS, etwas Javascript und &lt;i&gt;Glyphicon Halflings&lt;/i&gt; als Webfont mit. Webfont und Javascript können unverändert bleiben, das CSS hingegen sollte aus den LESS-Dateien kompiliert werden, um so mit wenigen Anpassungen in &lt;code&gt;variables.less&lt;/code&gt; das Aussehen der Website zu personalisieren.&lt;/p&gt;

&lt;p&gt;Meine &lt;i&gt;nanoc&lt;/i&gt;-Quelldateien habe ich dementsprechend folgendermaßen strukturiert:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;content/
 :
 :--bootstrap/
 :   :
 :   :--js/
 :   :
 :   :--fonts/
 :   :
 :   :--less/
 :    
 :--res/
     :
     :--css/
     :
     :--fonts/
     :
     :--js/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In &lt;code&gt;content/bootstrap/js/&lt;/code&gt; landet das Javascript aus &lt;i&gt;Bootstraps&lt;/i&gt; &lt;code&gt;dist/js/&lt;/code&gt;, in &lt;code&gt;content/bootstrap/fonts/&lt;/code&gt; die Schriften aus &lt;code&gt;dist/fonts/&lt;/code&gt;, und die Dateien aus &lt;code&gt;less/&lt;/code&gt; kommen nach &lt;code&gt;content/bootstrap/less/&lt;/code&gt;. Dabei müssen jedenfalls in meiner alten Version 3 von &lt;i&gt;nanoc&lt;/i&gt; noch einige Dateien umbenannt werden, weil sich nur in der Endung unterscheiende Dateien unzulässig sind: aus &lt;code&gt;bootstrap.min.js&lt;/code&gt; wird so &lt;code&gt;bootstrap-min.js&lt;/code&gt;, bei den Schriftdateien wird die Endung auch in den Dateinamen übernomme, so dass aus &lt;code&gt;glyphicons-halflings-regular.ttf&lt;/code&gt; dann &lt;code&gt;glyphicons-halflings-regular-ttf.ttf&lt;/code&gt; wird.&lt;/p&gt;

&lt;p&gt;Der Inhalt von &lt;code&gt;content/bootstrap/js/&lt;/code&gt; landet dann beim Kompilieren in &lt;code&gt;content/res/js/&lt;/code&gt;, derjenige von &lt;code&gt;content/bootstrap/fonts/&lt;/code&gt; unter Entfernung der &amp;#8220;doppelten&amp;#8221; Endungen in &lt;code&gt;content/res/fonts/&lt;/code&gt;, und aus &lt;code&gt;content/bootstrap/less/bootstrap.less&lt;/code&gt; wird (unter Einbindung aller anderen LESS-Dateien) &lt;code&gt;content/res/css/bootstrap.css&lt;/code&gt; kompiliert.&lt;/p&gt;

&lt;p&gt;Fertig.&lt;/p&gt;

&lt;p&gt;In den &lt;code&gt;Rules&lt;/code&gt; sieht das dann ungefähr so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env ruby

#########################
### compilation rules ###
#########################

# compile Bootstrap CSS (only) from bootstrap.less
compile &#039;/bootstrap/less/bootstrap&#039; do
  filter :less
end
compile &#039;/bootstrap/*&#039; do
  nil
end

# main rule
compile &#039;*&#039; do
  [...]
end

#####################
### routing rules ###
#####################

# copy font files and move last -XXX to extension
route &#039;/res/fonts/*/&#039; do
  # /bootstrap/fonts/foo-eot/ -&amp;gt; /res/fonts/foo.eot
  item.identifier.sub(&#039;/bootstrap/less/&#039;,&#039;/res/css/&#039;).sub(/-[^-]+\/$/, &#039;&#039;) + &#039;.&#039; + item[:extension]
end

# copy bootstrap files
route &#039;/bootstrap/less/bootstrap&#039; do
  item.identifier.sub(&#039;/bootstrap/less/&#039;,&#039;/res/css/&#039;).chop + &#039;.css&#039;
end
route &#039;/bootstrap/less/*&#039; do
  nil
end
route &#039;/bootstrap/*/&#039; do
  item.identifier.sub(&#039;/bootstrap/&#039;,&#039;/res/&#039;).chop + &#039;.&#039; + item[:extension]
end

# main rule
route &#039;*&#039; do
  [...]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es geht sicherlich einfacher und weniger komplex, aber so geht es jedenfalls auch. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wenn man in seinem &lt;i&gt;Git&lt;/I&gt;-Repository auch direkt einen &lt;code&gt;bootstrap&lt;/code&gt;-Branch anlegt, kann man &lt;i&gt;Bootstrap&lt;/i&gt;-Updates dort einspielen und in der Regel durch ein einfaches &lt;code&gt;git checkout master; git merge bootstrap&lt;/code&gt; für die eigenen Seiten übernehmen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/8916b18ed9d6465cbe3b6addf4f87938&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 05 May 2017 15:15:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1991-guid.html</guid>
    <category>bootstrap</category>
<category>nanoc</category>
<category>webdesign</category>

</item>

</channel>
</rss>
