Middleman and Google AMP (accelerated mobile pages)

Geschrieben von everflux am Juni 10th, 2016

Mobile growth is a driver for many technologies: Responsive design, HTTP/2, HTML5 replacing Flash. Facebook started with an own format for optimized mobile delivery. This is not only beneficial to users: If a page is displayed fast, ads are visible before the user clicks away, as well.

Google followed the approach of a custom format, called Accelerated Mobile Pages (Google AMP). Instead of choosing a completely different container, like XML, proven technologies were used: HTML, JavaScript and schema.org JSON notation. By using a JavaScript based runtime to implement functions like delayed loading of non-essential assets and inlining CSS, the initial transmission size of the page can be reduced.

While WordPress got support for generating AMP content by a plugin, other CMS applications seem to be lacking. Especially when using static site generators it can be challenging to generate multiple variants from the same content. I like static site generators for several reasons:

  • Can be served from a low-grade webserver without special requirements
  • Really, really fast page serving
  • Easy to cache / integrate CDN
  • Low attack surface, easy to secure

I used middleman in several projects, so far I am quite happy with it. Thanks to integrated asciidoctor support it was even possible to use a common source for web pages as well as print documents, distributed by other channels.

When facing the desire to provide Google Accelerated Mobile Pages (AMP) using the existing middleman setup along with the existing content I noticed the shortcomings of HTML or asciidoc based page templates. Nevertheless I went ahead and use some customizations (some would call it hacks) to achieve my goal. I prototyped it for trion.de and you can see the AMP result on https://www.trion.de/amp/

The implementation uses the latest middleman 4 and the targets plugin to have multiple variants as build targets. To ensure that the AMP links to not point to the non-AMP version by accident a link_prefix and deployment of AMP to a subdirectory is used. Another option would have been to use a subdomain. Of course the AMP version uses a different layout which includes the AMP engine JavaScript and required markup and meta data for the AMP pages.

 

# Build Targets
# https://github.com/middlemac/middleman-targets
config[:targets] = {
  default: {
    build_dir: "build",
    layout: "layout",
    link_prefix: nil,
    features:
    {
    }
  },
  amp: {
    build_dir: "build/amp",
    layout: "amp",
    link_prefix: "/amp",
    features:
    {
    }
  }
}

In order to be able to reuse the existing content, some global search-and-replace is applied as part of the template.

 

<% content = yield %>
<%
content.gsub!("<img", "<amp-img")
content.gsub!("<iframe", "<amp-iframe")
content.gsub!("</img", "</amp-img")
content.gsub!("</iframe", "</amp-iframe")
%>
<%= content %>

 

It is now obvious why this can be called a hack instead of an engineered solution. A better approach would be possible if the source data for the pages is provided in a more strcutured format like JSON or YAML. Both are supported by middleman and are a good choice for content that follows a well defined structure. (A good example is the trainings catalogue on trion.de/schulung/schulungen-coaching-training.html)

Multi-Core vs. Single-Core: Load Testing unter Linux

Geschrieben von everflux am Juni 29th, 2013

Inzwischen sind multi-core oder sogar multi-CPU Maschinen weit verbreitet. Um etwas besser abschätzen zu können, wie gut eine Anwendung mit steigender Anzahl von CPU (Kernen) skaliert, möchte man manchmal eine Anwendung auf einzelne Kerne oder sogar einen einzigen beschränken.
Auch fuer den Fall, dass man den selben Rechner als Test-Agent und zur Ausführung des Tests (also client und server) verwenden möchte, kann es sich lohnen die zu testende Anwendung und den Test-Agenten mit beschränkten Ressourcen zu starten, damit diese nicht so stark miteinander konkurrieren.
Unter Linux (Ubuntu, Debian, Arch…) gibt es das Utility „taskset“. Damit kann die CPU Affinität eines Prozesses beim start oder sogar nachträglich eingestellt werden.
Beispielsweise kann man damit dann eine Java Webanwendung folgendermaßen auf einen Core begrenzen:

taskset 1 [start-kommando]

In meinem Fall nutze ich jmeter um gegen eine so gestartete Anwendung zu testen:

env MAVEN_OPTS="$MAVEN_OPTS -noverify" taskset 1 mvn -Dspring.profiles.active=dev jetty:run

Schon beim Start bemerkt man recht deutlich, wie gut Java von Mehrprozessorarchitekturen profitiert. Selbst wenn die eigene Anwendung nicht stark parallelisert ist.

PHP: gd-png: fatal libpng error: Read Error: truncated data

Geschrieben von everflux am Mai 17th, 2010

Gerade zum Bloggen von Webseiten-Screenshots bietet sich diese Firefox Extension an: Screengrab. Bisher hat das auch alles prima geklabbt: Ubuntu, Firefox, WordPress Blog und Ubuntu Server.

Neuerdings gibts da jedoch ein Problemchen: Beim Hochladen der Bilder ins WordPress gibt es nur das „broken Image“ Symbol, und auf dem Server wird ganz viel dieser Art geloggt:

gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2

Die defekten Zeilenvorschübe kommen dabei original so aus dem Logfile. Ich habe zwar nach der Fehlermeldung ein wenig gesucht, konnte jedoch lediglich einen Hinweis finden, dass es auf aktuelleren PHP Versionen (z.B. Ubuntu Lucid) evtl. zu Problemen mit der Kompressionsstufe 10 kommen kann. Weiterlesen »

USB funktioniert nicht mit Ubuntu Lucid: Lösung

Geschrieben von everflux am Mai 16th, 2010

Wenn seit dem Update auf Ubuntu Lucid 10.04 USB Geräte nicht mehr funktionieren, bzw. externe USB Festplatten und Laufwerke nicht mehr automatisch gefunden werden unter Ubuntu Lucid, dann kann folgendes eine Lösung sein:

Unter Ubuntu Linux 10.04 gibt es ein Problem mit dem automatischen Einbinden von USB Sticks und anderen externen USB Speichern. Das USB Problem wird dabei durch eine BIOS Einstellung ausgelöst, so dass USB Geräte nicht mehr automatisch unter dem aktuellen Ubuntu Lucid eingebunden werden. Stellt man im BIOS den „Legacy Floppy Support“ auf „disabled“, so funktionieren nach einem Neustart des Linux Systems auch alle USB Geräte wieder wie gewohnt und werden gefunden.

Flash Video Stream speichern

Geschrieben von everflux am Februar 6th, 2010

Videos sind im Internet verbreitet – und mit ihnen Adobe Flash. Flash Videos zu speichern gelingt mit Firefox und passenden Addons/Extensions sehr leicht.
Etwas kniffliger wird die Sache, wenn man es mit einem gestreamten Video zu tun hat. Solche Flash Videos werden nicht mit HTTP ausgeliefert, sondern durch das RTMP Protokoll (Real Time Messaging Protokoll).

Nun ist aber das Speichern von Flash Video Streams auch interessant, vor allem wenn man ein Video mal unterwegs oder offline schauen möchte. (Wie die rechtlichen Implikationen beim Speicher von Flash Stream Videos sind, weiss ich nicht. Ich halte da vieles für denkbar in Deutschland und der EU.)

Wer keine Angst vor der Kommandozeile hat, findet mit dem Tool rtmpdump eine praktische und auch funktionierende Lösung. Leider findet sich rtmpdump noch nicht in den Ubuntu Repositories, und auch Debian hat meines Wissens kein Paket dafür. Dafür ist lässt sich das rtmpdump Programm jedoch sehr schnell und einfach selber übersetzen. Man bekommt die aktuellen Source auf http://rtmpdump.mplayerhq.hu/ Weiterlesen »

Java Networking Probleme mit Debian (testing)

Geschrieben von everflux am Februar 2nd, 2010

Wer unter besonders schwer zu diagnostizierenden Fehlern unter Debian testing leidet, die im Zusammenhang mit Java  oder Java Applikationen auftauchen, könnte von dem Bug 560056 erwischt worden sein, den das netbase Paket eingeführt hat.

Dabei wird das sysctl Setting
net.ipv6.bindv6only=1 in /etc/sysctl.d/bindv6only.conf
gesetzt, welches dann z.B. Socket Exceptions (invalid argument) nach sich zieht.

Eine schnelle Lösung des Problems:
Die Datei /etc/sysctl.d/bindv6only.conf editieren und das Setting auf „0“ umstellen. Danach:
sudo invoke-rc.d procps restart

Der Fehler könnte auch Ubuntu Systeme betreffen, die eine enstprechende Kerneleinstellung haben. Weiterlesen »

Ubuntu DVD Wiedergabe (libdvdcss mit Karmic)

Geschrieben von everflux am Dezember 4th, 2009

Bei Ubuntu Karmic funktionierte selbst nach einem Update von Ubuntu Jaunty mit funktionierender DVD Wiedergabe (dank libdvdcss) leider die Wiedergabe von DVDs nicht richtig. Ursache war hier, dass das DVD Kopierschutzsystem CSS nach dem Update nicht mehr mit VLC oder Totem nutzbar war.

Weiterlesen »

Münster Ubuntu Stammtisch

Geschrieben von everflux am September 7th, 2009

Ich habe ja nun etwas Erfahrung mit Stammtischen – eine super Sache! Nun haben einige Leute mein Blog bereits auf der Suche nach einem Ubuntu Stammtisch in Münster gefunden.
Ich kenne zwar (noch) keinen Ubuntu Stammtisch in Münster, aber wäre nicht abgeneigt an einem solchen teilzunehmen. Sehr empfehlen kann ich natürlich für alle an Java und Softwareentwicklung interessieren den Stammtisch bzw. die Treffen der Java Usergroup in Münster: http://www.jug-muenster.de/
(Tipp: Da sind auch viele Ubuntu und Debian Linux User aus Münster dabei.) Hinterlasst gerne einen Kommentar, so finden sich sicherlich einige interessierte aus Münster und Umgebung!

Nokia N900 (N810 Nachfolger)

Geschrieben von everflux am August 21st, 2009

An den Gerüchten eines linux basierten Nokia Mobiltelefons scheint etwas drann zu sein. Wie jetzt bekannt wurde, soll der Nachfolger des N810 Internet Tablet von Nokia den Namen N900 tragen (RX-51). Anders als bei Google Android, ebenfalls einer Linux basierten Mobiltelefon Plattform, möchte Nokia jedoch die Kompatibilität zu bestehenden Linux Distributionen wahren: Das Maemo Betriebssystem des N900 wird weiterhin mit dem Debian Paket Format (.deb) arbeiten und öffentlich entwickelt. Weiterlesen »

Nokia: Symbian, Android – oder Maemo?

Geschrieben von everflux am August 11th, 2009

Wie golem berichtet gibt es Gerüchte, dass Nokia das Betriebssystem Symbian auslaufen lassen könnte. Hintergrund soll sein, dass Symbian im vergleich zu aktuellen Betriebssystemen zu „schwerfällig“ sei. Betrachtet man die Entwicklung bei Linux (nicht zuletzt Dank Google mit Android) so kann man das gut nachvollziehen. Auch andere mobile Betriebssysteme wie das iPhone OS machen rasant Forschritte.

Hinzu kommt, dass Nokia mit Maemo selber einen deutlichen Takt vorlegt – man merkt spürbar, in welchem Bereich Innovationen stattfinden, und wo Altlasten die Entwicklung beherrschen. Setzt man dieses Gerücht in Kontext mit dem älteren Gerücht, dass Nokia zukünftig auf Android setze, so erscheint das ganze nicht so abwegig.
Beide Betriebssysteme basieren schließlich auf Linux, und damit hat Nokia unter dem Maemo Projekt bereits reichlich Erfahrung. Auch die Abkommen mit Intel sprechen hier eine recht deutliche Sprache. Schaden wird es Nokia wohl kaum – höchstens wenn die Migration nicht bald einsetzt.


http://everflux.de/
Copyright © 2007, 2008 everflux. Alle Rechte vorbehalten. All rights reserved.