Primefaces: AutoResize der inputTextarea mit dynamischer Breite fehlerhaft (Patch/Workaround)

Die Primefaces Komponente InputTextArea bietet die Möglichkeit, über das Attribut „autoResize“ die Größe mittels JavaScript dynamisch anpassen zu lassen.

<p:inputTextarea autoResize="true" style="width:70%;" />

Problem
Die Berechnung der notwendigen Größe funktioniert leider mit der aktuellen Version 5.1 nur dann korrekt, wenn eine feste Breite für das p:inputTextarea Tag angegeben wird. Wird die Breite in Prozent angegeben, ist die Berechnung der Höhe bzw. die Anzahl der notwendigen Rows fehlerhaft. Dies tritt aber erst ab einem Wert von 51% und mehr wirklich sichtbar auf. Die Anzahl der Rows die nach unten hin zuviel vorhanden sind, ist abhängig von der Länge des Textes und der Breite.

primefaces-inputtextarea-resize-bug

Bereits im Mai 2012 wurden die Entwickler von Primefaces auf dieses Problem (Issue 4015) aufmerksam gemacht. Leider steht das Issue auf den Status „WontFix“, was ich leider nicht ganz nachvollziehen kann.

Lösungsansatz
Es wurde bereits ein inoffizieller Patch im Issue zur Verfügung gestellt. Leider ist dieser nicht mehr ganz mit der aktuellen Primefaces Version 5.1 kompatibel. Zusätzlich wurde vergessen die Mindesthöhe der Textarea zu beachten. Hat eine Textarea noch keinen Inhalt oder braucht der Inhalt weniger Platz als die Mindesthöhe, dann wird trotzdem ein niedrigerer Wert als die Mindstehöhe gesetzt.

Patch für Primefaces 5.1
Ich habe den vorhandenen Patch erweitert und für die aktuelle Primefaces Version 5.1 angepasst.

InputTextarea Resize Patch herunterladen

Anpassung ohne Änderung der Bibliothek
Oft ist es jedoch keine gute Idee, den orginalen Sourcecode einer Bibliothek zu verändern. Die Änderung müsste dann z. B. bei jedem Update der Bibliotek immer wieder angepasst werden.

Etwas eleganter finde ich nachfolgende Lösung. Dort wird die Anpassung im eigenen Code vorgenommen und verändert nicht die Bibliothek selbst.

1. Folgende CSS Klasse muss hinzugefügt werden

.ui-inputtextarea-resizable-reference{
    position: absolute;
    bottom: 0;
    right: 0;
    white-space: pre-wrap;
    word-wrap: break-word;
    visibility: hidden;
}

2. Überschreiben der JavaScript Funktionen „setupAutoResize“ und „resize“ Komponente.

PrimeFaces.widget.InputTextarea.prototype.setupAutoResize_base = PrimeFaces.widget.InputTextarea.prototype.setupAutoResize;
PrimeFaces.widget.InputTextarea.prototype.resize_base = PrimeFaces.widget.InputTextarea.prototype.resize;

PrimeFaces.widget.InputTextarea.prototype.setupAutoResize = function(){
    var suffix, referenceContainerId;

    suffix = '_reference';
    referenceContainerId = this.jqId + suffix;
    this.referenceContainer = $(referenceContainerId);

    if (this.referenceContainer.length != 1) {
        this.referenceContainer = $(document.createElement('div'))
            .attr('id', this.id + suffix)
            .addClass('ui-widget ui-inputfield ui-inputtextarea ui-inputtextarea-resizable-reference')
            .appendTo($(document.body));
    }

    this.setupAutoResize_base();
    //this.resize();  //use this line to resize textarea on initialization
};


PrimeFaces.widget.InputTextarea.prototype.resize = function(){
    var newH, minH;

    //Update reference container and resize text area
    this.referenceContainer.width(this.jq.width());
    this.referenceContainer.text(this.jq.val());

    newH = this.referenceContainer.innerHeight();
    minH = parseInt(this.jq.css('min-height'), 10); //parse to int to remove all non numeric chars

    if(isNaN(minH) || minH === 0){
        this.jq.css('min-height',this.jq.height());
    }

    this.jq.height(newH);
};

TextWrangler – Ansicht mit der Liste von geöffneten Dokumenten dauerhaft anzeigen

Ich benutze sehr gerne den Text-Editor TextWrangler unter Mac OS. Leider wird standardmäßig die Ansicht mit der Liste von geöffneten Dokumenten erst angezeigt, wenn mindestens zwei Dokumente mit TextWrangler geöffnet sind.

Natürlich könnte man jedes Mal im Menu unter View – Show/Hide Files (Shortcut: CMD + 0) die Ansicht ein bzw. ausblenden lassen, was ich aber ziemlich umständlich finde.

Einfacher ist es das Standardverhalten von TextWrangler so anzupassen, dass die Ansicht bereits beim Starten des Programms automatisch geöffnet ist.

Dies kann durch eine „Experten-Einstellung“ erreicht werden. Folgender Konsolen-Befehl muss dazu in das Terminal eingegeben werden:

defaults write com.barebones.textwrangler AlwaysShowFileList -bool YES

Um das Standardverhalten wiederherzustellen, muss einfach der Wert „YES“ auf „NO“ geändert werden.

Es gibt natürlich noch viele weitere „Experten-Einstellungen“ um das Standardverhalten von TextWrangler anzupassen. Daher kann ich jedem nur empfehlen, einen Blick auf die „Expert Preference Settings“ zu werfen. Diese findet man im Menü unter „Help –> TextWrangler Help“.

Adobe Acrobat Reader – Langsames Scrollen und Hängen auf dem Macbook Pro (Retina)

Vielleicht geht es manchen Mac OS X Benutzern genauso wie mir?! Nachdem ich seit Jahren parallel auch Windows Benutzer bin, habe ich mich zur PDF-Anzeige an den Adobe Acrobat Reader gewöhnt. Leider zickt dieser unter Mac OS (aktuell bei mir unter 10.9.5) ziemlich herum. Beim Scrollen der einzelnen Seiten ist der Adobe Acrobat Reader ziemlich hakelig und sehr langsam. Nachdem dieses Problem schon seit einigen Versionen (auch bei der aktuellen) besteht, habe ich versucht eine Lösung zu finden.

Leider konnte ich bisher nur eine Linderung des Problems erzeugen, sodass ich zumindest bei kleineren PDF-Dokumenten den Adobe Reader verwenden kann.

Folgendes habe ich in den Einstellungen angepasst:

DEUTSCHE VERSION

  1. Im Menü unter „Adobe Reader“ den Eintrag „Voreinstellungen“ auswählen (Shortcut: CMD + ,)
  2. Kategorie „Seitenanzeige“ auswählen
  3. Folgende Einstellungen anpassen
    • AuflösungBenutzerdefinierte Auflösung: 110 Pixel
    • RendernSeiten-Cache verwenden: deaktivieren

adobe-acrobat-reader-einstellungen-deu

ENGLISCHE VERSION

  1. Im Menü unter „Adobe Reader“ den Eintrag „Preferences“ auswählen (Shortcut: CMD + ,)
  2. Kategorie „Page Display“ auswählen
  3. Folgende Einstellungen anpassen
    • ResolutionCustom resolution: 110 pixels
    • RenderingUse page cache: deaktivieren

adobe-acrobat-reader-einstellungen-eng

Bei größeren Dokumenten (mit z. B. 800 Seiten und mehr) besteht das Problem leider weiterhin.
Falls jemand eine Lösung für das Problem hat, würde ich mich sehr über weitere Informationen in den Kommentaren freuen!

Jenkins CI (oder Hudson) auf der Synology DiskStation installieren (Anleitung)

Mit dieser Anleitung kann die Continuous Integration Software Jenkins auf einer Synology DiskStation installiert und verwendet werdet werden.

Voraussetzung

Es muss bereits eine lauffähige Java Laufzeitumgebung auf der Synology DiskStation installiert worden sein.
Aktuell geht das wohl am einfachsten mit dem Java SE Embedded Package direkt über das DSM Paket-Zentrum.

Eine gute Anleitung dazu findet man auf dieser Seite:
http://pcloadletter.co.uk/2011/08/23/java-package-for-synology

Jenkins installieren

Jetzt kann die eigentliche Installation von Jenkins über die Shell (mit Root-Rechten) beginnen.
Dazu müssen nachfolgende Schritte ausgeführt werden.

1. Füge die Zeile jenkins:x:145:145:Jenkins:/var/lib/jenkins:/bin/sh in der Datei /etc/passwd ein

echo 'jenkins:x:145:145:Jenkins:/var/lib/jenkins:/bin/sh' >> /etc/passwd

2. Füge die Zeile jenkins:*:10933:0:99999:7::: in der Datei /etc/shaddow ein

echo 'jenkins:*:10933:0:99999:7:::' >> /etc/shadow

3. Füge die Zeile jenkins:x:145:jenkins in der Datei /etc/group ein

echo 'jenkins:x:145:jenkins' >> /etc/group

4. Erstelle das Jenkins Home-Directory Verzeichnis unter /opt/jenkins/data

mkdir -p /opt/jenkins/data

5. Erstelle einen Link unter /var/lib/jenkins auf den Pfad /opt/jenkins

ln -s /opt/jenkins /var/lib/jenkins

6. Setze die Besitzer- und Gruppenzugehörigkeit jenkins:jenkins für die Ordner /opt/jenkins und /opt/jenkins/data

chown jenkins:jenkins /opt/jenkins
chown jenkins:jenkins /opt/jenkins/data

7. Lade mittels wget Befehl die aktuelle Version der Jenkins Web-Anwendung herunter

wget -O /var/lib/jenkins/jenkins.war http://mirrors.jenkins-ci.org/war/latest/jenkins.war

Jenkins starten

Um Jenkins einfach starten zu können, kann ein Start-Script erstellt werden.

8. Datei /var/lib/jenkins/jenkins_start.sh im VI Editor öffnen

vi /var/lib/jenkins/jenkins_start.sh

9. Folgenden Inhalt in diese Datei einfügen

#!/bin/sh

NAME=jenkins
BASE_PATH=/var/lib/jenkins
DATA_PATH=$BASE_PATH/data
PID_FILE=$DATA_PATH/$NAME.pid
LOG_FILE=$DATA_PATH/$NAME.log

touch $PID_FILE
chown $NAME:$NAME $PID_FILE
su -s /bin/sh $NAME -c "
        cd /
        JENKINS_HOME=$DATA_PATH    \
        exec java -jar $BASE_PATH/jenkins.war $JENKINS_OPTS \
        </dev/null >>$LOG_FILE 2>&1 & echo \$! >$PID_FILE           
        "

10. Änderungen mittel ESC und :wq speichern

11. Für die neu erzeugte Datei jenkins_start.sh müssen jetzt noch die Zugrifsrechte angepasst werden

chmod 755 /var/lib/jenkins/jenkins_start.sh

12. Datei ausführen um Jenkins zu starten

/var/lib/jenkins/jenkins_start.sh

Jetzt sollte die WAR-Datei entpackt und der Jenkins Web-Server (Jetty) gestartet werden.
Vor allem beim ersten Start, kann es eine Zeit lang dauern, bis der Jenkins Web-Server komplett gestartet und verfübar ist.

War das Starten erfolgreich, sollte folgender Eintrag in der Log-Datei /var/lib/jenkins/jenkins.log zu finden sein.

INFO: Jenkins is fully up and running

13. Nun kann die Jenkins Anwendung im Browser über die Adresse http://SYNOLOGY-NAS-IP:8080 aufgerufen werden.

Jenkins automatisch starten

Wenn Jenkins automatisch beim Starten der Synology Diskstation mitgestartet werden soll, kann dies über ein simples Init-Script erfolgen.

Das Script findet man hier:
https://github.com/mesche/diskstation-scripts/blob/master/jenkins-service-scripts/S99jenkins.sh

Dieses muss unter folgendem Pfad installiert werden

/usr/local/etc/rc.d/S99jenkins.sh

Es kann auch unter /usr/syno/etc.defaults/rc.d/ installiert werden, jedoch wird dann die Datei nach einem Systemupdate wieder gelöscht.

Nicht vergessen die Dateirechte anzupassen, damit das Script auch ausgeführt werden kann.

chmod 755 /usr/local/etc/rc.d/S99jenkins.sh

Beim nächsten Start sollte die Jenkins Anwendung automatisch verfübar sein.

PhantomJS Script um von (mehreren) Webseiten Screenshots zu erstellen

Eher zufällig bin ich heute auf PhantomJS gestoßen. PhantomJS ermöglicht es, die Browserengine Webkit ohne Benutzeroberfläche (headless) über die Kommandozeile auszuführen. Dabei unterstützt PhantomJS die Webstandards wie DOM, CSS, JSON, Canvas und SVG. Aktuell kann PhantomJS unter Windows, Mac und Linux verwendet werden.

Um die Funktionalität zu testen, habe ich ein kleines Script in JavaScript geschrieben, über das man einen Screenshot einer Webseite (oder gleich mehrere Webseiten) über die Kommandozeile mittels PhantomJS erzeugen kann. Die Screenshots werden dabei jeweils in eine PNG-Datei abgespeichert.

Der Source-Code kann hier heruntergeladen werden:
PhantomJS Script – Multi URL Screenshot Creator (Github)

Gestartet werden kann das Script mit foldendem Befehl:

phantomjs multi-url-screenshot-creator.js www.blogging-it.com

Es wird ein Screenshot der gerenderten Webseite erzeugt und als PNG-Datei abgespeichert.

Um mehrere Screenshots von unterschiedlichen URLs zu erzeugen, können auch gleich mehrere URLs, getrennt durch Leerzeichen, angegeben werden. Sollen die CSS Resource Dateien nicht mitgeladen werden werden, so kann dies durch Angabe des Parameters „–css=false“ verhindert werden.

phantomjs multi-url-screenshot-creator.js www.blogging-it.com www.google.de --css=false