<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/vendor/feed/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
                        <id>http://blog.maxham.de/feed</id>
                                <link href="http://blog.maxham.de/feed" rel="self"></link>
                                <title><![CDATA[blog.maxham.de - all blogposts]]></title>
                    
                                <subtitle>All blogposts on blog.maxham.de</subtitle>
                                                    <updated>2025-12-15T23:35:32+01:00</updated>
                        <entry>
            <title><![CDATA[★ Zhylon Realtime: Datenschutz und Kontrolle in Echtzeit-Events]]></title>
            <link rel="alternate" href="https://blog.maxham.de/2-zhylon-realtime-datenschutz-und-kontrolle-in-echtzeit-events" />
            <id>https://blog.maxham.de/2</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Mit <strong><a href="https://realtime.zhylon.net/">Zhylon Realtime</a></strong> entsteht aktuell ein neuer Baustein im Zhylon-Ökosystem:<br />
ein moderner Realtime-Service für WebSocket-Events, vollständig kompatibel mit <a href="https://laravel.com/docs/broadcasting">Laravel Broadcasting</a> – <strong>aber datenschutzkonform, transparent und in europäischer Infrastruktur betrieben</strong>.</p>
<p>Der Fokus liegt dabei bewusst nicht nur auf Technik, sondern auf <strong>Kontrolle, Klarheit und Datenschutz</strong>.</p>
<h2 id="datenschutz-von-anfang-an-mitgedacht">Datenschutz von Anfang an mitgedacht</h2>
<p>Realtime-Events enthalten oft sensible Informationen: Nutzeraktivität, Anwesenheitsdaten oder interne Systemzustände.<br />
Zhylon Realtime läuft vollständig innerhalb meiner eigenen Infrastruktur – <strong>keine US-Cloud, keine Drittanbieter, keine unklaren Datenflüsse</strong>.</p>
<p>In Kombination mit <strong>EUStorage.eu</strong> bleiben Logs, Metriken und optionale Persistenz <strong>ausschließlich in Europa</strong>.<br />
Datenschutz ist hier kein Feature, sondern die Grundlage.</p>
<h2 id="teil-eines-geschlossenen-okosystems">Teil eines geschlossenen Ökosystems</h2>
<p>Zhylon Realtime ist kein isoliertes Tool, sondern ein integrierter Teil des Zhylon-Ökosystems:</p>
<ul>
<li>zentrale Verwaltung</li>
<li>klare App-Trennung</li>
<li>transparentes Controlling</li>
<li>keine Blackbox-Abrechnung</li>
</ul>
<p>Das reduziert Komplexität und macht den Betrieb planbar – gerade für Laravel-basierte Projekte.</p>
<h2 id="mehr-details-auf-patreon">Mehr Details auf Patreon</h2>
<p>Auf Patreon gehe ich deutlich tiefer:</p>
<ul>
<li>technische Hintergründe</li>
<li>Architektur-Entscheidungen</li>
<li>Datenschutz-Überlegungen</li>
<li>Roadmap &amp; nächste Schritte</li>
</ul>
<p>Wenn du sehen willst, <strong>warum und wie Zhylon Realtime entsteht</strong>, findest du dort den vollständigen Beitrag:</p>
<p>? <strong><a href="https://www.patreon.com/posts/zhylon-realtime-145936569?utm_medium=clipboard_copy&amp;utm_source=copyLink&amp;utm_campaign=postshare_creator&amp;utm_content=join_link">Zum ausführlichen Beitrag auf Patreon</a></strong></p>
]]>
            </summary>
                                    <updated>2025-12-15T23:35:32+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Zhylon hebt ab – Unsere neue Infrastruktur steht]]></title>
            <link rel="alternate" href="https://blog.maxham.de/3-zhylon-hebt-ab-unsere-neue-infrastruktur-steht" />
            <id>https://blog.maxham.de/3</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p><strong>Vollständiger Artikel auf Patreon verfügbar.</strong><br />
Mit deiner Unterstützung wächst Zhylon weiter.</p>
<p><a href="https://www.patreon.com/posts/143589218">https://www.patreon.com/posts/143589218</a></p>
<p>In den letzten Monaten hat sich bei Zhylon mehr verändert, als man nach außen sieht. Im Hintergrund ist eine Infrastruktur entstanden, die für ein unabhängiges Projekt unserer Größe eigentlich völlig verrückt wirkt – aber genau das ist unser Anspruch. Zhylon soll langfristig wachsen, stabil laufen und eine moderne Basis für Gaming, Tools, APIs, CDN und Community-Projekte bieten.</p>
<p>Wir haben einen der größten internen Schritte der gesamten Zhylon-Geschichte abgeschlossen. Die Systeme laufen jetzt schneller, leiser, sicherer und deutlich effizienter.</p>
<p><strong>Hardware &amp; Netzwerk</strong><br />
Vor Ort wurde alles modernisiert: neue UGREEN Gigabit Switches, hochwertige CAT8-Verkabelung sowie leistungsstarke 120mm-Lüfter für stabilere Temperaturen. Das sorgt nicht nur für bessere Performance, sondern auch für professionelle Ordnung im Rack.</p>
<p><strong>Rechenzentrum &amp; Hybrid-Serverstruktur</strong><br />
Zhylon besteht jetzt aus zwei eng verzahnten Welten:<br />
Drei leistungsstarke Produktionsserver im Netcup-Rechenzentrum bilden das Rückgrat. Dazu kommen vier produktive Hybrid-Server bei mir vor Ort – abgesichert durch WireGuard und Cloudflare Zero Trust. Sie übernehmen Redis, Queue-Worker, Backups, Logging, interne APIs, Datenverarbeitung, Microservices und sogar Gameserver.</p>
<p><strong>Software &amp; Architektur</strong><br />
Mit redundanten MariaDB-Instanzen, MinIO-S3-Storage, mehreren NGINX-Proxies, Cloudflare Tunnels, Redis, Netdata, Sitealarm und einem sorgsam abgesicherten Zero-Port-Sicherheitskonzept ist die Infrastruktur nun stabiler und moderner als je zuvor.</p>
<p><strong>Der Blick nach vorn</strong><br />
Wir stehen erst am Anfang: MinIO-Cluster, mehr Server, getrennte Rollen pro Maschine, internationale Performance-Optimierungen, skalierbare Dienste und georedundante Backups sind bereits geplant.</p>
<p>Zhylon ist kein Hobby-Projekt — es ist ein kleines Ökosystem, das ständig wächst.<br />
Und diese neue Infrastruktur ist ein Meilenstein in genau diese Richtung.</p>
]]>
            </summary>
                                    <updated>2025-11-14T19:14:00+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ ELNU wird zum Zhylon CDN]]></title>
            <link rel="alternate" href="https://blog.maxham.de/5-elnu-wird-zum-zhylon-cdn" />
            <id>https://blog.maxham.de/5</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Wir haben große Pläne für unser Ökosystem. Ein wichtiger Schritt ist die Zusammenführung unseres bisherigen Dienstes <strong>ELNU</strong> mit <strong>Zhylon</strong>. Daraus entsteht das <strong>Zhylon CDN</strong> – eine neue Plattform für schnelle, zuverlässige Content-Auslieferung.</p>
<p>Was bedeutet das? Zum einen wird <strong><a href="https://elnu.de">elnu.de</a></strong> künftig automatisch auf eine <a href="https://zhylon.net"><strong>zhylon.net</strong></a>-Domain weitergeleitet. Zum anderen bauen wir eine klare Integration in das <strong>Zhylon-Ökosystem</strong> auf. Mit einem zentralen Login (OAuth) und einer neuen API wird es deutlich einfacher, Inhalte zu verwalten und Updates zu automatisieren.</p>
<p>Das Beste: Die Nutzung bleibt wie bisher <strong>kostenlos</strong>. Gleichzeitig bringen wir ein neues Dashboard, modernes Branding und langfristig eine klare Roadmap mit.</p>
<p>Damit wird das CDN nicht nur ein Tool zum Ausliefern von Dateien, sondern ein <strong>fester Bestandteil des Zhylon-Universums</strong>.</p>
<p>? Alle Details und die komplette Ankündigung findest du hier:</p>
<p><a href="https://www.patreon.com/posts/138535366?utm_campaign=postshare_creator&amp;utm_content=android_share">https://www.patreon.com/posts/138535366</a></p>
]]>
            </summary>
                                    <updated>2025-09-13T12:06:07+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Meine Projekte 2024: Fortschritte trotz Zeitmangel]]></title>
            <link rel="alternate" href="https://blog.maxham.de/4-meine-projekte-2024-fortschritte-trotz-zeitmangel" />
            <id>https://blog.maxham.de/4</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Manchmal läuft das Leben nicht nach Plan – und genau das habe ich dieses Jahr deutlich zu spüren bekommen. Ursprünglich wollte ich 2024 nutzen, um berufliche und private Ziele voranzutreiben. Stattdessen wurde es ein Jahr, das mich in vielerlei Hinsicht an meine Grenzen gebracht hat. Trotzdem möchte ich zurückblicken, denn auch in schwierigen Zeiten gibt es Fortschritte, die zählen.</p>
<h2 id="berufliche-erfolge-trotz-hoher-belastung">Berufliche Erfolge trotz hoher Belastung</h2>
<p>Beruflich war dieses Jahr ein Ausnahmejahr. Eines der spannendsten Projekte war zweifellos die Umsetzung von gleich zwei großen Meilensteinen mit unserer Verbandssoftware. Nach über einem Jahrzehnt Mitarbeit an diesem System ist es immer wieder beeindruckend zu sehen, wie es wächst und sich weiterentwickelt.</p>
<p>Ein Highlight dieses Jahres war der erfolgreiche Einsatz unserer <a href="https://www.it4sport.de/">Verbandssoftware</a> in einem besonders großen Projekt – ein echter Meilenstein, der zeigt, wie weit die Software inzwischen gereift ist. Kurz darauf konnten wir einen weitere Kunden aus dem Sportbereich für unsere Lösung gewinnen. Diese Erfolge bestätigen, dass sich die vielen investierten Stunden und die harte Arbeit auszahlen.<br />
Hier auch nochmal die News aus dem letzten Jahr. <a href="https://tricept.de/news-stories/detail/news/it4sport-blickt-auf-ein-erfolgreiches-jahr-zurueck-1">Klick hier (News von Tricept.de 20.12.23)</a></p>
<p>Doch sie hatten auch ihren Preis: Viele Überstunden und die intensive Arbeit an diesen Projekten führten dazu, dass private Projekte in den Hintergrund rücken mussten. Es war nicht immer einfach, diese Balance zu finden, aber ich bin dennoch dankbar, Teil eines Teams zu sein, das solche Herausforderungen gemeinsam meistert.</p>
<h2 id="private-herausforderungen-ein-jahr-des-umbruchs">Private Herausforderungen: Ein Jahr des Umbruchs</h2>
<p>Parallel dazu war auch das Privatleben alles andere als ruhig. Ein erneuter Umzug brachte uns nicht nur in eine neue Umgebung, sondern auch einen deutlich längeren Schulweg für meine Kinder. Jeden Tag verbringe ich mehrere Stunden damit, sie hin und her zu fahren. Dieser Umstand beansprucht viel Zeit und Energie, die ich sonst in private Projekte hätte stecken können.</p>
<p>Zum Glück ist dieser Zustand nur vorübergehend – spätestens mit dem Ende des Schuljahres 2024/25 wird sich das wieder ändern. Doch aktuell bedeutet es, dass meine Kapazitäten stark begrenzt sind und persönliche Ziele warten müssen.</p>
<hr />
<h2 id="fortschritte-trotz-begrenzter-zeit-meine-projekte-2024">Fortschritte trotz begrenzter Zeit: Meine Projekte 2024</h2>
<p>Trotz der vielen Herausforderungen in diesem Jahr gab es auch Lichtblicke bei meinen privaten Projekten. Obwohl ich weit weniger Zeit investieren konnte, als ursprünglich geplant, haben einige Projekte dennoch Fortschritte gemacht, die mich stolz machen.</p>
<h3 id="strongsitealarm-fortschritte-im-website-monitoringstrong"><strong>Sitealarm: Fortschritte im Website Monitoring</strong></h3>
<p><a href="https://sitealarm.de/">Sitealarm</a>, mein Website-Monitoring-Tool, war eines der Projekte, bei dem ich ursprünglich mit großen Plänen in das Jahr gestartet bin. Geplant war die Umstellung auf eine neue Version Anfang 2024 – ein Ziel, das ich leider verschieben musste.</p>
<p>Stattdessen habe ich mich intensiv auf die Optimierung der Synchronisation zwischen Sitealarm und den Zhylon Services konzentriert. Der wichtigste Fortschritt: Jeder Server und jede Website wird jetzt automatisch mit einem Monitor versehen, sodass keine zusätzlichen Schritte mehr notwendig sind. Diese Automatisierung spart Zeit und erleichtert die Nutzung enorm.</p>
<p>Zusätzlich ist die geplante <em>&quot;App-Health&quot;-Funktion</em> schon fast abgeschlossen. Damit wird es Ende 2024 oder Anfang 2025 endlich möglich sein, die Umstellung zur neuesten Version anzugehen.<br />
Darüber hinaus habe ich die <a href="https://docs.sitealarm.de/">Dokumentation</a> umfassend überarbeitet. Dadurch werden viele Funktionen, die bislang im Verborgenen blieben, nun klarer sichtbar und leichter nutzbar.</p>
<blockquote>
<p>Fun Fact: „Wir“ heißt in diesem Fall eigentlich nur <em>ich</em>. Aber dazu später mehr.</p>
</blockquote>
<h3 id="strongzhylon-das-ecosystem-wachststrong"><strong>Zhylon: Das Ecosystem wächst</strong></h3>
<p>Auch <a href="https://zhylon.net/">Zhylon</a>, mein vermutlich gößtes Software-Ecosystem, konnte dieses Jahr wichtige Fortschritte machen. Hier haben wir die Funktionalität auf mehreren Ebenen erweitert:</p>
<ul>
<li><strong>Projektmanagement</strong>: Es ist nun möglich, pro Projekt einzelne Server und Websites anzulegen. Das erlaubt die Verwaltung verschiedener Umgebungen, die auf unterschiedlichen Branches arbeiten – alles in einer zentralen Oberfläche.</li>
<li><strong>Verbesserte CLI</strong>: Die Command-Line-Integration von Zhylon wurde optimiert. Jetzt lassen sich lokale Projekte direkt über die CLI steuern: <em>Hooks ausführen, neue Versionen deployen, Logs abrufen</em> – alles nahtlos und effizient.</li>
<li><strong>Neuer Mailserver</strong>: Ein weiteres Highlight ist die Einführung eines eigenen Mailservers, der perfekt in das Zhylon-Ecosystem integriert ist. Dieser Punkt verdient eigentlich einen eigenen Blogpost, den ich bald nachreichen werde.</li>
<li><strong>Domains und Server Management</strong>: Komplett neu ist das System zur Verwaltung von Domains und Servern, die automatisch in Zhylon integriert werden. Diese Erweiterung macht das Ecosystem noch leistungsfähiger und anwenderfreundlicher.</li>
</ul>
<h3 id="strongdas-community-projekt-idzhylonnetstrong"><strong>Das Community-Projekt: ID.zhylon.net</strong></h3>
<p>Ein weiterer Meilenstein ist die Weiterentwicklung von Zhylon als Community-Projekt. Unter <a href="https://id.zhylon.net">ID.zhylon.net</a> haben alle Nutzer jetzt die Möglichkeit, das Projekt aktiv zu unterstützen – sei es über Plattformen wie Patreon, GitHub Sponsors, Ko-Fi oder einmalige Spenden.</p>
<p>Diese Unterstützung ist essenziell, um die Entwicklung langfristig voranzutreiben und neue Features zu ermöglichen. Mit einem stärkeren Fokus auf die Community erhoffe ich mir, dass wir gemeinsam in den nächsten Jahren noch mehr erreichen können.</p>
<hr />
<h2 id="ein-blick-nach-vorn">Ein Blick nach vorn</h2>
<p>2024 war ein Jahr voller Herausforderungen – beruflich wie privat. Es gab Rückschläge, Verzögerungen und viele Momente, in denen ich an meine Grenzen gestoßen bin. Aber wenn ich jetzt zurückblicke, sehe ich nicht nur die Schwierigkeiten, sondern auch die Erfolge, die ich trotz allem erreicht habe.</p>
<p>Besonders stolz bin ich auf die Fortschritte bei Sitealarm und Zhylon. Diese Projekte zeigen mir, dass selbst kleine Schritte etwas Großes bewirken können, wenn man dranbleibt. Sie sind ein Beweis dafür, dass auch in schwierigen Zeiten etwas vorangehen kann – und das motiviert mich für die Zukunft.</p>
<h3 id="was-kommt-2025">Was kommt 2025?</h3>
<p>Im kommenden Jahr möchte ich an diesen Projekten weiterarbeiten und einige der geplanten Meilensteine endlich umsetzen. Dazu gehört die Umstellung von Sitealarm auf die neue Version und die Erweiterung des Zhylon-Ecosystems. Aber vor allem möchte ich versuchen, eine bessere Balance zwischen Arbeit, Projekten und meiner privaten Zeit zu finden.</p>
<p>Natürlich werde ich in den kommenden Monaten auch weiter über diese Themen schreiben. In den nächsten Blogeinträgen möchte ich tiefer in die einzelnen Projekte eintauchen – von der Entwicklung des Mailservers bis hin zu den neuen Features von Sitealarm und Zhylon. Wenn dich also die technischen Details oder die Herausforderungen hinter den Kulissen interessieren, bleib dran!</p>
<p>Es wird nicht immer einfach sein, und ich weiß, dass auch 2025 neue Herausforderungen bringen wird. Doch eines habe ich dieses Jahr gelernt: Es ist okay, wenn nicht immer alles nach Plan läuft – wichtig ist, dass man trotzdem weitermacht.</p>
<p>Vielen Dank, dass du diesen Rückblick gelesen hast. Wenn du Lust hast, meine Projekte zu unterstützen oder einfach mehr darüber zu erfahren, schau gerne bei <a href="https://id.zhylon.net">ID.zhylon.net</a> vorbei. Zusammen können wir etwas Großartiges schaffen.</p>
]]>
            </summary>
                                    <updated>2024-11-26T22:45:00+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Rückblick auf ein ereignisreiches Jahr 2021]]></title>
            <link rel="alternate" href="https://blog.maxham.de/10-ruckblick-auf-ein-ereignisreiches-jahr-2021" />
            <id>https://blog.maxham.de/10</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Es ist eigentlich jedes Jahr das gleiche. Der Dezember beginnt, mein Geburtstag naht und ich wundere mich jedes Mal darüber, wie schnell das Jahr wieder vergangen ist. In diesem Jahr habe ich die letzten Wochen etwas mehr Urlaub als sonst und kann das Jahr ganz in Ruhe mit der Familie ausklingen lassen. Zeit auch dafür, das Jahr noch einmal rückblickend zu bewerten und Ziele für das nächste Jahr zu setzen (<a href="https://blog.maxham.de/?p=438">könnt ihr hier nachlesen</a>).</p>
<p>Auch dieses Jahr war wieder geprägt durch die noch anhaltende Corona Pandemie. Das habe ich selbst vor allem dadurch gespürt, dass sich meine privaten Projekte deutlich langsamer entwickelt haben, als ich ursprünglich wollte. Nicht nur durch die fehlenden engen Gespräche mit Freunden, auch das erhöhte Home-Office und mehr Zeit mit der Familie hatten darauf Auswirkungen. Nun muss ich aber sagen, dass dies ja nichts schlechtes ist. Mehr Zeit mit der Familie verbringen zu können ist wahrlich etwas schönes und ich genieße jede Minute, die ich mit ihnen verbringen kann. Auch das Home-Office bringt viele Vorteile mit sich. Es fallen gut zwei Stunden Fahrtzeit weg und auch die Spritkosten wirken sich positiv auf die Umwelt und den Geldbeutel aus.</p>
<p>Ich sehe es ein wenig wie eine inspirierende Auszeit an, um neue Ideen für neue und bestehende Projekte zu sammeln. Davon war das Jahr auch geprägt. Ich habe über 200 Stunden Tutorials bei <a href="https://laracasts.com/@TobyMaxham">Laracasts</a> und auf YouTube angesehen. Viele neue Technologien ausprobiert, z.B. PHP 8.0 und 8.1, <a href="https://tailwindcss.com/">Tailwind CSS</a> oder <a href="https://laravel-livewire.com/">Laravel Livewire</a>. Ich habe viel mit GitHub Actions experimentiert und meine DevOps Skills erweitert. Kurzum, ich habe viel Erfahrung gesammelt aber relativ wenig Projekte umgesetzt.</p>
<h2 id="strongprojekt-ux9-url-shortenerstrong"><strong>Projekt UX9 URL Shortener</strong></h2>
<p>Hier gab es wohl die größten Veränderungen. Gegen Ende des Jahres habe ich die Anwendung überarbeitet und auf Laravel 8 umgebaut. Außerdem für PHP 8.0 bzw. PHP 8.1 vorbereitet. Zudem gibt es nun für alle Klassen Unit Tests wodurch ich eine Code Coverage von über 90% erreichen konnte. <a href="https://ux9.de/">https://ux9.de/</a></p>
<h2 id="strongprojekt-zhylon-und-deployerstrong"><strong>Projekt Zhylon und Deployer</strong></h2>
<p>Danke vor allem an meinen guten Freund Norbert, der hier nun viel Entwicklungsarbeit leistet. Zusammen konnten wir einige Updates einspielen was das Server Deployment nun deutlich erleichtert. Es gibt nun auch eine Version für kleine Teams und einen besseren Server Monitor. Zuletzt habe ich noch den OAuth2 Server aktiviert, wodurch ich neben MX-Codes nun auch Zhylon als Login verwenden kann. Gerne kann jeder sich beteiligen oder Beta Tester werden. Das Projekt wird noch einige Zeit brauchen, bis es komplett öffentlich werden kann. <a href="https://zhylon.de/">https://zhylon.de/</a></p>
<h2 id="strongprojekt-managementstrong"><strong>Projekt Management</strong></h2>
<p>Dieses Projekt hat vor etwa einem Jahr begonnen, da ich mit der Umstellung auf MacOS das von meinem Betrieb bereitgestellte <a href="https://tricept.de/referenzen/details/reference/modernisierung-einer-proprietaeren-zeiterfassungs-und-abrechnungsloesung">Zeit-Buchungs-Tool</a> nicht mehr nutzen konnte. Um mir das Buchen meiner Arbeitszeit etwas einfacher zu machen, habe ich ein altes Projekt wieder zum Leben erweckt und um einige neue Features erweitert. Norbert und Heiko konnte ich auch davon begeistern, sodass es nun regelmäßig mit großen und kleinen Updates ausgeschmückt wird. Nachdem wir bisher kein Namen für das Projekt finden konnten, haben wir nun endlich eine Domain gefunden und bestellt. Somit ist das Projekt nun ganz offiziell nutzbar <a href="https://pro%C4%B5ect.de/">https://proĵect.de/</a>. Der Basiscode soll demnächst Open Source werden, sodass vielleicht eine Community entstehen könnte um noch mehr Features zu bekommen.</p>
<p>Wie ihr gelesen habt, bin ich mit dem ganzen Jahr eigentlich sehr zufrieden. Ich bin auch sehr froh darüber, dass mich die Pandemie nur am Rande betroffen hat und ich kaum größere Einschnitte dadurch gespürt habe. Ich hoffe auch das kommende Jahr wird wieder ein gutes und erfolgreiches Jahr.</p>
<p><strong>Euch allen wünsche ich auf jeden Fall ein erfolgreiches, glückliches und gesundes neues Jahr.</strong></p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2021/12/px-downloadge5edb811be9300bd160b6a8385c30040df137aec9c200353f33890d97438a5b7eac7f62e5d0582d9fdab1edb9fd42baf3f161ff22fcb7a0aad1bac21c5533d3f_19209161231299103037186-1024x576.jpg" alt="Download Beispielbild">
</figure>
]]>
            </summary>
                                    <updated>2021-12-30T17:34:24+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ UX9 URL Shortener: Upgrade auf Laravel 8 - Teil 2]]></title>
            <link rel="alternate" href="https://blog.maxham.de/8-ux9-url-shortener-upgrade-auf-laravel-8-teil-2" />
            <id>https://blog.maxham.de/8</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Bevor ich mit der eigentlichen Umstellung begonnen haben, hatte ich mir ausführlich überlegt, was ich alles umstellen muss, und wie ich die Umstellung gestalten möchte. Relativ schnell ist mir aufgefallen, dass das Projekt zwar über die letzten 10 Jahre sehr gewachsen ist, der wesentliche Kern hingegen beschränkt sich auf wenige Klassen. Ich habe mich daher für eine Upgrade Strategie entschieden, die in der Regel für kleinere Projekte sehr gut funktionieren kann, hingegen für größere Projekte viel zu Aufwändig ist.</p>
<p>Hast du den ersten Teil bereits gelesen? Noch nicht, kein Problem. Hier geht es zum ersten Teil: <a href="https://blog.maxham.de/2021/11/ux9-url-shortener-upgrade-auf-laravel-8-teil-1/">UX9 URL Shortener: Upgrade auf Laravel 8 – Teil 1</a></p>
<p>Ich nenne die Strategie &quot;Copy-To-New&quot;, mit der ich in den letzten Jahre sehr gut bei kleine Projekten gefahren bin. Dabei ist die eigentliche Umstellung recht schnell beschrieben:</p>
<p>1. Alle Projekt-Dateien in ein &quot;Backup&quot;-Verzeichnis verschieben<br />
2. Neue Laravel Installation bereit stellen<br />
3. &quot;Alten&quot;-Code Schritt für Schritt wieder in die neue Installation verschieben<br />
4. Alle Änderungen Testen (Unit Tests)</p>
<p>Bei dieser Methode ist der 4. Punkt äußerst essentiell. Ich habe die Erfahrung gemacht, dass das Testen der Anwendung am Ende doch schwieriger ist, als man sich das zuvor überlegt hatte. Darum empfehle ich, je nach Größe und Umfang des Projekts, immer PHP-Unit Tests zu verwenden, mit welchen man die Funktion des Programmes auch nach dem Upgrade sicherstellen kann.</p>
<p>Leider hatte ich bis dato noch keinen (nicht einen einzigen) PHP-Unit Test für meinen URL Shortener geschrieben. Da ich aber seit einige Jahren auf das <a href="https://de.wikipedia.org/wiki/Testgetriebene_Entwicklung">Test-Drive-Development</a> setze, wollte ich das nun auch in diesem Projekt einführen. Also der ideale Zeitpunkt, um nun damit zu beginnen. Mein erster Schritt war also, für das gesamte Programm PHP-Unit Tests zu schreiben. Hier mal ein Beispiel, wie eine Test-Klasse bei mir aussieht. Der Test prüft einige Prozesse vom User-Dashboard:</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2021/11/ux9-test-cases-969x1024.png" alt="UX9 Test Cases: URL Shortener">
  <figcaption>UX9 Test Cases: URL Shortener</figcaption>
</figure>
<p>Für diese Phase habe ich etwa 200 Test geschrieben. Ich konnte damit eine Test-Abdeckung von ca. 73% erreichen. Bis zum Ende der Umstellung und weiterem Refactoring, möchte ich eine Test-Abdeckung von über 90% erreichen. Es werden also im Laufe und vermutlich auch direkt nach dem Upgrade noch einige weitere Tests folgen.</p>
<p>Im nächsten Teil dieser Serie, werde ich die ersten beiden Punkte näher beschreiben. Damit ist dann die Grundlage für jede weitere Umstellung gesetzt.</p>
]]>
            </summary>
                                    <updated>2021-11-16T12:00:00+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ MySQL > Unterschied zwischen VARCHR und TEXT]]></title>
            <link rel="alternate" href="https://blog.maxham.de/6-mysql-unterschied-zwischen-varchr-und-text" />
            <id>https://blog.maxham.de/6</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Hier mal ein spannender Artikel zum Unterschied zwischen den Datentypen VARCHAR und TEXT. Es wird sehr genau darauf eingegangen.</p>
<p>Hier auch die aus dem Artikel stammende kurze Antwort: &quot;<em>Verwende VARCHAR, wenn deine Daten eine variable Länge haben und du weißt, dass sie in die 65.535-Zeichen-Grenze von VARCHAR passen. In den meisten Fällen bietet VARCHAR eine bessere Leistung, ist flexibler und kann vollständig indiziert werden. Wenn du längere Zeichenfolgen speichern musst, verwende MEDIUMTEXT oder LONGTEXT, aber beachte, dass sehr große Datenmengen in Spalten dieses Typs gespeichert werden können.</em>&quot;</p>
<p>Von <a href="https://blog.cpanel.com">cPanel</a> am 7. Oktober 2021 <a href="https://blog.cpanel.com/varchar-vs-text-for-mysql-databases/">https://blog.cpanel.com/varchar-vs-text-for-mysql-databases/</a></p>
]]>
            </summary>
                                    <updated>2021-11-06T21:26:00+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ UX9 URL Shortener: Upgrade auf Laravel 8 - Teil 1]]></title>
            <link rel="alternate" href="https://blog.maxham.de/7-ux9-url-shortener-upgrade-auf-laravel-8-teil-1" />
            <id>https://blog.maxham.de/7</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Ich habe wieder einmal meinen Urlaub genutzt, um einige meiner privaten Projekte weiter zu entwickeln. Eines meiner derzeit größten Projekten ist mein eigener URL Shortener: <a href="https://ux9.de">https://ux9.de</a></p>
<p>Das ist neben meiner eigenen Homepage mittlerweile auch das Projekt, welches am längsten läuft. Bereits Ende 2009 habe ich mit den ersten Ideen dazu angefangen und diese noch auf meinem derzeitigen Blog (kein Wordpress) genutzt, um externe Verlinkungen zu analysieren und durch eine einfache Verkürzung besser darstellen zu können. Mit dem Erwerb von mehreren dreistelligen Domains, hat mein URL Shortener dann in den darauffolgenden Jahren auch seine eigene Seite bekommen.</p>
<p>Das Projekt wurde mit der Zeit stetig erweitert. Die ersten Jahre habe ich nur PHP ohne Framework verwendet. Seit 2015 habe ich dort dann mit Laravel 4.2 bzw. Laravel 5 als Framework begonnen. Dabei habe ich auch die Grundstruktur des Projektes neu organisiert. Neben stetigen Weiterentwicklungen gab es zuletzt ein Upgrade auf Laravel 6 im September 2019.</p>
<p>Die darauffolgenden Jahre war ich mir nicht sicher, ob ich das Projekt überhaupt noch weiter betreiben möchte oder nicht. Nach viel Überlegen habe ich mich aber dazu entschlossen, das Projekt weiter laufen zu lassen. Die Vorraussetzung dafür ist aber, dass das Projekt von Grund auf neu strukturiert wird, mit Unit-Test ergänzt wird und es eine vernünftige Möglichkeit gibt, dass Administratoren die einzelnen Module verwalten können.</p>
<p>Die Umstellung meiner Seite, möchte ich in dieser Serie von Beiträgen mit euch teilen. Ich hoffe ich kann damit einen kleinen Einblick geben, wie man Projekte sinnvoll umstellen kann. Die Teile werden in den nächsten 1-2 Wochen erscheinen.</p>
]]>
            </summary>
                                    <updated>2021-11-06T12:21:29+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Composer 2.0 ist erschienen]]></title>
            <link rel="alternate" href="https://blog.maxham.de/13-composer-20-ist-erschienen" />
            <id>https://blog.maxham.de/13</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Endlich ist es soweit. Eine neue Major Version von Composer, dem Paket Manager von PHP, ist erschienen.</p>
<p>Was ihr außer einer erheblichen Performance Verbesserung noch alles erwarten könnt, gibt es auf dem offiziellen Blog von <a href="https://blog.packagist.com">Packagist</a> nachzulesen.</p>
<p><a href="https://blog.packagist.com/composer-2-0-is-now-available/">https://blog.packagist.com/composer-2-0-is-now-available/</a></p>
]]>
            </summary>
                                    <updated>2020-10-25T13:58:29+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Ubuntu - Anzeige der Package Updates]]></title>
            <link rel="alternate" href="https://blog.maxham.de/9-ubuntu-anzeige-der-package-updates" />
            <id>https://blog.maxham.de/9</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Der Ubuntu-Paketmanager verfügt über mehrere Tools, um die verfügbaren Paketaktualisierungen für installierte Deb-Pakete aufzulisten. Schau dir die verschiedenen Möglichkeiten an und wähle die Methode aus, mit der du dich am wohlsten fühst. Die beiden ersten Befehel, sind meine Favoriten. Denn diese liefern die verfügbaren Paketaktualisierungen mit den Versionsdetails aus.</p>
<p>Diese Befehle funktionieren gut für 20.04. Möglicherweise müssen zusätzliche Tests für ältere Versionen von Ubuntu durchgeführt werden.</p>
<p><strong>Hinweis</strong>: Führe &quot;apt-get update&quot; aus, bevor du die Liste der verfügbaren Paketaktualisierungen überprüfst. Dadurch werden die Repository-Metadaten aktualisiert.</p>
<p>I. Dry-run apt-get</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2020/10/grafik-1024x496.png" alt="grafik">
</figure>II. Direkte Option in apt-get
<p>Dieser Befehl listet die installierte Paketversion und die Zielversion auf, in die sie übernommen werden kann. Dies ist sehr ausführlich um zu verstehen, welche Pakete aktualisiert werden.</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2020/10/grafik-1-1024x679.png" alt="apt list --upgradable">
  <figcaption>apt list --upgradable</figcaption>
</figure>
<p>III. Prüfen von Updates via check</p>
<p>Der Befehl &quot;apt-check&quot; eignet sich am besten, um einen Cron-Job zu planen, der den Administrator meldet, wenn Updates verfügbar sind.</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2020/10/grafik-2.png" alt="apt-check">
  <figcaption>apt-check</figcaption>
</figure>
<p>IV. Verwendung von &quot;dpkg&quot;</p>
<p>Ich hoffe, dieser Befehl funktioniert für jede Version von Ubuntu. Führe &quot;apt-get update&quot; aus, bevor Sie die folgende Befehle ausführst.</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2020/10/grafik-3-931x1024.png" alt="Verwendung von dpkg">
  <figcaption>Verwendung von "dpkg"</figcaption>
</figure>
<p>V. Zuletzt die Verwendung von &quot;aptitude&quot;</p>
<p>Mit &quot;aptitude&quot; wird ein anderes Ausgabeformat gezeigt. Das aptitude-Paket muss installiert sein, damit dieser Befehl funktioniert.</p>
<figure class="wp-block-image size-large">
  <img src="https://blog.maxham.de/admin-uploads/wp-uploads/2020/10/grafik-4-1024x905.png" alt="aptitude">
  <figcaption>aptitude</figcaption>
</figure>
]]>
            </summary>
                                    <updated>2020-10-20T16:28:05+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Was gibt es neues in PHP 8]]></title>
            <link rel="alternate" href="https://blog.maxham.de/12-was-gibt-es-neues-in-php-8" />
            <id>https://blog.maxham.de/12</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Ende des Jahres ist es wieder soweit. Eine neue Major Version von PHP wird erscheinen. Am 26. November 2020 soll sie erscheinen. Welche Neuerungen bereits bekannt sind könnt ihr in diesem <a href="https://stitcher.io/blog/new-in-php-8">Blogbeitrag</a> von <a href="https://twitter.com/brendt_gd">Brent (@brendt_gd)</a> nachlesen. Hier ein kurzer Überblick: - Union types</p>
<ul>
<li>Just in time compiler (JIT)</li>
<li>Attributes (or Annotations)</li>
<li>Constructor property promotion</li>
</ul>
<p>static and mixed return type
throw expression
Trailing comma in parameter list
Das war allerdings nur ein kleiner Auszug von allen neuen Features.</p>
]]>
            </summary>
                                    <updated>2020-06-13T15:10:39+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Laravel und Heroku]]></title>
            <link rel="alternate" href="https://blog.maxham.de/11-laravel-und-heroku" />
            <id>https://blog.maxham.de/11</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Es ist eigentlich gar nicht so schwer, eine <a href="https://ux9.de/laravel">Laravel </a>Anwendung auf der <a href="https://ux9.de/heroku">Heroku</a> Plattform bereitzustellen. Was man dafür beachten muss und wie die Konfiguration aussehen könnte seht ihr in diesem Video:</p>
<p><a href="https://ux9.de/Kthi">https://ux9.de/Kthi</a></p>
]]>
            </summary>
                                    <updated>2019-01-27T22:40:02+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Ping: Zeitüberschreitung der Anforderung und Zielhost nicht erreichbar]]></title>
            <link rel="alternate" href="https://blog.maxham.de/16-ping-zeituberschreitung-der-anforderung-und-zielhost-nicht-erreichbar" />
            <id>https://blog.maxham.de/16</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Haben wir vermutlich alle schon einmal ausgeführt: <code>ping</code>. Doch was ist Ping eigentlich genau?</p>
<p>Ping ist das Netzwerk-Troubleshooting-Tool Nummer 1. Es sendet <a href="https://de.wikipedia.org/wiki/Internet_Control_Message_Protocol">ICMP</a>-Pakete an ein IP-fähiges Gerät – meist in der Hoffnung, dass dieses Gerät auch antwortet. Aber was bedeutet eigentlich <em>&quot;Zeitüberschreitung der Anforderung&quot;</em> und wie unterscheidet sich das von <em>&quot;Zielhost nicht erreichbar&quot;</em>?</p>
<h2 id="ein-funktionierender-ping">Ein funktionierender Ping</h2>
<p>Zunächst der Normalfall: Ich pinge einen Rechner in meinem Netzwerksegment.</p>
<p><img src="https://blog.maxham.de/admin-uploads/wp-uploads/2017/01/ping_ok.png" alt="Ping Ok" />
<em>Ping Ok</em></p>
<p>Der Rechner antwortet auf das 32 Bytes große Paket in 50–55 ms und der TTL-Wert liegt bei 62 (Anzahl der maximalen Hops). Alles in Ordnung, das Gerät ist erreichbar.</p>
<h2 id="zeituberschreitung-der-anforderung">Zeitüberschreitung der Anforderung</h2>
<p>Jetzt wird es interessant: Ein Computer mit der IP <code>192.168.1.4</code> ist offensichtlich im Netzwerk nicht erreichbar.</p>
<ul>
<li><strong>Meine IP:</strong> <code>192.168.1.54/24</code></li>
<li><strong>Zu testende IP:</strong> <code>192.168.1.4/24</code></li>
</ul>
<p>Beide Geräte befinden sich also im gleichen Subnetz und in derselben Broadcast-Domäne.</p>
<p><img src="https://blog.maxham.de/admin-uploads/wp-uploads/2017/01/ping_zeitueberschreitung.png" alt="Ping Zeitüberschreitung" />
<em>Ping Zeitüberschreitung</em></p>
<p>Was kann man daraus schließen? Viele gehen jetzt davon aus, dass das Gerät nicht erreichbar ist – sprich &quot;kaputt&quot;, ausgeschaltet oder nicht mehr im Netzwerk. <strong>Das stimmt so aber nicht.</strong></p>
<p>Zeitüberschreitung der Anforderung im lokalen Subnetz bedeutet lediglich, dass das Gerät innerhalb einer gewissen Zeitspanne keine ICMP-Pakete als Antwort sendet. Sonst nichts. Aus dieser Information allein kann auf nichts anderes geschlossen werden als auf die Tatsache, dass das Gerät nicht auf einen Ping antwortet.</p>
<p>Mit <code>arp -a</code> erkenne ich, dass die MAC-Adresse via ARP ermittelt wurde. Das heißt zwar nicht zwangsläufig, dass der Computer online ist (Stichwort ARP-Cache), aber ich habe vorher mit <code>arp -d</code> den ARP-Cache geleert.</p>
<p><img src="https://blog.maxham.de/admin-uploads/wp-uploads/2017/01/ping_arp-1024x397.png" alt="ARP" />
<em>ARP-Tabelle nach geleertem Cache</em></p>
<p>Meist lässt die Windows-Firewall eingehendes ICMP nicht zu – das Gerät ist also funktionsfähig, antwortet aber nicht. Hier die Ansicht in <code>wf.msc</code>:</p>
<p><img src="https://blog.maxham.de/admin-uploads/wp-uploads/2017/01/ping_firewall.png" alt="Firewall Einstellung" />
<em>Firewall-Einstellung für ICMP</em></p>
<p>Sobald die IPv4-Regeln aktiviert werden, antwortet das Gerät wie erwartet.</p>
<h2 id="zielhost-nicht-erreichbar">Zielhost nicht erreichbar</h2>
<p>Ganz anders sieht die Sache bei folgender Antwort aus: <em>Zielhost nicht erreichbar.</em></p>
<p><img src="https://blog.maxham.de/admin-uploads/wp-uploads/2017/01/ping_nicht_erreichbar.png" alt="Ping Nicht erreichbar" />
<em>Ping – Zielhost nicht erreichbar</em></p>
<p>Was lässt sich daraus schließen? Meist ist der Computer tatsächlich nicht online, und auch der ARP-Cache zeigt keine MAC-Adresse des Zielcomputers. Das bedeutet, dass bereits der ARP-Request fehlgeschlagen ist.</p>
<p>In den meisten Fällen kann man davon ausgehen, dass der Computer <strong>tatsächlich offline</strong> ist.</p>
<h2 id="fazit">Fazit</h2>
<p><strong>Zeitüberschreitung der Anforderung</strong>
: Gerät ist erreichbar (ARP erfolgreich), antwortet aber nicht auf ICMP – oft Firewall</p>
<p><strong>Zielhost nicht erreichbar</strong>
: ARP-Request fehlgeschlagen – Gerät ist mit hoher Wahrscheinlichkeit offline</p>
<p>Die beiden Meldungen werden oft synonym verwendet, sagen aber etwas komplett Unterschiedliches aus. Wer den Unterschied kennt, spart sich beim Troubleshooting viel Zeit.</p>
]]>
            </summary>
                                    <updated>2017-01-04T04:01:52+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ Laracon: Übersicht Laravel 5.3]]></title>
            <link rel="alternate" href="https://blog.maxham.de/14-laracon-ubersicht-laravel-53" />
            <id>https://blog.maxham.de/14</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Gestern hat <a href="http://taylorotwell.com/">Taylor Otwell</a> auf der <a href="http://laracon.us/">LaraconUS</a> einige neue Features von Laravel 5.3 präsentiert. Die Präsentation beinhaltete die vier Hauptpunkte: Laravel Scout, Laravel Passport, Laravel Mailable und Laravel Notifications. Hier nun ein grober Überblick, was man damit alles machen kann. ### Laravel Scout</p>
<p>Laravel Scout ist eine Treiber basierende Volltextsuche für <a href="https://laravel.com/docs/eloquent">Eloquent</a>. <a href="https://www.algolia.com/">Algolia</a> wird bereits bei der Auslieferung unterstützt. Da es jedoch Treiber basierend ist, können und werden noch andere Volltextsuch-Systeme integriert. Da wird es in der nächsten Zeit in der Community viele Vorschläge geben. <strong>Scout</strong> kann leicht über einen „<span style="text-decoration: underline;">Searchable</span>“-Trait in die bestehenden Models eingebaut werden. Anschließend müssen die Daten nur noch über einen Service synchronisiert werden. Dies könnte z.B. so aussehen: ```
php artisan scout:import App\Post</p>
<pre data-lang="txt" class="notranslate">
Dann kann danach gesucht werden: ```
Post::search('Alice')-&gt;get();
</pre>
<p>Auch das Paginieren ist möglich: ```
Post::search('Alice')-&gt;paginate();</p>
<pre data-lang="txt" class="notranslate">
Genauso wie einfache WHERE-Bedingungen: ```
Post::search(‘Alice’)—&gt;where('acount_id', '&gt;', 1)-&gt;paginate();
</pre>
<h3 id="laravel-mailable">Laravel Mailable</h3>
<p>Laravel Mailable ist eine neue Mail-Klasse, die das Verenden von E-Mails deutlich verbessert. Das ganze schaut nun viel mehr nach Laravel aus, als die bisherige Vorgehensweise mit der Closure-Funktion. ```
Mail::to('laravel@example.com')-&gt;send(new OrderComplete);</p>
<pre data-lang="txt" class="notranslate">
Es sind alle Mail-Features weiterhin verfügbar: ```
Mail::to('laravel@example.com')-&gt;cc('john@example.com')-&gt;queue(new OrderComplete);
</pre>
<h3 id="laravel-notifications">Laravel Notifications</h3>
<p>Laravel Notifications erlaubt es uns, Updates über Services wie <a href="https://api.slack.com/">Slack</a>, SMS oder E-Mail zu machen. Notifications werden bereits mit einem „responsive transactional“ E-Mail Template ausgeliefert. In der eigentlichen Klasse muss dann nur noch folgendes aufgerufen werden: ```
$this-&gt;line('Thank you for joining')
    -&gt;action('Button Text', 'http://url.com')
    -&gt;line('If you have any questions please hit reply')
    -&gt;success();</p>
<pre data-lang="txt" class="notranslate">
</pre>
<p>$this-&gt;line('Sorry we had a problem with your order')
    -&gt;action('Button Text', 'http://url.com')
    -&gt;error();</p>
<pre data-lang="txt" class="notranslate">
### Laravel Passport

Laravel Passport ist ein optionales Packages das einen vollständigen OAuth2 Server bereitstellen kann. Man kann damit z.B. Token generieren oder zurücknehmen. Diese Features werden alle noch bis zum Release Dokumentiert. Allerdings wird es bis dahin doch noch ein paar Wochen dauern. Vielleicht ja zur LaraconEU?
</pre>
]]>
            </summary>
                                    <updated>2016-07-28T19:42:25+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[★ PHP Stories: Letztes Array Element]]></title>
            <link rel="alternate" href="https://blog.maxham.de/15-php-stories-letztes-array-element" />
            <id>https://blog.maxham.de/15</id>
            <author>
                <name><![CDATA[Toby Maxham]]></name>
                <email><![CDATA[blog@maxham.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Heute zeige ich euch, wie man mit einem kleinen Trick das letzte Element eines Arrays herausfindet. Dabei finde ich diese Vorgehensweise besser gelöst als mit einem <strong>count()</strong>.</p>
<p>Hier nun das Beispiel:</p>
<pre data-lang="php" class="notranslate"><span class="hl-keyword">&lt;?php</span> <span class="hl-comment">// lastArrayExample.php</span>
<span class="hl-variable">$array</span> = <span class="hl-property">array</span>(<span class="hl-value">'Toby'</span>, <span class="hl-value">'John'</span>, <span class="hl-value">'Leo'</span>, <span class="hl-value">'John'</span>);

<span class="hl-comment">// Pointer an das Ende des Arrays setzten</span>
<span class="hl-property">end</span>(<span class="hl-variable">$array</span>);

<span class="hl-comment">// Den Key des Elements holen</span>
<span class="hl-variable">$lastKey</span> = <span class="hl-property">key</span>(<span class="hl-variable">$array</span>);

<span class="hl-keyword">foreach</span>(<span class="hl-variable">$array</span> <span class="hl-keyword">as</span> <span class="hl-variable">$k</span> =&gt; <span class="hl-variable">$v</span>) {
    <span class="hl-keyword">if</span>(<span class="hl-variable">$k</span> == <span class="hl-variable">$lastKey</span>) {
         <span class="hl-keyword">echo</span> <span class="hl-variable">$v</span> . <span class="hl-value">' ist der letzte!'</span>;
    } <span class="hl-keyword">else</span>
	<span class="hl-keyword">echo</span> <span class="hl-variable">$v</span> . <span class="hl-value">'&lt;br /&gt;'</span>;
}
<span class="hl-comment">// Ausgabe: Toby&lt;br /&gt;John&lt;br /&gt;Leo&lt;br /&gt;John ist der letzte!</span>
</pre>
]]>
            </summary>
                                    <updated>2016-01-22T03:26:03+01:00</updated>
        </entry>
    </feed>
