OS X 10.9 Mavericks: Kein M2_HOME mehr in IntelliJ IDEA

Nach dem Update auf Mavericks hat sich auch unter der Haube einiges an Libraries getan. So ist nicht nur das System-Ruby auf Version 2 angehoben worden, sondern auch Maven wurde nebst Java jetzt wirklich komplett entfernt.

Damit man in IntelliJ IDEA nicht in jedem Projekt separat die Maven-Konfiguration nachpflegen muss, muss man nun Maven auch selber installieen (musste man vorher auch, wenn man eine andere Version als den Default haben wollte). Leider erhalten GUI-Anwendungen unter OS X nicht einfach alle Umgebungsvariablen (aus dem Enviroment, ~/.bash_profile usw.). Seit 10.8 und 10.9 muss man wohl tatsächlich, will man globale Variablen anlegen, diese im Launch Daemon registrieren. Dies wiederum kann man aber bspw. in seiner ~/.bash_profile machen.

Das sieht bei mir nun wie folgt aus:

export M2_HOME=~/bin/apache-maven-3.0.5
export M2=$M2_HOME/bin
launchctl setenv M2_HOME $M2_HOME
launchctl setenv M2 $M2

Darüber hinaus schadet es auch nicht, eine funktionierende JAVA_HOME Variable anzulegen, weil manche stumpfsinnigen OSX-Anwendungen einfach nicht in der Lage sind ohne auszukommen:

export JAVA_HOME=$(/usr/libexec/java_home)
launchctl setenv JAVA_HOME $JAVA_HOME

Und wenn wir einmal dabei sind, aktualisieren wir noch den Pfad.

launchctl setenv PATH $PATH

Wahlweise kann man hier natürlich auch das $M2 hinzufügen ($PATH:$M2), wenn man den Befehl „mvn“ auch im Pfad haben will.

Proof Of Concept: Proxy-Download von S3

Aufgabe

Die Verwendung von Amazon S3 soll a) nicht öffentlich gemacht werden und/oder man b) möchte den Zugriff per zusätzlicher Authentifizierung absichern. Es gilt also, durch eine Anfrage per HTTP einen Download bei S3 anzustoßen und den Inhalt entsprechend zurückzuschreiben.

Option 1: Download auf Temp-File / Speicher

Zunächst kann man natürlich ganz allgemein den Download abstoßen, den Inhalt lokal auf dem Server in eine Datei packen und anschließend dem Client zurückzuschicken.

Problem 1: Selbst bei guter Anbindung des Servers an S3 muss man erst alles laden und erst bei Beendigung des Downloads kann man dem Benutzer die Datei schicken. Dieser Delay ist unschön.

Problem 2: Sollte die Datei größer sein, verbraucht man (unnötigerweise) Platz auf dem Server.

Problem 3: Eventuell ist es aus Sicherheitsgründen auch nicht wünschenswert.

Option 2: Download direkt auf Client speichern

Sobald der Download angestoßen wurde und Daten liefert, werden die Chunks (Buffer-Pakete) sofort dem Stream der laufenden HTTP-Anfrage rausgeschrieben. Damit wird sichergestellt, dass weder auf der lokalen Platte oder im Speicher des Servers unnötige Daten gespeichert werden müssen.

Code liegt bei GitHub, wo denn sonst.

Sonstiges

  • Die NodeJS Library knox setzt auf aws-sdk auf und bietet ein Wrapper um die AWS-S§-Response. Damit ist dies Lösung oben geringfügig einfacher zu realisieren.
  • Eine Alternative zu der ganzen Thematik können auch so genannte Signed URLs sein. Eine Signed URL auf S3-Content ermöglicht auch temporären Zugriff auf nicht öffentliche Dateien. Signed URLs sind relativ simpel, weil sie nur aus dem Expiry Date und einer Signatur (auf Basis des privaten Schlüssels des Owners) dessen bestehen.

Spring 3.2 + JodaTime + Jackson2

Möchte man in seinem frischen Spring 3.2 Projekt auch gerne Jackson 2 (Version 2 von fasterxml, Version 1.x bei codehaus) mit Joda Time verdrahten, um beispielsweise eine schöne ISO-Formatierung bzw. Konvertierung (also „rein“ und „raus“) zu ermöglichen, dem sei folgende Lösung ans Herz gelegt. Jegliche eigenen Date-Serialisierer aus früheren Versionen sind nicht mehr notwendig.

Lösung bei stackoverflow

Optimierte JavaScript Anwendungen mit erweiterten Debugging-Möglichkeiten

Im Firmenblog habe ich einen Artikel unter dem Titel Optimierte JavaScript-Anwendungen mit erweiterten Debugging-Möglichkeiten veröffentlicht.

Es sollte mittlerweile in jeder halbwegs ernsthaften Webanwendung gängig sein, dass das JavaScript nicht as is ausgegeben wird, sondern in einer optimierten Variante. Dabei wird in der Regel auf eine Kombination aus Konkatenation und Minifizierung zurückgegriffen.

In diesem Artikel stelle ich eine Möglichkeit vor, dies in einem Java-Projekt mit Spring einzusetzen. Als Builder wird Maven und als JS-Compiler wird der Google Closure Compiler verwendet. Als Boni werden die Source Maps in der Konbination mit Google Chrome vorgestellt. Grundsätzlich sind einige Werkzeuge zum Teil auch ohne Java oder Spring einsetzbar — Google Closure Compiler ist zwar in Java geschrieben, aber als JAR verfügbar und universell per Executable steuerbar.

Best Practices in Spring

Schon ein paar Tage alt, aber sehr guter Lesestoff für Spring-Entwickler. Das ist eine ganze Artikel-Reihe.

Einige Dinge weiß man — hoffentlich 🙂 — schon, andere waren auch mir neu, bspw. was das Maven Enforcer Plugin außer der JDK Version sonst noch so kann (siehe Project Config).

Eine tolle +1-I-Like-Top-Sache.

jQuery AutoSuggest v2 (pre) – oder: Heißer Scheiß mit grunt, coffee, sass, github und travis

In einer bislang nur als Pre-Release verfügbaren Version 2 gibt es nun von mir das jQuery Plugin AutoSuggest auf GitHub. Das Plugin basiert weitestgehend auf der Version von Wu Yuntao, welcher aber die aktuell verfügbare Version 1.6 nicht mehr wirklich zu pflegen scheint. Ursprünglich wurde das Plugin 2009 von Drew Wilson entwickelt. Das dortige Plugin dort wurde das letzte mal im März 2010 in der Version 1.4 veröffentlicht.

„jQuery AutoSuggest v2 (pre) – oder: Heißer Scheiß mit grunt, coffee, sass, github und travis“ weiterlesen