Dienstag, 14. Juni 2016

Löschen von Digital Ocean Droplets via RES API in der 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 | 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.