Donnerstag, 8. Dezember 2016

Vortrag bei der Java User Group Dublin - Fotos

Jetzt sind die wirklich guten Fotos von meinen Vorträgen, IoT mit Tinkerforge und Software Robustheit, bei der Java User Group Dublin da:
https://www.flickr.com/photos/139932355@N08/albums/72157674941628376

Danke an die beiden netten Hosts: Barry und Gerry und an die Firma Tinkerforge für die Unterstützung.





Dieser Briefkasten (Dublin, Temple Bar) stammt aus der Zeit als George König war. GR bedeutet George Royal und nicht wie es einem die Iren erzählen George Rules. Man beachte das der Briefkasten irisch Grün und nicht Englisch rot ist!


Internet Radio

Jeder kennt Spotify und andere Internet Radio Stationen. Hier eine beachtenswerte Alternative aus San Francisco, somaFM. Es ist 100% Werbefrei und finanziert sich nur aus den Spenden der Hörer. Es sind auch Apps für iOS, macOS und Android verfügbar, man kann es auch via Browser hören. Die Apps haben kleine Macken, funktionieren aber sonst gut, d.h. man kann gut Musik hören. Inhaltlich gibt es diverse thematische Kanäle wie z.B. Groove Salad oder Secret Agent aber auch einen für Weihnachten (Chrismas Lounge).

SomaFM commercial free internet radio

Mittwoch, 12. Oktober 2016

Berechnen der CPU Nutzung in Bash

Für Last-Analysen, Performance-Analysen und Robustheitsanalysen ist es sinnvoll die CPU Auslastung des Zielsystems zu kennen um auf mögliche Ressourcenprobleme bei des CPU zu schliessen. Dabei sind die Programme top und stop die ersten Anlaufpunkte. Um aber die gesamte CPU Auslastung automatisch per BASH Script zu erfassen sind nur begrenzt geeignet. Alternativ kann man sysstat benutzen, welches aber erst installiert werden muss. Hier nun eine sehr einfache Methode die CPU Auslastung per BASH Script ohne Zusatzsoftware zu erfassen:

ps -A -o pcpu | tail -n+2 | paste -s -d '+' - | tr , . |bc

Dieser Wert muss dann noch durch die Anzahl der CPUs geteilt werden um die Auslastung des Servers zu ermitteln. Das tr ist nur auf Systemen notwendig, die ein Komma als Dezimal-Separator haben, sonst schadet es aber auch nicht.


Die Anzahl der Kerne eines Servers kann man auf verschiedene Weisen ermitteln. Hier die meine, welche für Linux als auch für macOS funktioniert:

getCores () {
    os=`uname`
    if [[ "$os" == 'Linux' ]]; then
        core=`nproc`
    elif [[ "$os" == 'Darwin' ]]; then
        core=`sysctl -n hw.ncpu`
    else
        echo "Error: Unsupported platform: $os"
        core=-1
        exit
    fi
}

Die Anzahl der Kerne wird in die BASH Variable $core geschrieben.



Mittwoch, 5. Oktober 2016

Schnell Analysen mit R: Ich kenn SQL aber wie mache ich das in R?

Hier eine kleine Anleitung für SQL erfahrene Benutzer um Daten schnell und effizient mit R zu analysieren.

Mit R kann ohne Zusatzpakete jedes Problem lösen. Leider sind einige Funktionen in R relativ umständlich und bei grossen Datenmengen nicht sehr performant. Ein R-Paket mit dem es schneller und einfacher geht ist: data.table. Alternativ können auch andere Pakete wie dplyr oder sqldf benutzt werden. Dplyr setzt auf Pipes (wie Splunk auch) zur Verarbeitung der Daten. Mit dem R-Paket sqldf werden die Daten in eine SQLite Datenbank übertragen. Dann können die Daten einfach mit SQL abgefragt werden: sqldf("select avg(vctotal), avg(dctotal) from a2 where label ='A'"). Hier noch eine Anmerkung zur Benutzung von Date Feldern in sqldf, die Date Strings müssen ins UTC ticks / unix epoch Werte umgerechnet werden. Das ist das interne Format der Datenbank.

Aber los gehts.

Voraussetzung:
  • data.table geladen
  • Daten aus CSV Datei in die Variable g geladen.

Anmerkungen
  • Row (R) und Tupel (SQL) werden hier synonym verwand.
  • Was in Programmiersprachen wie Java der Punkt ist ist in R das $ Zeichen.
  • Mit installiertem OpenMP laufen einige data.table Operationen schneller. Auf dem Mac installiert man OpenMP mit brew install openmpi
  • Effiziente Benutzung von data.table Link

R data.table cheat sheet

Aufgabe
SQL
R + data.table
Anmerkung
Auswahl mit Hilfe eines Vergleichs Rows/Tupelselect * from g where dc < 10000g[ dc < 10000, ]Nicht das Komma vergessen
Nur die ersten 15 Rows anzeigenselect * from g limit 15
head( g, 15)
g[ 1:15, ]
Beide Varianten gehen
Mehrfach Auswahlselect * from g where dc < 10000 and dc > 500g[ dc < 10000 & dc > 500, ]
Zählen der Ergebnisseselect count(*) from gg[ , .N ]
.N ist eine spezielle Variable in data.table - alternativ kann man die Anzahl auch über dim(g)[1] bestimmen.
Mittelwert berechnenselect avg(dc) from gg[ , mean(dc) ]In R heisst der Mittelwert mean und nicht average
Mittelwert und Median berechnen???g[ , c(mean(dc), median(dc)) ]Hier müssen die Berechnungen mittel c() zusammengefasst werden
Mittelwert berechnen bezogen auf verschiedene Gruppenselect avg(dc) from g grouped by ABg[ , mean(dc), by = AB ]Achte auf das = nach dem by
Auswahl mit einer Liste
select * from where visit IN (values)
a[ a$visit %in% meineListe ]wichtig sind hier die umschliessenden % Zeichen, meineListe ist eine Liste mit den Selektionierten - values sind die Werte selbst
Umgekehrte Auswahl mit einer Listeselect * from where visit NOT IN (values)a[ !(a$visit %in% meineListe) ]Negation mit !
Vorkommen von Werten zählenselect count(*) from g grouped by visittable( g$visit )um teure Operationen zu testen, kann man die Operation auf einem Subset durchführen table( g[1:50]$visit )
Left outer joinselect * from g, tg[ t ]
Anmerkung: es müssen in g und t die Spalten als Key gesetzt werden die man für den Join benutzen möchte
setkey(g, visit)
setkey(t, visit)
Berechnen einer neuen SpalteALTER TABLE g ADD vkok AS (vc<10000 & vc>500) a1[ , vkok:=(vc < 10000 & vc > 500) ]Hier wird in Place eine neue Spalte mit boolschen Werten berechnet: vkok
Löschen einer  SpalteALTER TABLE c DROP COLUMN vcgroup g$vcgroup = NULL
Teilen ein Menge in gleich grosse Teilmengen (Buckets)
g1$vcg = as.numeric( cut2( g1$vc, g = 5) )Es wird eine neue Spalte den Daten hinzugefügt die die Gruppennummer des Buckets enthält. Die Buckets enthalten gleich viele Element, dies kann wie folgt geprüft werden: g1[, .N , by = vcg]
Die Buckets werden entlang der Dimension vc gebildet. Aufsummiert ergeben die Buckets eine Percentil-Zerlegung der Daten.
Auswahl einer Menge Mittels LikeSELECT * FROM a1 WHERE url LIKE "amount.json"a1[ like(url,"amount.json") ]Die LIKE Funktion ist eine Art sehr einfacher Grep
SortierenSELECT * FROM a1 ORDER BY ttfb ASCa1[ order(ttfb) ]Sortiert das Ergebnis der Abfrage nach dem Feld ttfb. Es können auch mehrere Felder angegeben werden, nach denen sortiert wird. Wichtig, hier keine Anführungszeichen beim Feldnamen (colname) verwenden.

Mittwoch, 14. September 2016

Robust Code: Update von Daten mittels Switch

Stell dir vor du downloadest regelmäßig eine Datei, die du danach weiter verarbeitest. Hier zur Illustration als Bash:

curl -sS "http://eber-p.com/report.csv" | wc -l

Wenn jetzt der Download aus irgend einem Grund fehlschlägt, dann bricht die Datenverarbeitung ab. Dein Service liefert keine Ergebnis mehr. Hier pflanzt sich ein Fehler durch mehrere Systeme fort. Das kann gewollt sein, meistens möchte man aber eine robuste Lösung die nicht bei jedem Downloadfehler zusammenbricht. Dies kann man erreichen, in dem man die alte Datei nicht überschreibt, sondern als Fall Back behält und sie ggf. erst nach einem erfolgreichen Download überschreibt.

wget "http://eber-p.com/report.csv" 
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l   


Wichtig ist nur, dass man die Benutzung des Fall Backs dokumentiert, im Log File und oder in der Antwort des Services. Letztere wird hier nicht gemacht.

Kurz zusammengefasst die robuste Softwarelösung:

  1. Lose Kopplung von Programmteilen die unterschiedliche Funktionen hat, hier Datenbeschaffung und Logik (hier zählen der Zeilen des Reports). 
  2. Puffern von alten Daten und Nutzung von diesen Daten als Fallback.

Zum Thema hier noch ein passender Link. Dort wird diese Problematik unter dem Begriff Be Atomic beschrieben.

Hier das ganze Beispiel-Skript:
#! /bin/sh

echo "Test with right URL"
u="http://ebert-p.com/report.csv"

echo "Non robust code"
curl -sS  $u | wc -l

echo "Robust code"
wget -q -a log.log  $u
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l         


echo "Test with wrong URL"
u="http://ebert-p.com/report_wrong.csv"

echo "Non robust code"
curl -sS  $u | wc -l

echo "Robust code"
wget -q -a log.log  $u
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l   

Und die Konsolen Ausgabe:
Test with right URL
Non robust code
    1518
Robust code
    1518
Test with wrong URL
Non robust code
      24
Robust code
    1518

Nicht-Funktionale Anforderung: Software Robustness

Robustheit ist die Toleranz gegenüber Fehlern. Robustheit gehört damit zu den nicht-funktionalen Anforderungen. Die Toleranz gegenüber Fehlern kann auf unterschiedliche Weise realisiert werden. Systeme gelten als robust, wenn sie folgende Eigenschaften hat:

  1. Ein Fehler führt nicht zum Ausfall des gesamten Systems.
  2. Das System kann Fehler selbst beheben oder umgehen.
  3. Die Auswirkung eines Fehlers bleiben lokal begrenzt, sowohl aus zeitlicher als auch aus Systemsicht.

Robustheit zahlt direkt auf die Verfügbarkeit von Systemen ein, sowohl was die Häufigkeit von Störungen als auch auf den zeitlichen Umfang der Störung angeht. Oder anders formuliert, robuste Softwaresysteme haben eine höhere Verfügbarkeit als weniger robuste Softwaresysteme.

Robustheit kann durch verschieden Massnahmen erreicht werden:

  1. Redundanz
  2. Robuste Software Architektur
  3. Exception Handling
  4. Fall Backs
  5. Funktionsreduktion

Alles was man nicht testet funktioniert auch nicht, so auch Software Robustheit. Deswegen muss Robustheit auch durch Robustheitstests gesichert werden.

Dienstag, 13. September 2016

Sicherheitsproblem API Token

API Token sind eine einfache Möglichkeit um den Zugriff auf z.B. Rest API zu steuern. Ein API Token ist in der Regel ein längerer String mit zufälligem Inhalt, der dem Programmierer den Zugriff auf das API erlaubt. Der Benutzer bzw. Programmierer wird identifiziert sich mittels des API Tokens. Wie Kristopher Sandoval in seinem Blog Artikel ausführt, sollten man kritisch auf die scheinbare Sicherheit der API Token schauen. Zum Umgang mit API Token hier ein paar Tipps:

  1. Einen API Token sollte man wie privaten SSH Key behandeln. 
  2. Man sollten ihn auf keinen Fall innerhalb des Projektes, egal ob in einer plain Textdatei oder im Code haben. 
  3. Im einfachsten Fall sollte man den API Token im hoffentlich gesicherten User Verzeichnis ablegen, auf dem hoffentlich verschlüsseltem Disk Volumen.
  4. Bei Rest APIs sollte der API Token nur per sicherem HTTPS benutzt werden.
  5. Der API Token sollte nie in öffentliche Code Repos wie Github gepostet werden. Das Entfernen von solchen Git Pushes ist kein Spass. Hier kann ein Git Hook (pre-commit) hilfreich sein, der den Code nach verdächtigen Strings oder Dateien durchsucht.
  6. Auch sollten sie nicht in Wikis abgelegt werden.

Links:

Dienstag, 30. August 2016

Docker at Digital Ocean

Start an Centos Droplet at Digital Ocean with Docker Machine:

$ docker-machine create --driver digitalocean --digitalocean-region "fra1" --digitalocean-size "1gb" --digitalocean-image "centos-7-2-x64" --digitalocean-access-token $DOTOKEN mer

Remarks:

  1. Update your docker installation, because a bug prevent using Centos with Docker on Cloud provider like Digital Ocean.
  2. Digital Ocean regions must be lower case.
  3. You need an API Token at Digital Ocean. 
  4. Look at image syntax "Centos 7.2 x64" -> "centos-7-2-x64"

Sonntag, 31. Juli 2016

Tinkerforge IoT First Steps Java Project launched on Github

I launched the first steps Java project for learning Tinkerfor ge and IoT (Github).

It uses following hardware as my simple and low cost starter kit:

  • Master Brick
  • Segment Display 4x7 Bricklet
  • Teperature Bricklet
  • Ambient Light Bricklet
  • Accelerometer Prickelt


The newbie can start with some experiments or challenges:

  • Hello World
  • Simple Themometer
  • Thermomenter and Clock
  • Small weather station with temeperatur, time and illumination
  • Resource saving programming with Call Backs/Listeners
  • Ambient Light sensor as contactless display light switch
  • Accelerometer as contactless switch
Code examples helps to realize the challenges.

Tinkerforge Weather Station published on Github

Tinkerforge is electronics framework for software developers. It's a good starting point for your own Internet of Things (IoT).  So I decide to bye me a starter kit. I choose the weather station kit.

Now, after some time I publish my Tinkerforge Weather Station Java Project on Github (Link). Its simple and robust. It uses callbacks to recognize on sensor changes. and runs over days without problems. It measures humidity, air pressure, ambient light and temperature. The temperature is measured indirectly via chip temperature of the humidity bricklet. Special features are, switching the display light depending on ambient light, show alternating date and time and show warnings because of to low or high humidity. If you put your hand over the ambient light sensor, the sensor works as contactless light switch.


If you are looking for more information on Tinkerforge, you can read the book (Kindle, german only) from Sven Ruppert: Einführung in die Heimautomatisierung: IoT mit Tinkerforge.


Mittwoch, 13. Juli 2016

Run All Test on File Change

Eines der besten Instrumente um Code zu verbessern sind Test, speziell Unit Tests. Unit Test sind für alle erdenklichen Programmiersprachen verfügbar und wenn nicht, dann schreibt man sich den Test selbst, ohne Frame Work. Mit Hilfe der Unit Test können Fehler einfach aufgedeckt werden dazu muss man nicht nur die Test haben, sondern sie auch permanent ausführen. Dieses permanente Ausführen ist die Aufgabe des Continouse Integration Servers, z.B. Jenkins. Alternativ gibt es auch die Unit Integration in die IDE. Wem selbst der Jenkins oder die IDE zu langsam ist, schnelle Roundtripzeiten bedeuten effizientes Entwickeln, der kann sich mit Hilfe eines einfachen Scripts seine Test ausführen, wenn sich etwas am Quellcode der Software oder der Test geändert hat (File save).

Hier ein Beispiel für den Mac, dass Unit Test für R ausführt und den Entwickler per Notification auf Fehler bei der Testdurchführung hinweist. Zuerst muss per Homebrew fswatch installiert werden. Dann muss dieses Script ins Root Verzeichnis deines Projektes abgelegt werden. Dann muss es starten. Es läuft ohne Unterbrechung solange, bis man via CRTL + C abbricht. Alternativ kann man das Script für andere Umgebungen anpassen.


#!/usr/bin/env bash

runX=true

finish (){
    runX=false
}
trap finish SIGINT


runTests(){
    for SCRIPT in src/test/*
    do
        if [ -f $SCRIPT -a -x $SCRIPT ]
        then
            $SCRIPT
            if [[ $? -ne 0 ]] 
            then
                FAILEDTESTS=${FAILEDTESTS}"\n"$SCRIPT
            fi
        fi                                                      
    done
    if [ ${#FAILEDTESTS} -ge 1 ]
    then
        osascript -e 'display notification  "'"$FAILEDTESTS"'" with title "R Test failed"'
        FAILEDTESTS=""
    fi
}

while $runX; do
    fswatch src/main/*.R src/test/*.R | runTests 
done



Dienstag, 14. Juni 2016

Löschen von Digital Ocean Droplets via REST API in der BASH Kommandozeile mit CURL

Das Löschen eines Droplets geht sehr einfach, vorher muss man die Droplet ID (hier 17401233) ermittelt haben:
curl -X DELETE -H "Authorization: Bearer $TOKEN" "https://api.digitalocean.com/v2/droplets/17401233"

Anmerkung: Natürlich muss man die hier verwendete BASH Variable TOKEN mit dem Digital Ocean API Token füllen.

Bilder Vergleichen auf der Kommandozeile

Wie vergleicht man am besten Bilder? Dazu muss man zuerst wissen, was man genau wissen möchte. Um die Identität zweier Bilder nachzuweisen reicht in der Regel die Berechnung des MD5 Wertes. Komplizierter wird es, wenn ein und das selbe Bild auf zwei Weisen komprimiert wurde, sind die Bilder gleich und wenn nein, wo sind die Unterschiede.

Zuerst sollte man den Blick auf die Bildgrösse, nicht die Dateigrösse, richten. Dabei hilft das Programm exvi2, auch wenn es eigentlich sonst der Manipulation von Bild-Metadaten dient.
metalpro2:test-diffimage mirkoebert$ exiv2 15556649?_f*
15556649A_formatz.jpg File name       : 15556649A_formatz.jpg
15556649A_formatz.jpg File size       : 103058 Bytes
15556649A_formatz.jpg MIME type       : image/jpeg
15556649A_formatz.jpg Image size      : 720 x 960
15556649A_formatz.jpg: No Exif data found in the file
15556649S_formatz.jpg File name       : 15556649S_formatz.jpg
15556649S_formatz.jpg File size       : 156172 Bytes
15556649S_formatz.jpg MIME type       : image/jpeg
15556649S_formatz.jpg Image size      : 720 x 960

15556649S_formatz.jpg: No Exif data found in the file

Hier sind beide Bilder gleich gross. Jetzt geht es weiter mit dem Vergleich des Inhalts mittels Imagemagic und der Funktion compare.
compare 15556649A_formatz.jpg 15556649S_formatz 15556649_diff.png 

Hier wird ein simples Differenzbild erzeugt, dass man dann begutachten kann. Im Bild unten sieht bei der Vergrösserung des Bildes Unterschiede (Weichzeichnung, Farbe) vor allem an den Kanten. Das obere, rechte Bild verliert Tiefe, Schärfe und Farbe. Alternativ kann man compare auch eine Metrik mitgeben, mit der man das Differenzbild errechnet.


Montag, 13. Juni 2016

Wie bekomme ich die IPs von meinen Digital Ocean Servern?

Erzeuge einen API Token bei Digital Ocean, oben im Menü und setze eine Shell Variable, der Einfachheit halber.
export TOKEN=e21558xx1111111111111222333

Hole alle Informationen deiner Droplets via Digital Ocean REST API:
curl  -sS -X GET "https://api.digitalocean.com/v2/droplets?per_page=200" -H "Authorization: Bearer $TOKEN"  > droplets.json

Vorsicht mit der Aufteilung der Antwort in mehrere Seiten. Dazu gibt es in der Antwort die Links:
cat droplets.json | jq '.links'
{
  "pages": {
    "last": "https://api.digitalocean.com/v2/droplets?page=2&per_page=200",
    "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=200"
  }


}

Die nächste Seite erhält man:
curl  -sS -X GET "https://api.digitalocean.com/v2/droplets?page=2&per_page=200" -H "Authorization: Bearer $TOKEN"  > droplets.json

Filter aus den Agenten die dich interessieren z.B. bezüglich des Namens und hole dir die IP4 Adressen.


cat droplets.json | jq '.droplets[] | .name+";"+.networks.v4[].ip_address' | tr -d "\"" | grep imageservertest-agent | awk -F ';' '{ print $2}' > agents.txt


Das ergibt dann ein schöne IP Liste als Datei. 
wc -l agents.txt 
22 agents.txt

Erweiterung um Droplet IDs
Die Droplet Ids benötigt man z.B. wenn man automatisiert seine Droplet zerstören (löschen) möchte.

cat droplets.json | jq -r '.droplets[] | [ .name+";"+.networks.v4[].ip_address, .id|tostring] | join(";")' | grep "imageservertest-agent" > agents.csv

Interessant sind die beiden Verkettungen in JQ. Einmal werden zwei String via + verkettet. Das zweite mal wird eine Zahl in einen Stein umgewandelt und danach mittels join zu eine CSV Datei verkettet.

Anmerkung: Durch die JQ option -r werden die umschliessenden Double Ticks verhindert. Dadurch kann im zweiten Beispiel der tr Schritt ausgelassen werden.

Mittwoch, 8. Juni 2016

RStudio oder R startet nicht mehr auf meinem Mac

Verschiedentlich stand ich vor dem Problem, dass Studio nicht mehr startete und die meisten "Lösungen" aus dem Internet nicht funktionierten.
Der Grund warum Studio nicht startet ist: R start nicht mehr. In der Kommandozeile erhält man folgende Fehlermeldung:
metalpro2:mastercontroller mirkoebert$ R
dyld: Library not loaded: /usr/local/opt/gcc/lib/gcc/5/libgfortran.3.dylib
  Referenced from: /usr/local/Cellar/r/3.3.0/R.framework/Versions/3.3/Resources/lib/libR.dylib
  Reason: image not found

Trace/BPT trap: 5

Ja, die Fehlermeldung ist richtig, die referenzierte Fortran-Bibliothek fehlt. Grund hierfür war ein Brew (Homebrew) Update der Compiler Suite. Entgegen anders lautender Tipps ist die Lösung sehr einfach. Man muss nur einen passenden Link setzen. That's all.


ln -s /usr/local/opt/gcc/lib/gcc/6 /usr/local/opt/gcc/lib/gcc/5


Dienstag, 12. April 2016

Keep Simple Things Simple

Einige Skriptsprache bieten das Feature, dass der letzte Wert einer Methode der Returnwert dieser Methode ist. Man muss ihn also nicht explizite zurückgeben. Das ist ein durchaus hilfreiches Feature, was den zu schreibenden Code reduziert. In der Regel ist Convention zutreffend und damit hilfreich. Leider kann man diese Hilfe auch zu seltsamen Code führen. Hier ein R Beispiel.

Hier wird die Variable visitData explizit noch einmal aufgeführt damit sie von der Methode zurückgeben wird. Und dazu kommt noch der Kommentar der dieses Verhalten beschreibt. Besser wäre hier die konventionelle Schreibweise mit explizitem Return. Sie ist besser zu verstehen und kürzer.

Montag, 21. März 2016

Buch: Ilya Grigorik High Performance Browser Networking

Jeder der professionell sich mit Webperformance auseinandersetzt sollte dieses Buch besitzen. Es beschäftigt sich sehr gut beschrieben mit dem Browser Networking. Es geht auf alle relevanten Aspekte wie Latenz, Übertragungsgeschwindigkeit, TCP, TLS (aka HTTPS), drahtlose Netzwerke, WLAN ein. Das Networking wir gut und umfangreich beschrieben und sollte Jedem vertraut sein, der über Performance nachdenkt. Der Teil zu HTTP ist gut und endet mit einer kurzen Einführung von HTTP 2.0, das hier nur relativ kurz angerissen wird. Abgerundet wird dieses empfehlenswerte Buch mit XMLHttpRequests, SSE, WebSockekts und WebRTC. Das Buch ist gelungen ist aus meiner Sicht ein Standardwerk für den Bereich Performance und Web, ach wenn der zweite Teil ein wenig schwächer ist.
Wer Themen sucht zur Optimierung der Browserperformance, der wird in diesem Buch leider nicht fündig. Dieser Zweite wichtige Themenkomplex bleibt aussen vor. Hier wünscht man sich ein zweites Buch zu diesem Thema vom Autor. Ilya Grigorik hat diese Dinge leider nicht zu einem Buch zusammengefasst, sondern man findet sie auf der Seite von Google, bei Google Developers unter Webfundamentals, Performance (Link). Auch diese Seiten sind wirklich lesenswert.


Donnerstag, 17. März 2016

Neue Ideen zur Performance Optimierung von Webapps

Nach Brodli und Zopli als Alternativen zur Gzip Kompression im Webbrowser, dachte man das wäre es jetzt. Aber nein es gibt, wieder von Google, nach eine andere weniger bekannte Idee um Bytes in der Übertragung vom Webserver zum Wenbbrowser des Kunden zu sparen, sie heisst SDHC. SDHC oder lang Shared Dictionary Kompression over HTTP, benutz ein gemeinsames Dictionary für die Kompression. Das Dictionary ist bei einigen Kompressionsverfahren ein grundlegendes Element und wird z.B. bei Gzip immer neu aufgebaut in Abhängigkeit zum zu komprimierenden Inhalt. Googles Idee ist, irgendwie ähnelt sich alle Responses also kann man vielleicht mit einem zentralen Dictionary, wenn man es nur einmal überträgt, weitere Bytes sparen. Ich bin gespannt auf die ersten Messergebnisse.

Links:

  1. https://engineering.linkedin.com/shared-dictionary-compression-http-linkedin
  2. http://blog.endpoint.com/2009/07/sdch-shared-dictionary-compression-over.html

Und es gibt mal wieder ein neues Bildformat, das sich anschickt das alte Ross JPEG in den Ruhestand schicken. Es heisst, jetzt kommt's,  Better Portable Graphics oder BPG. Es greift auf die Still Image Kodierung von HEVC zurück. Mal sehen wie es im Vergleich aussieht, vor allem mit den anderen JPEG Nachfolgern wie WebP oder JPEG2000 und mal sehen wie es mit Browsersupport vorangeht. Auf den ersten Blick ergeben sich bei hohen Kompression Weichzeichnungseffekte, die kennt man ja schon von JPEG2000. Hier könnt ihr das ganze mal selbst probieren: http://xooyoozoo.github.io/yolo-octo-bugfixes/#cologne-cathedral&jpg=s&bpg=s



Die dritte Performance Idee heisst Tubolink und ist die geschickte Anwendung von Javascript um den HTML Body des aktuellen HTML Dokuments im Browserfenster auszutauschen und das Parsen und Kompilieren von inkludierten JS Dateien zu sparen. Die Idee kling ganz nett, die Frage ist, wie hoch das Einsparpotential ist und ob dies mit jeder Webseite funktioniert.



Mittwoch, 13. Januar 2016

Dienstag, 12. Januar 2016

HTTP2

HTTP2 is the new, better, faster HTTP and it replaces Googles SPDY (http://programming-2.blogspot.de/search?q=SPDY). One really informative site to HTTP2 is https://http2-explained.readthedocs.org/en/latest/index.html

To use HTTP2, you need an client. CURL support it, but not as default. To use HTTP2 with CURL on MacOSX, you have to install CURL with brew:

brew install curl --with-nghttp2

Now you can check out HTTP2 with CURL

If you got following error:
curl: (1) Unsupported protocol
You use an CURL without compiled HTTP2 support. On MacOSX brew doesn't replace the existing CURL. You have to use the full path to the CURL from brew:

/usr/local/opt/curl/bin/curl --http2 -I -v https://google.com