Blog: Latest Entries (15):


Shopware: Traue keinem Subscriber!

Subscriber bei Shopware-Plugins sind immer so ein Problem. Sie nehmen Daten manipulieren diese und reichen sie an den nächsten Subscriber weiter. Wenn ein Subscriber in einen Fehler läuft und z.B. leere Daten in die Arguments zurück schreibt, ist am Ende alles kaputt und die Daten sind verloren gegangen. Das ist mir jetzt einmal passiert und deswegen, bin ich darauf umgeschrieben, dass Subscriber nur noch auf einer Kopie arbeiten
dürfen.


$outputModelCopy = new \ArrayObject($outputModel);
$outputModelCopy = $this->fireEvent('decorate_model', $outputModelCopy);
if($outputModelCopy && count($outputModelCopy->getArrayCopy()) > 0){
$outputModel = $outputModelCopy->getArrayCopy();
}


Sollte nun etwas schief gehen und die Daten verloren gehen, werden einfach die Ursprungsdaten weiter verwendet. Wenn nun zusätzliche Daten nicht dazu dekoriert werden, ist es zwar doof und man muss in das Log-File gucken, ob Fehler auftraten, aber der Ablauf funktioniert weiter und es kommen immer hin die Grunddaten weiter dort an wo sie hin sollen.

Gerade bei Exports oder Imports mit kritischen und unkritischen Daten zusammen, ist es immer besser wenigstens die kritischen Daten sicher zu haben als gar nichts zu haben. Unkritische Daten kann man meistens dann sogar per Hand nachpflegen.

Identitätsdiebstahl und Koblenz

HD+ Kunden, die sich ein neues Programmpaket bestellen, gehen oft nach einem bestimmten Muster vor. Sie geben eine beliebige Email-Adresse (bestimmt geht auch eine nicht existente und rein ausgedachte Email-Adresse) und dann geben sie eine beliebige Bankverbindung ein. Mehr Daten braucht man da wohl auch nicht. Dann bekommt vielleicht jemand eine Rechnung (in diesem Fall ich) und irgendwer muss bezahlen (in diesem Fall jemand auf Koblenz).

Wenn man sich als Rechnungsempfänger da meldet, interessiert es da keinen, weil ja hoffentlich der 2. dumme es nicht merkt und die Rechnung bezahlt.

Da ich schon mehrmals mit genau dem selben Vorgang bei HD+ als Rechnungsempfänger zu tun hatte, scheint es da wirklich System zu haben. Leider gibt HD+ an der Hotline auch direkt an, daran nichts ändern zu wollen.

Ich bin gespannt, wann die nächste Email bei mir aufläuft.

bbcode-image

Java: Eine Fat Jar mit allen Dependencies

Manchmal ist es echt unpraktisch viele kleine JAR-Dateien zu haben und man hätte gerne alles in einer großen. Keine Class-Path Probleme mehr, einfaches Deployen und ein Single-Point-Of-Failure.

Mit Maven geht das zum Glück sehr einfach. Spring Boot und Meecrowave haben eigene Plugins mit denen man auch sehr gut arbeiten kann und die dem Beispiel hier vorzuziehen sind.


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>de.hannespries.time.gui.MainFrame</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>


bbcode-image


Shopware: XML-Export + SCP

Die Windeit-Software GmbH wird in der nächsten Zeit eine neue Version des Automatic XML-Export Shopware-Plugins veröffentlichen. Es hat nun die Version 2.0.0 erreicht und kann jetzt selbstständig per SCP XML-Dateien auf einen anderen Server laden.

Dafür muss die php-ssh2 Extension installiert sein, was unter Ubuntu sehr einfach geht:

sudo apt-get install php7.2-ssh2


Auf dem Ziel Server muss der Openssh-Server installiert sein.

bbcode-image


Danach müssen nur noch die Verbindungsdaten eingegeben werden und der SCP-Upload aktiviert werden.

bbcode-image

Mein erstes Unix: Bull DPX/2

Mein erster Unix Rechner war ein Bull DPX/2 mit Motorolla 68030 CPU, 4MB RAM und einem Unix-Derivat. Vorher genutzt von dem DRK und man musste sich mit einem Serial VT-100 kompatiblen Terminal verbinden. Zum "Glück" war das UUCP-Konto nicht geschützt und so war es möglich sich das erste mal in VI zu verirren und erste Erfahrungen mit Unix zu machen.

bbcode-image


Der Rechner war riesig und schwer (eingebaute USV am Boden des Gehäuses), aber alles war von der Rückseite aus entfernbar und man konnte viel über die Computer-Architektur der 80er Jahre lernen.

Und wegen dem AM27C1024 EPROM: 50 Jahre AMD!

Firma mit familiären Klima

Man stolpert doch immer mal wieder über Firmen, die in Stellenanzeigen mit familiären Klima werben. Das ist so ein Überbleibsel der 70er und 80er Jahre wo Familie einen sehr hohen Stellenwert zugewiesen wurde. Gefühlt auch damals schon nicht immer zu Recht... aber zurück zu den Firmen. Familie an sich ist erst einmal super. Man hat Vertraute und bekommt Hilfe, wenn man sie braucht. Aber auch dort gibt es Diskussionen und Streit. Wenn man sich jetzt einmal vorstellt man würde in einer Firma arbeiten, die nur mit Familienmitgliedern besetzt ist und man ist nicht Chef. Wenn es in dieser Firma zu einer großen Diskussion kommen würde, könnte jeder bestimmt schnell ein Familienmitglied benennen, das schon nach kurzer Zeit beleidigt sich aus der Diskussion ausklinken würde, weil es nicht nach dieser Person geht.
Familie hat eben den einen Nachteil, dass dort alles auf persönlicher Ebene geregelt wird und nicht auf professioneller. Eben auch Konflikte und Meinungsverschiedenheiten. Wenn nun in einer Firma diskutiert wird und man kommt nicht auf einen Nenner, wird der Chef/Teamleiter irgendwann das abbrechen und sich für eine Ansicht entscheiden mit der man dann eben weiter arbeiten wird. Niemand würde ihm das übel nehmen, weil es eben sein Job ist und man ja auch irgendwie weiter machen muss. Wenn jemand damit nicht zurecht kommt, dass es nicht nach ihm geht, ist die Person leider in der Abteilung/Firma falsch.

In einer Firma mit familiären Klima ist alles persönlich und wird nur auf einem persönlichen Niveau ausgetragen. Ein großes Problem ergibt sich aber daraus, dass es so auch erwartet wird und auch klar nach dem Motto gelebt wird, man könne sich seine Familie ja nicht aussuchen. Dadurch kommt es, dass der Chef sich mit bestimmten Mitarbeiten nur streitet, beide beleidigt sind und es in großen Konflikten ausufert (auch mal mit Geschrei oder das einer mucksch vor dem PC sitzt und den anderen demonstrativ ignoriert*). Aber der Chef würde diese Person nicht feuern, weil es wie in einer Familie ist, wo man zwar mit einigen verwandt ist, aber wegen einem Streit seit Jahren nicht mehr gesprochen hat.
Das Kündigen wird, dann auch als Verrat an der Familie/Firma aufgefasst, egal wie schlecht es vorher lief.

So kann aber eine Firma und Team nicht funktionieren. Auch Menschen, die sich nicht mögen, können auf professioneller Ebene zusammen arbeiten. Sollte es einfach nicht gehen, muss man dann eben getrennte Wege gehen und einer muss das Team verlassen/wechseln.

Ich würde nicht in einer Firma anfangen, die sich wie eine Familie fühlt. Firmen sollen Firmen sein und Familien bleiben Familien. Keines von beiden ist perfekt, aber wenn man es mischt, kommt es meistens dazu, dass nur die schlechten Teile von beiden zusammen kommen und nicht die guten.

Der englische Begriff für das was ich meine ist Psychological safety. Wo man weiß, dass die eigene Meinung auf professioneller Ebene beurteilt, wird und nicht auf persönlicher.

* das habe ich sogar einmal persönlich erlebt

Node.js und Elasticsearch

Ein paar kleine Code-Snippets, um grundlegende Funktionen in node.js mit Elasticsearch implementieren zu können.

Elasticsearch-Client installieren:

npm install elasticsearch get-json


Client erstellen:

var elasticsearch = require('elasticsearch');

var client = new elasticsearch.Client( {
hosts: [
'http://localhost:9200/'
]
});


Index erstellen:

if(!client.indices.exists("testidx")){
client.indices.create({
index: "testidx"
}, (error, resp, status) => {console.log(status)}
);
}


Document speichern:

client.index(
{
index: "testidx",
type: "item",
id: "1",
body: {
id: "123",
value: "blubb"
}
}
);


Ein einfaches Query mit Callback-Function:

client.search({
index: 'testidx',
type: 'item',
body: {
query: {
match: { "id": "123" }
},
}
}, (error, response,status) => {
console.log("-- Hits --");
response.hits.hits.forEach((hit) => {
console.log(hit);
});
});


Ein einfaches Query mit Promise:

client.search({
index: 'testidx',
type: 'item',
body: {
query: {
match: { "id": "123" }
},
}
}).then((response) => {
response.hits.hits.forEach((hit) => {
console.log(hit);
});
}, (error) => {console.log(error);})


Mit Hilfe dieser Seite https://www.compose.com/articles/getting-started-with-elasticsearch-and-node/ zusammen gebastelt und hiermit https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/quick-start.html ergänzt.

Blackmagic DaVinci Resolve: Video Speedup

Im Gegensatz zu NCH Videopad, das nur bis 800% Speedup kommt (man muss für mehr zwischen durch immer exportieren), kann Blackmagic DaVinci Resolve auch weit über 1000% beschleunigen, so dass man man 11:00min auf unter 1min stauchen kann. Das geht auch ganz einfach. Auf den Clip den man ändern möchte mit einem Rechtsklick das Context-Menü öffnen und "Change Clip Speed" auswählen. Wenn man die %-Zahl ändert, sieht man auch direkt welche Länge der Clip dann haben wird.

bbcode-image


In der Vorschau ruckelte es zwar noch sehr, aber nach dem Exportieren lief alles es flüssig. Ich muss mich wohl noch mal mit den Vorschau-Einstellungen auseinander setzen. Da es nur ein 720p Video war und nicht mal 4K.

Kostenlose Multimedia Programme

ESM-Computer hat einen sehr interessanten Blog-Post geschrieben, der mich an alte Zeiten in Foren erinnert hat, wo man Freeware und Open-Source Listen hatte, damit die Mitglieder nicht ihr Geld für "fragwürdige" Software ausgeben, ob man für weniger (also nichts) mehr bekommen würde und auch um etwas zu Zeigen, dass es neben Adobe noch andere Lösungen gibt. Meiner Meinung nach fehlen in dem ESM-Post aber noch ein paar sehr gute Lösungen.

1. Videoplayer
Da hat ESM-Recht... ich hatte den noch auf NT 4.0 laufen und es gab damals eigentlich keine Alternative. Es gibt den Server nicht mehr.. ja.. es gab einen Server und einen Client (das C in VLC steht für Client).
Man kann Video-Streams nehmen und ein eigenes Logo einbauen und es dann weiter streamen. Auch auf kleiner Hardware mit 1,2GHz und 2GB kann man ohne Probleme einen Stream von einem SAT-IP Server streamen und so ein Stream braucht wirklich Bandbreite.. wirklich viel.

2. Audio
Seit neusten gibt es Cakewalk Sonar als Freeware. Seit Cakewalk-Zeiten (Cakewalk 5.0?) war es immer eine gute Lösung, auch wenn der aktuellen Freeware-Version einiges fehlen soll, ist es sicher immer noch eine gute Lösung.

3. Video
Ich habe Lightworks ausprobiert und fand es so gut wie unbedienbar. Gerade für kleine Video hatte ich nicht die Ruhe mich lange damit zu beschäftigen. Früher war Adobe mit Premiere und AfterFX das Non+Ultra. Es gab noch exotischere Programme wie die von Autodesk/Discreet (Smoke, Combustion, etc). Aber an die kam man so garnicht ran ohne gleich ein komplettes Schnittsystem zu kaufen. Aber jetzt gibt es Blackmagic DaVinci Resolve, das auch keine großen Einschränkungen hat. Ich habe mir jeden Falls vorgenommen darauf umzusteigen, wenn ich mal wieder ein Video schneiden muss. Die Blackmagic Produkte kennt man ja und die waren schon immer cool.. auch deren Kameras.
Gibt es auch für Linux! Super professionelle Schnittlösungen für Linux waren lange echt nicht zu finden.. jetzt gibt es viele.

4. Audio 2
Ja.. kann man immer gut gebrauchen. Früher gab es noch Cool Edit Pro, bevor es von Adobe gekauft wurde und zu Audition wurde. Die erste Adobe Version war noch eine 1:1 Übernahme des Programms mit geänderten Namen.

5. Grafik
Klar gibt es GIMP, das super für Fotos ist. Wer aber malen möchte ist mit Krita besser beraten. Für Zeichner wohl auch besser als Photoshop. Leider hat es keine 3D-Figuren wie Clip Studio Paint Pro.

bbcode-image
Wacom Cintiq mit Clip Studio Paint


Vielleicht baut ja jemand mal ein Plugin um Blender zu integrieren. Genau wie GIMP stammt auch Krita aus der Linux-Welt und wurde dann auf Windows portiert.
Krita hat auch Pixelart Werkzeuge, aber kann sehr viel weniger als Aseprite, dass nicht kostenlos ist, aber als Portable multiplattform Lösung seine paar Euro echt das Geld wert ist (gibt es im Humble Bundle Store). Für Windows gibt es [url=http://www.ultimatepaint.com/de/]Ultimate Paint als kostenlose EA DeluxePaint Kopie (ja EA hat mal Grafik-Software gemacht! Hatte ich mal auf einem 386er.).

bbcode-image
Animation mit Aseprite erstellt


bbcode-image
Ultimate Paint


6. Grafik RAW
Für die Bearbeitung von RAW-Fotos und als Alternative zu Lightroom gibt es noch RawTherapee für Windows und Linux. Begleitet mich seit meinen Nikon D80 Zeiten.. f*ck.. ist das schon lange her.


Der Vorteil der meisten genannten Lösungen ist einfach, dass es sie für Linux gibt, man also auch nicht mal mehr Windows als kostenpflichtige Software braucht. Ich mag Linux Mint.. wobei Windows 10 meiner Meinung nach die beste Windows Version seit NT 4.0 ist.

Unmodifiable Maps in Java

Manchmal soll Logik auf Daten einer Map zugreifen können aber nicht ändern können. Ich habe für meine State-Implementierung Action-Dispatcher eingeführt, die Daten der Action anpassen dürfen und dafür auch Daten aus dem State zum Abgleich nutzen sollen, aber an der Stelle sollen sie nicht die Möglichkeit haben den State selbst zu ändern, weil ich an der Stelle keine Änderungen tracke. Action-Dispatcher sollen schnell und leichtgewichtig sein.


Map<String, Object> stateUnmod = Collections.unmodifiableMap(this.state);
for (ActionDispatcher dispatcher: this.dispatchers) {
dispatcher.dispatch(action, stateUnmod);
}


Zum Glück kann man mit Collections sich schnell eine unmodifiable Map erstellen. Was das für die Performance bedeutet habe ich noch nicht getestet, aber ich gehe davon aus, dass das Tracken und Behandeln von Änderungen am State am Ende auf wendiger wäre.

Unfertiges Shopware-Plugin jetzt bei GitHub

Ich habe ein älteres (letztes Jahr September) angefangenes aber nie fertig gewordenes Shopware Plugin nun bei GitHub hochgeladen, in der Hoffnung, dass noch jemand was damit anfangen kann. Es fügt z.B. ein zusätzliches Feld zum Product-Slider Emotion-Element hinzu und ändert das Template für bestimmte Artikel im Slider.

bbcode-image


https://github.com/annonyme/HPrArticleQuantityDiscountSlider

Das Plugin nutzt nur PHP und kein JavaScript.

Stored Procedures in MySQL

Viele Probleme lassen sich nicht durch einfache SQL-Queries lösen. Gerade wenn es um Daten-Generierung und Dinge geht, wo man die Logik nicht in allen Clients umsetzen möchte, die auch die Datenbank zugreifen.

Wärend Stored Procedures coole Dinge wie IF, WHILE und so können, haben die doch oft einen schlechten Ruf, weil man dann ja nicht mehr Datenbank unabhängig wäre, wenn man anfängt diese zu verwenden. Aber am Ende wird man sowie so nie wirklich die Datenbank wechseln und sollte man das tun, dann eher von SQL zu NoSQL und da ist es dann auch egal, da man alles alle neu anpassen muss.


Eine einfache Procdure in MySQL:


DELIMITER \\
DROP PROCEDURE IF EXISTS exampleProcedure\\
CREATE PROCEDURE exampleProcedure()
BEGIN
DECLARE checkval INT;
SET expectedval = 0;

START TRANSACTION;

-- implement your logic here

IF checkval = expectedval THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END \\
DELIMITER ;

CALL exampleProcedure();

DROP PROCEDURE IF EXISTS exampleProcedure;


Es gibt auch die klassischen IN und OUT Parameter. Alles ganz einfach und schnell zu schreiben. Sieht ein wenig aus wie Pascal. ABER im Vergleich zu PL/SQL fehlen doch eine Datentypen wie RECORDs, um komplexere Datenstrukturen anlegen zu können oder direkter mit Tables arbeiten zu können. SELECT .. INTO ist nett, aber RECORDs machen es doch sehr viel einfacher und strukturierter.

Aber an sich kommt man damit zurecht und man sollte doch mehr davon und auch öfters Stored Procedures verwenden, um sich in einigen Teilen das Leben etwas leichter zu machen.

Ich habe PL/SQL immer gerne verwendet, auch wenn ich oft genug daran verzweifelt bin.

GMX -Freemail zu unsicher?

Heute Nacht um 1:00 kam eine Email, dass bei einer GMX-Adresse das Passwort geändert worden sei. Man konnte sich nicht mehr anmelden, also war die Email korrekt.

Das Problem ist nun: 0900-Hotline ist über Mobile und VoIP nicht erreichbar. Live-Chat, Twitter, Email... gibt es alles nicht. Die einzige Hotline die geht, ist nur für zahlende Kunden.

Das Passwort selbst ändern würde gehen, wenn die alte dort angegebene Email-Adresse von Hotmail noch existieren würde. Bei den meisten Benutzern wird wohl eine Email-Adresse angegeben sein, die nicht mehr im Zugriff ist. Handy-Nummer werden viele auch nicht angegeben haben.

Zum Glück war die Email Adresse nicht wichtig und alt.. aber bei einer aktuellen und genutzten Adresse wäre das jetzt eine wirklich Katastrophe, weil davon auszugehen ist, dass alle möglichen Dienste, wo die Adresse zum Login verwendet wurde, gefährdet sind und man keine Möglichkeit hat mit GMX in Kontakt zu treten, um den Account sperren zu lassen.

Hat wer eine Lösung bzw einen alternativen Kommunikationsweg als die 0900-Nummer?

Bei den wichtigen Adressen ist, jetzt auf jeden Fall Handynummer und eine Email-Adresse, die 100%ig unter meiner Kontrolle ist, angegeben und mal gucken, ob man nicht von GMX weg geht mit den dort vorhandenen Adressen.

Bei Yahoo hatte ich trotz alles Security-Leaks nie solche Probleme, wohl auch weil ich immer Weiterleitungen davor schalte.

CSS overflow und ellipsis

Ein kleiner Tipp, wenn man in einer Webapp zulange Listen- oder Tabelleneinträge zurecht schneiden möchte. Um anzuzeigen, dass der Text gekürzt ist will man oft ... am Ende stehen lassen. Das mit PHP, JavaScript, etc zu machen ist aber doof und overflow-hidden: hidden reicht nicht. Aber es gibt in CSS text-overflow.


.cut-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}


Der Text wird einzeilig und abgeschnitten. Zusätzlich werden 3 Punkte angehängt. Alles gut? Nur solange man es nicht bei einem <li> mit Bullet-Points verwendet. Die gehen dabei leider auch verloren. Aber auch hier gibt es eine Lösung, wobei man aber die Abstände des <li> zum linken Rand neu anpassen muss.


li.cut-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
list-style-position: inside;
}

Older posts:

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