Blog: Latest Entries (15):


Shopware: Eigene Events

Es war ein kalter und nasser November morgen. Ich saß zu der Zeit in einem ehemaligen Fabrikgebäude im tiefsten Osten Deutschlands mehrere Fahrtminuten hinter Lübeck.
Meine Aufgabe sollte es da sein ein Konzept für das Beschaffungsmodul eines ERP-Systems zu konzeptionieren. Ich stand gerade vor dem Problem, dass z.B. bei Wareneingängen, die über das Modul verbucht werden sollten, auch das Lager-Modul und das Inventur-Modul diesen Eingang verarbeiten mussten. Ich überlegte und entschied mich am Ende für ein auf MDB basierten Event-Model. Wenn etwas passierte sollte ein Event/eine Message los laufen und andere Module sollten, dieses bei Interesse nehmen, zur Kenntnis nehmen oder auch Daten anpassen können. Man war felxibel, hatte keine Abhängigkeiten und alles war erweiterbar und austauschbar. Ich war schon halb dabei was konkretes zu entwickeln... wie man sich sicher jetzt schon denken kann, kam es nie dazu. EJBs wurden direkt aufgerufen mit allen Problemen, die ich mit den Events umgehen wollte.

Ob es nun Fire-And-Forget, synchron oder asynchron, MDB-basiert oder was auch immer gewesen wäre, es wäre besser gewesen als alle benötigten fremden Services per Hand direkt aufzurufen und denen die Daten in deren Formaten aufbereitet zu übergeben. Jede Änderung an den fremden Services, die es zuhauf gab, konnte wieder alles kaputt machen und das passierte natürlich häufig, besonders weil Service-Interfaces beliebig geändert wurden und nie stabile Schnittstellen zwischen den Modulen waren.

Es war ein Fehler es nicht so zu machen, deswegen liebe ich alles was genau so arbeitet. Jetzt habe ich auch angefangen bei einigen meiner Shopware-Plugins Events einzubauen, so dass diese auch teilweise erweitert werden können. Das Preis-Warnung-Plugin ist das erste, das Events erhalten wird. Bei Shopware ist es an sich sehr einfach mit Events zu arbeiten. Als Beispiel nehmen wir uns einen einfachen Service.


namespace HPrEventTest\Components;

class EventService{
/** @var \Enlight_Event_EventManager */
private $eventManager;

public function __construct(\Enlight_Event_EventManager $eventManager = null){
$this->eventManager = $eventManager;
}

public function fireExample(){
$val = 0;
$result = $this->eventManager->filter('HPrEventTest_example', $val, ['subject' => $this]);
return $result;
}
}


Wir müssen nur noch den Event-Manager per Injection zum Service hinzufügen.


<?xml version="1.0" encoding="utf-8"?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="hpr_event_service" class="HPrEventTest\Components\EventService">
<tag name="service" />
<argument type="service" id="events" />
</service>
</services>
</container>


Wie man auf Events reagiert, weiß eigentlich jeder, der schon mal ein Shopware-Plugin geschrieben. Allein der Klassiker zum hinzufügen von Template-Dirs erklärt schon fast alles.


namespace HPrEventTest;

use Shopware\Components\Plugin;

class HPrEventTest extends Plugin{
public static function getSubscribedEvents(){
return [
'HPrEventTest_example' => 'processEvent',
];
}

public function processEvent(\Enlight_Event_EventArgs $args){
$args->setReturn($args->getReturn() + 1);
}
}


Wir feuern also ein Event mit 0, das wird in unseren Plugin verarbeitet und 0 wird zu 1 und diese 1 wird von der ursprünglichen Service-Methode auch dann wieder zurück gegeben.

Es gibt natürlich noch ein paar mehr Event-Strategien als filter(), aber an sich sind alle sehr ähnlich. Nicht bei jedem wird der Return-Wert verwendet.
Das Subject, das wir hier verwenden, eignet sich super dafür Controller und Services zu übergeben, die das Event ausgelöst haben.


Refurbished IT - Gebraucht, günstig, produktiv

Ich hatte mal vor längerer Zeit einen Blog-Post darüber gesprochen, dass IT nicht bei Ebay wächst. Also über Firmen, die ihre IT Ausstattung oder was sie so nennen, sich Stückchenweise bei Ebay und so zusammen kaufen und einen wilden Wuchs verschiedenster PCs und Notebooks mit genau so vielen verschiedenen Problemen schaffen.

Das Verlockende an diesem Vorgehen ist einfach der Preis und damit ein gedachter schneller RoI. Nur leider stimmt dieses so einfach nicht. Verschiedene Systeme haben verschiedene Probleme und brauchen verschiedene Lösungen. Die langzeit Administrationkosten sind also sehr hoch und drücken sehr auf den RoI. Oft wären der RoI schneller und höher bei neuen Systemen, die man bei z. B. bei Dell, HP, Fujitsu oder Lenovo in den benötigten Stückzahlen kaufen kann.

Aber es gibt eine 3. Methode, die eher der 2. genannten entspricht, aber auf Preisen der ersten basiert. Refurbished Systeme kaufen. Refurbished Systeme kommen zu meiste aus alten Firmenbeständen. Wenn eine Firma 200 Arbeitsplatz-PCs austauscht, weil der Hersteller nach 5-6 Jahren keinen bezahlbaren Support und Ersatzteile/Austauschgeräte mehr bietet, holt man sich gerne eine externe Firma, die die PCs einen abkauft, wieder in Schuss bringt und dann selbst weiter verkauft. Stückzahlen, Garantie und schon die richtige Art von Systemen für einen sehr günstigen Preis.

Bei dem Preis kauft man sich einfach 10% mehr als benötigt und spart sich teure Support-Verträge.

Konkret ging es bei mir um eine Anfrage, wie man ~12 Arbeitsplätze erneuern könnte. Es gab verschiedene Angebote und ich sollte auch noch mal was raus suchen. Anforderung war, dass sie schneller als die alten sein sollten. Das übersetzt man dann in: leicht administrierbar, alle gleich, solide Hardware, ausreichend Anschlüsse. Da ist das auch Freelance-Ebene neben meinem Job mache, habe ich dabei auch die Freiheit günstig zu sein, auch wenn ich versuche nicht denen, die davon leben, die Preise kaputt zu machen.

bbcode-image


Ich hab einen einfachen Office-PC rausgesucht. Ein i5 ist mehr als ausreichend schnell. Denn was machen die Leute im Büro? 80% der Anwendungen sind Cloud-Anwendungen, die im Firefox laufen. Was in Word schreiben. Die Hardcore-Anwender verwenden sogar mal Excel (teilweise für Todo-Listen). PDFs ansehen, Drucken, Scannen (damals noch über SMB-Freigaben *urgs*).. das war es. Ich wurde gewarnt, dass viele ja so viele Daten hätten 10GB-500GB an Daten und die 320GB HDD würde ja nie reichen. Wenn man aber die 600MB Druckertreiber, 150MB Openoffice Installer, etc einmal weg gerechnet hatte blieben meist so 1GB-5GB übrig. Der Arbeitsplatz der Grafikdesignerin war eine eigene kleine ungeplante Baustelle.
Viel konnte man sparen, in dem man die Scans nur noch über Email laufen lies. Weil dann ist alles im Postfach zu finden, was man mal gescannt hat und man findet es dort auch wieder, falls mal die Kopie von der Festplatte verloren geht (defekter PC oder so).

Also i5, 8GB RAM, 320GB HDD und , das war mir wichtig, 2 Displayports. Keiner der dort verwendeten Monitore war mit Displayport angeschlossen, ABER der Wildwuchs an HDMI, DVI und VGA Monitoren, Adaptern und Kabel war zu undurchsichtig um alles irgendwie geordnet aud 1x HDMI, 1x DVI, 1x VGA auszuteilen. An Displayport kann man alles gut und einfach adaptieren und die Adapter sind günstig. Also lieber 8x DP auf HDMI und 6x DP auf DVI ADapter kaufen und sich den Stress mit Kabel und Monitore sortieren und hin und her tauschen sparen.

Etwas was man auch nicht unterschätzen sollte, ist die Stapelbarkeit der PCs. Wenn man die alten einlagert oder neue vorbereitet für den späteren Einsatz, ist man glücklich im Lagerraum nur wenig Platz zu benötigen. Da sind diese Office-PCs auch fast unschlagbar (nur die Kiste für die Netzteile ist nicht ganz optimal).

bbcode-image


Das sind dann ca 280 Euro für einen neuen Arbeitsplatz und es können mit Tesafilm zusammen gehaltene PCs ausgetauscht werden :-)

bbcode-image


Was neu gekauft wurde, sind die Adapter, ein QNAP NAS (als allgemeiner SMB-Server und Domain-Controller.. was echt super funktioniert), sowie eine Fritzbox. Die Fritzbox ersetzte eine Telekom Digitialisierungbox Business.
Beim Router war der RoI auschlag gebend. Remote-Access, VPN und alles schnell und einfach. Der Preis für die Fritzbox war schon in den 30min wieder drin, die ich damit brauchte alles einzurichten, wobei ich bei der Box 4-5h lang gescheitert bin. Ok.. mir fehlte die Erfahrung mit der Box, aber wenn man die TK-Anlagen Funktion der Box nicht nutzt, ist es kein Verlust und spart direkt Geld (Fallback Lösungen sind auch schnell in 10min umgesetzt).

Selbst die Fritzbox hätte man gut gebraucht kaufen können, wenn man die Zeit gehabt hätte. Bei QNAP Geräten sind die Auswahl und die Preise bei Refurbished Geräten so schlecht, dass neu kaufen genau so gut ist.
Bei anderen Herstellern ist es leider nicht besser (Domain-Controller Funktion lässt leider wenig Auswahl!)

bbcode-image


Noch mal zum Grafik-Arbeitsplatz. Momentan ist der Arbeitsplatz nur mit einem Notebook (i7, 16GB, etc) ausgerüstet und soll zu einem Arbeitsplatz mit einer echten Workstation + dem Notebook + VPN-Zugang werden. Der Printserver für den Plotter entpuppte sich als Xeon CAD-Workstation (E3, 16GB, Quadro 4000er, 256GB M.2 SSD). Dafür habe ich eine refurbished 2TB HDD gekauft (ich liebe Shops wo ich 3h nach Bestellung alles einfach direkt abholen kann).
Die Daten für die Workstation und das Notebook sollen auf dem NAS gelagert sein, dass über VPN dann erreichbar ist.

bbcode-image


Am Ende war es eine gute Entscheidung das meiste gebraucht oder wenigstens günstig zu kaufen. Beim NAS sind neue Festplatten gut, aber das Gehäuse hätte man genau so gut gebraucht kaufen können. Für Festplatten und SSDs die nicht 24h/7d laufen reichen auch oft refurbished Komponenten, die zumeist aus Demo-Systemen stammen oder bei Aufrüstungen übrigblieben.

Ich habe erst gestern eine 300GB SSD verbaut, um einen PC noch mal etwas mehr schnellen Speicher zu geben. Günstig, funktioniert... da am Ende nur viel davon gelesen wird (da kommt der Steam-Ordner drauf) hält die auch lange. Auch als unempfindliche externe Festplatte sind günstige SSDs echt super. Sie sind sehr viel schneller als USB-Sticks und halten auch mal Stöße sowie Stürze aus, weil keine mechanischen Komponenten verbaut sind. Ein gutes 2,5 USB 3.0 Gehäuse gibt es für 8 Euro.

bbcode-image


Seine IT auf refurbished Geräten aufbauen zu lassen ist also ohne Probleme möglich und für kleine Firmen, die nicht viel Geld investieren und auch das schnell wieder drin haben wollen, eine sehr gute Alternative zu Verträgen mit Dell, HP, etc.

John Sonmez verläßt Simple Programmer

Auch wenn ich vieles was John Sonmez so sagt, sehr kritisch sehe (Burnout gibt es nicht, man hat nur nicht genug Disziplin.. oder um mehr Zeit zu haben sollte man einfach weniger schlafen) muss ich sagen, dass ich gerade in seinen Artikel von so vor 3 - 2 Jahren sehr viel gelernt und verstanden habe. Es war gerade eine Zeit bei mir wo ich sehr motiviert und auch engagiert an einen Projekt gearbeitet habe. Zuvor war ich Teil von einem doch relativ großen Team, wo alle Probleme und Fehler, die bei großen Teams vorkommen, gerade durch exerziert wurden. Mit einem kleineren und sich damit schneller entwickelten Projekt war ich sehr zufrieden und versucht meine Vorstellung von Vereinfachung und beschleunigter Entwicklung da einfließen zu lassen. Leider scheiterten viele dieser Bemühungen an der Skepsis vor neuen Technologien und der Situation, dass man nicht wirklich Zeitdruck hatte und das sparen von Zeit deswegen nicht wirklich ein Argument war.
Zur selben Zeit versuchte ich die gelernten Lektionen und meine Ideen, die ich dort nicht umsetzen konnte, privat in Text und manchmal auch Code zu konservieren, damit man in späteren Zeiten doch mal darauf zugreifen konnten. Außerdem war damit auch die Hoffnung verbunden von anderen Entwicklern und Firmen beachtet zu werden und irgendwie auch Bestätigung zu bekommen. Der Simple Programmer Blog traf zu der Zeit also bei mir einen Hauptnerv. Einmal wurde dort mein Verständnis davon bestätigt, dass die einfachste (also unkomplexeste Lösung, "Don't be smart!") meist auch die beste Lösung sei und auch wurde dort das Gefühl fest zu stecken und sich nicht mehr weiterentwickeln zu können oft thematisiert.

Dem ersten Tip hatte von mir aus schon umgesetzt und vielen Verbesserungen unterzogen: Schreib einen Blog. Das machte ich und hatte auch einen relativ hohen Output, weil ich vieles aus meinem Job dort verarbeiten konnte. Zusätzlich faste ich auch einfach oft, dass zusammen was ich neben lernte. Anleitung zum Aufsetzen waren auch mehr Merkzettel für mich, weil man dann nicht jedes mal neu überlegen, ob ich alles gemacht und nichts vergessen habe. Aber wohl die größte Inspiration war das Gespräch mit Kollegen. Jeder hat seine Ansichten und Meinungen. Wirklich falsch ist etwas davon nie nur immer aus verschiedenen Sichtweisen. Selbst die Sichtweisen, die Neuerungen und so schwer gemacht haben, waren ja nicht an sich falsch.

Ich fing also auch vermehrt an an privaten Projekten zu arbeiten. Das hatte ich schon vorher getan und mein PHP-Framework hatte auch zu der Zeit schon ein paar Jahre produktiven Einsatz hinter mir. Aber ich lernte von John Sonmez eine ganz wichtige Lektion, die mich wirklich weiter gebracht hat. Wenn man etwas anfängt, muss man es auch zu Ende bringen. Angefangen hatte ich viel, aber an sich ist da alles irgendwann im Sande verlaufen und ich hatte Glück, wenn etwas Prototyp-Status erreichte. Meistens war es dass eine andere Technologie dann wieder spannender war und man die andere Technologie ja irgendwie gemeistert hatte.. das Programm lief ja.. dann wäre so was wie der Go-Live gekommen und man hätte es der Öffentlichkeit präsentieren müssen. Werbung, Support, Pflege.. Kunden.. also der ganze unspannende und nervige Kram. Aber es gehört nun mal dazu und ein Projekt technologisch umzusetzen ist, dass was an sich jeder Entwickler mehr oder weniger gut am Ende hinbekommt. Abhängig davon welche Umgebungsfaktoren und Anforderungen einen so Steine in den Weg legen. Dann genau dieser letzte Teil vom Projekt, ist der der einen weiter bringt und einem Sichtbarkeit verschafft. Projekt, das zwar läuft aber nicht veröffentlicht wurde, ist nicht mehr als Beispiel für Lernzwecke, aber nie am Ende etwas richtiges.
Zu der Zeit entstand neben ein paar kleinen Firefox-OS Apps und mp4togif.com. Genau diese Softskills waren es dann auch, die mich weiterbrachten. Denn ein Projekt selbst durch zuführen ist was ganz anderes als nur Entwickler in einem Projekt zu sein. Man lernt zu Kommunizieren und irgendwie auch etwas zu Manipulieren. Umschiffe Hindernisse mit der richtigen Sprache und in dem man die richtigen Leute anspricht. Dafür muss man proaktiv nach vorne gehen. Du musst die Probleme lösen, die anderen können besten Falls unterstützen oder Hilfen geben. Und wenn man die richtigen Leute um Hilfe fragt, werden sie sich auch an dich erinnern und das nicht negativ.

Also.. Softskills. Lerne Menschen kennen bzw lass anderen Menschen dich kennen lernen. Frage um Hilfe, wenn du sie brauchst und zeige Dankbarkeit für die Hilfe. Auch sollte man genauso seine Hilfe anbieten.

Denn dass ist etwas, was ich zwar wusste, aber erst eimal bewusst forcieren musste. Sei die Person die man um Hilfe fragt. Lerne zu helfen und dein Wissen verständlich und sicher mitzuteilen. Man muss nicht alles wissen, aber man sollte seine Bereiche haben, wo man sich sicher auskennt und dieses auch offensiv nutzen. Wenn jemand ein Problem hat, soll er zu dir kommen. An sich ist das nichts anderes als Kundengenerierung. Man muss sich in eine Position bringen, wo man anderen die Hilfe nicht mehr anbieten muss sondern wo man um Hilfe gefragt wird.
Wichtig hierbei zu beachten ist natürlich: Wer Programmieren liebt und nicht seine Zeit in Meetings verbringen möchte, wo man auch mal deine Meinung zu einen Thema gerne hören würde... dann sollte man es nicht machen. Ich helfe gerne, lerne gerne die Probleme und Lösungsansätze anderer kennen und entwickle gerne Lösungen. Programmieren ist dann nur noch ein letzter Schritt zur Realisierung.

Auch wenn es immer versucht wird zu verhindern, dass sich Wissen in einer Person konzentriert (die Person ohne die bei einem Programm nichts gefixt werden kann, wenn die Person nicht da ist..), sei diese Person, aber sei auch ein Multiplikator, auch erstmal aktiv. Sag in Meetings, dass du eine ähnliche Lösung schon mal gesehen hast und eine Email schreiben wirst oder gib Tipps wo schon mal so etwas gemacht wurde. Das man dann noch mal auf dich zukommt, wenn noch Fragen sind, ist gut, weil dann dein Tipp zumeist gut und hilfreich war.

Man muss dieses Networking und die "richtigen" Menschen kennen nicht so extrem sehen wie John Sonmez und Menschen nur nach Nutzen beurteilen. Aber einige Leute zu erinnern, dass man noch existiert, kann nie schaden. Falls doch mal Hilfe braucht oder sogar man mal auf der Suche nach einem neuen Job ist (Freelancing oder fest angestellt.. egal) kann es hilfreich sein. Würde ein ehemaliger Arbeitgeber merken, dass es doch jetzt Zeit für einen B2B-Webshop wäre und man eine Anbindung (automatisierter Artikel und Bestellungen Abgleich) an ein ERP braucht.. SAP oder.. an sich egal.. würde ich natürlich gerne unterstützen und helfen. Erstens würde es mich darin bestätigen, dass mein Konzentrieren auf diesen Bereich richtig war, dass das was in meine Blog steht mein Fachwissen und Kompetenz gut transportiert hat und ich als Mensch nicht so war, dass man mit mir nicht zusammen arbeiten wollen würde. Wobei ich dann doch so bin, dass mich der letzte Punkt am meistens treffen würde, denn es gibt nur einen mit dem ich nie wieder zusammen arbeiten würde, weil es leider zu unschön aus einander ging und es wohl nie harmonieren würde bei einem erneuten Versuch der Zusammenarbeit.

Denn das habe ich auch von Simple Programmer gelernt. Wenn es nicht geht geh... egal ob man dir bei neuen Bewerbungsgesprächen dumme Fragen stellen könnte. UND die Probezeit ist für beide Seiten da! Auch der Arbeitgeber darf gehen, wenn es nicht passt.

Es gab natürlich auch Tipps, die mir nichts gebracht haben. Z. B. die Promodoro-Technik. Ich kann es nicht. Meine Arbeitsweise passt nicht zu den Zyklen.
Klar mache ich auch kurze oder etwas längere Pausen, um zwischen Workloads den Kopf wieder frei zu bekommen. Aber wenn ich einen Lauf habe will ich nicht unterbrochen werden und ich kann meine Aufgaben immer in 15min Workloads aufteilen. Gerade beim Debuggen an einer Stelle, wo man sich erst einmal hinarbeiten muss, kostet eine Unterbrechung nur unnötig viel Zeit und nervt mehr als zu nutzen.

Treibe Sport! ... jaaaaa... wenn ich wieder Zeit dafür habe... also.. nächstes Jahr? Bzw eines der nächsten Jahre.... TBA.. ja.. TBA.

Aber Ernährung war dann doch wieder besser und kann ich unterstützen. Es bedarf Überzeugung und Motivation, sich Abends was vorzubereiten oder morgens doch noch mal Brote zu schmieren. Ich mag Pizza und Burger und man findet immer jemanden der in der Mittagspause mitbestellen würde. Und selbst den Gang zum Bäcker kann man sich gut reden. Aber am Ende fühlt man sich mit eigenen gesunden (oder nicht ganz ungesunden Essen) leistungsfähiger und fit. Ich trinke auch zu viel Mate und zu wenig Wasser bei der Arbeit. ABER jedes mal wen nicht ein paar Tage doch etwas besser mache, bin ich stolz auch mich und in den letzten Monaten klappt es auch immer ein Stückchen besser: Gesundes Essen am Abend, Smoothis, oder einfach mal ein selbst geschmiertes Brot. Man merkt den Unterschied zu einer fettigen Pizza.

Also.. ich habe von John Sonmez viel gelernt oder wenigsten Hilfe dabei gehabt Sachen deutlicher zu sehen. Die Beiträge von den anderen Autoren haben mich nie wirklich begeistern können. Deswegen ist sein Weggang für mich auch mit das Ende von Simple Programmer für mich. Wirklich Schade, aber was zu sagen war, hat er gesagt und geht nicht verloren.

Außerdem war er neben Kassenzone.de der einzige mir gekannte Blog, der Transkripte der Vlogs und Podcasts hatte. Ich überfliege lieber schnell die Texte zum Filtern nach interessanten Themen als durch ein Video oder Podcast zu spülen und mit etwas Glück die richtige Stelle zu erwischen.

bbcode-image

Shopware: Automatischer Bestellung Export

Es wurde das Verhalten von leeren "states" in der API gefixt.

bbcode-image


Es gibt nun Filter-Events:

- HPrAutomaticOrderExport_ot1_created_address_additionallines
- HPrAutomaticOrderExport_ot21_created_xml
- HPrAutomaticOrderExport_ot1_created_xml
- HPrAutomaticOrderExport_ot1_created_party
- HPrAutomaticOrderExport_ot21_created_party

- HPrAutomaticOrderExport_export_updated_orderstatus
- HPrAutomaticOrderExport_export_created_model
- HPrAutomaticOrderExport_export_before_writefile
- HPrAutomaticOrderExport_export_rest
- HPrAutomaticOrderExport_export_generated_list_sql
- HPrAutomaticOrderExport_export_loaded_list

bbcode-image


Das Update wird in den nächsten Tagen in den Store kommen.

Java ArgumentResolver Update

Nach langer Zeit mal ein Update dafür:


package de.hannespries.commons.cli;

import java.util.HashMap;

public class ArgumentResolver {

private HashMap<String, String> arguments = new HashMap<>();

public ArgumentResolver() {

}

public ArgumentResolver(String[] args) {
this.readArray(args);
}

/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
*/
public void addArray(String[] args){
this.readArray(args, false);
}

/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
*/
public void readArray(String[] args) {
this.readArray(args, true);
}

/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
* @param clearBefore clear the existing map
*/
public void readArray(String[] args, boolean clearBefore) {
if(clearBefore){
this.arguments.clear();
}

if (args != null && args.length > 0) {
String argName = "";
for (String arg : args) {
if (arg.startsWith("-")) {
argName = arg.substring(1, arg.length()).trim();
this.arguments.put(argName, "");
} else {
if (argName.trim().length() > 0) {
if (this.arguments.get(argName).trim().length() == 0) {
this.arguments.put(argName, this.arguments.get(argName).concat(arg));
} else {
this.arguments.put(argName, this.arguments.get(argName).concat(" " + arg));
}
}
}
}
}
}

/**
*
* @param name argument name
* @return gives back the existence of the argument with the given name
*/
public boolean existsIn(String name) {
return this.arguments.containsKey(name);
}


/**
*
* @param name argument name
* @param defaultValue argument value if not found
* @return value of the argument with the given name
*/
public String getArgumentValue(String name, String defaultValue) {
return this.existsIn(name) ? this.arguments.get(name).trim() : defaultValue;
}

/**
*
* @param name argument name
* @return value of the argument with the given name
*/
public String getArgumentValue(String name) {
return this.getArgumentValue(name, "");
}

/**
*
* @return count of arguments
*/
public int size() {
return this.arguments.size();
}
}


Syntax ist weiterhin so:

java -jar example.jar -name blubb blubb -value 1


name ist dann "blubb blubb" und value ist "1". Diese Klasse kommt an sich bei jeden meiner Java-Projekte zum Einsatz, wenn das Programm über die CLI bedient werden kann.

Es wird Zeit für Angular...

Ich hatte ja gehofft, dass sich AngularJS neben Angular gleichberechtigt halten wird und nicht von diesem ersetzt wird. Sieht wohl aber so aus als würde die Zeit von AngularJS jetzt doch zu Ende gehen (mit 3 Jahren LTS). Also werde ich mir dann doch mal wirklich, nach 1000 mal sich dieses vorzunehmen, genauer ansehen und ausprobieren.
Wenn es mir nicht gefällt gibt es ja noch immer Knockout.js. Lust mein eigenes kleines cJS-Framework doch nochmal weiter zu entwickeln habe ich dann doch nicht. Dem fehlt einfach eine gute Template-Engine und so eine zu schreiben oder einzubauen, wäre etwas zu viel Arbeit.

Mal gucken bei welchen Framework ich am Ende dann landen werde.



Shopware: POS-Plugin

So langsam wird aus dem Prototypen, ein echtes und brauchbares Produkt. Auch wenn der Realworld-Test heute leider ausgefallen ist, hat das Plugin wichtige neue Funktionen bekommen:

- Direktes Anlegen eines Kunden beim ersten Login-Versuch (dann muss man bei 4000 Karten nicht 4000 Kunden anlegen sondern, kann direkt loslegen)
- Vorgegebene Freitext-Felder, dadurch muss man weniger konfigurieren und weniger Fehlerquellen

bbcode-image


Zusätzlich:

- viele Fixes
- Drucken von Kassenbons ist zu 50% fertig. Ein Thermodrucker zum testen ist bestellt.. und hilft vielleicht bei der Kassenschubladen-Problematik
- 13,6mHz Tags zum Aufkleben und ein passendes Lesegerät sind auch bestellt... damit kann man einfache Eintrittskarten zu Bezahlkarten machen

Es geht also alles in schnellen Schritten voran und ich hoffe, dass es dann schon bald als Cloud-Service für alle verfügbar sein wird.

Shopware: Registrierung-Plugin Version 2.1

Mein Registrierung-Plugin wird in der Version 2.1 ein paar kleine Verbesserungen erhalten. So kann man festlegen, ob die Registrierung nur als Firma oder nur als Privat-Kunde möglich ist (oder natürlich wie sonst auch beides).

bbcode-image


bbcode-image



Zusätzlich kann man einstellen das Schnellbestellungen als Gast-Kunde nur als Privat-Kunde möglich ist und nicht als Firma.

Die 2.1 Version ist im Store. Momentan wird noch an einem Fix für ein Problem 5.4 RC1 gearbeitet.. der noch mit 5.3.7 getestet werden muss oder wieder fallen gelassen wird, sollte sich 5.4 RC2 in dem Bereich wieder "normal" verhalten.

Shopware: Quelloffene Plugins im Store

Quelloffene Plugins sind toll. IonCube ist doof, umständlich und schwer einzurichten. Wenn es die Möglichkeit gibt würde ich ein quelloffenes Plugin immer vorziehen.
Dieser Artikel von Shopware fasst alles sehr gut zusammen.

Viele Fragen zu einem Shopware-Plugin können einfacher und schneller durch einen Blick in den Code beantwortet werden:

- Wo holt es sich die Daten her?
- Wo schreibt es die Daten hin?
- Welche Daten müssen vorhanden sein, damit alles verarbeitet werden kann?
- Wann wird welche Funktion aus geführt?

Und gerade die Angst, der Code könnte geklaut werden halte ich in 99,99999% für eine verzerrte Sicht der Dinge. Denn man muss einfach davon ausgehen, dass die Plugins aus genau zwei Gründen gekauft werden:

- Der Betreiber des Shops kann nicht Programmieren und hat auch keine Entwickler
- Das Plugin selbst zu entwickeln wäre teurer als es zu kaufen

Ich selbst habe ein paar Plugins im Store die auch wirklich wenigen Zeilen Code bestehen. Manche manipulieren genau einen Wert im Request. Es hat etwas gedauert bis man musste welcher Wert manipuliert werden muss (das weiß man, weil man ja den Quellcode von Shopware einsehen kann). Umsetzen, Testen, verbessern, etc. Aber keine großen oder komplexen Leistungen.

Warum habe ich diese quelloffen im Store? Weil ich glaube, dass ein Entwickler (wenn er gerade keinen Forschungsdrang hat) eher mal paar Euro ausgibt als selbst es nach zubauen und alles selbst nochmal testen und überprüfen zu müssen.

Lösungen zu verheimlichen ist nie gut. Weil man selbst braucht ja auch oft mal Hilfe oder Denkanstöße. Mit genug Zeit kommt jeder auf die Lösung, aber man hat immer genug zu tun, um dankbar dafür zu sein, dass jemand anderes sich diese Zeit genommen hat und man sich mit deren Dingen beschäftigen kann.

Der neue Shopware-Newsletter

Mir gefällt der neue Shopware-Newsletter nicht. OK er ist übersichtlicher, aber mir gefällt es nicht, dass die neuen und aktualisierten Updates nicht mehr direkt als Liste enthalten sind sondern nur noch Banner-Links auf deren Store, wo man diese Plugins findet.

Mir gefiel es immer meinen Namen dort zu lesen. Hat den Freitag oft verschönert :-)

Shopware: Probleme mit value in der config.xml

Ich hatte ein kleines Problem mit der config.xml, dass sich rein auf die Reihenfolge der XML-Nodes bezog.

Richtig:

<element required="true" type="text" scope="locale">
<name>default_value</name>
<label lang="de">Standard Wert</label>
<label lang="en">Default value</label>
<value>default</value>
</element>


Falsch:

<element required="true" type="text" scope="locale">
<name>default_value</name>
<value>default</value>
<label lang="de">Standard Wert</label>
<label lang="en">Default value</label>
</element>


Muss man nur wissen....


Older posts:

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?