Ein einfacher kleiner AngularJS-Filter, der einen String in Uppercase umwandelt.
So einen Filter gibt es natürlich schon, aber daran kann man gut sehen, wie man einen Filter selber implementieren kann.
function UpperCase(){
return function (key){
return key.toUpperCase();
};
}
var app=angular.module("example",[]);
app.filter("ownuppercase", UpperCase);
Das Ganze einmal erweitert mit einem eigenen Service, der durch den Filter angesprochen wird. Logik sollte eher in einem Service ausgelagert werden, als direkt im Filter implementiert werden.
function UpperCaseService(){
this.upper=function(key){
return key.toUpperCase();
};
}
function UpperCase(UpperCaseService){
return function (key){
return UpperCaseService.upper(key);
};
}
var app=angular.module("example",[]);
app.service('UpperCaseService', [UpperCaseService])
app.filter("ownuppercase", ['UpperCaseService', UpperCase]);
Man hört es ja immer im TV, es wird viel versprochen was die Geschwindigkeit bei Internetleitungen
angeht, aber am Ende ist das Internet sehr viel langsamer. Es wird dann immer dazu aufgerufen, dass man selbst seinen Internet-Anschluss mit einer der dort genannten Websites testen sollte, um heraus zu bekommen ob auch bei einem selbst das Internet zu langsam ist.
Viele machen das auch schon gleich prophylaktisch, wenn der Anbieter z.B. die Bandbreite erhöht oder ähnliches. Dann kommt oft der Schock. Das geschah auch bei jemanden vor ein paar Tagen.
Bei dieser Person wurde von 16MBit auf 50MBit erhöht. Änderung wurde durch geführt und bei der Messung über eine Internetseite kam heraus dass nur 8MBit im Download ankamen. Auch nur 8Mbit beim Upload, wo es eigentlich 25Mbit sein sollten. Der Ping war ok.
Der Anbieter verhielt sich wie den TV-Sendungen immer beschrieben und behauptete es wäre alles ok und die 50MBit wären verfügbar.
Wer mal mit dem Computerproblemen von privaten Personen zu tun hatte wird die eine Regel kennen, die man immer befolgen sollte: "Glaube dem Kunden nichts, was du nicht selbst gesehen hast und lasse dich nicht mit Ausreden abwimmeln, es wird dir nur unnütze Aufwände bescheren."
Also über Teamviewer wurde das Problem bestätigt.. bzw die Messung wurde wiederholt und zeigt ein entsprechendes Ergebnis. Wichtig ist jetzt verlässliche Werte zu bekommen, also heraus zu finden mit welcher Geschwindigkeit der Router die DSL-Verbindung ausgebaut hat und synchronisiert hat. Natürlich war das Passwort zur Fritzbox unbekannt. Aber einmal Strom trennen und auf Werkseinstellungen zurück setzen hilft. Die wenigstens Personen haben Port-Weiterleitungen eingestellt, also kann bis auf ein paar Telefonnummernzuordnungen eigentlich nichts verloren gehen.
Die Fritzbox sage 63MBit down und 30MBit up. Mehr als an sich erwartet wurde. Bloß weil man diese Bandbreite zugeteilt bekommt, bedeutet es natürlich nicht, dass man sie auch komplett nutzen kann. Fehlerkorrekturen im Protokoll und ähnliches kosten natürlich auch Bandbreite.
Der normale Benutzer ist jetzt natürlich überfragt, auf der einen Seite funktioniert es nicht wie es gerne hätte und auf der anderen Seite wird der Anbieter sich quer stellen und sich auf die Angaben im Router berufen. Was kann er also nur machen? Immer wieder beim Anbieter anrufen, die werden ihn abwimmeln oder sagen, dass sie es noch mal prüfen werden, aber am Ende wird nichts passieren. Verstanden wird sich der Benutzer bei bestimmten nach Jahreszahlen benannten TV-Sendungen fühlen, die ihm auch klar machen, dass man den Anbieter nur genug unter Druck setzen muss, damit der das Problem behebt.
Das ist für den Benutzer leider etwas unschön, aber Ende leider auch genau die Lösung, die den Benutzer zufrieden stellen wird. Der Anbieter ist Schuld, man selber kann nichts tun und ist nur ein Opfer. Benutzer kennen sich mit Computern meistens sehr wenig aus und sind zu meist auch sehr Stolz auf ihre Leistung sich einen PC oder ein Notebook gekauft zu haben. Sie haben sich beraten lassen, dann alles abgewogen und das für ihre Zwecke beste und günstigste Gerät gekauft. Meistens haben sie das Gerät dann auch selbst mit dem Router verbunden. Bei WLAN ja nicht so einfach mit Key, aber immer noch besser als irgendwelche Kabel durch die Wohnung zu verlegen.
Dies ist wirklich eine gute Leistung für jemanden, der eigentlich keine Ahnung davon hat warum es am Ende eigentlich alles funktioniert und was dieses ominöse WLAN überhaupt ist. Sein Kabelloses Internet funktioniert und er ist glücklich und stolz. 2 wichtige Faktoren... besonders der zweite. Keiner mag es, wenn man viel Zeit und Energie in etwas investiert hat und dann jemand kommt und sagt einen, dass man ja sehr bemüht war.. also.. am Ende doch nur Rotz raus kam. Dann ist man weder glücklich noch stolz.
Wir messen also über zwei Netzwerke, einmal das vom Anbieter und einmal das vom Router zum Gerät, dass meistens WLAN sein wird. Jetzt sprechen alle Indikatoren (Anbieter-Messung und Router) dafür, dass das Netzwerk des Anbieters nicht das Problem ist. Dem Benutzer wird zu 99% nicht mal klar sein, dass das WLAN kein Teil des Anbieternetzwerkes ist, sondern ein 2. Netzwerk, dass ganz allein ihm untersteht und für dass er auch die Verantwortung trägt.
WLAN ist praktisch, aber bringt viele Probleme mit sich:
* Wände können das Signal stark stören
* Wenn über USB angeschlossen sollte man keinen langsamen USB-Standard nutzen
* Viele WLAN Geräte blockieren sich gegenseitig
* Es sind meistens kleine und schwache Antennen verbaut
Das sind alles Probleme, die so sind und die der Physik und Implementierung geschuldet sind. WLAN ist ein Standard und es wird auch bei den Routern nur WLAN dieses Standard angeboten. Mit dem Kauf des Routers sollte der Benutzer sich dieser Probleme bewusst sein und auch dass er auf diese Dinge achten muss, um ein gut funktionierendes WLAN zu betreiben.
Wenn das Internet zu langsam ist wird sich das Problem zu meiner Erfahrungen nach zu 80% beim Anwender finden lassen. Beim normalen Surfen fällt nichts auf und erst wenn man solche Messungen durchführt kommt heraus dass die Datenrate, die beim Gerät ankommt, zu gering ist. Benutzer hören das überhaupt nicht gerne. Die sind glücklich wenn die Schuld beim Anbieter liegt. Das sie das Problem selbst verursacht haben, wollen sie nicht hören, gerade wenn sie alles selbst eingerichtet haben. Benutzer die schon beim Kauf um Hilfe fragen, haben kein Problem damit, dass die Probleme z.B. durch einen alten WLAN-Stick verursacht werden. Die anderen halten zu Viel auf ihr Werk, als dass sie Zugeben wollen, dass sie nicht wussten was sie taten und es wohl deswegen teilweise falsch gemacht haben. Das sind die Personen die man dann im TV sieht, weil gerade Hotlines wissen wie solche Benutzer reagieren, wenn man denen sagt, dass das Problem wohl bei denen liegt und man da nicht für Zuständig ist, wenn der Benutzer bei sich zu hause was falsch eingerichtet hat.
Hier nochmal eine kleine Checkliste, wie man richtig überprüfen kann, ob das Problem im eigenen Netzwerk zu suchen ist:
* Ein LAN-Kabel benutzen und direkt mit dem Router verbinden
* Ein PC/Notebook nutzen das "sauber" ist. Am besten von jemanden der viel Spiele im Internet spielt.. am besten Shooter.. die achten darauf dass deren System
keine Probleme beim Netzwerk hat
Wenn sich damit nun heraus stellt, dass es wirklich nicht am Anbieter liegt:
* WLAN richtig eingerichtet? (Anleitung lesen, jemanden fragen der sich damit auskennt)
* wie gut ist der Empfang? (Repeater kaufen, extra Antenne kaufen)
* Wie alt ist die verwendete Hardware? (was neues Kaufen.. sich beraten lassen.. nicht im Geschäft)
* Was ist an Software installiert? (Es gibt Software, die PCs schneller und sicherer macht.. XPAntiSpy, TuneUp, etc... zu 99% sind diese Programme Verursacher der Probleme.. deinstallieren und nie wieder installieren)
Wenn man kein LAN-Kabel über große Strecken verlegen mag, helfen Powerline Adapter, die LAN über das hausinterne Stromnetz ermöglichen. Was sehr gut funktioniert.
Sollte das Problem beim Anbieter liegen, diesen bitten die Leitung einmal zu überprüfen oder einen Techniker vorbei zu schicken. Immer kooperativ und nett sein.
Probleme bei denen müssen nicht immer bekannt sein und können Hinweise für den Anbieter auf defekte Hardware oder Kabel sein. Teilweise auch in Bereichen, wo der Anbieter selbst keinen Einfluss hat.
Es gibt heute so viel Bandbreite... und ob ich mit 30MBit Downloade oder mit 50Mbit ist nur ein Unterschied in den Minuten, die ich benötige für den Download, aber der Traffic beim Anbieter wird gleich bleiben. Es würde ihn nur Kosten sparen, wenn er auf wenige MBit herunter drosselt um mich davon abzuhalten viele Downloads durch zuführen.. so 1-2Mbit. Wenn man >=8Mbit hat ist es unwahrscheinlich, dass es an einer Drosselung der Leitung liegt.
Während ich in den letzten 3 Jahren bei aoop immer mehr Framework-Charakter im Vordergrund gesehen habe und den CMS-Teil davon mehr oder weniger komplett vernachlässigt habe (bis auf die Integration von TinyMCE und Code-Mirror), habe ich jetzt mal wieder angefangen in die Richtung etwas zu tun und die ersten Änderungen sind schon aus dem Feature-Branch in den Master gewandert.
Seiten sind nun Grids mit Content-Modulen als Inhalt. Der Vorteil von so einem Grid ist, dass es responsive ist und so die Anpassung für Mobile-Devices sehr vereinfacht wird. Während in der Desktop-Ansicht man das Grid sieht wird bei der Unterschreitung einer gewissen Breite einfach alles untereinander angeordnet. Momentan verwende ich das Grid von Bootstrap, weil man dieses auch allein super in vorhandene Templates integrieren kann ohne Angst haben zu müssen, dass das Design oder Layout Schaden nimmt.
Der Editor nutzt auch das Grid um eine brauchbare Vorschau zu liefern.
Dieses neue Seiten-Model und der dazu gehörige Editor werden nie den Umfang und die Qualität der Shopping Worlds in Shopware. Ich überlege ein Modul zu schreiben, das ähnlich wie das Digital Publishing in Shopware repsonsive Banners ermöglicht, aber auch hier natürlich nicht in dem Umfang, sondern in einer einfachen und grundlegenden Version.
Falls man mal nach längerer Zeit wieder seine Testinstallation aufruft und irgendwie vergessen hat sich das Passwort vom Admin-Konto aufzuschreiben und nicht mehr in den Admin-Bereich kommt, ist es an sich ganz einfach das Passwort neu zusetzen. Man muss nur über die CLI Schnittstelle von Magento 2 gehen.
PHP kann ja Zahlen, die als String vorliegen, direkt als Zahl casten. Was sich erst einmal ganz praktisch anhört ist leider sehr seltsam umgesetzt, da nie validiert wurde, ob der String im Ganzen eine gültige Zahlennotation enthält.
$a = "05" + "10dings";
Der Ausdruck liefert 15 zurück. Jeder aus Java Integer.parseInt() kennt, wird es bei so einem Umgang nur kalte Scheuer über den Rücken jagen.
Einige halten dieses Verhalten zwar für vollkommen korrekt und besonders praktisch, weil einem so der Benutzer durch unsinnige Eingaben die Berechnung nicht kaputt machen kann... aber wenn man mal ehrlich ist, ist "5 stück" + "0.5 eier" + "draussen dunkel" = int(5.5) nicht wirklich ein brauchbares Ergebnis.
Ja da kommt wirklich 5.5 raus.
Aber zum Glück gibt es jetzt mit 7.1 wenigstens eine kleiner Verbesserung. Es wird eine Warnung geworfen.
Number operators taking numeric strings now emit E_NOTICEs or E_WARNINGs when given malformed numeric strings.
Damit ist man schon mal soweit, dass man seinen Code sicher machen kann, wenn man möchte. Man muss es leider nicht, aber dass man es kann ist schon mal ein Fortschritt.
Oft hat man ja eine vorhandene Homepage mit vorhandenen CSS und möchte nur Teile davon erneuern. Wenn man nun einfach Bootstrap hinzufügt ist es bestimmt so, dass das ganze Layout zerfallen wird.
Gerade das Grid ist aber etwas was man gerne zusätzlich zum vorhandenen CSS hätte.
Dafür braucht man aber nicht alles von Bootstrap und zum Glück bietet Bootstrap selbst an sich eine Version zu compilieren, die nur die gewünschten Komponenten enthält. Man kann sich also eine Version bauen, die nur das Grid und die Icons enthält.
Seit Anfang November 2016 begleitet mich ein Microsoft Surface Pro 4 mit Core m3 und hat man altes Toshiba i3 Notebook ersetzt. Das Notebook lief mit Linux Mint echt noch sehr gut, nur die schlechte Lüftung machte mit seiner Lautstärke nicht mehr wirklich Spaß. Es war auch nicht das dünnste und der Akku war von Anfang an kein Highlight. Das Alienware ist echt super und ist schon mit mir durch nass und noch vieler nasser gegangen. Aber es ist eben auch nicht meins sondern gehört meiner Frau und in Urlauben und so, wenn wir beide gerne ein Notebook dabei haben wollen, muss ich immer den kürzeren ziehen.
Der absolute Vorteil des Surfaces ist seine Kompaktheit gepaart mit der Leistungen eines normalen x86-64 Notebooks. Kein ARM, kein Atom und nicht nur 1-2GB RAM. Damit kann ich einfach alles vom Alienware Notebook auf das Surface und direkt dort weiter arbeiten. Nur die 128GB SSD ist etwas klein.
Der Core m3 + 4GB reicht vollkommen für XAMPP (Apache + MySQL) und Eclipse + PDT gleichzeit. Natürlich läuft noch eine Firefox-Instance und meistens auch noch GitKraken. Ich hab keine Performance-Probleme oder merke, dass ich Dinge damit nicht erledigen kann. Klar ist die Xeon-Workstation in allen etwas schneller und einige Programm laden in 5 Sekunden und nicht in 8 Sekunden. Aber am Ende merkt man keinen wirklichen Unterschied mehr wenn erst einmal alle Programme geladen wurden.
Die Tastatur muss man extra kaufen. Sie ist wirklich toll und es fühlt sich nicht so an als würde man auf Gummi-Tasten schreiben. Viele günstige Desktop-Tastaturen sind schlechter. Sie ist beleuchtet und die Halterung über Magneten sorgt dafür, dass man sie schnell an und ab machen kann. Hochklappen ..und sie bleibt oben. Der Netzteilstecker ist genau so befestigt und es funktioniert einfach gut.
Das Surface versucht in einem Punkt nicht so super modern zu sein, wie z.B. das Tab Pro von Samsung: Es hat einen stink normalen USB-Anschluss. Einfach USB-Stick oder DSLR ran und es läuft. Auch eine extra Webcam wie die HD 3000 (für Visual-Distance.com oder das Switch Time-System) sind kein Problem.
Das Einzige was man als nett und an sich praktisch bezeichnen kann ist der Pen und der Digitizer. Der Pen ist irgendwie drucksensitiv. Windows benutzen klappt auch ganz gut. Zeichnen funktioniert auch mit WinTab-Treiber oft nur ohne Druckstufen. 256 Druckstufen sind sowie so nicht so toll. Im Vergleich mit einem Wacom Cintiq 13HD zieht es beim Malen und der Fotonachbearbeitung ganz klar den Kürzeren. Die Striche sind schön sauber und genau, was aber wohl mehr an einer schlechten Auflösung des Digitizers liegen mag. Außerdem muss der Pen geladen werden und wird nicht durch den Digitizer mit Strom versorgt.
Der Preis für ein Surface Pro 4 ist nicht gering, aber dafür bekommt auch ultra kompaktes Geräte in der Form eines Tablets mit der Leistung eines Notebooks und mit Windows 10 Pro, das für alle normalen Webdeveloper-Aufgaben reicht.
Man kann sehr einfach mit CSS auch die Reihenfolge von Elementen ändern. Damit kann man allein schon mit CSS viel an Templates anpassen ohne gleich Twig oder Smarty bemühen zu müssen.
Wenn man alte Software laufen hat, die dann hoffentlich schon PDO nutzt aber nicht jedes SQL-Statement
testen kann, kann man MySQL 5.7 auch dazu bringen sich wie eine alte 5.5 Version zu verhalten. Das kann nötig werden wenn man von Ubuntu 14.04 LTS auf 16.04 LTS upgradet und damit eine aktuellere MySQL-Version installiert wird, die sich meiner Meinung nach sehr viel korrekter mit Werten und Typen verhält als die alte Version.
Wenn man langem ist Oracle gearbeitet hat würde man auch nie auf die Idee kommen für einen Number/Int-Wert '1' an stelle von 1 zu übergeben.
Für mein Projekt Mein-Online-Adventskalender habe ich die alte Fancybox ersetzt und eine eigene kleine Lösung geschrieben. Kein JQuery, kein AngularJS.. einfaches kleines altes JavaScript.
function MediaViewer(){
this.dialog = null;
this.mediaContainers = [];
Man ganz einfache eigene Container in den Dialog einbauen. Der Name wird bei mv-item angegeben. Sollten nur die Tags wie mv-item angegeben sein versucht die Logik im Dialog ein Element des selben Typs (img, video, etc) zu finden.
Ich wollte nur mal kurz Magento 2 installieren (XAMPP und Windows 10 Pro). Aber das Adminpanel wollte nicht funktionieren und auch viele CSS und JS Dateien wurden nicht gefunden.
Ich habe eine Lösung aus zwei Lösungen im Internet gefunden, mit denen es am Ende dann doch alles lief.
Zuerst habe ich alles bis auf die htaccess aus pub\static gelöscht.
Dann die app\etc\di.xml editiert. Die Strategie von Symbolic-Link auf Copy geändert.
Und dann ein PHP Script ausgeführt, dass alles noch mal neu anlegt. bin\magento.
Nachdem ich im letzten halben Jahr mit Neo4j und nun auch mit Elasticsearch zu tun hatte, bin ich was NoSQL-Datenbanken angeht etwas zwiegespalten. Graphen-Datenbanken sind toll um Beziehungen zwischen Entitäten abzubilden. Dokumenten-orientierte Datenbanken wie Elasticsearch ideal um unstrukturierte Daten zu speichern und neben der eigentlichen Abfrage auch z.B. Durchschnittswerte oder Übersichten von der Abdeckung von bestimmten Attributen/Feldern gleich mit abzufragen.
Die Abfragen sind schnell. Aber.. auch sind die Queries komplexer (Neo4j) bis sehr viel komplexer (Elasticsearch). Der Vorteil der NoSQL Datenbanken ist, dass man schon fertige Objekte zurück bekommt und man nicht auf Tabellenstrukturen beschränkt ist. So kann man also Listen mit Objekten die zu einer Entität gehören gleich mit abfragen und erspart sich ein zweites Query und zusätzliches Mapping.
Aber sind die NoSQL Datenbanken wirklich so viel schneller, wie man immer hört? Dafür muss man verschiedene Dinge bedenken. Zuerst ob die Datenbank die primäre Datenquelle ist oder nur zusätzlich zu einem RDBMS verwendet wird. Ich hatte bis jetzt nur mit zusätzlichen Datenbanken zu tun. Deren Daten wurden durch Cronjobs aus dem RDBMS gelesen, aufbereitet und dann in die NoSQL-Datenbank geschrieben.
Entweder per CSV-Import (Neo4J) oder direkt über die REST-API (Elasticsearch). Die gleichen Abfragen waren in der MySQL-Datenbank langsamer. Nicht viel langsamer. Aber es war doch spürbar und lagen bei der Neo4J bei so 30%-40%.
Wenn man nun aber einberechnet wie viel Aufwand der Import darstellt, der bei beiden Anwendungsfällen zwischen 1,5-5min lag, sieht es schon sehr viel anders aus. Die Importscripte reduzierten die Datenmenge natürlich sehr extrem und schrieben nur die nötigsten Daten in die NoSQL-Datenbanken. Bei der Neo4J waren es wirklich nur Ids und Relationen. Die Elasticsearch hatte alle elementaren Felder und auch Unterobjekte, die bei SQL über Joins geladen werden würden. Auf dieser reduzierten und stark vereinfachten Datenbasis waren die Abfragen sehr schnell.
Wenn man mit ein paar SQL-Statements die selben Daten in der MySQL in dem selben Umfang in eigene Tabellen schreibt, ist die MySQL Datenbank meiner Erfahrung nach genau so schnell. Im Vergleich von MySQL und Neo4J muss man sagen, dass für die Abfragen plötzlich viel mehr Daten zur Verfügung stand und diese auf genutzt wurden. Außerdem wurden doppelt so viele Queries verwendet. Am Ende war die MySQL-Lösung langsamer aber auch sehr viel komplexer und in dem Sinne besser.
Ich für meinen Teil sehe in den NoSQL-Datenbank nur einen Vorteil, wenn man die Vorteile derer auch nutzt. Wenn ich keine Graphen brauche, brauche ich auch keine Neo4J-Datenbank. Habe ich nur Entitäten und DTOs die ich schnell speichern und laden möchte, brauche ich keine Elasticsearch. Elasticsearch ist komplex und kann ein paar wirklich interessante Dinge durch deren Aggregations. Wenn ich haufenweise unterschiedliche Daten aus vielen verschiedenen Quellen zusammen fahren möchte bin ich mit Elasticsearch gut beraten. Aber wenn ich nur Geschwindigkeit haben möchte muss ich nur die Datenbasis verringern und vereinfachen. Neo4J ist auch extrem Speicher hungrig. Was bringt es mir wenn ich 96GB an RAM brauche um das zu machen was ich mit 32GB und einer MySQL oder einer Oracle-DB genau so schnell hinbekomme. Wenn ich dann sehr viel RAM habe und ganze Datenbanken im Speicher halten kann, habe ich die selbe Geschwindigkeit und bin mit der größeren Datenbasis sehr viel flexibler. Außerdem ist alles schneller und sicherer was ich direkt innerhalb der Datenbank machen kann. Ein Import von der MySQL in die Neo4J brauchte viel darum herum um sicher zu sein. In einer Oracle würde alles sowie so in einer Transaction laufen, die auch nicht noch den Server der das Script startet belastet.
Wer also in seinem RDBMS Performanceprobleme hat, soll sie auch dort lösen und nicht glauben, dass ein weiteres System anzubinden (und synchron zu halten) dieses Probleme lösen würde.