Eine Firebird 2.5.x Datenbank mag nicht mehr die neuste Datenbank sein. Sie skaliert nicht zeitgemäß, SQL dafür Schreiben macht wirklich keinen Spaß und auch sonst sollte man alles tun um zu vermeiden damit arbeiten zu müssen.. aber sie funktioniert noch und es gibt auch noch Docker-Container dafür.
In alten Projekten findet man also manchmal noch so eine alte Firebird Version und man kann sie super und schnell im Docker-Container starten und hat eine kontrollierbar Entwicklungsumgebung. DBeaver kann man gut damit verwenden.. also DBeaver spricht gut mit der Firebird DB, aber auch das Programm scheint aus einer Zeit zu stammen also Delphi noch der heiße geile Scheiß war.
Ich kam auf die abstruse Idee einfach meine Intellij IDE damit Verbindungen zu wollen. Es geht gut, wenn man erstmal weiß was man so einstellen muss.
1. Mut die fast älteste Version des Treibers wählen, die dabei ist
2. Encoding einstellen... nicht erwarten das so etwas modernes wie UTF-8 funktioniert
3. Die Software, die die Firebird 2.5.x nutzt so schnell wie möglich ablösen oder auf eine aktuelle MySQL/MariaDB Version bringen.
Sollte damals schon jemand voll modern gewesen ein und richtige JOIN Strukturen im FROM verwendet haben (das funktioniert da wirklich schon.. irgendwie), sollte so eine Migration gar nicht so schwer sein. ChatGPT hilft sicher gerne das DDL zu migrieren.
Lange Zeit war die erste Stelle für Platzhaltertexte immer Kraut-Ipsum. Doch dann war es weg. Nachdem nun GPT-5 rauskam brauchte ich ein paar Test-Ideen und irgendwie kam ich auf die Idee Kraut-Ipsum davon nochmal bauen zulassen.. ganz einfach und ganz simpler Prompt. Hab mich einmal bei der originalen Wort-Liste bedient aber man kann natürlich einfach sich da selber was zusammen basteln... so Firmen eigene Wort-Liste wäre auch möglich.
Agenturen haben gerade viele Probleme, und es müssen neue Wege gefunden werden, wie man mit der sich verändernden Wirtschaft, Gesellschaft und Weltsituation umgeht. Ein riesiges Problem ist, dass bisher niemand einen funktionierenden Ansatz gefunden hat – oder auch nur eine Idee, wie man überhaupt einen solchen Ansatz entwickeln könnte. Ich habe es selbst versucht und musste mir eingestehen: Ich hatte nicht nur keine gute Idee, sondern nicht einmal eine schlechte.
Fehlende Kunden, KI, schlechte Wirtschaftslage – das alles lässt sich grob zusammenfassen mit: „Es fehlt das Geld, um etwas zu tun.“
Um als Agentur weiter existieren zu können, braucht man Kunden, die nicht nur den Status quo bezahlen, sondern auch genug Geld mitbringen, um Freiräume zu schaffen – um neue Wege zu gehen, Risiken einzugehen, auch mal zu scheitern. Aber genau dieses Geld ist bei den Kunden heute nicht mehr vorhanden. Gleichzeitig ist ihre Kompetenz gestiegen – sie stellen plötzlich unangenehme, weil sehr gezielte und berechtigte Fragen.
Vor fünf Jahren hat man eben 2000 € für etwas bezahlt, ohne dass ganz klar war, warum – weil es lief und das Geld da war.
Heute ist der Kampf um Kunden voll entbrannt. Jetzt muss man sich kompetent, professionell und innovativ präsentieren. Auch Verträge müssen so formuliert werden, dass nicht bei einem Problem gleich das ganze Projekt oder gar die Firma scheitert.
Das Sales-Department ist gefragt – und soll liefern. Was viele vergessen: In Agenturen spielen die Entwickler eine zentrale Rolle bei der Kundenakquise. Warum? Weil der Kunde mit seinem eigenen IT-Menschen kommt – und der zerlegt jeden Sales-Mitarbeiter argumentativ in der Luft. Sales können verkaufen, aber haben oft keine tiefere Ahnung vom Produkt oder der Dienstleistung. Deshalb sprechen am Ende meist Entwickler mit Entwicklern – oder mit Leuten, die selbst mal programmiert haben.
So kommt man auf einen gemeinsamen Stand, mit dem beide Seiten leben könnten.
Aber: Der Entwickler entscheidet nichts. Dann kommt wieder Sales – und es wird kompliziert. Die wollen mehr Geld, bessere Positionen. Wenn Entwickler verhandeln, kommt selten ein Deal dabei raus, der den Kunden „über den Tisch zieht“. Aber wenn mit ehrlicher Arbeit kein Geld mehr verdient wird, entsteht Druck – und dann sucht man eben doch Wege, irgendwie Geld rauszuholen. Auch wenn es nicht ganz sauber ist.
Sales gibt die Richtung vor. Das C-Level will: mehr Geld bei weniger Aufwand. Entwickler? Die kündigen womöglich, wenn der Druck zu groß wird. Verzögerungen? Möglich. Wenn schon die letzten Projekte nur „okay“ liefen, weil der Kunde über Probleme hinweggesehen hat und man Features nachliefern durfte, will man nicht an einen Kunden geraten, der vor Gericht um sein Geld kämpfen würde.
Also wird umformuliert, Zeiten angepasst. Nicht das Ergebnis soll bezahlt werden, sondern die Arbeit. Entwickler werden aus der Kommunikation genommen – weil sie zu ehrlich waren, sich zu gut mit dem Kunden verstanden haben.
Stattdessen schickt man eine Welle aus Inkompetenz los, um dem Kunden zu „zeigen“, dass er keine Ahnung hat und es für ihn besser sei, mehr für weniger zu zahlen. Aussagen wie: „Ein Pflichtenheft ist nur zum Nachteil des Kunden, weil er dann nicht mehr flexibel genug ist.“ – als ob es die letzten Male der Kunde gewesen wäre, der die Probleme verursacht hat.
Kommen wir zurück zum Punkt: Kunden sind kompetenter und stellen gute Fragen. Sie wissen, dass nicht sie sich um die Agentur bemühen müssen, sondern umgekehrt – und das machen sie auch deutlich.
Plötzlich ist der Entwickler wieder gefragt, weil er sich ehrlich mit dem Kunden auseinandergesetzt hat. Wenn man in so einer Situation landet: Nicht mitmachen! Es gibt einen Grund, warum plötzlich wieder Leute zurückgeholt werden, die schon raus waren oder nie dabei sein wollten. Es ist bereits zu spät – jetzt geht es nur noch darum, zu erklären, was der Kunde sehen will und warum er Recht hat.
Sales sagt nein.
Der Entwickler antwortet: „So geht es nicht weiter – genau deshalb sind wir jetzt in dieser Situation.“
Wenn man so weitermacht, verliert man den Kunden.
Und dann passiert etwas, das ich so noch nie erlebt habe:
Der Sales-Mitarbeiter sagt, es sei ihm egal – er würde für nichts, was er getan, gesagt oder noch sagen wird, die Verantwortung übernehmen. Alle im Meeting nehmen das hin. Kein Widerspruch. Weiter im Text.
Was soll nun geschehen? Soll der Entwickler noch mal versuchen, den Kunden mit Argumenten zurückzuholen?
Auf keinen Fall! Der Entwickler würde an allem Schuld sein.
Der Kunde würde das Problem allein bei ihm sehen – schließlich hat er auf das vertraut, was der Entwickler ihm vermittelt hat. Und das wurde nicht geliefert. Unter dem Subtext: „Eigentlich müsste man dich feuern.“
Wenn man wirklich, wirklich unfassbares Glück hat, merkt der Abteilungsleiter irgendwann, dass man nur das getan hat, was Sales gefordert hat – und er war dabei, als alle Bedenken vom Tisch gewischt wurden. Man hatte sich bewusst gegen die Wünsche des Kunden entschieden.
Und dann erkennt man:
Der Abteilungsleiter hat einfach nicht mitgespielt beim Spiel der Verantwortungsschieberei. Die Verantwortung wandert immer nach unten.
Der Klassiker „Das war der Azubi“ ist bittere Realität – blöd nur, wenn man keinen Azubi hat. Dann bist du schuld.
Aber zum Glück ist das kein Problem, mit dem man leben muss – also nicht das Weiterreichen von Verantwortung an sich, sondern solche Abteilungsleiter. Wozu braucht man die überhaupt? Sie stehen nur im Weg, wenn das C-Level, das längst keinen Bezug mehr zum Alltag hat, seinen Frust direkt auf die Entwickler abregnen will. Und Entwickler? Die beschweren sich nicht – und wenn doch, sind sie zum Glück in einer Gehaltsklasse, auf die man nicht hören „muss“.
Am Ende bleibt die alte Erkenntnis:
Du HAST nicht Schuld.
Du BEKOMMST die Schuld.
OpenAI hat seinen AI-Agenten vorgestellt, und für viele ist das der Beweis, dass KI schon jetzt in einer Sackgasse steckt. Es gebe keine sinnvolle Verwendung für KI, sie sei eine Lösung für ein Problem, das noch nicht gefunden wurde. Wenn man sich die Kommentare zu skeptischen Meinungen im Internet durchliest, ist die Haltung zu KI sehr eindeutig. Die Argumente sind klar: KI könne niemals etwas liefern, das für einen Menschen von echtem Nutzen sei.
Einige würden sagen, diese Leute seien einfach zu „deutsch“ und hätten nicht verstanden, wie KI (insbesondere LLMs) funktioniert. Sie hätten eine völlig falsche Vorstellung davon, was eine KI leisten kann. Aber ist es wirklich so einfach? Kurz gesagt: Ja! Doch wenn man etwas genauer hinsieht, merkt man, dass die Frage doch nicht ganz so simpel zu beantworten ist. Ich gehe mal auf ein paar Punkte ein:
Was bringt mir eine KI, die mir einen Tisch reservieren kann? Zuerst wird sich darüber lustig gemacht, dass die KI ja „nur“ einen Tisch reservieren könne und nicht einmal richtig buche – obwohl das im Alltag zu 100 % deckungsgleich ist. Dann kommt die große Frage: Woher soll die KI wissen, was ich gerade will?
Die KI sucht irgendein Restaurant aus, reserviert zu einer beliebigen Zeit, zu der mein Kalender frei ist – und dann soll ich da hingehen, obwohl ich vielleicht gar keinen Hunger habe oder lieber Pizza statt asiatisch gegessen hätte. Genau so wäre es, wenn man der KI den Wocheneinkauf überlassen würde: Man hätte immer das Gleiche, vielleicht in völlig falschen Mengen – Woche für Woche. KIs liefern eben das, worauf sie trainiert wurden, und da jeder Mensch einzigartig ist, ist die Wahrscheinlichkeit, dass die KI etwas Passendes liefert, sehr gering. KI produziert also nur Dinge, die kaum jemand wirklich mögen kann?
KI fehlt einfach die Fantasie? Wie jemand in den Kommentaren schrieb: KI fehlt einfach die Fantasie, um für Menschen interessante Dinge zu generieren. Egal ob Bilder, Videos, Texte oder Musik – die KI generiert nur das, worauf sie trainiert wurde, und was sie für den allgemeinen Geschmack hält.
Wenn ich die KI bitte, mir eine Geschichte zu schreiben, wird sie mir sicher nicht gefallen – denn ich lese ja am liebsten Fantasy-Romane. Eine Antwort darauf war: Die KI steckt deshalb in einer Sackgasse und könne erst dann wirklich hilfreich sein, wenn man ihr die eigenen Wünsche und Vorlieben mitteilen kann.
Und hier wird es seltsam… Einen Weg finden, um der KI etwas mitzuteilen? Hat diese Person jemals mit einem LLM oder einer anderen generativen KI gearbeitet?
Wenn ich schreibe: „Schreib mir eine Geschichte“, mich wundere, dass mir das Ergebnis nicht gefällt, und mich dann über die KI beschwere – dann liegt das Problem wohl woanders. Viele Menschen, die KI für völlig sinnlos halten und befürchten, dass dadurch alles zum Einheitsbrei wird, betrachten KI wie ein Fernsehgerät – nur eben ohne Fernbedienung. Man müsse eben gucken, was gerade läuft. Sie erwarten, dass sie genau das bekommen, was sie sich wünschen – ohne aktiv zu kommunizieren, sondern nur passiv zu konsumieren.
Natürlich muss ich der KI sagen, was ich will. Wenn ich total unspezifisch bleibe, kommt auch nur etwas Unspezifisches heraus. Die KI kann keine Gedanken lesen.
Beschweren ist Volkssport? Es wird sich beschwert. Sich zu beschweren ist für bestimmte Menschengruppen – oft aus dem gehobenen Alter – fast schon ein Hobby. Der Fernseher ist ein gutes Beispiel: Ältere Menschen sitzen davor, beklagen sich über das schlechte Fernsehprogramm (früher war natürlich alles besser) und sagen, sie wären lieber ins Bett gegangen (tun es aber nicht und schauen trotzdem weiter). Dabei gäbe es auf anderen Sendern durchaus Vielfalt – aber die emotionale Blockade, den gewohnten Bereich zu verlassen, verhindert das.
Eine KI kann ihre Stärken nur im Zusammenspiel entfalten. Wenn man aber selbst keine Initiative zeigt, wird auch keine brauchbare Reaktion kommen.
Kommunikationsschwäche als Kernproblem? Viele Menschen sind nicht in der Lage, eine klare, zielgerichtete Kommunikation zu führen. Wenn jemand sagt: „Die Musik ist doof, ich mag so was nicht“, wäre die naheliegende Gegenfrage: „Was für Musik magst du denn?“ Doch viele Menschen würden daraufhin nur irritiert reagieren, lang überlegen und dann womöglich gereizt und laut entgegnen, was einen das überhaupt angehe. Man solle gefälligst selbst wissen, was man mag, und andere damit in Ruhe lassen. Auf so eine „dumme“ Frage habe man keine Lust.
Gefühlt ist diese Gruppe nicht klein. Dass diese Menschen eine KI weder verstehen noch richtig bedienen können, ist logisch. Wer seine Wünsche nicht formulieren kann, ist mit einer KI überfordert.
Heute werden KIs meist über Prompts gesteuert. Wer es nicht schafft, seine Erwartungen in einem Prompt zu formulieren, und auf eine Schnittstelle wartet, die genau das ermöglicht (was der Prompt ja bereits ist), der hat derzeit einfach keine Möglichkeit, mit einer KI sinnvoll zu interagieren.
Das eigentliche Problem ist also nicht die KI – sondern die Unfähigkeit vieler Menschen zur klaren Kommunikation. Die KI könnte fast alles liefern – wenn man ihr nur den richtigen Input gibt.
Fazit Wenn OpenAI zeigt, dass ihr Agent einen Tisch reservieren kann, dann ist das für viele offenbar schwer als Beispiel zu erkennen. Sie nehmen es wortwörtlich – und denken nicht weiter. Dabei könnte man noch tausend andere Dinge mit der KI tun. Aber man muss eben selbst denken. Leider ist das auch nicht jedermanns Stärke.
Kunden sind manchmal unzufrieden. Das ist normal. Manchmal ist es berechtigt, und in manchen Fällen liegt es eher am Kunden selbst. Oft ist es aber einfach so, dass Agentur und Kunde nicht zueinander passen. Dann ist es völlig in Ordnung, getrennte Wege zu gehen.
Problematisch wird es nur, wenn zu viele Kunden gehen wollen – und man lieber einen ungeliebten Kunden behält als gar keinen. Ich habe vor vielen Jahren zum ersten Mal gehört, dass Kunden sich zwar von Agenturen trennen möchten, aber Angst haben, dabei ihre Website oder Domain zu verlieren. Die Agentur hat die Domain gekauft – nicht im Namen des Kunden, sondern sie lediglich zur Verfügung gestellt. Das Hosting läuft auf einem Agenturserver, oft nicht sauber von anderen Projekten und Kunden getrennt, sodass ein Zugriff für den Kunden unmöglich ist.
Ich bin ein großer Verfechter davon, dass der Kunde alles selbst besitzen soll. Ich berate und helfe gerne überall, aber am Ende sollte alles wirklich dem Kunden gehören. Der Kunde muss mir Zugriff auf seine Sachen geben – nicht ich ihm auf Dinge, die ihm eigentlich ohnehin gehören.
Eine Trennung zwischen Agentur und Kunde muss nicht negativ verlaufen. Vielleicht wurde die Firma des Kunden verkauft, oder der Agenturinhaber kann den Kunden aus gesundheitlichen Gründen nicht mehr betreuen. In jedem Fall ergibt es Sinn, das Kommen genauso einfach zu gestalten wie das Gehen.
Viele Agenturen sehen das leider anders. Sie nehmen die Entscheidung des Kunden, zu gehen, persönlich – selbst wenn es vorher bereits Streit gab und eigentlich keiner der beiden Seiten mehr Lust auf die Zusammenarbeit hat. Dann wird es schwierig: Der Kunde will gehen, möchte aber natürlich seine Website, seinen Shop oder sonstige Projekte mitnehmen. Weder eine Domain zu übertragen noch ein Git-Repository zu öffnen oder zu exportieren, ist wirklich schwer oder zeitaufwendig. Das sollte innerhalb von zwei Stunden erledigt sein.
Doch manche Agenturen verhalten sich dann so, dass man schon von einer Art Geiselnahme sprechen könnte (andere würden es als Nötigung bezeichnen). Die Domain kann nicht einfach übertragen, sondern nur zu einem hohen Preis verkauft werden. Der Quellcode wird als ZIP-Datei übergeben – was angeblich so aufwendig ist, dass es natürlich teuer wird. Datenbankkopien sind angeblich nur zu ganz bestimmten Zeiten möglich – und dass der Kunde einfach auf „Exportieren“ klickt, sei ihm nicht zumutbar.
Ein besonders extremes Beispiel habe ich kürzlich erlebt: Ein Kunde, zwei Agenturen. Bei der einen Agentur geht Know-how verloren, und der Entwickler der zweiten Agentur soll Zugriff auf Code und Server erhalten, um im Notfall etwas fixen zu können. Teile des Codes stammen ohnehin von ihm, und vor 1,5 Jahren hatte er bereits Zugriff auf das Projekt. Also nichts Neues, sondern eigentlich nachvollziehbar.
Doch die Angst der ersten Agentur war: „Wenn die den Code haben, sind sie ganz weg.“ Ja – das wird passieren. Und es hat auch seine Gründe. Zugänge sauber einzurichten und den Kunden beim Übergang zu unterstützen, wäre eigentlich die beste Lösung. Das kann man auch abrechnen – und niemand würde sich beschweren. Selbst wenn noch ein bis zwei Stunden bei der Agentur verbleiben, um intern alles zu koordinieren, wird das gerne bezahlt – solange alles sauber abgewickelt wird.
Aber plötzlich 5.000 Euro zu fordern und dem Kunden mitzuteilen, dass es ein Vertragsbruch sei, wenn der andere Entwickler einen Bugfix macht – und man gegen den Kunden vorgehen würde, falls dieser nicht zahlt –, das ist einfach nur extrem. Es ging um Plugins, die speziell für diesen einen Kunden entwickelt wurden, und die sich nicht sinnvoll für andere Kunden weiterverwenden lassen, ohne nochmal viel Zeit zu investieren. Der Agentur bringt dieser Code also gar nichts.
Ich verstehe nicht, warum Agenturen lieber auf etwas sitzen bleiben (spezialisierter Code, ungenutzte Domains etc.), anstatt sich fair und professionell zu verhalten. Einen Streit mit dem Kunden zu beginnen – der womöglich in schlechten Bewertungen endet – bringt niemandem etwas.
Eine Agentur sollte in der Lage sein, professionell zu agieren – ruhig, lösungsorientiert und kompromissbereit. Selbst wenn der Kunde sich danebenbenimmt (ich wurde auch schon wegen meines Stundensatzes beleidigt…), sollte man als Dienstleister einen kühlen Kopf bewahren.
Microsoft entlässt 9.000 Entwickler und ersetzt sie durch AI. Das ist mal eine Aussage – und zeigt, wie schwer es für Entwickler geworden ist. Die AI kommt und nimmt ihnen die Jobs weg. Klingt ein wenig zu einfach, um wahr zu sein ... ist es natürlich auch.
Erstens ist es bei amerikanischen Firmen immer wieder erstaunlich, wie viele Angestellte sie beschäftigen. „Hire and Fire“ führt dazu, dass man lieber mal zu viele Entwickler einstellt als zu wenige – ein Fehler, den man schnell korrigieren kann. Da werden mal eben 20 Entwickler für ein Projekt eingestellt, bis der Kunde doch abspringt – und schon werden die Entwickler einfach wieder entlassen. Der feuchte Traum eines jeden deutschen Agentur-Chefs. Dass man viele einstellt und dann in gewissen Wellen die Low Performer entlässt, ist auch nicht neu. Auch hier ist AI nicht das eigentliche Problem, sondern nur ein verstärkender oder beschleunigender Faktor.
Wenn man sich die Kommentare zu solchen News durchliest, kommt schnell der Einwand, dass die Firmen bald merken werden, dass eine AI keinen komplexen Code erzeugen kann – und dann die entlassenen Entwickler teuer zurückholen müssen. Gefühlt stammen solche Aussagen oft von Menschen, die nicht mit AI arbeiten, und deshalb eine etwas verzerrte Vorstellung davon haben, wie man mit AI-Agents arbeitet.
Jeder meiner Versuche, eine vollständige Anwendung mit Junie oder gemini-cli erstellen zu lassen, war nicht wirklich erfolgreich. Sich jedoch eine Boilerplate-Anwendung generieren zu lassen, in der man dann Schritt für Schritt seine Anwendung implementiert, lief dagegen echt gut. Ich brauchte ein winziges CMS für ein paar Seiten, ein paar Webhooks und einen AI-Agenten, bei dem sich Benutzer anmelden können. Grave war schon zu groß, also hat mir gemini-cli auf Basis meiner requirements.md genau das gebaut – und es funktionierte super. Auch der Code war ziemlich gut. Ich selbst hätte dafür sicher 3–4 Stunden gebraucht und die meiste Zeit nur primitiven Code geschrieben oder mir etwas aus alten Projekten kopiert. So war alles in 30 Minuten durch, und ich konnte direkt mit der eigentlichen Anwendung beginnen.
Brauche ich noch Designer, die mir nach meinen Beschreibungen Skizzen und Storyboards erstellen, wenn die AI das kann – und ich nach zwei Minuten einen angepassten Prompt eingebe und so in einer Stunde bis zu 30 Iterationen habe, wo ich mit einem Menschen vielleicht zwei oder drei geschafft hätte?
Im Zusammenhang mit den Microsoft-Kündigungen las man, dass sich Level-Designer ein AI-Tool gebaut haben, um das Leveldesign zu beschleunigen – und dann durch genau dieses Tool ersetzt wurden. Genauer gesagt ging es um Candy Crush und ähnliche Spiele. Mein Gefühl sagt mir, dass die Schöpfungshöhe solcher Level recht gering ist und festen Mustern folgt. Perfekt also, um sich so etwas von AI erzeugen zu lassen. Es scheint also auch vorher eher Fleißarbeit als Denkarbeit gewesen zu sein.
Am Ende werden Menschen nicht durch AI ersetzt, sondern durch Menschen, die AI möglichst effizient einsetzen. Menschen, deren Arbeit immer darin bestand, Dinge nach festen Vorgaben abzuarbeiten und strukturierten Output zu liefern, sind leichter zu ersetzen. Programmierer gehören oft dazu – denn selbst in der Zeit vor AI war die eigentliche Programmierung selten die Herausforderung. Meist wusste man, was man tun wollte, hatte den Code schon im Kopf und saß dann zwei Stunden da, um alles niederzuschreiben und zu testen. Das nimmt einem jetzt die AI ab. Auch wenn ein AI-Agent manchmal selbst länger braucht und 30 Minuten benötigt, um alles anzulegen und zu befüllen, spart man dennoch viel Zeit. Ich hatte auch schon Meetings, bei denen mir die AI nebenbei etwas gebaut hat – und ich konnte nach dem Meeting sofort testen und meine kleinen Verbesserungen oder Funktionen einbauen.
2004 in der Berufsschule haben wir gelernt, dass Entwickeln und Programmieren zwei unterschiedliche Dinge sind. Entwickeln ist die eigentliche Leistung, Programmieren ist der stupide, zeitraubende Teil der Aufgabe. Heute ist das deutlicher denn je.
Gleichzeitig zu diesen Entlassungen wird in Deutschland diskutiert, ob man die Arbeitszeiten verlängern sollte – vielleicht sogar einen Feiertag opfern sollte. Gerade für alle, die von AI betroffen sind, klingt das vollkommen realitätsfern. Die Menschen werden ja nicht entlassen, weil sie nicht in der Lage wären, mit AI-Tools mehr in weniger Zeit zu schaffen, sondern weil jetzt alle mehr schaffen – aber nicht mehr Arbeit da ist. Arbeit ist der limitierende Faktor, der es erlaubt, Leute freizustellen.
In Kommentaren regt man sich darüber auf, dass Firmen Millionengewinne einfahren und trotzdem so viele Angestellte entlassen. Aber es bringt auch nichts, Leute rumsitzen zu lassen, die keinen Mehrwert erbringen. Rumsitzen und nichts zu tun haben macht keinen Spaß und verursacht auch viel Stress. Die wenigsten Leute würden sich hinsetzen und einfach ein neues Produkt entwickeln. Wenn das so wäre, würde man sie liebend gern behalten – weil sie durch ihre Anwesenheit Mehrwert schaffen. Kaffee trinken und im Internet surfen zählt aber nicht dazu.
Die große Herausforderung für die Zukunft wird sein, dass Menschen lernen, wenig bis nichts mehr zu tun zu haben – weil weniger Menschen dieselbe Menge an Arbeit erledigen können, aber nicht mehr Arbeit entsteht. Auch die Gesellschaft muss einen Weg finden, den Menschen aufzuzeigen, wie sie einen Mehrwert schaffen können. Das Problem ist dann die Bezahlung, weil das bisherige Konzept nicht mehr passt. Das, was heute Geld einbringt, wird von AI übernommen – und der Mensch arbeitet noch, um sich selbst und die Gesellschaft zu verbessern.
Vibe-Coding war ein Begriff, der vor einiger Zeit einen regelrechten Hype auslöste und in aller Munde war. Wenn man heute noch mit Vibe-Coding kommt, schauen einen viele mitleidig an und fragen, ob man nicht Context-Engineering meint. Vibe-Coding ist eben schon sowas von letzte Woche … gefühlt ist es gerade mal drei Tage her, dass Context-Engineering als der neue heiße Shit gilt.
Als bei meinem Ex-Arbeitgeber Vibe-Coding der breiten Masse der Entwickler vorgestellt wurde (es ist tatsächlich schon ganze vier Wochen her – Ewigkeiten in AI-Zeit, heute wechseln AI-Dev-Konzepte so schnell wie früher Nvidia neue GeForce-Karten herausgebracht hat), gab es folgenden Tipp: Alle Anforderungen in eine Datei schreiben und im Prompt lediglich auf diese Datei verweisen. Die Dokumentation sollte in einem Unterverzeichnis liegen – man sollte sich nicht darauf verlassen, dass das LLM schon alles Nötige weiß. Also: Weniger in die Prompts und mehr Struktur direkt im Projekt.
Am Ende ist das nichts anderes als: „Erst denken, dann Code schreiben.“ Also nicht einfach drauflos coden, sondern zuerst Anforderungen und Konzepte überlegen.
Context-Engineering ist genau das. Den „Vibe“ rausnehmen, erst nachdenken, Informationen sammeln und strukturiert ordnen. Vibe-Coding eignet sich hervorragend, um Prototypen und Ideen schnell zu entwickeln. Diese lassen sich dann sauber dokumentieren und als Kontext in ein Projekt einbinden – ideal, wenn daraus später ein echtes Produkt entstehen soll.
Man kann also sagen: Vibe-Coding als kreative Vorstufe, Context-Engineering als methodischer Feinschliff.
Jedenfalls ist das meine Auffassung von dem, was gerade passiert. Aber vielleicht ist nächste Woche ja schon wieder alles anders.
Viele Agenturen haben momentan ein Problem: So wie es die letzten zwei bis drei Jahre lief, läuft es einfach nicht mehr. Kunden bleiben aus. Bestehende setzen weniger Geld um oder springen komplett ab. Was übrig bleibt, können wenige Mitarbeitende bewältigen – während der Rest darauf wartet, dass neue Kunden kommen. Doch das bindet das Sales-Team und erfordert hohe Investitionen, um überhaupt überschaubare Projekte zu gewinnen.
Aber wer oder was ist schuld an der Situation?
Wenn man den zeitlichen Verlauf betrachtet, fällt auf, dass mit dem Beginn der Probleme auch etwas anderes gewachsen ist: Künstliche Intelligenz. AI ermöglicht es Kunden, viele Dinge selbst zu erledigen. Einfach die AI fragen – und schon bekommt man eine brauchbare Antwort. Kunden sind dadurch mündiger geworden und stellen mehr in Frage. Das macht es schwerer, ihnen etwas zu verkaufen. Klar, die wirtschaftliche Lage spielt auch eine Rolle, aber AI scheint der Haupttreiber zu sein.
So einfach ist es dann aber doch nicht.
AI ist großartig, gerade im generativen Bereich. Aber: Kein Kunde ersetzt seine Agentur durch AI und generiert einfach selbst Code. Vielmehr wird AI in Produkte integriert und macht diese zugänglicher und einfacher in der Bedienung. Gleichzeitig wird es aber auch komplexer, diese Systeme zu erweitern – denn die AI muss diese Anpassungen auch „verstehen“. Ja, AI hat sicherlich Entwicklungen beschleunigt, aber viele Probleme gab es schon vorher – und sie wären auch ohne AI irgendwann sichtbar geworden.
Corona ist nun endgültig vorbei. Damals konnte man sich auf die Straße stellen, einmal laut rufen: „Ich bin Programmierer“ – und 20 Minuten später hatte man fünf neue Kunden. Webshops und Homepages waren plötzlich kein Hype mehr wie zu Dotcom-Zeiten, sondern überlebensnotwendig, um mit Kunden in Kontakt zu bleiben und weiterhin verkaufen zu können. Wer keinen Webshop hatte, war raus. Und wer einen hatte, wollte plötzlich wieder vorne mitspielen. Es brauchte Beratung. Sales sprach mit Kunden, als wären sie "dumm". Man konnte ihnen viel verkaufen, denn sie hatten weder Ahnung noch Erfahrung. Lieber zu viel investieren, als unterzugehen.
Diese Zeit ist vorbei. Jeder, der einen Webshop brauchte, hat längst einen. Der Rest hat überlebt – oder sich bestätigt gefühlt, dass es auch ohne geht. Diese kleinen, unerfahrenen Kunden in Massen? Verschwunden. Manche Sales-Abteilungen haben sich nicht angepasst. Heute steht dir ein potenzieller Kunde gegenüber, der Geld für ein Upgrade seines Shops hat – nicht, weil er bisher etwas falsch gemacht hat, sondern weil er vieles richtig gemacht hat. Wer den behandelt wie einen Anfänger, verliert ihn sofort. Warum sollte sich jemand von einem erklären lassen, wie das eigene – erfolgreiche – Geschäft funktioniert?
#1: Die Zeit, in der man Kunden wie Idioten behandeln konnte, ist vorbei!
Auch der Mangel an Entwicklern ist vorbei. Man muss nicht mehr in Osteuropa suchen oder in Asien einkaufen. Entwickler gibt es wieder überall: gute, mittelmäßige und schlechte – also genau wie es sein sollte.
Kein Kunde baut sich mit AI selbst ein Shopware-Plugin. Tools wie Cursor und Junie ermöglichen das theoretisch erst seit wenigen Monaten. Kunden sind auch nicht mehr dankbar, dass eine Agentur überhaupt Zeit für sie hat. Wenn eine Agentur nicht liefert – in Qualität oder Quantität – sucht man sich eine andere oder stellt eben direkt Entwickler ein. Gerade für Firmen mit IT-Abteilung, SAP-Beratern und ERP-Know-how ist es kein weiter Schritt, auch einen Shopware-Entwickler ins Team zu holen. Der kann dann auch direkt an der Middleware mitarbeiten – ohne großen Overhead.
Ich kenne zwei Fälle, in denen der Ansprechpartner beim Kunden selbst aus der IT kam – und entschied: „Das machen wir jetzt intern.“ Eine Vollzeitkraft ist produktiver als eine Agentur, weil kaum Overhead entsteht. Die Codequalität? Ausreichend.
Und dann höre ich von Agenturen:
„Der Kunde hat zwei Entwickler eingestellt, um unseren einen zu ersetzen… Die werden schon sehen, dass das nichts wird!“
Falsch! Der Kunde hat genug Arbeit für zwei Leute – und die Agentur konnte schlicht nicht genug liefern.
#2: Angestellte Entwickler sind eine echte Alternative zu Agenturen!
Entwickler haben in den letzten Jahren sehr gute Arbeit geleistet. Ich habe mal zu einem Arbeitgeber gesagt:
„Ich bin gut, wenn ich mich selbst überflüssig gemacht habe – wenn die Software so einfach ist, dass ihr mich nicht mehr braucht.“
Und genau das haben viele Entwickler geschafft: intuitive Oberflächen, einfache Bedienung, modular aufgebaut, wiederverwendbar. Kunden sind nicht so individuell, wie sie glauben. Zwei, drei Konfigurations-Flags – und ein Plugin funktioniert für mehrere. Viele Shops kann man heute zu 90 % aus bestehenden Plugins zusammenstellen – ohne eine einzige Codezeile.
Dieses "Zusammenklicken" lässt sich super in einfache Oberflächen gießen. Dazu automatisiertes Deployment – und zack, hat man einen Cloud-Service. SAP behauptet, es gäbe keine Standardschnittstellen – aber am Ende bauen sie doch bei jedem Kunden das Gleiche. 90 % gibt es schon, 10 % sind individuelle Anpassungen – theoretisch auslagerbar in eine JSON-Datei.
Webshops funktionieren seit 20 Jahren nach dem gleichen Prinzip: Listing, Produktseite, Warenkorb, Checkout, Account. Wer so lange entwickelt hat, hat alles schon mal gebaut. Der Punkt ist erreicht: Kunden finden fast alles, was sie brauchen, bereits fertig.
#3: Es gibt fast alles schon – es muss nicht mehr neu entwickelt werden!
Natürlich zahlt ein Kunde heute nicht denselben Preis, wenn jemand einfach einen Shop zusammenklickt, wie damals, als alles individuell programmiert werden musste. Für echtes Custom-Development zahlt man noch immer gut – aber es ist seltener nötig.
Ein weiteres Thema ist der Overhead. Kunden wollen für Impact zahlen – nicht für Projektmanagement. Viele Kunden wären zufrieden, wenn man den Projektmanager streicht. Spart Geld, spart Zeit.
Natürlich gibt es sehr gute Projektmanager – die wissen, was der Kunde will, die auch mal einen Shopware-Flow anpassen, damit der Entwickler sich auf Code konzentrieren kann. Aber genauso gibt es viele, die teure Projekte verkaufen und managen wollen – aber nicht mal den Admin-Bereich bedienen können. Kunden, die täglich mit dem System arbeiten, merken schnell, wenn sie es besser verstehen als die Agentur.
#4: Kenne dein Produkt – und sei ein echter Experte!
Heute haben wir Kunden, die Profis sind. Und wir haben Tools, die fast alles können. Jedes Ticket ist schnell erledigt. Weniger Aufwand, weniger Stunden – weniger Geld. Gleichzeitig wächst der Druck: Tickets sollen schneller fertig werden. Und wenn du gut bist und brauchst statt 8 nur 4 Stunden, super – nur bekommst du dann auch weniger bezahlt.
Zeit gegen Geld ist ein veraltetes Modell. Kunden bezahlen gerne für Impact – und oft auch dafür, es schnell zu bekommen. Warum machen wir Aufwandsschätzungen zum Problem des Kunden?
Der Kunde will ein Ergebnis – das bekommt einen Preis. Ob das nun schon fertig rumlag oder neu entwickelt wird, ist egal. Wenn der Entwickler freitags mittags geht, weil er fertig ist: gut so! Die Leistung ist erbracht, das Geld verdient.
#5: Weg vom Zeitmodell – hin zu Festpreisen für Ergebnisse. Impact zählt, nicht Aufwand.
AI beschleunigt die Entwicklung enorm – vor allem bei neuen Ideen, Prototypen und Design. Dass etwas schneller geht, ist ein Vorteil, den man verkaufen sollte – kein Nachteil!
Fazit: AI ist weder Schuld noch allein die Lösung. Die eigentlichen Probleme reichen tiefer und sind älter als brauchbare AI. Sie kann vieles verbessern – aber nur, wenn das Umfeld mitzieht. „Das haben wir schon immer so gemacht“ ist ein schwaches Argument, wenn es darum geht, warum plötzlich nichts mehr funktioniert.
Agenturen existieren in einer eigenen sehr speziellen Bubble, in der Gesetze gelten, die sich außerhalb dieser Bubble seit 20 Jahren oft schon überholt haben. Eines dieser Gesetze ist, dass Qualität nur aus Komplexität entstehen kann. Je komplexer eine Lösung ist, desto höher ist deren Qualität. Wenn es darum geht eine vorhandene alte Lösung durch eine schlankere und einfacher Lösung zu ersetzen, kommt neben dem "das haben wir schon immer so gemacht" auch eine reine Beurteilung an Anzahl der Zeilen, Anzahl der Dateien und ob Copy&Paste als Design-Pattern dort zum Einsatz kam. Also wenn die neue Lösung 40 Zeilen lang ist, in eine Datei passt und extends-Funktionalität nutzt ist die Qualität geringer als die alte Lösung aus über 200 Zeilen, 6 Dateien und wo alles per Copy&Paste erstellt wurde und mindestens 2 Dateien per Hand synchron gehalten werden beim verwendeten Docker-Image. Wenn man also noch eine Risikobewertung mit rein nimmt verhält sich Qualität also immer entgegen des Risikos. Das Onboarding eines neuen Developers dauert über eine Stunde und nicht 15min? Das nennt sich Qualität, weil jemand sehr viel mehr dran gearbeitet hat als andere neuen Lösung (die Zeilen und Dateien entstehen ja nicht ohne Arbeit). Viel Arbeit = Viel Qualität.
Das stammt auch aus der Art, wie Abgerechnet wird. Zeit gegen Geld. Somit gilt also: Viel Arbeit = Viel Geld = Viel Qualität.
Interessanter Weise gilt das selbe für die Auswahl bei von der AI generierten Lösungen. Je komplexer die präsentierte Lösung ist, desto besser und als qualitativ hochwertiger wird sie betrachtet, weil die AI darauf ja mehr Rechenleistung verbraten hat.
Wenn man z.B. ein Product-Box per Ajax von einem Controller nach lädt, wird der "In den Warenkorb" Button nur als normale Form funktionieren und nicht den Off-Canvas Warenkorb nutzen per JavaScript. Weil bei dem initialisieren der Plugins der HTML-Code natürlich noch nicht da war. Das kann man aber einfach nachholen.
Ein Honeypot in das Kontaktformular einbauen ist recht einfach. Man kann alles am Feld hinterlegen:
form:
name: contact-form
fields:
- name: honeypot
label: "Leave this field empty"
type: text
attributes:
style: "display: none; position: absolute; left: -9999px;"
validate:
required: false # Sicherstellen, dass das Feld nicht ausgefüllt werden muss
message: "Bot detected!" # Fehlermeldung, falls das Feld ausgefüllt wird
rule: empty # Das Feld muss leer bleiben
buttons:
- type: submit
value: Send
Man kann auch eine Rule in user/plugins/form/form.yaml[anlegen] und die rule anstelle von "empty" angeben. Wenn man mehrere Formulare auf der Seite hat, ist das sicher die bessere Methode.
Nachdem ich feststellen musste, dass ChatGPT nur per API nutzbar ist, wenn man dafür bezahlt und sowie es ja problematisch sein kann Daten wie Telefonnummern oder Adressen dahin zu schicken, habe ich mich nach Alternativen umgesehen. Google Gemini kann man ohne Probleme per API nutzen, auch wenn man nicht bezahlt, aber das Datenschutzproblem bleibt. Also wäre eine lokale Lösung sowie so viel besser.
So kam ich zu Ollama. Das kann man ohne Probleme per Docker starten. Ohne GPU-Beschleunigung war es aber doch recht langsam. Zum Glück installiert der Nvidia-Treiber alles mit, um auch unter Windows GPU-Beschleunigung in Docker-Containern nutzen zu können.
Selbst mit einer GTX 970 ist das llama3 Model recht gut nutzbar. Test mit einem separaten Linux-System und Telsa P4 folgen später, wenn die Karte da ist.
Menschen kommen, scheitern und gehen. Der nächste wird besser sein. Es ist eine endlose Suche nach dem einen der diesen ewigen Kreislauf durchbricht. Wobei Suche der falsche Begriff ist. Es ist mehr ein warten. Ein passives Warten. Aber ganz sicher kommt irgendwann der eine oder die eine, die alles mitbringt was man haben will. Jemand der nicht auf die Hilfe der anderen angewiesen ist, die keine Zeit für sowas haben und somit das Scheitern für die meisten schon vorprogrammiert ist. Nein! Ein Mensch wird kommen und genau die Person sein, die man schon immer haben wollte.
Die anderen, die durch die Rotation gegangen sind, ziehen weiter. Zur nächsten Firma und durch den nächsten Rotationszyklus bis auch die Firma sie wieder ausspuckt. Diese Menschen sind das Rauschen, dass die gesuchten verdeckt, ihre Aufgabe ist es ausgesiebt zu werden oder bis sie sich ändern. Aber wenn sie sich ändern könnten, wären sie nicht da wo sie sind. Nicht gefangen in einen immer wieder kehrenden Zyklus von Kommen, Scheitern und Gehen gefangen.
Und somit.. mal gucken ob der nächste Projektmanager, die nächste Projektmanagerin ein weiter Zyklus in der Rotation ist oder diese Rotation durchbrechen kann.
Natürlich könnte man mehr Zeit in Auswahl, Förderung und Aufbau eigener Leute stecken.. aber das bezahlt einen eben niemand.
In HTML gibt es die Möglichkeit Inputs auch außerhalb einer Form zu haben und diese mit einer Form zu verknüpfen. Dazu nutzt man das form-Attribute. Gerade im Checkout von Shopware 6 ist es echt praktisch. Beim DatePicker besteht aber das Problem, dass das Input, dass man selbst definiert durch ein neues Input-Feld ersetzt wird, wenn Flatpickr sich initialisiert. Diesem neuen Input muss man auch das form-Attribute geben.
Tut man es nicht, funktioniert z.B. das required-Flag am DatePicker nicht.
Bei Deployments die ein per Composer erzeugtes Shopware 6 Projekt als Basis haben (was wohl alle neueren sind) muss man die JWT-Dateien immer noch zusätzlich erzeugen und sie müssen die richtigen Rechte haben.
Man kann auch Env-Variablen (JWT_PUBLIC_KEY und JWT_PRIVATE_KEY) verwenden, was bei mir aber irgendwie nicht korrekt funktionierte und beim Login in die Administration zu einer Exception führt.
Aber es gibt auch einen Weg ganz ohne JWT Keys und der verwendet das APP_SECRET aus der .env Datei.
Damit klappte auch ein Deployment auf platform.sh dann ohne Probleme.
Um z.B. in einer Gitlab Pipeline den AWS secretsmanager zu nutzen, um Passwörter oder Token abzufragen muss man erstmal den CLI Client installieren und konfigurieren. Das geht am Besten wenn man die Dateien direkt schreibt.
Eine Bestellung zu bearbeiten in dem man z.B. ein LineItem löscht benötigt die Nutzung von Versionen. Was an sich nicht schwer ist, wenn man weiß
wie man es machen muss. (Beispiel ist Shopware 6.4)
MySQL Dump bei Shopware haben manchmal das Problem, dass DEFINER und Datenbanknamen an Triggers mit exportiert werden, die nicht zur neuen Datenbank passen, wenn die Datenbank anders heißt und man einen anderen Benutzernamen hat.
Man kann dann mit einem Texteditor wie nano, vi oder Notepad++ die Datei durchsuchen und es per Hand fixen. Nur doof wenn die Datei 6GB groß ist und keiner der Editoren mehr so richtig performant mit der Datei arbeiten will.
Dafür gibt es dann in der Linux Kommandozeile sed:
mysqldump -u demouser -p demo_webshop > ./dump_for_65_update.sql
sed 's/`demo_webshop`.//g' dump_for_65_update.sql > dump_for_65_update_clean.sql
sed -i 's|/\*!50017 DEFINER=`demouser`@`localhost`\*/||g' dump_for_65_update_clean.sql
mysql --database=demo65_webshop --user=demouser65 -p < ./dump_for_65_update_clean.sql
Man kann da sicher noch allgemeine Ausdrücke für schreiben, aber das lag dieses mal außerhalb dem was der Kunde bezahlt hätte.
An sich geht es ganz einfach. In der Administration geht man auf Update, bestätigt alles, die Plugins werden deaktiviert (vielleicht auch das Language-Pack) und dann startet der Installer und .. läuft in einen Fehler und dann läuft garnichts mehr. Scheint jeden Falls öfters mal so zu passieren.
Ich hab mir ein Script gebastelt mit dem man sich eine Kopie des Shops auf die neue Version updaten kann und dann später auf diese Kopie switchen kann.
Man muss nicht alle Plugins deaktiveren, aber einfacher ist es. Also eine Kopie (Dateien und Datenbank) anlegen und da alles Plugins deaktiveren. Per SQL-Statement geht es recht schnell und einfach.
Der original Shop liegt in shop/ und der neue in shop65/. Die .env der Kopie (wegen DATABASE_URL) wird in shop_shared/ abgelegt und um LOCK_DSN="flock" und SHOPWARE_SKIP_WEBINSTALLER=1 ergänzen.
Dann das Script laufen lassen.. oder besser Zeile für Zeile per Hand ausführen.
cd ~/public_html/shop65 && composer update
cd ~/public_html/shop65 && bin/console system:update:finish
cd ~/public_html/shop65/vendor/shopware/administration/Resources/app/administration && npm install && cd ~/public_html/shop65
Ziel ist es wieder in die Administration zu kommen und dort alle Plugins zu aktualisieren. Wenn das gelungen ist, dann alle nach und nach wieder aktivieren und wieder die Themes in den SalesChannels einrichten.
Wenn Fehler auftreten immer mal wieder bin/console aufrufen, weil dann die Exceptions meistens ganz gut dargestellt wird.
So kommt man auch sehr gut ohne den Installer zu seinem aktuellen Shopware und räumt auch direkt noch etwas auf.
Arbeiten mit Dateien ist in Shopware 6 an sich recht einfach, gerade seit die Media-Entity und deren Thumbnails ein Path-Feld haben, in dem der relative Pfad direkt angegeben werden kann. Wenn man den hat muss man nur noch den absoluten Pfad bauen. Wenn man z.B. in das public/ Verzeichnis will um dort etwas zu hinterlegen oder ein Media-File zu lesen kann man sich die Umgebungsvariable mit Symfony Project Root per Dependency Injection direkt in den Constructor seines Services geben und von da aus dahin navigieren. Von der aktuellen PHP-Datei aus ist es nicht so toll, da man nicht immer weiß wo das Plugin sich befindet. Z.B: kann es im custom-Folder oder irgendwo in vendor/ sich befinden.
<argument>%kernel.project_dir%</argument>
Und was ist wenn man die Dateien in einem Cluster-Betrieb über ein S3-Bucket an die Cluster-Nodes verteilt? Shopware 6.5 hat zum Glück nicht nur Flysystem dabei, sondern nutzt es auch richtig. Man kann sich direkt per Dependency Injection das privater oder das öffentliche Dateisystem geben lassen und dann ist es egal ob es auf einem FTP, in einem S3 Bucket oder im lokalen Dateisystem liegt.
namespace HPr\FSTest\Services;
use League\Flysystem\FilesystemOperator;
use Shopware\Core\Content\Media\MediaEntity;
class MediaTest {
public function __construct(private FilesystemOperator $filesystem){}
/**
* @throws FilesystemException
*/
public function md5Media(MediaEntity $media): string {
return md5($this->filesystem->read($media->getPath()));
}
}
Um nun das passende Dateisystem zu bekommen ist nicht viel nötig.
Public ist das öffentliche Verzeichnis, das man für Product-Bilder, CMS-Media oder auch andere Downloads nutzen kann, die jeder sehen darf. Dann gibt es auch das private Dateisystem, wo man alles wie Rechnungen und Dinge ablegt, die nicht jeder sahen darf und wo man den Zugriff am besten durch einen eigenen Controller kapselt. Die MediaEntity hat einen private-Flag, um anzugeben in welchem Dateisystem man die Datei findet.
Das Dateisystem selbst kann man in einer YAML-Datei in config/packages/ definieren. Wie man da z.B. seine Dateien in einem MinIO S3 Bucket ablegen kann, habe ich in einem Post vorher schon erklärt.
Da man beim einfachen Entwickeln nicht ein AWS S3-Bucket für die Entwickler bereit stellen möchte, kann man hier sehr gut MinIO verwenden. Es lässt sich schnell in docker-compose einbinden und die FileSystems von Shopware können den normalen S3-Adapter verwenden.
Manchmal braucht einfach Imagick. Z. B. wenn man eine Bildvorschau einer PDF erzeugen will oder einfach mehr Power bei der Bildbearbeitung in PHP oder in Scripten braucht.
Während die Installation die meisten Anleitungen für Docker und Imagick mit den default PHP Docker-Image super funktionieren ist es bei Dockware anders, weil es eine volle Ubuntu-Umgebung mitbringt.
Zu beachten ist, dass man für alle PHP-Versionen die Erweiterung installieren muss.
Manchmal funktionieren ein paar Snippets nicht. Ich vermute es liegt daran wie ein Theme über nicht immer sehr gradlinige Wege überschrieben und erweitert wurde.
Z.B. steht dann "orion.footer.certificates" auf der Seite, obwohl die Snippets korrekt für alle Sprachen in der Administration gefunden werden. Also an sich sollte es dann ja funktionieren.
Lösung: Einmal den Übersetzungen ein 'X' anhängen, speichern, das 'X' wieder entfernen und erneut speichern. Dann sind sie in der Storefront auch richtig.
Weil sie dann aus der Datenbank geladen werden und nicht aus dem Theme/Plugin/App.
Zum 2024-01-01 hat One-DC Teile ihrer Dropshipping-Services abgeschaltet. Man kann immer noch Bestellungen dort per API aufgeben und diese direkt an seine Shopkunden senden, aber es gibt keine Feeds mit Produkten, Beständen und Preisen mehr. Der Sinne erschließt sich mir überhaupt nicht, da Dropshipping ja doch irgendwie weiterhin möglich ist und elektronische Katalogdaten auch für PIMs und Kassensysteme der Kunden wichtig ist. Hätte man den Versand an die Endkunden eingestellt würde ich es ja noch verstehen, aber so macht es für mich keinen Sinn. Falls jemand mehr Weiß oder eine Möglichkeit kennt Katalogdaten weiterhin zu erhalten, bitte sich per Email bei mir melden.
Import2Shop stellt deren Anbindung zu EDC auch ein und die Shops sitzen jetzt und versuchen möglichst schnell zu einem anderen Anbieter zu wechseln. Meine Plugins bleiben weiter online, erhalten aber keine Weiterentwicklung mehr und gelten ab sofort als EOL, wenn nicht sich doch noch was neues ergeben sollte.
Bei in Java bei XML ist die bekannteste Lösung manchmal nicht die Lösung, die man gerade braucht. Groß, komplex und kann alles. Dependencies machen dann aber Probleme und wenn man nur eine Datei schnell und einfach lesen möchte, braucht man nicht irgend eine HTML-Lib, die nur in ganz bestimmten Fällen nötig wäre.
Beim Lesen von Excel-Dateien in PHP ist es genau so. HTML-Lib machte Probleme beim Installieren über Composer, aber ich will ga rkeine HTML-Sachen damit machen. Cool das es gehen würde, aber ich will nur schnell und einfach die Daten der Tabelle auslesen. CSV hätte ja gereicht, aber es kommt eben eine Excel-Datei.
Viele erinnern sich noch an Zeiten, wo man direkt auf einem Webserver seinen HTML-Seiten und Scripts geschrieben und getestet hat. HTML ging meistens schon lokal, aber wenn es um PHP oder anderes ging brauchte man einen Server. Dann schwenkte man auf XAMPP um, wo man einen lokalen Apache nutze. Linux brachte den Apache und PHP direkt mit. Aber man hatte oft kein Linux und half sich mit VirtualPC oder VirtualBox, so man entweder eine shared Speicher hatte oder ganz klassisch per FTP oder später SCP/SSH seine Dateien aus der IDE ins Zielsystem bekam. Dann kam Docker und die Welt wurde gut.. über all gut? Nein, dann erstaunlich viele gerade im Agentur-Bereich arbeiten immer noch mit einem Server und einem FTP-Sync. Gut heute oft mit SFTP oder SCP, aber ohne Docker oder lokalen Webserver.
Während ich klassische vServer mit Apache und ohne Reverse-Proxy und Docker für veraltet halte, sind sie noch öfter Realität als Docker-/K8n-Umgebungen. Selbst shared-Hosting für produktive Umgebungen sind noch öfters anzutreffen.
Nach einem Gespräch, wo noch direkt auf dem Server gearbeitet wurde und nicht mal eine lokale IDE einen Sync in Richtung Server vornahm sondern direkt die Datei vom Server aus geöffnet wurde (da kann man fast direkt mit vi auf dem Server arbeiten...), hier eine einfache kostenlose Lösung, wo man wenigstens die Dateien lokal hat und so auch ohne Probleme mit Git arbeiten kann.
Genutzt wird VisualStudio Code (die Intellij-IDEs bringen so einen Sync direkt von Haus aus mit, kosten aber in den meisten Varianten Geld).
Ein Plugin installieren:
FTP-Config anlegen (wird geöffnet nach dem ersten Sync-Versuch):
Wenn uploadOnSave aktiviert ist am Besten die IDE noch mal neustarten.
Geht auf jeden Fall besser als WinSCP parallel zum Sync laufen zu lassen.
Würde ich so entwickeln wollen? Nein. Besonders wenn mehr als ein Entwickler an einem Projekt arbeiten, geht nichts über Docker. Für Shopware habe ich gute Images oder man nimmt Dockware, was gerade für Entwickler an sich vollkommen reicht.
Wie man eine eigene Entity in die Suche integriert hatte ich schon erklärt. Was aber wenn man eine vorhandene Entity um weitere durchsuchbare Felder erweitern will? Das geht auch relativ einfach.
if (module?.manifest?.defaultSearchConfiguration) {
module.manifest.defaultSearchConfiguration = {
...module.manifest.defaultSearchConfiguration,
extensions: {
// In case some other plugin has already done this trick; we do not want to remove theirs.
...(module.manifest.defaultSearchConfiguration.extensions ?? {}),
// Add our extension fields to the omnisearch
customFields: {
customer_debitor_set_number: {
_searchable: true,
_score: searchRankingPoint.HIGH_SEARCH_RANKING,
},
}
},
};
}
Auch wenn dort die Felder hierarchisch angegeben werden, sind diese bei den Snippets flach strukturiert.
In einem Cart-Validator sollte man vermeiden vom Cat-Service die getCart()-Methode zu verwenden. Ich habe einen Service der mir für den Validator benötigte Daten lieferte und dabei auch einen Wert aus dem Cart generierte. getCart() triggert aber wieder den Validator.. Endlossschleife! Also am besten wirklich nur das in die Validator-Methode rein gereichte Cart-Object verwenden.
Es gibt manchmal CustomFields in denen man Daten wie externe Ids, ein Import- oder Export-Datum oder ein einfaches Bool-Flag speichern möchte. Der normale Admin-Benutzer darf diese Daten gerne sehen sollte sie aber nicht ändern, weil er oder sie nicht das nötige Wissen über die internen Abläufe des Plugins hat, um genau zu wissen, welche Auswirkungen so eine Änderung hat.
Deswegen ist es gut so ein CustomField readonly zu machen und am Besten komplett zu disablen. Das ist über die config des CustomFields sehr einfach möglich. In der Manifest einer App kann dass leider schon wieder ganz anders sein, weil dort sowas nicht vorgesehen ist.
Oft ist es sehr viel einfacher direkt etwas in die Suche der Administration einzugeben, als umständlich eine Seite zu öffnen und etwas aus der Liste per Hand oder Browser-Suche heraus zu suchen.
Eigene oder fehlende Entitäten dort zu integrieren ist an sich recht einfach und logisch. Es gibt hier eine Anleitung die aber leider so für mich nicht funktioniert hat, weil ein wichtiger Teil fehlte.
Routennamen sind hier erstmal nur Beispiel haft vergeben.
Step 1 Ich gehe davon aus das ein Plugin existiert mit einem JS-Module, das mindestens eine Route hat und dessen Name nach dem Schema {vendor}-{name} aufgebaut ist. Zum Module müssen wir wie beschrieben
einige wenige Dinge ergänzen:
{
...
entity: 'ce_my_entity',
...
}
hier kommt später noch was dazu!
Step 2
Den Type (der Entität) hinzufügen. Der Name muss nicht dem Namen der Entität entsprechen, ist aber nicht verkehrt es so zu machen.
Damit kennt die Suche nun den neuen Type und dann theoretisch schon danach suchen.
Step 3
Jetzt müssen wir festlegen wie unsere Entität bei den Ergebnissen dargestellt werden soll. Dafür erweitern wir ein Template und machen es der Suche bekannt.
Was noch fehlt Soweit ist alles gut und nach Anleitung. Aber es funktionierte einfach nicht. Es wurde nach allen möglichen Entitäten gesucht nur nicht nach der eigenen. Nach viel Gesuche kam ich dann darauf, dass bei den Preferences, die für die Liste der Entities genutzt wird, meine eigene garnicht aufgelistet wurde. Warum? Weil ich natürlich keine Preferences dafür hinterlegt hatte, weil es nirgendwo angegeben war.
Diese Preferences findet man im Profile seine Admin-Users und kann es dort alles noch genauer anpassen, wie die Suche suchen soll. Hier werden nun die Felder name und description angeboten und auch direkt aktiviert.
Damit funktionierte die Suche dann auch sofort wie gewünscht.
Wenn man sich in einer Shopware 6 SaaS Umgebung und Apps bewegt, hat man nicht mehr die Möglichkeit Rules im PageLoader zu prüfen und ein bool-Value rein zu reichen, weil man nun alles via Twig machen muss. Entweder im Template oder in den App Scripts, die die PageLoader-Events ersetzt haben.
Geht zum Glück an ganz einfach auch wenn es kein array_intersect gibt.
{% set hideBuyButton = false %}
{% set checkRuleIds = config('MyApp.config.checkRules') %}
{% set intersect = checkRuleIds|filter((rule) => rule in context.context.ruleIds) %}
{% if intersect|length > 0 %}
{% set hideBuyButton = true %}
{% endif %}
Während man in 6.4 noch beliebigen eigenen HTML-Code in z.B. CMS-Elementen oder Snippets eingeben konnte, filtert 6.5 Teile dieses Codes nun heraus. Er gilt als möglicherweise unsicher. Wenn man nun von 6.4 auf 6.5 migriert und z.B. style-Tags entfernt werden, wäre es sehr aufwendig alles nun in SCSS und dem Theme unterzubringen. Einfacher ist es den Sanitizer zu deaktivieren und das selbe Verhalten wie bei 6.4 wieder zu haben.
In der config/packages/shopware.yaml kann den Sanitizer einfach deaktiveren.
Update meiner Shopware Docker Umgebung. Funktioniert mit 6.4. An 6.5 arbeite ich noch. Es ist Imagick installiert, um z.B. automatisch beim Upload von PDFs die erste Seite als JPG zu speichern und in einem CustomField als Vorschau zu verlinken.
RUN docker-php-ext-install dom \
&& docker-php-ext-install pdo \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install curl \
&& docker-php-ext-install zip \
&& docker-php-ext-install intl \
&& docker-php-ext-install xml \
&& docker-php-ext-install xsl \
&& docker-php-ext-install fileinfo
RUN mkdir -p /usr/src/php/ext/imagick
RUN curl -fsSL https://github.com/Imagick/imagick/archive/06116aa24b76edaf6b1693198f79e6c295eda8a9.tar.gz | tar xvz -C "/usr/src/php/ext/imagick" --strip 1
RUN docker-php-ext-install imagick
RUN echo 'memory_limit = 512M' >> /usr/local/etc/php/php.ini
RUN a2enmod rewrite
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --2.2 #there are problem
RUN mv composer.phar /usr/local/bin/composer
# copy conf-file to /etc/apache2/sites-enabled/000-default.conf
RUN mkdir /files;
COPY ./setup.sh /files/setup.sh
ENTRYPOINT ["sh", "/files/setup.sh"]
Wenn man weiß man tun muss ist es an sich recht einfach.
Wir brauchen Verzeichnis mit ./db_data und ./app. Zusätzlich noch eine leere .env Datei.
Um nichts mit DDEV zu tun haben zu müssen gehen wir zu GitHub und laden uns das letzte Release als Zip herunter. Die entpacken wir dann ins app-Verzeichnis.
Nun alles mit docker-compose up -d starten. Sich auf den web-Container per docker exec verbinden. Er hat keine bash sondern nur die sh. Aber egal. Einmal dieses Command ausführen:
php craft setup/security-key
Das generiert uns einen Security-Key für Cookies.
Nun http://localhost:8080/admin/install aufrufen und die Installation kann starten.
Getestet unter Windows mit Docker + WSL2. Sollte also auch ohne Probleme so unter Linux und auf einem Mac funktionieren.
Nach einigen Hin und noch mehr Her, hat die Interspark Inc bestätigt, dass sie keine IPs der Interspark GmbH übernommen hat und somit auch nicht die IPs an den beiden Plugins besitzt. War am Ende sehr schnell feste gestellt und ich übernehme die Plugins nun wieder, da es ja sonst niemanden gibt, der Ansprüche erhebt. Die Lizenz wird auf die MIT/BSD Lizenz geändert und die GitLab Projekte werden öffentlich.
Während die Shopware 5 Version schon in mehreren Shops bewiesen hat, das sie funktioniert, steht bei der Shopware 6 Version noch aus, diese als production-ready zu deklarieren.
Sie hat die meisten Test gut gemeistert und sollte nun auch mit Shopware 6.5 funktionieren. Trotzdem steht noch aus diese in einer produktiven Umgebung über einige Tage laufen zulassen.
Builds und Releases wird es ab jetzt hier geben. Jeder der Interesse oder Bedarf hat kann sich die Plugins installieren oder auch gerne mit weiter entwickeln.
Eine App-Version des Plugins, um damit auch die Shopware 6 Cloud Version (SaaS) abzudecken ist bis jetzt nicht von mir geplant, außer jemand würde mir dafür 5000 EUR geben, weil der Aufwand wirklich groß ist. Es wäre eine vollständig eigenständige Software, die außerhalb von Shopware läuft und dort wo die DAL verwendet wird dann die Shopware API (mit Multi-Tenant usw) aufrufen würde.
Man selbst fährt weit weg und andere übernehmen für die Zeit die Aufgaben, die man sonst selbst ausgeführt hätte. Urlaub. Ein tolles Konzept. Erholung, befreit von den Verpflichtungen die man sonst gegenüber den Kunden hat. Sword Art Online gucken und überlegen wie man Kubernetes Fähigkeiten assimilieren kann ohne wie die Borg-Queen zu erscheinen. Einfach mal AI Bilder von seinem Hund erzeugen. Ok... es hat bis Mittwoch funktioniert. Am Ende muss man proaktiv immer selbst prüfen, ob die Vertretung seine Aufgaben erledigt. Nein... tun sie nicht. Also am Ende ist Urlaub eine Illusion. Es wird trotzdem verlangt, dass man sich um alles kümmert und sich um die Fehler der anderen kümmert und berichtigt.
Am Ende ist das einzige Fazit: Urlaub ist eine Illusion. Es ist eine Matrix mit dem Glauben der freien Entscheidung.
Blog-entries by search-pattern/Tags:
Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?