Wenn ich mir anschaue, wie sich die politisch-gesellschaftliche Situation in Deutschland und Europa entwickelt, zeichnen sich mir tiefe Sorgenfalten auf die Stirn!

Ich finde es bedrohlich, wie viele Menschen bei PEGIDA und verwandten Bewegungen mitlaufen und ihre stumpfe Fremdenfeindlichkeit hinter einer diffusen Angst vor dem Islam zu verstecken versuchen. Ich kann leider nicht glauben, dass sich innerhalb des PEGIDA- und HoGeSa-Mobs wirklich Leute befinden, die tiefergehende Kenntnisse dieser Religion haben. Das gleiche dürfte für die christliche Religion gelten, die immer wieder gerne heran gezogen wird, weil sie doch angeblich so bestimmend für unser aktuelles gesellschaftliches Zusammenleben ist.

Mir ist auch diese Heuchelei zuwider, plötzlich die Rechte der Frauen für sich zu entdecken und diese dabei lediglich als argumentative Keule auszuschlachten. Besonders grotesk ist das, wenn man sich anschaut, welches Frauenbild die AfD vertritt, die ja fleißig in den braunen PEGIDA-Gewässern fischt und dort fette Beute macht. Das gleiche gilt für Obdachlose, die man während der Flüchtlingskrise am rechten Rand als schützenswerte Gruppe für sich entdeckt hat. Dass es zuweilen das Hobby gelangweilter Neonazis ist, Obdachlose im Suff tot zu treten — kann ja mal vorkommen. Und dass jemand, der auf der Straße lebt und nicht arbeitet, ja irgendwie auch suspekt sein müsste — geschenkt! Kohärenz wird sowieso überbewertet.

Und wenn ich schon mal so beiläufig das Thema rechte Gewalt anschneide: wie kann es sein, dass wir in 2015 über 900 Brandanschläge auf Flüchtlingsunterkünfte hatten, und das Thema trotzdem in den Randnotizen dahin dümpelt? Klar ist das irgendwie monoton: "Flüchtlingsheim => Feuer; das eigene Haus steht noch, alles i. O." Aber — und jetzt wirds trivial — unterhalb dieser hässlichen Spitze des Eisbergs, tut sich der Umstand auf, dass wir hier Gewalttätern das Feld überlassen, die ohne zu Zögern den Tod von Menschen in Kauf nehmen. Man könnte meinen, dass das etwas mehr Öffentichkeit verdient hätte. Man könnte auch meinen, dass sich die Exekutive angesichts dieser Entwicklung bemüßigt fühlte, ihr Gewaltmonopol an der Stelle mal grade zu rücken.

Weiterhin finde ich es höchst bedenklich, wie mittlerweile verbal ausgeteilt wird. Dazu muss ich erwähnen, dass ich diesem Ideal einer Gesellschaft anhänge, nach dem sich die Menschen gegenseitig mit Achtung und Respekt begegnen. Und zwar nicht zum reinen Selbstzweck, sondern weil das die Gesellschaft lebenswert macht. Wenn ich mir aber angucke, welche Meinungen von Seiten der — nach eigener Wahrnehmung — bildungsnäheren Schichten hinsichtlich der neuen, rechten Massenbewegungen geäußert werden, dann sehe ich Gräben, die sich auftun. Was ich jedoch nicht sehe, ist das Interesse, diese Gräben zu überwinden.

Wer im Fernsehen und in den sozialen Medien selbstgefällig darüber fabuliert, wie dumm und von hohen IQs verschont geblieben die Menschen seien, die bei PEGIDA & Co mitlaufen, der hat kein Interesse daran, in irgend einer Weise zur Lösung der Probleme beizutragen. Vielmehr wird sich dadurch nur vergewissert, wo man selbst steht. Und sollte die Zerklüftung der Gesellschaft während dieser Scharmützel zunehmen, ist das ein willkommener Kollateralschaden. Schließlich muss die eigene wertvolle Gruppe verlässlich abgeschottet werden, gegen all jene, die vermeintlich weniger gebildet, kultiviert und strebsam sind. (Ziemlich drastische Unterstellung, ich weiß … ¯\_(ツ)_/¯)

Und bitte nicht falsch verstehen: auf Facebook und twitter wird viel rechter, menschenverachtender Müll abgesondert. Vieles davon mit haarsträubender Rechtschreibung und Interpunktion. Die Urheber dieser unsäglichen Beiträge sind in den meisten Fällen nicht an einer sachlichen Diskussion interessiert. Doch so wenig es bringt, in diesen Fällen in die Debatte einzusteigen, so wenig bringt es auch, sich der Eitelkeit hinzugeben und die Verfasser für ihre mangelnde Bildung zu verlachen.

Vielmehr sollte man einen Schritt zurück gehen und sich fragen, wie es kommen konnte, dass es mittlerweile — besonders in den mitunter leer gefegten, neuen Bundesländern — so viele Menschen gibt, die komplett abgehängt sind? Die weder Ausbildung noch Perspektive haben. Und deren Meinungsbildung durch Menschen bestimmt wird, die einen ähnlich schmalen Horizont haben. Seien das nun die Nachbarn oder die Protagonisten diverser Scripted-Reality-Shows. Die Antwort auf diese Frage ist relativ komplex. Von etwaigen Lösungen ganz zu schweigen. Aber einfache Antworten gibt es nicht.

Höchstens bei der AfD. Ich würge regelmäßig Kotze hoch, wenn ich Björn Höcke und Konsorten reden hören. Momentan frage ich mich, ob es vielleicht zur schrulligen Tradition wird, am Anfang eines Jahrhunderts am Praxisbeispiel darzulegen, wie nachteilig eine faschistische Regierung ist. Andererseits ist es ja gerade irgendwie en Vogue in Europa. Wie ein Kind, dass lieber seine Sandburg kaputt macht, als zusammen mit einem weiteren Kind, das neu in den Kindergarten gekommen ist, daran weiter zu bauen, werden alle Errungenschaften der letzten Jahrzehnte in der EU in die Tonne gekloppt.

Was mich zum letzten Punkt bringt: die Flüchtlinge, die hier zu Tausenden Schutz suchen. Ich finde es toll, wie viele Bürger sich ehrenamtlich engagieren und die dringend benötigte Hilfe anbieten!! Und denjenigen, die sich fragen, ob wir uns das überhaupt leisten können, sage ich: so eine Schäuble'sche, schwarze Null hat meiner bescheidenen Meinung nach keinen Wert. Oder anders gesagt: Sparen zum Selbstzweck ist keine Politik, die diese Bezeichnung verdient.

Ich wundere mich aber, wie leichtfertig das Mittelmeer als Flüchtlingsmassengrab "vor der Haustür" hingenommen wird. Und dass die Schließung der Grenzen als probates Mittel erachtet wird, wohl wissend, dass Menschen in Not nicht einfach umkehren werden. Wieviel Blut wird die Friedensnobelpreisträgerin EU an den Händen haben können, bevor sie als Randnotiz der Geschichte zu den Akten gelegt wird? Man wird sehen …

So, das wäre es auch schon. Habe ich etwas vergessen? Bestimmt. Man sehe mir bitte auch nach, wenn ich stellenweise ins Zynische abgeglitten bin. Ich habe mich schon sehr gezügelt! Was sonst noch? Ich darf mich jetzt fragen, was ich aktiv zur Behebung der genannten Missstände unternehme. … außer meine Meinung dem allgemeinen Desinteresse des Internets zu präsentieren.

Letzten Mai habe ich mit zwei Freunden das schöne Schottland bereist. Wir sind den West Highland Way abgelaufen, haben einen Höflichkeitsbesuch beim Loch Ness gemacht, anschließend Inselluft auf der Isle of Mull geschnuppert und abschließend noch zwei Tage im wunderschönen Edinburgh verbracht.

Eine herrliche Reise, die ich in der Form jederzeit wieder machen würde. Nur das Loch Ness kann man sich schenken. Es sei denn, man hält sich von der unsäglichen Nessie-Folklore fern und erkundet die Landschaft.

Hier noch ein paar Schnappschüsse von der Reise. Das volle Paket gibts bei Flickr im Album "Schottland 2015".

"Schottland 2015" auf Flickr.

(English version of this article @Codepen.)

Neulich hatte ich ein interessantes Problem: Ich musste ein <iframe>-Element in eine responsive Website einbetten, dessen Inhalt wiederum nicht responsiv war. Man kann sich leicht vorstellen, wo hier der Fallstrick liegt. Wird der Bildschirm kleiner, passt sich die umgebende Website zwar problemlos an, der Inhalt des iFrames jedoch bleibt starr in seinen Dimensionen. Zusätzlich erscheinen unschöne, horizontale Scroll-Balken am iFrame.

Glücklicherweise gibt es in modernen Browsern einen Weg, mit diesem Problem umzugehen. Mithilfe von CSS-Transforms kann der iFrame inklusive seines Inhalts runter skaliert werden wie ein Bild. Der folgende Codepen zeigt, wie das aussehen kann.

See the Pen Scaling iFrames with CSS transforms by Emanuel Kluge (@herschel666) on CodePen.

Um dieses Verhalten zu implementieren, benötigen wir als erstes einen Breakpoint, ab dem die Skalierung wirksam wird. Den Breakpoint kann man sehr leicht ermitteln, indem man das Browser-Fenster verkleinert. Sobald am iFrame ein horizontaler Scroll-Balken auftaucht, hat man den Breakpoint erreicht.

var BREAKPOINT = 1060; // (Willkuerlich gewaehlter Wert!)

Der Breakpoint dient außerdem als Referenz-Breite des iFrames: 100% entsprechen 1060px. Nun benötigen wir den Skalierungs-Faktor. In der Theorie ist das der Quotient aus gegenwärtiger Bildschirm-Breite und iFrame-Referenz-Breite. In der Praxis hat sich dieser Wert für mich jedoch ab einem bestimmten Punkt als zu groß erwiesen. Daher verringere ich den Wert geringfügig mithilfe der Math.pow-Methode und einem Exponenten von 1.2.

var scale = Math.pow(window.innerWidth / BREAKPOINT, 1.2);

Eigentlich habe wir damit auch schon alles, was wir benötigen: einen Breakpoint, ab dem das Skalieren einsetzt, und einen Skalierungs-Faktor. Setzten wir nun jedoch den CSS-Transforms-Wert mit dem jeweiligen Skalierungs-Faktor am iFrame-Element an, passiert etwas merkwürdiges: der Inhalt des iFrames skaliert unmerklich, wobei das iFrame-Element selbst rapide an Größe verliert und buchstäblich in sich zusammen fällt. Das ist leider nicht das gewünschte Resultat.

Glücklicherweise gibt es einen Weg, dieses Verhalten zu unterbinden. Die Lösung ist, die Dimensionen des iFrames in dem Maße zu erhöhen, in dem es skaliert wird. Die Auswirkungen der CSS-Transforms auf die Abmessungen werden somit vollständig kompensiert und der iFrame verhält sich wieder wie ein normales, responsives Element. Lediglich der Inhalt des iFrames schrumpft wie gewünscht.

var scale = 0.8; // (Willkürlich gewählt!)
var width = 100 / scale; // Breite in Prozent
var height = INITIAL_IFRAME_HEIGHT / scale; // Hoehe in Pixeln

Die Breite des iFrames in Prozent ist die Inverse des gegenwärtigen Skalierungs-Faktors multipliziert mit 100. Die angepasste Höhe in Pixel ist der Quotient aus initialer Höhe und Skalierungs-Faktor. Die initiale Höhe des iFrames muss dabei ganz zu Beginn einmal ermittelt und gespeichert werden.

Jetzt gibt es nur noch ein potenzielles Problem: ist das iFrame-Element mithilfe von margin: * auto; mittig auf der Seite positioniert, muss die transform-origin ebenfalls durch "center top" auf Zentrierung eingestellt werden.

Dies hat jedoch zur Folge, dass der iFrame während des Skalierens rechts aus dem Bild "läuft", da sich seine Breite sukzessive erhöht. Um dieses Verhalten zu kompensieren, muss der iFrame um die Hälfte seines Wachstums in der Breite nach links verschoben werden.

var width = 100 / scale; // Breite in Prozent
var offsetLeft = (width - 100) / -2; // Versatz nach links in Prozent

Setzt man diesen Versatz mithilfe von transform: translateX(…);, bleibt der iFrame in der Mitte der Seite.

Das ist auch schon alles. Solltest du Fragen dazu haben, schreib einen Kommentar oder frag mich via Twitter: @Herschel_R.

»GH Random Favorite« im Google Chrome Store

»GH Random Favorite« auf GitHub

Interessante GitHub-Repos zu favorisieren ist fast schon ein Reflex. Ich denke, niemand spart dabei mit Sternen. Allerdings gilt für die meisten favorisierten Repos wohl der Leitspruch: aus den Augen, aus dem Sinn.

Das ist schade und oftmals ärgerlich. Wie oft sucht man nach einer Lösung (aka Library, PlugIn, Framework, …) für ein bestimmtes Problem und stellt dann — nachdem man auf GitHub etwas gefunden hat — fest, dass man das Repo vor einem halben Jahr schon einmal favorisiert hat.

Um dieser Form der digitalen Demenz entgegen zu treten, habe ich eine Chrome-Extension — »GH Random Favorite« — geschrieben, die auf der GitHub-Startseite ein zufällig gewähltes Repo aus der Favoritenliste anzeigt. Dabei treten wahre Schätze wieder zutage.

Probierts mal aus!

Sollte es Probleme geben, kann im zugehörigen GitHub-Repo ein Ticket angelegt werden.

PS: Das ganze läuft über die stark reglementierte Public API von GitHub. Es können also nur 30 zufällige Favoriten pro Stunden angezeigt werden (es braucht zwei Requests pro zufälligem Favorit). Sollte sich herausstellen, dass das zu wenig ist, könnte man über die Integration von OAuth nachdenken. Das spielt für mich momentan jedoch noch keine Rolle.

Im Oktober/November diesen Jahres hat es mich nach Nepal verschlagen, wo ich mit einem Freund 13 Tage lang den berühmten Annapurna Trek abwanderte. Die Reise führte uns dabei von Besi Shahar über den Thorong-La-Pass bis nach Tatopani. Die Fotos der Reise gibt es bei Flickr:

Foto-Set "Annapurna Trek 2013 (Nepal)"

Das nenne ich mal eine veritable Ungleichverteilung!

Da die Menschen im Gros immer der Meinung sind, sie seien schlauer als ihre Vorgänger-Generationen, wird kaum jemand ernsthaft in Erwägung ziehen, dass eine derartige Einkommensverteilung bzw. noch extremere Ungleichverteilungen zu gewaltsamen Auseinandersetzungen führen könnten. Nicht im zivilisierten 21. Jahrhundert!

Dabei ist das IMHO blütenreines Konfliktpotenzial. Und je eher man da entgegensteuert, desto besser. In einer Arbeitswelt, die immer mehr durch den Einsatz von Computern und Automatisierung gekennzeichnet ist, und immer höhere Erträge von immer weniger Akteuren erwirtschaftet werden, greifen die althergebrachten Entlohnungsstrukturen nicht mehr. Das sind aber auch old News.

Wir müssen auch gar nicht groß über den Atlantik glotzen. Das gleiche Problem (in weniger extremer Form) haben wir auch bei uns. Und die klassische Ignoranz gegenüber historischen Erfahrungen ist auf dieser Welt so gleichverteilt, wie es Geld selbst im Muster-Sozialismus nicht sein könnte. Von daher ist eine Besserung in nächster Zeit nicht zu erwarten. Um des Friedens Willen wäre es jedoch wünschenswert.

Link: www.utrend.tv/v/9-out-of-10-americans-are-completely-wrong-about-this-mind-blowing-fact/

(via @anked)

This is a rather unusual post as it is written in english. So don't be irritated by the fact that everything around here on this blog is in german. I switched the language for this post because I wanted to write a response to an article on Smashing Magazine about Full-stack JavaScript. Normally I would have just written a comment over at Smashing Magazine's, but this comment would have gotten way too long.

Also I want to shortly clarify my relationship to JavaScript. I'm working as a frontend developer for an agency in Hanover and I actually love writing JavaScript. In fact I have to love writing JavaScript as it is my main programming-/scripting-language. I'm quite familiar with PHP too and I wrote a little Python some time ago, but most of the time I'm writing JavaScript. And therefor I would get in real trouble if I started to hate writing it.

So what's wrong with this article on Full-stack JavaScript? Actually it's overall a good post and provides a wide overview on the topic. But beside the fact, that I disagree with the author when he states that asynchronous, callback-based code is easier to read and understand than synchronous (linearly written) code (e.g. PHP), I don't like the announcement of the "Full-stack-JacaScript-developer-dude/-dudess" he implicitly makes.

It's correct that it is easily possible to to have an application (client and server) fully running on JavaScript. But in my perception Alejandro Hernandez negates the fact that there still exist two different environments, though they both run the same language. And these environments provide different requirements to the developer. On the client-side it's about creating a user experience, dealing with user interaction and device deficiencies. Sure, with client-side-rendering and -routing formerly unusual tasks arrived on the client-side, but IMHO that doesn't equate client- and server-side programming.

On the server-side again there are tasks that could easily be located on the client-side (e. g. SQLite is implemented on both sides of the wire), but that's only a small part of the tasks a common server-side progammer is confronted with. There are way more things to do with data than fetching it from/writing it to a database. This is the kind of computer-sience-stuff a frontend developer has few to nothing to do with with when she's juggling HTML, CSS and JavaScript in the presence of various browser quirks.

That's why I think it's risky to suggest that there could prospectively be one kind of developer that is writing the full stack in JavaScript. And I think Alejandro Hernandez is exactly doing this in his article.

TL;DR

Though client and server are nowadays able to run the same programming language, I think there won't arise a new species of full-stack developer that addresses all the requirements issued by these two environments. Though there is an overlap in tasks and some people out there have a really broad understanding of various JavaScript-driven environments, the common case will be a specialized developer that does reliable work either on either the client- or the server-side.


Photo by Kim Yokota (CC)

Da ich mich gerade auf einem beliebten und nicht unumstrittenen Social Network über den SpOn-Artikel "NSA-Spähprogramm: Friedrich fordert Deutsche zu mehr Datenschutz auf" aufgeregt habe und das zu einem relativ umfangreichen Kommentar geführt hat, möchte ich die Gelegenheit nutzen, mich auch noch einmal öffentlich zu echauffieren.

Unser werter Bundesminister des Inneren, HP Friedrich, hängt nämlich der Meinung nach, die Lösung gegen Totalüberwachung à la NSA wären größere Bemühungen seitens der Bürger, sich selbst zu schützen. Nun bin ich sicherlich kein Anhänger des paternalistischen Staates. Ich erfreue mich meiner Mündigkeit und bin gerne bereit, die damit einhergehende Verantwortung für mich und mein Handeln zu tragen.

Doch alles hat Grenzen. Ich besitze beispielsweise keinen prall gefüllten Waffenschrank. Zwar besteht die hypothetische Möglichkeit von vorsätzlichen Eingriffen in meine körperliche Unversehrtheit durch Dritte, doch hat hier der Staat die Hoheit über die Sicherung meiner Gesundheit. Das ist auch in Ordnung. So genannte "Wild-West-Zustände" halte ich für wenig konstruktiv.

Wenn man sich dagegen die gebetsmühlenartig vorgetragene Beteuerung, das Internet sei kein rechtsfreier Raum, und die teilweise recht strenge "Hacker-Gesetzgebung" anschaut, verwundert es jedoch stark, dass es bei der Überwachung durch (ausländische) Geheimdienste auf einmal anders sein soll. Dass hier nicht mehr der Staat die Wahrung der Grundrechte seiner Bürgerinnen und Bürger übernimmt, sondern dass diese sich selbst helfen müssen.

Herr Friedrich scheint der Meinung zu sein, dass man übernommene Verantwortung mal eben ablegen kann, wenn es opportun erscheint. So viel mangelnde Souveränität und Integrität ist erschreckend!

Wie weithin bekannt ist, benutzt Angular für DOM-Angelegenheiten intern eine abgespeckte jQuery-Variante namens jqLite, auf die über angular.element zugegriffen werden kann. Diese bietet ein paar Methoden aus dem Bereich DOM-Manipulation und -Traversing, hat jedoch keine Selektor-Engine. Bindet man parallel zu Angular die jQuery-Library ein, wird jqLite durch jQuery ersetzt.

Angesichts der Tatsache, dass Angular eigene Services für AJAX und Animationen (Version >= 1.1.3 in Verbindung mit CSS3) bietet, ist der Einsatz von jQuery jedoch stark übertrieben. Zum Glück gibt es die von jQuery verwandte und von John Resig geschriebene Selektor-Engine Sizzle auch als Stand-alone-Version. Diese kann man alternativ einbinden. Man muss angular.element dann nur noch beibringen, sie auch zu verwenden.

Das wiederum ist schnell erledigt.

// Anlegen einer Referenz auf die eigentliche angular.element-Methode
angular._element = angular.element;

// Ueberschreiben der angular.element-Methode
angular.element = function (selector) {
    // ist das uebergebene Argument bereits eine
    // Instanz von angular._element, wird es ohne
    // Umschweife zurueck gegeben.
    if ( selector instanceof angular._element ) {
        return selector;
    }

    // Andernfalls wird eine Sizzle-Instanz erstellt
    // und an die angular._element-Methode uebergeben.
    return angular._element(Sizzle(selector));
};

Fertig ist die Laube!

Das ganze gibt es auch als Angular-Modul Angular-Sizzle" auf Github.

Zum Schluss noch der Hinweis, dass der Einsatz von Angular-Sizzle gut überlegt sein will. Das Konzept von Angular sieht vor, dass tiefgreifendere Arbeiten am DOM über Direktiven erledigt werden. Diese bieten abstrahierte Element-, Klassen- und Attribut-Selektoren. Innerhalb der Direktiven gibt es automatisch eine jqLite-Instanz der relevanten DOM-Elemente, mit der man arbeiten kann.

Der Einsatz einer ausgewachsenen Selektor-Engine könnte also übertrieben sein. Das hängt jedoch davon ab, was man vor hat.

Seit kurzer Zeit gibt es ein JavaScript-API, mit welchem man Vibrationen von mobilen Geräten im Browser steuern kann. Um den Umgang mit dem API intuitiver zu gestalten, habe ich einen Navigator.Vibrate-Wrapper namens Burp.js geschrieben. Dieser funktioniert folgendermaßen:

Burp('*·*·*·**-**', 200);

Die Burp-Funktion nimmt zwei Parameter entgegen: Einen String, welcher den Rhythmus der Vibration steuert. Sternchen bilden dabei Vibrationen, Punkte (Middle Dot) sind kurze Unterbrechungen und Bindestriche Pausen, welche die gleiche Länge wie die Vibrationen haben. Mehrere Vibrationen bzw. Pausen hintereinander werden addiert.

Der zweite, optionale Parameter gibt in Millisekunden an, wie lang die Vibrationen und Pausen sein sollen. Der Default-Wert ist 300ms.

Hier gibt es eine Demo dazu …

Das ganze wird theoretisch vom mobilen Firefox, dem Android-Browser und dem mobilen Chrome unterstützt. Praktisch zum Laufen bekommen habe ich es jedoch nur im Mobile Firefox. Man wird sehen, wie es sich entwickelt. Für mehr Informationen empfehle ich den Beitrag auf MDN dazu.