642 lines
150 KiB
JSON
Raw Normal View History

{
"version": "https://jsonfeed.org/version/1.1",
"title": "fboës - Der Blog | Startseite",
"home_page_url": "https://journal.3960.org/",
"feed_url": "https://journal.3960.org/feed.json",
"description": "Programmierung, Luft- & Raumfahrt, Kurioses: Der Blog von und mit Frank Boës.",
"icon": "https://cdn.3960.org/favicon-192x192.png",
"favicon": "https://cdn.3960.org/images/tile-128x128.png",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org"
}
],
"language": "de-DE",
"_rss": {
"about": "http://cyber.harvard.edu/rss/rss.html",
"copyright": "© 2008-2020 Creative Commons BY"
},
"items": [
{
"id": "user/posts/2020-02-21-lecker-lecker/index.md",
"url": "https://journal.3960.org/posts/2020-02-21-lecker-lecker/",
"title": "Lecker, lecker",
"content_html": "<blockquote><p>Da ist es zwar nicht ganz billig,<br />dafür schmeckt&#39;s aber auch nicht.</p></blockquote><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Lecker%2C%20lecker&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-02-21-lecker-lecker%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Da ist es zwar nicht ganz billig, dafür schmeckt's aber auch nicht.",
"date_published": "2020-02-21T18:08:06+01:00",
"date_modified": "2020-02-21T18:08:06+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Lustiges"
]
},
{
"id": "user/posts/2020-02-10-sabine-flughafen-amsterdam/index.md",
"url": "https://journal.3960.org/posts/2020-02-10-sabine-flughafen-amsterdam/",
"title": "„Sabine“ am Flughafen Amsterdam",
"content_html": "<p><a href=\"https://en.wikipedia.org/wiki/METAR\" rel=\"nomention\">METAR</a>-Informationen sind nicht nur für die Fliegerei praktische und kompakte Möglichkeiten, Wetterbedingungen zusammenzufassen. Hier braust zum Beispiel am 09. Januar 2020 das Sturmtief „Sabine“ mit Windgeschwindigkeiten bis zu 51 Knoten über den Flughafen Amsterdam-Schiphol:</p>\n<pre><code class=\"language-metar\"><i title=\"Location\">EHAM</i> <span title=\"Day of month\">09</span><b title=\"Time\">1725Z</b> <span title=\"Wind direction\">200</span><b title=\"Wind speed\">37G51KT</b> 170V230 9999 <var title=\"Cloud\">FEW011</var> <var title=\"Cloud\">BKN014</var> <var title=\"Cloud\">BKN025</var> <b title=\"Temperature\">11</b>/<span title=\"Dewpoint\">11</span> <span title=\"Pressure\">Q0986</span> RE/RA TEMPO 7000</code></pre>\n<p>Solch einen METAR-Code kann z.B. mit dem <a href=\"https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/\">Aerofly FS2 Wettergerät</a> verwendet werden.</p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=%E2%80%9ESabine%E2%80%9C%20am%20Flughafen%20Amsterdam&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-02-10-sabine-flughafen-amsterdam%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "METAR-Informationen sind nicht nur für die Fliegerei praktische und kompakte Möglichkeiten, Wetterbedingungen zusammenzufassen. Hier braust zum Beispiel am 09…",
"date_published": "2020-02-10T18:40:04+01:00",
"date_modified": "2020-02-11T08:51:21+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Fliegerei",
"Simulation"
]
},
{
"id": "user/posts/2020-01-19-migrants/index.md",
"url": "https://journal.3960.org/posts/2020-01-19-migrants/",
"title": "Migrants",
"content_html": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=G2dGWH90aew\" src=\"https://www.youtube-nocookie.com/embed/G2dGWH90aew?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/G2dGWH90aew?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/G2dGWH90aew/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/G2dGWH90aew/hqdefault.jpg\" --></div><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Migrants&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-01-19-migrants%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "",
"date_published": "2020-01-19T18:09:37+01:00",
"date_modified": "2020-01-19T18:09:37+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://img.youtube.com/vi/G2dGWH90aew/hqdefault.jpg",
"language": "de-DE",
"image": "https://img.youtube.com/vi/G2dGWH90aew/hqdefault.jpg",
"tags": [
"Geckobar",
"Raumfahrt",
"The Cool"
]
},
{
"id": "user/posts/2019-12-30-ssh-schluessel-unter-windows-komplett/index.md",
"url": "https://journal.3960.org/posts/2019-12-30-ssh-schluessel-unter-windows-komplett/",
"title": "SSH-Schlüssel unter Windows das komplette Programm",
"content_html": "<p><img src=\"https://journal.3960.org/posts/2019-12-30-ssh-schluessel-unter-windows-komplett/puttygen-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 240/240;\" alt=\"\" /> SSH-Schlüssel sind die Eintrittskarte für SSH, Git, und viele andere darauf aufbauende, nützliche Dienste, die ein Programmierer nutzen möchte. Während unter Linux und Mac OSX das Erzeugen eines SSH-Schlüssels eine schmerzlose Sache ist, sind unter Windows mehr Handgriffe gefragt, um <em>alle</em> Anwendungsfälle eines SSH-Schlüssels abbilden zu können unter anderem für die Verwendung des selben Schlüssels aus einer Virtualisierung wie zum Beispiel VirtualBox oder Docker.</p>\n<!-- more -->\n<p id=\"more\">Generell gibt es zwei Arten, unter Windows einen SSH-Schlüssel zu speichern:</p>\n<ul>\n<li>Das <i>PuTTY Private Key</i>-Format (<code>ppk</code>)</li>\n<li>Das unter UNIX bekannte OpenSSH-Format mit zwei Dateien für den privaten und öffentlichen Teil des Schlüssels</li>\n</ul>\n<p>Viele Anleitungen beschränken sich auf <a href=\"https://www.ssh.com/ssh/putty/windows/puttygen\" rel=\"nomention\">die eine</a> oder <a href=\"https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent\" rel=\"nomention\">andere Methode zum Anlegen von SSH-Schlüsseln</a>. Tatsächlich macht es aber unter Windows sehr viel Sinn, den eigenen Schlüssel in <em>beiden</em> Formate verfügbar zu haben. Das geht deutlich schmerzloser, wenn beide Schlüsselformate in einem Aufwasch angelegt werden.</p>\n<ol>\n<li>Zuallererst werden die <a href=\"https://putty.org/\" rel=\"nomention\">PuTTY Utilities</a> installiert diese beinhalten neben PuTTY auch den <code>puttygen</code> Schlüsselgenerator, <code>pageant</code> Schlüsselagenten und das <code>plink</code> SSH-Verbindungstool.</li>\n<li>Ebenfalls wird <a href=\"https://git-scm.com/\" rel=\"nomention\">Git für Windows</a> benötigt hier ist wiederum Git Bash enthalten, einen Linux-Bash-Emulator.</li>\n<li>Im nächsten Schritt muss Git Bash geöffnet werden und im eigenen Benutzerverzeichnis das SSH-Schlüsselverzeichnis mittels <code>mkdir -p ~/.ssh</code> angelegt werden.</li>\n<li>Jetzt wird PuTTYGen gestartet, um in dem just angelegten Verzeichnis (unter <code>C:\\Users\\USERNAME\\.ssh</code>) die insgesamt drei Dateien anzulegen, die zusammen alle Schlüssel-Komponenten darstellen.</li>\n</ol>\n<h2 id=\"puttygen\">PuTTYGen</h2>\n<p>In PuttyGen selber wird es nun etwas trickreich:</p>\n<ol>\n<li>Als „Key comment“ gibt wird die eigene E-Mail-Adresse verwendet. Das hilft später bei der Identifikation des Schlüssels.</li>\n<li>Außerdem sollte eine Passphrase vergeben werden, die den Schlüssel schützt, falls die Schlüsseldateien abhanden kommen sollten.</li>\n<li>Nicht zuletzt sollte bei der Bitlänge des Schlüssel entweder 2048 oder aber gleich 4096 verwendet werden.</li>\n<li>Nun drückt ihr den Knopf „Generate“ und wischt mit der Maus über dem PuTTYGen-Fenster hin und her, um ein Zufallsmuster zu erzeugen. Im Anschluss hat das Programm einen Schlüssel generiert, den ihr wie folgt speichern müsst:</li>\n<li>Die PPK-Datei mittels „File → Save private key“ in <code>C:\\Users\\USERNAME\\.ssh\\id_rsa.ppk</code> speichern.</li>\n<li>Aus der oberen Textbox von PuTTYGen den „OpenSSH Public Key“ kopieren und in eine neue Datei in <code>C:\\Users\\USERNAME\\.ssh\\id_rsa.pub</code> einfügen (mit der Funktion „Save public key“ wird der Public Key nicht im korrekten Format exportiert).</li>\n<li>Mit „Conversions → Export OpenSSH key“ den Private Key unter <code>C:\\Users\\USERNAME\\.ssh\\id_rsa</code> speichern. Wichtig ist hierbei, dass keine Dateiendung verwendet wird.</li>\n</ol>\n<p>In eurem SSH-Verzeichnis <code>C:\\Users\\USERNAME\\.ssh</code> sollten nun mindestens drei Dateien liegen:</p>\n<pre><code class=\"language-bash\">id_rsa.ppk <u># Privater / öffentlicher Schlüssel für PuTTY</u>\nid_rsa.pub <u># Öffentlicher Schlüssel für OpenSSH</u>\
"summary": "SSH-Schlüssel sind die Eintrittskarte für SSH, Git, und viele andere darauf aufbauende, nützliche Dienste, die ein Programmierer nutzen möchte. Während unter…",
"date_published": "2019-12-30T18:52:10+01:00",
"date_modified": "2020-01-11T10:00:49+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://journal.3960.org/posts/2019-12-30-ssh-schluessel-unter-windows-komplett/puttygen.png",
"language": "de-DE",
"image": "https://journal.3960.org/posts/2019-12-30-ssh-schluessel-unter-windows-komplett/puttygen.png",
"tags": [
"Für Tumblr",
"Programmierung",
"Webdevelop",
"Git",
"Bash",
"Anleitung"
]
},
{
"id": "user/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/index.md",
"url": "https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/",
"title": "Firefox Weniger Werbung, mehr Speed unter Android",
"content_html": "<p><img src=\"https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 240/240;\" alt=\"\" /> Werbung nervt. Tracking nervt. Nerven nervt. Und gerade mobil habe ich eigentlich keine Zeit, meine geringe Download-Rate mit dem Herunterladen von hässlichen Werbemitteln zu verbringen. Aber welche Optionen hat man schon auf einem Smartphone?</p>\n<!-- more -->\n<p id=\"more\">Schon vor einiger Zeit war ich auf <a href=\"https://journal.3960.org/posts/2017-10-31-mobiles-surfen-ohne-werbung/\">Firefox für Android</a> gestoßen. Da ich schon immer ein Herz für Mozilla hatte und Firefox einer der wenigen Browser unter Android war, in dem ein AdBlocker funktionierte, war ich von Chrome für Android auf Firefox für Android umgestiegen.</p>\n<blockquote><p>Oh, ein Nerd-Telefon! Android, Firefox und DuckDuckGo.</p></blockquote>\n<p>Ein <a href=\"https://www.duden.de/rechtschreibung/Wermutstropfen\">Wermutstropfen</a> hatte Firefox für Android aber: Im Vergleich zu Android-Chrome war er nicht wirklich schnell. Das fiel augenscheinlich auch Mozilla auf, so dass sich in der stetig vergrößernden Palette an <a href=\"https://play.google.com/store/apps/dev?id=7083182635971239206\">Mozillas Android-Apps</a> eine neue Version von Firefox für Android findet: <a href=\"https://play.google.com/store/apps/details?id=org.mozilla.fenix\">Mozilla Firefox Preview</a>.</p>\n<p>Von seinem Vorgänger unterscheidet <i>Firefox Preview</i> neben einer etwas kompakteren Oberfläche vor allen Dingen seine rasante Geschwindigkeit. Und das man (aktuell) keine Plugins installieren kann ist sofort vergessen, denn der eingebaute AdBlocker (Enhanced Tracking Protection bzw. <i>ETP</i> genannt) funktioniert einfach fantastisch (so das meine Bastelei für <a href=\"https://journal.3960.org/posts/2015-07-02-fritz-box-als-adblocker/\">den FritzBox-AdBlocker</a> für <em>diesen</em> Browser überflüssig wird).</p>\n<p><span class=\"figure quad\"><img src=\"https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox-blocked-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 240/240;\" alt=\"Neulich auf einer ganz normalen Nachrichtenseite.\" /><span class=\"figcaption\" aria-hidden=\"true\">Neulich auf einer ganz normalen Nachrichtenseite.<br /></span></span> Nebenbei kann der Firefox Preview auch den Webview auf Android ersetzen. Damit sind <em>alle</em> Apps auf dem Telefon, die Webview verwenden, nicht nur mit der Rendering-Engine sondern auch mit dem AdBlocker von Firefox Preview ausgestattet.</p>\n<p>Nicht zuletzt ist in Firefox Preview der Dienst „Firefox Sync“ eingebaut. Sobald man sich einen kostenlosen <a href=\"https://www.mozilla.org/de/firefox/accounts/\">Firefox Account</a> zugelegt hat, können alle anderen mit diesem Account registrierten Firefox-Browser Historie und Lesezeichen teilen. Damit ist das Erlebnis wie bei Google Chrome mit aktivierten Google Account.</p>\n<p>Übrigens: Mozillas Bemühen um neue Privatsphären-Services hat <a href=\"https://monitor.firefox.com/\">Firefox Monitor</a> hervorgebracht. Mit einem Firefox-Account kann man sich so informieren lassen, ob die eigene E-Mail-Adresse von einem Datenleck betroffen ist. Ein sinnvoller Service, der mich zum Beispiel darauf gebracht hat, dass einige von mir benutzte Dienste meine E-Mail-Adresse nebst Passwort-Hash verloren hatten und merkwürdigerweise ein <em>nicht</em> von mir benutzter Dienst, womit sich hier möglicherweise der Kreis zum Trackingschutz von Mozilla Firefox schließt. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Firefox%20%E2%80%93%20Weniger%20Werbung%2C%20mehr%20Speed%20unter%20Android&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />"
"summary": "Werbung nervt. Tracking nervt. Nerven nervt. Und gerade mobil habe ich eigentlich keine Zeit, meine geringe Download-Rate mit dem Herunterladen von hässlichen…",
"date_published": "2019-12-22T18:33:43+01:00",
"date_modified": "2020-01-07T10:31:04+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox.png",
"language": "de-DE",
"image": "https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox.png",
"tags": [
"Für Tumblr",
"Geckobar",
"Review",
"Technologie",
"Webdevelop",
"Adblocker"
]
},
{
"id": "user/posts/2019-10-27-event-handling-mit-javascript-ohne-jquery/index.md",
"url": "https://journal.3960.org/posts/2019-10-27-event-handling-mit-javascript-ohne-jquery/",
"title": "Event-Handling mit JavaScript und ohne jQuery",
"content_html": "<p><img src=\"https://journal.3960.org/posts/2019-10-27-event-handling-mit-javascript-ohne-jquery/event-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 240/240;\" alt=\"\" /> Als Web-Entwickler fügen wir im Laufe eines Projektes einer Website eine zumeist nicht unerhebliche Anzahl an JavaScript-Event-Handlern hinzu sei es mit jQuery oder regulärem JavaScript (<a href=\"http://youmightnotneedjquery.com/\">You Might Not Need jQuery</a>). Abhängig von der gewählten Methode lässt sich damit… die Performance einer Website gründlich ruinieren.</p>\n<p>Aber das muss nicht sein wie dieser Überblick über die Montage von Event-Handlern in JavaScript / jQuery zeigt.</p>\n<!-- more -->\n<p id=\"more\">Ganz grundsätzlich muss jeder Prozessschritt beim Hinzufügen eines Event-Handlers richtig angewendet werden. Der ganze Vorgang besteht aus drei Schritten:</p>\n<ol>\n<li>Die DOM-Elemente <strong>selektieren</strong>,</li>\n<li>auf dem selektierten DOM-Elementen einen <strong>Event-Typ</strong> beobachten,</li>\n<li>und schließlich bei Auslösen des Events einen <strong>Event-Listener</strong> ausführen.</li>\n</ol>\n<p>In jedem dieser Schritte lässt sich zum Teil massiv optimieren.</p>\n<h2 id=\"kenne-deine-selektoren\">Kenne deine Selektoren</h2>\n<p>Um einen Event-Handler montieren zu können, muss dieser an ein Element angekoppelt werden in der Regel ist dies ein DOM-Element. Dazu gibt es verschiedene Methoden, DOM-Elemente zu selektieren. Je nach gewählter Methode ist dies mehr oder weniger performant.</p>\n<blockquote><p>Faustformel: Je eindeutiger das Suchmerkmal und je kleiner die Menge der zu durchsuchenden Elemente, desto schneller ist die Suche.</p></blockquote>\n<p>Die <a href=\"https://jsperf.com/getelementbyid-vs-queryselector/304\">schnellste Methode ist dabei die Selektion über ein <code>id</code>-Attribut</a> die langsamste dagegen die Suche nach einem beliebigen Attribut, im schlimmsten Fall mit der Prüfung, ob dieses Attribut einen bestimmten Wert beinhaltet.</p>\n<div class=\"table-wrapper\"><table>\n<caption id=\"dom-selektions-methoden-sortiert-nach-performance\">DOM-Selektions-Methoden, sortiert nach Performance</caption>\n<thead>\n<tr>\n<th>Methode</th>\n<th>jQuery</th>\n<th>JavaScript</th>\n<th>Neues JavaScript</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>ID</td>\n<td><code>$(&#39;#x&#39;)</code></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById\"><code>document.getElementById(&#39;x&#39;)</code></a></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\"><code>document.querySelector(&#39;#x&#39;)</code></a></td>\n</tr>\n<tr>\n<td>Klasse</td>\n<td><code>$(&#39;.x&#39;)</code></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\"><code>document.getElementsByClassName(&#39;x&#39;)</code></a></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll\"><code>document.querySelectorAll(&#39;.x&#39;)</code></a></td>\n</tr>\n<tr>\n<td>Tag</td>\n<td><code>$(&#39;x&#39;)</code></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagName\"><code>document.getElementsByTagName(&#39;x&#39;)</code></a></td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll\"><code>document.querySelectorAll(&#39;x&#39;)</code></a></td>\n</tr>\n<tr>\n<td>Attribut</td>\n<td><code>$(&#39;[x]&#39;)</code></td>\n<td>n/a</td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll\"><code>document.querySelectorAll(&#39;[x]&#39;)</code></a></td>\n</tr>\n<tr>\n<td>CSS (s.u.)</td>\n<td><code>$(&#39;x y&#39;)</code></td>\n<td>n/a</td>\n<td><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll\"><code>document.querySelectorAll(&#39;x y&#39;)</code></a></td>\n</tr>\n</tbody></table></div>\n<p>Sowohl die jQuery-Methode <code>$()</code> als auch die JavaScript-Meth
"summary": "Als Web-Entwickler fügen wir im Laufe eines Projektes einer Website eine zumeist nicht unerhebliche Anzahl an JavaScript-Event-Handlern hinzu sei es mit…",
"date_published": "2019-10-27T17:01:02+01:00",
"date_modified": "2020-02-09T17:01:08+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://journal.3960.org/posts/2019-10-27-event-handling-mit-javascript-ohne-jquery/event.png",
"language": "de-DE",
"image": "https://journal.3960.org/posts/2019-10-27-event-handling-mit-javascript-ohne-jquery/event.png",
"tags": [
"Javascript",
"Programmierung",
"Webdevelop"
]
},
{
"id": "user/posts/2019-10-18-kalorien-sind-auch-option-stipp-isch/index.md",
"url": "https://journal.3960.org/posts/2019-10-18-kalorien-sind-auch-option-stipp-isch/",
"title": "Kalorien sind auch eine Option: Stipp(isch)",
"content_html": "<p itemprop=\"description\">Es gibt Gerichte, die trotz allem schlechten Gewissen oder entgegen ärztlichen Ratschlägen immer wieder gerne auf den Tisch kommen. Eines davon ist Stipp(isch) ein Gericht, das in jüngster Zeit wieder neue Fans gefunden hat. Höchste Zeit also, das Rezept zu verraten.</p>\n<!-- more -->\n<p id=\"more\">Stipp(isch) ist eigentlich nur eine äußerst leckere Sauce, die aus Alibi-Gründen über ein paar Kartoffeln gekippt wird. Die Einkaufsliste für diese Operation ist relativ handlich. Ihr benötigt, um 23 Personen glücklich zu machen:</p>\n<ul>\n<li itemprop=\"recipeIngredient\">300g gewürfelter <strong>Schinkenspeck</strong>,</li>\n<li itemprop=\"recipeIngredient\">3 große <strong>Zwiebeln</strong>,</li>\n<li itemprop=\"recipeIngredient\">400ml <strong>Sahne</strong> (ihr habt einen Eindruck, wohin die Reise geht)</li>\n<li itemprop=\"recipeIngredient\">etwas <strong>Milch</strong> nach Gefühl</li>\n<li itemprop=\"recipeIngredient\">sowie <strong>Pfeffer, Salz</strong></li>\n<li itemprop=\"recipeIngredient\">und bei Bedarf <strong>Fondor</strong>.</li>\n<li itemprop=\"recipeIngredient\">Dazu passen gut <strong>Pellkartoffeln</strong>.</li>\n</ul>\n<p>Kurz zusammengefasst besteht die Sauce also aus Speck, Zwiebeln und Sahne.</p>\n<p>Die Zubereitung ist fast genau so einfach:</p>\n<ol itemprop=\"recipeInstructions\" itemscope itemtype=\"http://schema.org/ItemList\">\n<li itemprop=\"itemListElement\">In einer großen Pfanne die Schinkenwürfel anbraten.</li>\n<li itemprop=\"itemListElement\">Die gewürfelten Zwiebeln hinzugeben und anbraten, bis sie glasig werden.</li>\n<li itemprop=\"itemListElement\">In der Zwischenzeit kann man bereits die Kartoffeln in einem separaten Topf auf den Herd stellen.</li>\n<li itemprop=\"itemListElement\">Darüber Sahne und ggf. Milch geben die Konsistenz der Sauce sollte dabei leicht zähflüssig bleiben.</li>\n<li itemprop=\"itemListElement\">Anständig würzen, gut verrühren kurz vor dem Aufkochen ist die Sauce dann fertig.</li>\n</ol>\n<p>Die Sauce kann durch harte körperliche (oder seelische Arbeit) verlorene Kalorie relativ flott wiederherstellen. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span> <meta itemprop=\"prepTime\" content=\"PT10M\" /><meta itemprop=\"cookTime\" content=\"PT20M\"></p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Kalorien%20sind%20auch%20eine%20Option%3A%20Stipp(isch)&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-10-18-kalorien-sind-auch-option-stipp-isch%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Es gibt Gerichte, die trotz allem schlechten Gewissen oder entgegen ärztlichen Ratschlägen immer wieder gerne auf den Tisch kommen. Eines davon ist Stipp(isch…",
"date_published": "2019-10-18T18:55:49+02:00",
"date_modified": "2019-12-04T12:40:29+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Rezept"
]
},
{
"id": "user/posts/2019-10-14-kalaschnikow-programmierung/index.md",
"url": "https://journal.3960.org/posts/2019-10-14-kalaschnikow-programmierung/",
"title": "Kalaschnikow-Programmierung",
"content_html": "<blockquote><p>Dies ist meine Philosophie über Programmierung. Es gibt viele davon, aber diese hier ist meine. </p></blockquote>\n<!-- more -->\n<p id=\"more\">Jeder Programmierer entscheidet mit jeder Zeile, die er oder sie schreibt, wie er oder sie ein Problem lösen möchte. Verwirrenderweise gibt es dabei oft keinen „richtigen“ oder „falschen“ Weg (ausgenommen natürlich von handwerklichen Fehler, die absolut betrachtet falsch sind). Viel mehr entwickelt jeder Programmierer eine Meinung, warum bestimmte Wege besser sind als andere. Diese Meinung wiederum basiert auf Attributen, die einem wichtig erscheinen.</p>\n<h2 id=\"kalaschnikow\">Kalaschnikow?</h2>\n<p>Die Sturmgewehr-Familie, die mit der <a href=\"https://de.wikipedia.org/wiki/Kalaschnikow\">Kalaschnikow AK-47</a> begründet wurde, erfreut sich auch nach über siebzig Jahren Produktion immer noch einer überragenden Verbreitung. Im Gegensatz zu deutlich moderneren, fortschrittlicheren Konkurrenzmodellen überrascht die Langlebigkeit dieses Produktlinie und die Anzahl der Kopien und Derivate, die seitdem entwickelt wurden.</p>\n<p>Der AK-47 werden viele Dinge nachgesagt: Sie sei günstig, einfach zu produzieren, robust, geht tolerant mit Fehlbehandlung um und kann trotzdem gute Ergebnisse erzielen. Sie kann auch von wenig versierten Personen benutzt und repariert werden. Wie viele Konstruktionen aus sowjet-russischer Produktion ist die AK-47 unverwüstlich.</p>\n<p>Unabhängig davon, wofür eine Waffe also solche und diese im Speziellen steht, kann man von diesem Gewehr eine Menge für die Programmierung lernen.</p>\n<h2 id=\"kalaschnikow-programmierung-1\">Kalaschnikow-Programmierung</h2>\n<p>Für gute Programmierung existieren Unmengen an ausformulierten <i>best practices</i>, Coding-Standards oder Anleitungen. Diese im Detail zu kennen ist aber gar nicht so notwendig, wenn hinter jeder Entscheidung bei der Programmierung eine konsistente Philosophie steckt wie zum Beispiel die <strong>Kalaschnikow-Programmierung</strong>.</p>\n<p>Im Detail sind diese Ideen einfach zu erklären, wenn wir uns als Programmierer folgende Dinge vor Augen führen:</p>\n<ul>\n<li>Unser Code wird auf Situationen treffen, die wir nicht vorhergesehen haben. Falsche Werte, zu viele Werte, zu wenig Werte, abbrechende Verbindungen, Fehlbenutzung als dies sind Dinge, die <em>wir</em> abfangen müssen. Als Programmierer können wir uns nicht auf schlechte Umstände berufen, sondern müssen wie ein Anschnallgurt in einem Auto oder die Displayfolie auf einem Smartphone davon ausgehen, das früher oder später etwas Schlimmes passieren kann.</li>\n<li>Unsere Programmierung kann nicht alle Fehlerfälle vorhersehen und abfangen. Deswegen muss sie auch nachträglich verbessert werden können durch uns, oder einen anderen Programmierer.</li>\n<li>Wir arbeiten fast immer in Teams. Unser Code wird von Programmierern gewartet oder verändert werden müssen, die nicht das selbe Wissen wie wir haben oder nicht die selben Tools. Ironischerweise können wir selber dieser Programmierer sein: Schmökert doch mal in Programmierung, die ihr vor zwei Jahren produziert habt, und versucht die für die Entwicklung notwendigen Tools aufzusetzen.</li>\n</ul>\n<p>Deshalb muss für mich persönlich Programmierung die folgende Attribute besitzen die den Attributen der Kalaschnikow-Gewehr-Familie ähneln:</p>\n<ol>\n<li>Sie muss eine <strong>Aufgabe präzise und möglichst wenig komplex</strong> lösen. Nicht weniger aber auch nicht mehr.</li>\n<li>Sie muss <strong>tolerant mit Fehlern umgehen</strong> und sinnigerweise im Falle eines Fehlers dem Benutzer oder zumindest einem Programmierer mitteilen können, was der Fehler war.</li>\n<li>Sie muss <strong>verständlich</strong> sein, damit sie auch von anderen Programmierern mit anderem technischen Verständnis oder Tools über einen längeren Zeitraum hinaus gewartet werden kann.</li>\n</ol>\n<p>Diese drei Kernideen, einmal verinnerlicht, erlauben eine ganze Menge Entscheidungen zu fällen, ohne jeden Han
"summary": "Dies ist meine Philosophie über Programmierung. Es gibt viele davon, aber diese hier ist meine.",
"date_published": "2019-10-14T18:58:23+02:00",
"date_modified": "2019-12-12T15:55:06+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Programmierung",
"Technologie",
"Webdevelop",
"Meinung"
]
},
{
"id": "user/posts/2019-10-12-microsoft-flight-simulator-2020-was-er-bewirken-wird/index.md",
"url": "https://journal.3960.org/posts/2019-10-12-microsoft-flight-simulator-2020-was-er-bewirken-wird/",
"title": "Der Microsoft Flight Simulator 2020 und was er bewirken wird",
"content_html": "<p>Microsoft hat vor Kurzem den neuesten Teil ihrer weltberühmten <i>Flight Simulator</i>-Serie angekündigt. Innerhalb kürzester Zeit war der <i><a href=\"https://www.flightsimulator.com/\">Microsoft Flight Simulator 2020</a></i> in aller Munde nicht zuletzt wegen seines spektakulären Trailers:</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"Der Trailer zu MSFS2020 ist atemberaubend.\" src=\"https://www.youtube-nocookie.com/embed/ReDDgFfWlS4?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/ReDDgFfWlS4?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/ReDDgFfWlS4/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/ReDDgFfWlS4/hqdefault.jpg\" --></div>\n<p>Nachdem sich der Staub etwas gelegt hat und immer mehr Informationen über dieses (augenscheinlich seit fünf Jahren im Geheimen produzierte) Projekt an die Öffentlichkeit dringen, gibt es eine erste Ahnung, was <abbr title=\"Microsoft Flight Simulator 2020\">MSFS2020</abbr> für das Hobby der Flug-Simulation bedeuten kann.</p>\n<!-- more -->\n<h2 id=\"more\">Was bisher geschah</h2>\n<p>Der aus dem Jahre 2006 stammende letzte Simulator aus dem Hause Microsoft war der <i><a href=\"https://de.wikipedia.org/wiki/Microsoft_Flight_Simulator#Flight_Simulator_X\">Microsoft Flight Simulator X</a></i> ein in seiner Zeit bahnbrechendes Stück Software, dass für lange Zeit den Maßstab für private Flug-Simulation gesetzt hatte.</p>\n<p>Die Jahre gingen ins Land, und der <abbr title=\"Flight Simulator X\">FSX</abbr> verstaubte mehr und mehr: Die Grafik, das Flugmodell, alleine der Nachschub an Patches all dies machte FSX trotz einer treuen Fangemeinde langsam überholt. Alle warteten auf einen Nachfolger.</p>\n<p>2012 erschien das Flugspiel <i>Microsoft Flight</i>. Die Annahme, dass es eine Fortsetzung des FSX sein würde, wurden enttäuscht. Stattdessen handelte es sich um ein vereinfachtes <em>Spiel</em>, dass Simulationsfreunde nicht zufrieden stellen konnte.</p>\n<p>Als weitere Signale schloss Microsoft 2009 das für den FSX verantwortliche Studio, und lizensierte die Engine an andere Unternehmen, die <a href=\"https://de.wikipedia.org/wiki/Microsoft_Flight_Simulator#Nachfolgeprodukte\">mehr oder weniger würdige Nachfolger für den Flight Simulator</a> produzierten. Keines dieser Produkte konnte aber bahnbrechende Erfolge feiern. </p>\n<p>Simulationsfreunden wurde klar, dass von Microsoft nichts mehr zu erwarten sein würde. So zog die Herde weiter, unter anderem zu <a href=\"https://www.x-plane.com/\">X-Plane 11</a>, oder schwelgte mit <a href=\"https://www.prepar3d.com/\">Prepar3d</a> in Nostalgie.</p>\n<h2 id=\"götterdämmerung\">Götterdämmerung</h2>\n<p>Das alles änderte sich schlagartig mit den ersten Trailern für den <i>Microsoft Flight Simulator 2020</i>, die für alle überraschend nicht nur einen bereits sehr fertig wirkenden Simulator zeigte.</p>\n<p>Die Trailer zeigten ein Flugerlebnis, das vor allen Dingen <a href=\"https://www.thedrive.com/the-war-zone/29848/this-spin-recovery-clip-from-microsofts-upcoming-flight-sim-is-absolutely-insane\"><em>außerhalb</em> der Simulations-Gemeinde Interesse an MSFS2020 weckte</a>. In persönlichen Gesprächen mit <em>Gamern</em> zeigte sich, dass Microsoft einen Nerv getroffen hatte: Auch Spieler ohne Vorerfahrung mit Flugsimulatoren interessierten sich auf einmal <em>brennend</em> für den MSFS2020. Die ansprechende Grafik und die einsteigerfreundliche Präsentation machten Lust auf mehr.</p>\n<p>Und die alten Simulationshasen? Immer, wenn der Hype-Train durch den Ort brauste, saßen sie erstmal gemütlich auf der Veranda und beobachteten das Spektakel skepti
"summary": "Microsoft hat vor Kurzem den neuesten Teil ihrer weltberühmten Flight Simulator-Serie angekündigt. Innerhalb kürzester Zeit war der Microsoft Flight Simulator…",
"date_published": "2019-10-12T18:20:22+02:00",
"date_modified": "2020-02-07T14:31:15+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://img.youtube.com/vi/ReDDgFfWlS4/hqdefault.jpg",
"language": "de-DE",
"image": "https://img.youtube.com/vi/ReDDgFfWlS4/hqdefault.jpg",
"tags": [
"MSFS2020",
"Fliegerei",
"Für Tumblr",
"Meinung",
"Simulation",
"Spiel",
"The Cool",
"Aerofly FS2",
"X-Plane",
"DCS"
]
},
{
"id": "user/posts/2019-10-01-redirects-fuer-apache-verstehen/index.md",
"url": "https://journal.3960.org/posts/2019-10-01-redirects-fuer-apache-verstehen/",
"title": "Redirects für den Apache verstehen",
"content_html": "<p>Nach größeren Änderungen an einem Internetauftritt gibt es oft den Wunsch, veraltete URLs auf neue URLs umzuleiten. Dazu kann man in Webservern sogenannte „Redirects“ anlegen Umleitungen für URLs. Sowohl Besucher mit Lesezeichen wie auch Suchmaschinen werden so eure neuen Inhalte umgeleitet, auch wenn sie eine alte URL aufrufen.</p>\n<p>Für den Apache Webserver gibt es 2½ Wege, wie man Redirects konfigurieren kann: <code>redirect</code>, <code>redirectmatch</code> sowie <code>RewriteRule</code>. Tatsächlich ist die korrekte und fehlerfreie Konfiguration von Redirects aber eine trickreiche Sache und ein genaues Studium der jeweiligen Anleitung notwendig, um <i>Redirect Loops</i> zu vermeiden.</p>\n<!-- more -->\n<p id=\"more\">Die 2½ verschiedenen Redirect-Direktiven funktionieren relativ ähnlich: Sie leiten eine <strong>Anfrage-URL</strong>, die einem bestimmten <strong>Muster</strong> entspricht, auf eine <strong>Ziel-URL</strong> um. Dazu können sie der Anfrage einen <strong><a href=\"https://de.wikipedia.org/wiki/HTTP-Statuscode\">HTTP-Statuscode</a></strong> mitgeben, der den ursprünglichen Aufrufer mitteilt, aus welchem Grund und wie lange die Umleitung existiert.</p>\n<h2 id=\"wo-kann-ich-für-den-apache-webserver-redirects-einrichten\"><em>Wo</em> kann ich für den Apache-Webserver Redirects einrichten?</h2>\n<p>Der Ort für die Konfiguration von Redirects ist entweder die Apache-Konfigurationsdatei, oder aber (wenn der Webserver dieses Feature eingeschaltet hat) die <code>.htaccess</code>-Konfigurationsdatei direkt im Hosting-Verzeichnis bzw. der Document Root des Webauftritts.</p>\n<p>Wenn kein Apache zum Einsatz kommt, funktioniert diese Methoden nicht in der Regel verfügt aber jeder Webserver über eine zumindest ähnliche Methode, wie Redirects eingerichtet werden können.</p>\n<h2 id=\"wie-sollte-ich-für-den-apache-redirects-einrichten\"><em>Wie</em> sollte ich für den Apache Redirects einrichten?</h2>\n<p>Bei der Einrichtung von Redirects sollte in der Konfigurationsdatei vermerkt werden, warum die Redirects eingerichtet wurden, oder wann sie gelöscht werden können. Nichts ist schlimmer, als in einem Wust von 6.500 Redirects nicht mehr durchzublicken und auch nicht zu wissen, ob nicht 6.000 Regeln schon lange hätten weggeworfen werden können. Hier bieten sich Kommentare an:</p>\n<pre><code class=\"language-apacheconf\"><u># Basic redirects START</u>\n<i>Redirect</i> permanent <kbd>&quot;/index&quot;</kbd> <kbd>&quot;/&quot;</kbd>\n<u># Basic redirects END</u>\n\n<u># SEO redirects DELETE AFTER 10/2020 START</u>\n<i>Redirect</i> permanent <kbd>&quot;/artikel&quot;</kbd> <kbd>&quot;/articles&quot;</kbd>\n<i>Redirect</i> permanent <kbd>&quot;/kontakt&quot;</kbd> <kbd>&quot;/contact&quot;</kbd>\n<u># SEO redirects DELETE AFTER 10/2020 END</u></code></pre>\n<p>Gerade bei Redirects, die Suchmaschinen von einer alten, nicht mehr im Einsatz befindlichen URL auf eine neue URL umleiten sollen, kann nach zwei Jahren spätestens davon ausgegangen werden, dass sie nicht mehr notwendig sind.</p>\n<p>Ein weiterer Vorschlag ist, die Direktiven für Redirects in Blöcke einzupacken, die testen, ob das für die Direktiven notwendige Modul überhaupt installiert ist:</p>\n<pre><code class=\"language-apacheconf\">&lt;IfModule mod_alias.c&gt;\n <i>Redirect</i> permanent <kbd>&quot;/index&quot;</kbd> <kbd>&quot;/&quot;</kbd>\n&lt;/IfModule&gt;\n\n&lt;IfModule mod_rewrite.c&gt;\n <i>RewriteRule</i> <kbd>&quot;^/source$&quot;</kbd> <kbd>&quot;/target&quot;</kbd> [R=301,L]\n&lt;/IfModule&gt;</code></pre>\n<p>Dies verhindert, dass der Webserver seinen Betrieb einstellt, falls das Modul deaktiviert wird. Andersherum kann man diese Blöcke natürlich weglassen, wenn man explizit möchte, dass das Deaktivieren von Modulen und der damit verbundenen Redirects auffällt. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p>\n<h2 id=\"fallstricke-bei-der-konfiguration-von-redirects-im-apache\">Fallstricke bei der Konfiguration von Redirects im Apache</h2>\n<p>Wen
"summary": "Nach größeren Änderungen an einem Internetauftritt gibt es oft den Wunsch, veraltete URLs auf neue URLs umzuleiten. Dazu kann man in Webservern sogenannte …",
"date_published": "2019-10-01T18:03:10+02:00",
"date_modified": "2020-01-06T12:37:22+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Programmierung",
"Webdevelop",
"Apache"
]
},
{
"id": "user/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/index.md",
"url": "https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/",
"title": "VFR ohne technischen Schnickschnack",
"content_html": "<p><a href=\"https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/sunset.jpg\" class=\"gallery__link\"><img src=\"https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/sunset-400x225.jpg\" class=\"default\" width=\"400\" height=\"225\" style=\"--aspect-ratio: 400/225;\" alt=\"\" /></a></p>\n<p>Mein aktueller Lieblings-Flugsimulator <a href=\"https://journal.3960.org/tagged/aerofly-fs2/\">Aerofly FS2</a> überredet mich immer wieder zu neuen Experimenten. Nachdem ich <a href=\"https://journal.3960.org/posts/2017-12-17-vor-freude-ifr-mit-aerofly-fs2/\">IFR ohne GPS in Aerofly FS2</a> ausprobiert hatte, animierte mich die Geschichte der <a href=\"http://sometimes-interesting.com/2013/12/04/concrete-arrows-and-the-u-s-airmail-beacon-system/\">Leuchttürmen und großen Beton-Pfeilen für Flugzeuge</a> aus der Gründerzeit der Fliegerei, mir eine neue Aufgabe vorzuknöpfen: Navigation <em>ohne</em> moderne technische Hilfsmittel an Bord!</p>\n<!-- more -->\n<h2 id=\"more\">Die Herausforderung</h2>\n<p>Die Aufgabe: Ohne jedes technische Hilfsmittel zur Funk- oder Satelliten-Navigation an Bord sicher und zuverlässig mit dem simulierten Flugzeug einen Cross-Country-Flug vom Start- zum Zielflughafen zu finden. Damit entfällt nicht nur das allgegenwärtige GPS, sondern auch die Nutzung von VOR- und NDB-Empfängern. Was erlaubt ist: eine gute Karte, ein Kompass, eine Uhr und ein guter Plan.</p>\n<p>Inspiration für solche Abenteuer finden sich z.B. in diesem <a href=\"https://www.youtube.com/watch?v=OVYGTa_OUEs\">Youtube-Video, in dem Flugnavigation ohne technische Hilfsmittel im echten Leben</a> zu bewundern ist.</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=OVYGTa_OUEs\" src=\"https://www.youtube-nocookie.com/embed/OVYGTa_OUEs?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/OVYGTa_OUEs?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/OVYGTa_OUEs/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/OVYGTa_OUEs/hqdefault.jpg\" --></div>\n<p><a href=\"https://de.wikipedia.org/wiki/Sichtflug\">VFR</a> nach diesen Regeln verändert deutlich die Art und Weise, wie ein Flug in einem Simulator durchgeführt werden muss:</p>\n<ol>\n<li>Vor der Flugplanung muss deutlich genauer das <strong>Wetter</strong> überprüft werden. Nicht nur eine hinreichend hohe Sichtweite muss gegeben sein auch der Wind spielt beim VFR eine wichtigere Rolle als bei der Fliegerei mit Navigationsunterstützung.</li>\n<li>Im Vorfeld muss ein <strong>präziser Flugplan</strong> ausgearbeitet werden, bei dem der jeweilige Kurs und die Distanzen vermerkt werden müssen, sowie die daraus resultierenden Zeiten.</li>\n<li>Der Flugplan muss dabei nicht zwangläufig der kürzeste Weg sein, sondern vor allen Dingen sich an <strong>aus der Luft sichtbaren Merkmalen</strong> orientieren.</li>\n<li>Im Flug wiederum wollen der <strong>Kurs, die Geschwindigkeit und die Zeit</strong> beachtet werden, um ein Gefühl dafür zu bekommen, wie weit man auf dem Flugplan bereits gekommen ist.</li>\n<li>Und nicht zuletzt muss der Pilot beständig aus dem Fenster schauen, um <strong>Geländemerkmale wieder zu erkennen</strong>, an Hand derer er oder sie seine Position feststellen kann.</li>\n</ol>\n<p>Statt also seine Hände in den Schoß und sein Schicksal in die Hände des Autopiloten zu legen, ist bei Gelände-VFR-Flügen Aufmerksamkeit und Konzentration gefragt.</p>\n<p><strong>Disclaimer:</strong> Natürlich ist diese Anleitung weder vollständig, professionell, noch für die Verwendung im wahren Leben geeignet. Andererseits kann diese Anleitung auch
"summary": "Mein aktueller Lieblings-Flugsimulator Aerofly FS2 überredet mich immer wieder zu neuen Experimenten. Nachdem ich IFR ohne GPS in Aerofly FS2 ausprobiert…",
"date_published": "2019-09-22T18:43:14+02:00",
"date_modified": "2020-02-07T14:31:40+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/sunset.jpg",
"language": "de-DE",
"image": "https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/sunset.jpg",
"tags": [
"Aerofly FS2",
"Fliegerei",
"Geografie",
"Simulation",
"Spiel",
"X-Plane"
],
"_geo": {
"about": "http://geojson.org/",
"type": "Point",
"coordinates": [
-80.343874,
25.279406
]
}
},
{
"id": "user/posts/2019-09-16-f-16-fighting-falcon-fuer-dcs/index.md",
"url": "https://journal.3960.org/posts/2019-09-16-f-16-fighting-falcon-fuer-dcs/",
"title": "Die F-16 Fighting Falcon für DCS",
"content_html": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=8QfANpD0GHY\" src=\"https://www.youtube-nocookie.com/embed/8QfANpD0GHY?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/8QfANpD0GHY?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/8QfANpD0GHY/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/8QfANpD0GHY/hqdefault.jpg\" --></div>\n<p>Endlich! Nachdem für den <a href=\"https://www.digitalcombatsimulator.com/de/\">Digital Combat Simulator</a> bereits jetzt eine riesige Palette an Fluggeräten erhältlich ist, produziert Eagle Dynamics nun selber den Klassiker unter den westlichen Kampfflugzeugen: Die <a href=\"https://en.wikipedia.org/wiki/General_Dynamics_F-16_Fighting_Falcon\">F-16 Fighting Falcon aka „Viper“</a>.</p>\n<!-- more -->\n<p id=\"more\">Dieses Flugzeug befindet sich seit 1974 in Produktion, und wird auch heute nach über 40 Jahren immer noch hergestellt wenn auch die neueren Ausgaben der F-16 Block 60 sich gegenüber dem Ursprungsmodell sowohl von der Leistung als auch von der Sensorik her stark weiter entwickelt haben. Von de F-16 wurden bis heute über 4.000 Einheiten hergestellt und in über 20 Ländern in Dienst gestellt.</p>\n<p>DCS hatte schon immer eine ansprechende Palette von westlichen Kampfflugzeugen: A-10 Warthog, F-5 Tiger, F-14 Tomcat, F-15 Eagle, F-18 Hornet, AV-8B Harrier. Aber die F-16 war und ist <em>das</em> ikonische Kampfflugzeug der NATO. Wenn also nichts dazwischen kommt, steige ich demnächst von meiner (kostenlosen) Su-25 Frogfoot auf die F-16 um.</p>\n<p>Ich persönlich war schon früh der (simulierten) F-16 verbunden: Schon auf dem Commodore C-64 hatte ich mit <a href=\"https://www.mobygames.com/game/f-16-combat-pilot\">Digital Integrations <i>F-16 Combat Pilot</i></a> meine ersten Erfahrungen gemacht. Und obwohl ich die legendäre <a href=\"https://www.mobygames.com/game-group/falcon-series\">Spectrum Holobytes <i>Falcon</i>-Reihe</a> nur kurz gestreift habe, so habe ich doch zumindest in <a href=\"https://www.mobygames.com/game/strike-commander\"><i>Strike Commander</i></a> (einem Ableger der <i>Wing Commander</i>-Serie) die F-16 (simuliert) geflogen. So oder so ist die <a href=\"https://www.mobygames.com/game-group/aircraft-f-16-fighting-falcon\">F-16 ein in unzähligen Computerspielen und -simulationen auftretender Kampfjet</a>.</p>\n<p>DCS bzw. Eagle Dynamics haben übrigens schon begonnen, Schulungsvideos bei Youtube einzustellen damit zukünftige DCS-F-16-Piloten sich schonmal mit ihrem neuen Arbeitsgerät vertraut machen können.</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=Jpug6-Si_i0\" src=\"https://www.youtube-nocookie.com/embed/Jpug6-Si_i0?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Jpug6-Si_i0?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Jpug6-Si_i0/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Jpug6-Si_i0/hqdefault.jpg\" --></div><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Die%20F-16%20Fighting%20Falcon%20f%C3%BCr%20DCS&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-09-16-f-16-fighting-falcon-fuer-dcs%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Endlich! Nachdem für den Digital Combat Simulator bereits jetzt eine riesige Palette an Fluggeräten erhältlich ist, produziert Eagle Dynamics nun selber den…",
"date_published": "2019-09-16T18:01:22+02:00",
"date_modified": "2019-09-29T17:43:04+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://img.youtube.com/vi/8QfANpD0GHY/hqdefault.jpg",
"language": "de-DE",
"image": "https://img.youtube.com/vi/8QfANpD0GHY/hqdefault.jpg",
"tags": [
"DCS",
"Fliegerei",
"Simulation",
"Spiel",
"Militär"
]
},
{
"id": "user/posts/2019-09-13-programmierung-zurueck-zur-werkbank/index.md",
"url": "https://journal.3960.org/posts/2019-09-13-programmierung-zurueck-zur-werkbank/",
"title": "Programmierung: Zurück zur Werkbank",
"content_html": "<p>Wie schon in dem Artikel <a href=\"https://journal.3960.org/posts/2019-04-23-einfachheit-programmierung/\">„Simple &amp; Boring“</a> von Chris Coyier hat auch Bastian Allgeier eine Lanze für Einfachheit in der Programmierung gebrochen. Sein Artikel <a href=\"https://bastianallgeier.com/notes/simplicity-part-2\">„Simplicity (II)“</a> dürfte vielen altgedienten Programmierern aus der Seele sprechen.</p>\n<p>Tatsächlich bemerke ich sowohl in der privaten als auch beruflichen Programmierung den Trend, für mehr Geschwindigkeit ein neues Tool einzusetzen… das kleine Probleme verursacht, die durch ein weiteres Tool gelöst werden müssen… das kleine Probleme verursacht, die durch ein weiteres Tool gelöst werden müssen…</p>\n<figure class=\"blockquote\"><blockquote cite=\"https://bastianallgeier.com/notes/simplicity-part-2\"><p>When everything works, it feels like magic. When something breaks, it&#39;s hell.</p></blockquote>\n<figcaption><a href=\"https://bastianallgeier.com/notes/simplicity-part-2\">Bastian Allgeier, „<cite>Simplicity (II)</cite>“</a></figcaption></figure>\n<p>Der Artikel dreht sich zwar primär darum, was diese Abhängigkeiten gerade für ältere Projekte bedeuten (nämlich, dass Abhängigkeiten nach ein paar Jahren sich nicht wieder auslösen lassen, weil die dafür benötigten Versionen an Tools nicht mehr zur Verfügung stehen), inzwischen bemerke ich aber auch bei aktuellen Projekten die Probleme, die übermäßige Abhängigkeiten für die Entwicklungsgeschwindigkeit bedeuten können, wenn auch nur ein Teil ausfällt.</p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Programmierung%3A%20Zur%C3%BCck%20zur%20Werkbank&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-09-13-programmierung-zurueck-zur-werkbank%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Wie schon in dem Artikel „Simple & Boring“ von Chris Coyier hat auch Bastian Allgeier eine Lanze für Einfachheit in der Programmierung gebrochen. Sein Artikel…",
"date_published": "2019-09-13T18:23:11+02:00",
"date_modified": "2019-10-17T18:51:03+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"external_url": "https://bastianallgeier.com/notes/simplicity-part-2",
"tags": [
"CSS",
"Javascript",
"Meinung",
"PHP",
"Programmierung",
"Webdevelop",
"Geckobar"
]
},
{
"id": "user/posts/2019-05-08-rueckkehr-von-b-und-i/index.md",
"url": "https://journal.3960.org/posts/2019-05-08-rueckkehr-von-b-und-i/",
"title": "Die Rückkehr von <i> und <b>",
"content_html": "<p>Vor vielen Jahren haben Web-Entwickler <code>&lt;i&gt;</code>-, <code>&lt;b&gt;</code>- und <code>&lt;u&gt;</code>-Tags im HTML den Rücken gekehrt.</p>\n<p>In der Anfangsphase von HTML waren Tags und Attribute sowohl für Inhalt als <em>auch</em> Styling zuständig waren. Mit dem Aufkommen von CSS, der Idee von semantischen Layout und Barrierefreiheit wurden Tags aussortiert, die nur für Styling zuständig waren. Und so wurden auch <code>&lt;i&gt;</code>, <code>&lt;b&gt;</code> und <code>&lt;u&gt;</code> mit HTML4 gestrichen, und waren ab dort <i>deprecated</i> bzw. <i>personae non gratae</i>.</p>\n<p>Aber tatsächlich sind sie wieder da! In HTML5 wurden diese HTML-Tags mit neuer Bedeutung wieder eingeführt, und können wieder verwendet werden.</p>\n<!-- more -->\n<h2 id=\"more\">Elemente, die regulär gefettet dargestellt werden</h2>\n<p>Als Ersatz von <code>&lt;b&gt;</code> wurde <code>&lt;strong&gt;</code> propagiert. Tatsächlich haben aber weiterhin <em>beide</em> Tags ihre Relevanz. Das Mozilla Developer Network weiß das folgende über <code>&lt;strong&gt;</code> und <code>&lt;b&gt;</code> zu berichten:</p>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong\"><p>The <b>HTML Strong Importance Element (<code>&lt;strong&gt;</code>)</b> indicates that its contents have strong importance, seriousness, or urgency.</p></blockquote>\n<figcaption><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong\">MDN-Definition von <code>&lt;strong&gt;</code></a></figcaption></figure>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b\"><p>The <b>HTML Bring Attention To element (<code>&lt;b&gt;</code>)</b> is used to draw the reader&#39;s attention to the element&#39;s contents, which are not otherwise granted special importance.</p></blockquote>\n<figcaption><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b\">MDN-Definition von <code>&lt;b&gt;</code></a></figcaption></figure>\n<p>Nach dieser Definition wird <code>&lt;strong&gt;</code> für Wörter verwendet, die man bei Aussprache besonders betonen würde. <code>&lt;b&gt;</code> dagegen empfiehlt sich z.B. für die Hervorhebung von wichtigen Begriffen in einem Text.</p>\n<h2 id=\"elemente-die-regulär-kursiv-dargestellt-werden\">Elemente, die regulär kursiv dargestellt werden</h2>\n<p>Für <code>&lt;i&gt;</code> sollte vor geraumer Zeit nur noch <code>&lt;em&gt;</code> verwendet werden. Aber auch hier hat sich ein Wandel vollzogen. Das Mozilla Developer Network hat folgende Information <code>&lt;em&gt;</code> und <code>&lt;i&gt;</code> parat:</p>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em\"><p>The <b>HTML <code>&lt;em&gt;</code></b> element marks text that has stress emphasis.</p></blockquote>\n<figcaption><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em\">MDN-Definition von <code>&lt;em&gt;</code></a></figcaption></figure>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i\"><p>The <b>HTML <code>&lt;i&gt;</code></b> element represents a range of text that is set off from the normal text for some reason. Some examples include technical terms, foreign language phrases, or fictional character thoughts.</p></blockquote>\n<figcaption><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i\">MDN-Definition von <code>&lt;i&gt;</code></a></figcaption></figure>\n<p>Dementsprechend wird <code>&lt;em&gt;</code> für Wörter verwendet, die bei Aussprache besonders betont werden würden. Mit <code>&lt;i&gt;</code> dagegen würden spezielle Begriffe und Wörter aus dem Text herausgehoben werden.</p>\n<h2 id=\"und-sogar-unterstrichene-elemente\">Und sogar unterstrichene Elemente</h2>\n<p>Selbst das verpönte <code>&lt;u&gt;</code> hat eine Wiederauferstehung erlebt:</p>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en
"summary": "Vor vielen Jahren haben Web-Entwickler <i>-, <b>- und <u>-Tags im HTML den Rücken gekehrt.\nIn der Anfangsphase von HTML waren Tags und Attribute sowohl für…",
"date_published": "2019-05-08T19:10:30+02:00",
"date_modified": "2019-10-17T18:50:52+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Blog",
"Programmierung",
"Webdevelop"
]
},
{
"id": "user/posts/2019-04-24-verantwortung-von-software/index.md",
"url": "https://journal.3960.org/posts/2019-04-24-verantwortung-von-software/",
"title": "Die Verantwortung von Software",
"content_html": "<p>Ein Tipp von den Wedeler Jungs: Gregory Travis erklärt aus seiner Erfahrung als Programmierer <em>und</em> Pilot, warum <a href=\"https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer\">Flugzeugbau und Softwarebau zwei sehr unterschiedliche Grundphilosophien haben, die nicht gut zueinander passen</a> am Beispiel des Abstürze der Boeing 737 Max.</p>\n<!-- more -->\n<p id=\"more\">Tatsächlich finde ich genug Beispiele: Das Smartphone hat einen größerer Bug? Keine Angst, es wird ein Update geben. Der Staubsauger-Roboter bleibt öfter an Teppich-Kanten hängen? Kein Problem, da kommt früher oder später ein Update. Die Rumble-Packs der WMR-Brille funktionieren nicht? Nach dem nächsten Update tun sie das bestimmt. In dem Spiel fehlen versprochene Features? Ach, das werden die Entwickler früher oder später schon nachliefern.</p>\n<p>Als Software-Entwickler verlassen wir uns sehr darauf, dass wir Fehler später immer noch korrigieren können. Wir verzichten auf Testing, QA, Methoden zur Fehlerbehandlung, Exception-Abarbeitung, Prüfung von Variablen, Quoting, saubere Typisierung weil für uns als Entwickler nicht viel davon abhängt, als gegebenenfalls später ein Patch dafür bauen zu müssen. Zum Glück leben wir ja nicht mehr in der Zeit, in der Software auf einem Datenträger verteilt werden muss oder auf ein Modul gebrannt wird, und dort bis in alle Ewigkeit funktionieren muss.</p>\n<p>Tatsächlich sollten wir als Programmierer etwas mehr Ehrfurcht vor unserer Aufgabe haben und diese Ehrfurcht auch einfordern. Außerdem sollten wir uns selber einen defensiven Programmierstil auferlegen. In diesem Zusammenhang möchte ich nochmals auf <strong><a href=\"https://de.wikipedia.org/wiki/Kalaschnikow\">Kalashnikov</a>-Programmierung</strong> hinweisen: </p>\n<blockquote><p>Die Programmierung muss nicht technisch herausragend sein sie muss robust, unter jeder Umgebung einsatzbereit und einfach zu reparieren sein.</p></blockquote>\n<p>Sie auch den Artikel über die <a href=\"https://journal.3960.org/posts/2019-04-23-einfachheit-programmierung/\">die Vorzüge einfacher Programmierung</a>.</p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Die%20Verantwortung%20von%20Software&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-04-24-verantwortung-von-software%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Ein Tipp von den Wedeler Jungs: Gregory Travis erklärt aus seiner Erfahrung als Programmierer und Pilot, warum Flugzeugbau und Softwarebau zwei sehr…",
"date_published": "2019-04-24T19:02:28+02:00",
"date_modified": "2019-04-24T19:02:28+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Fliegerei",
"Geckobar",
"Programmierung",
"Technologie"
]
},
{
"id": "user/posts/2019-04-23-einfachheit-programmierung/index.md",
"url": "https://journal.3960.org/posts/2019-04-23-einfachheit-programmierung/",
"title": "Einfachheit in Programmierung",
"content_html": "<p>Meine persönlichen Grundsätze für Programmierung finden sich bestens in dem Artikel <a href=\"https://css-tricks.com/simple-boring/\">Simple &amp; Boring</a> zusammengefasst. Meine eigenen Ideen dazu:</p>\n<p>Wenn ich ein neues Tool, ein neues Konzept oder eine neue Sprache verwenden möchte, frage ich mich vorher: <em>Welches Problem löst das?</em> Außerdem eine gute Frage: <em>Welche Probleme verursacht das?</em></p>\n<p>Außerdem verbreite ich gerne die Idee der <strong><a href=\"https://de.wikipedia.org/wiki/Kalaschnikow\">Kalashnikov</a>-Programmierung</strong>: Die Programmierung muss nicht technisch herausragend sein sie muss robust, unter jeder Umgebung einsatzbereit und einfach zu reparieren sein.</p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Einfachheit%20in%20Programmierung&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-04-23-einfachheit-programmierung%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Meine persönlichen Grundsätze für Programmierung finden sich bestens in dem Artikel Simple & Boring zusammengefasst. Meine eigenen Ideen dazu:\nWenn ich ein…",
"date_published": "2019-04-23T19:16:18+02:00",
"date_modified": "2019-04-23T19:16:18+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"external_url": "https://css-tricks.com/simple-boring/",
"tags": [
"Geckobar",
"Meinung",
"Philosophie",
"Programmierung",
"Webdevelop"
]
},
{
"id": "user/posts/2019-04-10-bilder-iframes-einfach-mit-lazy-loading-ausstatten/index.md",
"url": "https://journal.3960.org/posts/2019-04-10-bilder-iframes-einfach-mit-lazy-loading-ausstatten/",
"title": "Bilder und iFrames einfach mit Lazy-Loading ausstatten",
"content_html": "<p>Lazy-loading ist eine beliebte Technik, um die gefühlte Geschwindigkeit einer Internetseite zu erhöhen. Statt alle Bilder einer Webseite schon beim Laden der Seite mitzuladen, werden nur die Bilder geladen, die auch <em>tatsächlich</em> sichtbar sind. Damit verringert man gerade auf langen Seiten die initial geladene Menge an Bildern.</p>\n<p>Bisher hatte das mit etwas Aufwand zu tun, und auf jeden Fall mit JavaScript. Netterweise gibt es da jetzt auch eine deutlich einfachere Lösung.</p>\n<!-- more -->\n<p id=\"more\">Die bisherigen Lösungen gingen davon aus, dass irgendeine Form von <a href=\"https://appelsiini.net/projects/lazyload/\">LazyLoad-JavaScript</a> auf der Seite montiert wurde, und das HTML eines jeden Bildes abgeändert werden musste:</p>\n<pre><code class=\"language-html\"><u>&lt;!-- Load when visible --&gt;</u>\n&lt;<i>img</i> <var>src</var>=&quot;<kbd>example-lowres.jpg</kbd>&quot;\n <var>data-src</var>=&quot;<kbd>example-highres.jpg</kbd>&quot; <var>class</var>=&quot;<kbd>lazyload</kbd>&quot;\n <var>alt</var>=&quot;<kbd></kbd>&quot; <var>width</var>=&quot;<kbd>240</kbd>&quot; <var>height</var>=&quot;<kbd>240</kbd>&quot; /&gt;</code></pre>\n<p>Google Chrome unterstützt in absehbarer Zukunft ein Attribut namens <code>loading</code>, dass das Ladeverhalten von <code>&lt;img&gt;</code> und <code>&lt;iframe&gt;</code> steuert, <em>ohne</em> zusätzliches Javascript. Genaue Details kann man einem <a href=\"https://addyosmani.com/blog/lazy-loading/\">Blog-Post eines Chrome-Entwicklers über Lazy-Loading</a> entnehmen, im HTML sieht das aber schlicht und ergreifend wie folgt aus:</p>\n<pre><code class=\"language-html\"><u>&lt;!-- Load when visible --&gt;</u>\n&lt;<i>img</i> <var>src</var>=&quot;<kbd>example.jpg</kbd>&quot; <var>loading</var>=&quot;<kbd>lazy</kbd>&quot; <var>alt</var>=&quot;<kbd></kbd>&quot; <var>width</var>=&quot;<kbd>240</kbd>&quot; <var>height</var>=&quot;<kbd>240</kbd>&quot; /&gt;\n&lt;<i>iframe</i> <var>src</var>=&quot;<kbd>example.html</kbd>&quot; <var>loading</var>=&quot;<kbd>lazy</kbd>&quot;&gt;&lt;/<i>iframe</i>&gt;\n\n<u>&lt;!-- Load as soon as possible --&gt;</u>\n&lt;<i>img</i> <var>src</var>=&quot;<kbd>example.jpg</kbd>&quot; <var>loading</var>=&quot;<kbd>eager</kbd>&quot; <var>alt</var>=&quot;<kbd></kbd>&quot; <var>width</var>=&quot;<kbd>240</kbd>&quot; <var>height</var>=&quot;<kbd>240</kbd>&quot; /&gt;\n&lt;<i>iframe</i> <var>src</var>=&quot;<kbd>example.html</kbd>&quot; <var>loading</var>=&quot;<kbd>eager</kbd>&quot;&gt;&lt;/<i>iframe</i>&gt;</code></pre>\n<p>Damit entfällt in Zukunft in Google Chrome (und allen anderen Browsern, die da nachziehen werden) die Notwendigkeit, JavaScript für Lazy-Loading auf der eigenen Seite zu montieren. Zudem können browser ohne diese Möglichkeit bzw. ohne JavaScript immer noch die selben Inhalte sehen.</p>\n<h2 id=\"tests-mit-chrome\">Tests mit Chrome</h2>\n<p>Solange Google Chrome das Feature noch nicht direkt unterstützt, muss man im aktuellen Google Chrome Lazy-Loading noch einmalig einschalten:</p>\n<ol>\n<li>In Chrome <code>chrome://flags</code> in die URL-Zeile eingeben</li>\n<li>Nach „Lazy“ suchen.</li>\n<li>Die beiden nun angezeigten Optionen aktivieren.</li>\n<li>Chrome neu starten.</li>\n</ol>\n<p>Danach sollte man beim Besuch einer Seite, die mit <code>loading</code>-Attributen versehen ist, beim Öffnen des Inspektors bemerken, dass erst beim Scrollen auf der Seite weiter unten befindliche Bilder nachgeladen werden.</p>\n<h2 id=\"mit-der-gießkanne-umsetzung-in-nodejs\">Mit der Gießkanne: Umsetzung in NodeJs</h2>\n<p>Um in einem gesamten Content-Block jedes <code>&lt;img&gt;</code> und <code>&lt;iframe&gt;</code> mit dem passenden <code>loading</code>-Attribut zu versehen, reicht folgende kleine Funktion:</p>\n<pre><code class=\"language-javascript\"><b>const</b> lazyloadAttributes = <b>function</b>(html, loading = <kbd>'lazy'</kbd>) {\n <i>return</i> html.replace(/(&lt;(?:img|iframe) )/g, <kbd>'$1loading=&quot;'</kbd> + loading + <kbd>'&quot; '</kbd>);\n};</code></pre>\n<h2 id=\"und-in-p
"summary": "Lazy-loading ist eine beliebte Technik, um die gefühlte Geschwindigkeit einer Internetseite zu erhöhen. Statt alle Bilder einer Webseite schon beim Laden der…",
"date_published": "2019-04-10T19:02:20+02:00",
"date_modified": "2019-04-20T09:57:01+02:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Für Facebook",
"Javascript",
"Programmierung",
"Webdevelop"
]
},
{
"id": "user/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/index.md",
"url": "https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/",
"title": "Das Wettergerät für Aerofly FS2",
"content_html": "<p><img src=\"https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/favicon-512x512-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 240/240;\" alt=\"\" /> Was Anfang des Jahres als kleine Idee begonnen hatte, ist inzwischen in einem einigermaßen komplexen Projekt gemündet: Ich wollte das Wetter in meinem Lieblings-Flugsimulator <a href=\"https://www.aerofly.com/\">Aerofly FS2</a> verbessern.</p>\n<!-- more -->\n<p id=\"more\">Aerofly FS2 ist noch weit entfernt von der Tiefe und Komplexität von X-Plane oder auch Prepar3D. Darum hatte ich mir zwischenzeitlich <a href=\"https://www.x-plane.com/\">X-Plane</a> angeschaut, war aber inzwischen bereits sehr verwöhnt von der Performance und Unkompliziertheit von Aerofly FS2. Gerade die Unterstützung für Virtual Reality gefiel mir in AFS2 einfach besser, so dass ich X-Plane inzwischen wieder in den Hangar gerollt hatte.</p>\n<p>Nach meiner Rückkehr zu AFS2 vermisste ich nun aber doch ein paar Features:</p>\n<ol>\n<li><a href=\"https://en.wikipedia.org/wiki/Air_traffic_control\">Air Traffic Control</a>, d.h. die korrekte Verwendung des Funkgerätes,</li>\n<li>eine lebendig wirkende Umwelt,</li>\n<li>und den realen Bedingungen entsprechendes Wetter.</li>\n</ol>\n<p>Während die lebendig wirkende Umwelt (in Form von Autos und Schiffen) gerade durch das <a href=\"https://steamcommunity.com/games/434030/announcements/detail/1804161464656648118\">Aerofly Life Project</a> angegangen wird, habe ich mir also das Wetter vorgenommen.</p>\n<p>Tatsächlich existiert in X-Plane eine Idee, die in <a href=\"https://journal.3960.org/tagged/aerofly-fs2/\">Aerofly FS2</a> ebenfalls funktioniert: Jeder größere Flughafen auf diesem Planeten veröffentlicht in relativ kurzen Abständen seinen aktuellen Wetterbericht in Form eines <a href=\"https://de.wikipedia.org/wiki/METAR\">METAR</a>. Dieser Wetterbericht ist nicht nur sehr verdichtet, sondern auch mit etwas Geschick maschinenlesbar.</p>\n<pre><code class=\"language-metar\"><i title=\"Location\">KEYW</i> <span title=\"Day of month\">26</span><b title=\"Time\">1153Z</b> <span title=\"Wind direction\">360</span><b title=\"Wind speed\">05KT</b> 10SM <var title=\"Cloud\">FEW012</var> <b title=\"Temperature\">23</b>/<span title=\"Dewpoint\">23</span> <span title=\"Pressure\">A3004</span> RMK AO2 SLP172 T02330217 10233 20222 53012</code></pre>\n<p>Darüber hinaus gibt es viele Anlaufstellen, die METARs über eine HTTP-Schnittstelle zur Verfügung stellen. Die <strong>Quelle</strong> war also gefunden.</p>\n<p>Gleichzeitig hatte ich in der Hauptkonfigurationsdatei <code>main.mcf</code> von AFS2 entdeckt, dass die Wetterdaten darin gespeichert wurden. Zu meiner Überraschung fanden sich dort sogar Schalter, die in der Simulation selber gar nicht konfigurierbar waren. Mit ein paar wenigen Experimenten konnte ich nachweisen, dass Veränderungen in der <code>main.mcf</code> tatsächlich in AFS2 übernommen wurden hier war also mein <strong>Ziel</strong>.</p>\n<h2 id=\"die-aufgabe\">Die Aufgabe</h2>\n<p>Die Aufgabe war jetzt also klar erkennbar:</p>\n<ol>\n<li>Einen METAR für einen definierbaren Flughafen per HTTP-API abholen,</li>\n<li>den METAR-Bericht in ein strukturiertes METAR-Objekt umwandeln,</li>\n<li>das METAR-Objekt wiederum in ein Aerofly-kompatibles Objekt umwandeln,</li>\n<li>und diese Daten dann in die Simulation schreiben hier also in die <code>main.mcf</code>.</li>\n</ol>\n<h2 id=\"phase-1-kommandozeile\">Phase 1: Kommandozeile</h2>\n<p><img src=\"https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/aerofly-weather-desktop.png\" width=\"931\" height=\"570\" style=\"--aspect-ratio: 931/570;\" alt=\"\" /></p>\n<p>Als Webprogrammierer habe ich mich für das Projekt an eine Sprache gehalten, die ich gut kannte: JavaScript, bzw. <a href=\"https://nodejs.org/\">NodeJS</a>.</p>\n<p>Hier zahlte sich vor allen Dingen aus, dass ich privat sehr gerne test-getrieben entwickele, da das Format von METARs doch einige Überraschungen parat hatte. Unz
"summary": "Was Anfang des Jahres als kleine Idee begonnen hatte, ist inzwischen in einem einigermaßen komplexen Projekt gemündet: Ich wollte das Wetter in meinem…",
"date_published": "2019-03-27T19:32:27+01:00",
"date_modified": "2020-02-11T08:52:46+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/favicon-512x512.png",
"language": "de-DE",
"image": "https://journal.3960.org/posts/2019-03-27-wettergeraet-fuer-aerofly-fs2/favicon-512x512.png",
"tags": [
"Aerofly FS2",
"Fliegerei",
"API",
"Für Tumblr",
"Programmierung",
"Simulation",
"Spiel"
]
},
{
"id": "user/posts/2019-02-28-ueber-impertinenz/index.md",
"url": "https://journal.3960.org/posts/2019-02-28-ueber-impertinenz/",
"title": "Über Impertinenz",
"content_html": "<blockquote><p>Wer sich einen impertinenten Tonfall leistet, sollte sich seiner Sache besser sicher sein.</p></blockquote>\n<p>Besser ist es natürlich, Recht zu haben <em>und</em> ein angenehmer Gesprächspartner zu bleiben.</p><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=%C3%9Cber%20Impertinenz&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-02-28-ueber-impertinenz%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Wer sich einen impertinenten Tonfall leistet, sollte sich seiner Sache besser sicher sein.\n\nBesser ist es natürlich, Recht zu haben und ein angenehmer Gespr…",
"date_published": "2019-02-28T18:46:14+01:00",
"date_modified": "2019-02-28T18:46:14+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Idee",
"Meinung",
"Philosophie"
]
},
{
"id": "user/posts/2019-02-14-simplex-duplex/index.md",
"url": "https://journal.3960.org/posts/2019-02-14-simplex-duplex/",
"title": "Simplex, Duplex",
"content_html": "<ul>\n<li>Simplex: Es funktioniert nur eine Richtung gleichzeitig.</li>\n<li>Duplex: Es funktionieren beide Richtungen gleichzeitig.</li>\n<li>Durex: Es funktioniert keine Richtung… in 99% der Fälle jedenfalls.</li>\n</ul><img src=\"https://stats.3960.org/p.php?idsite=8amp;action_name=Simplex%2C%20Duplex&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-02-14-simplex-duplex%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
"summary": "Simplex: Es funktioniert nur eine Richtung gleichzeitig.\nDuplex: Es funktionieren beide Richtungen gleichzeitig.\nDurex: Es funktioniert keine Richtung… in 99%…",
"date_published": "2019-02-14T19:11:34+01:00",
"date_modified": "2019-02-14T19:11:34+01:00",
"author": {
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
},
"authors": [
{
"name": "Frank Boës",
"url": "mailto:info@3960.org",
"avatar": "https://www.gravatar.com/avatar/71fcf51cf2ae9acdd54182d3e367ceca"
}
],
"banner_image": "https://cdn.3960.org/favicon-192x192.png",
"language": "de-DE",
"image": "https://cdn.3960.org/favicon-192x192.png",
"tags": [
"Lustiges",
"Programmierung",
"Webdevelop"
]
}
]
}