Springe zum Inhalt

Schon seit einiger Zeit befasse ich mich mit dem Thema Zeitraffer. Nach einigen recht einfachen Versuchen habe ich mir nun die Software LRTimelapse von Gunther Wegner besorgt, mit der man unter Zuhilfenahme von Adobe Lightroom hervorragend Zeitrafferaufnahmen entwickeln und zusammensetzen kann.

Mein erstes Video mit dieser Sofware könnt Ihr Euch bei Vimeo ansehen.

Nachdem ich die Tage mal auf der Arbeit versucht habe, mit Hilfe eines Shellscripts für den Mac über einen Zeitraum zu iterieren und es bislang auf die Schnelle nicht geschafft habe, ein derartiges Skript zu schreiben, hat mich das doch ziemlich gewurmt und ich habe mich jetzt am Wochenende mal hingesetzt und es tatsächlich geschafft, ein entsprechendes Skript zu schreiben.

Das folgende Skript dient als Beispiel und muss dem entsprechenden Anwendungsfall angepasst werden. Das folgende Skript wird mit den Parametern "<startdate> <enddate>" aufgerufen, wobei das Format des Datums folgendes ist: YYYY-MM-DD (Y: vierstelliges Jahr, M: zweistelliger Monat, D: zweistelliger Tag).

Hier das Skript selbst:

#!/bin/bash
STARTDATE=$1
ENDDATE=$2

CURRENT_DATE_SINCE_EPOCH=`date -j -f "%Y-%m-%d" $STARTDATE +%s`
ENDDATE_SINCE_EPOCH=`date -j -f "%Y-%m-%d" $ENDDATE +%s`

while [ $CURRENT_DATE_SINCE_EPOCH -le $ENDDATE_SINCE_EPOCH ]
do
  DAY=`date -j -f "%s" $CURRENT_DATE_SINCE_EPOCH +%d`
  MONTH=`date -j -f "%s" $CURRENT_DATE_SINCE_EPOCH +%m`
  YEAR=`date -j -f "%s" $CURRENT_DATE_SINCE_EPOCH +%Y`
  echo $YEAR-$MONTH-$DAY
  CURRENT_DATE_SINCE_EPOCH=`date -v +1d -j -f "%s" $CURRENT_DATE_SINCE_EPOCH +%s`
done

Wie man dem Skript entnehmen kann, werden die Eingabedaten zunächst in Sekunden seit EPOCH umgewandelt, um damit rechnen zu können, d.h. um schauen zu können, wann die Abbruchbedingung zutrifft (while-Schleife). Innerhalb der Schleife wird das aktuell behandelte Datum in verschiedene Werte umgewandelt. Um das Skript nicht unnötig zu verkomplizieren, habe ich darauf verzichtet, nur ein date-Aufruf zu tätigen und das Ergebnis ggf. per grep aufzusplitten; hier ist also noch Optimierungspotential. Das Ganze ist übrigens für den Mac entwickelt, sollte aber vermutlich auch unter Unix laufen.

...ordentlich Schmackes hinter Ihrem Schmetterball beim Volleyball-Spiel. Auf jeden Fall habe ich mir bereits zum zweiten mal den Finger beim blocken ausgerenkt. Echt nervig!

Zum Glück konnte man mir den Finger in der Notambulanz im Krankenhaus relativ problemlos wieder einrenken. Auch wenn der Arzt erst vermutet hat, dass der Finger mehrfach gebrochen ist. Naja, jetzt ist erst mal Pause und ich kann endlich wieder mit dem Laufen anfangen. 🙂

Nachdem ich ja mittlerweile schon längere Zeit ein iPhone besitze, habe ich vergangene Woche eine kleines Java-Bibliothek für eine Growl-Anbindung geschrieben. Mit der iPhone-App Prowl kann man Nachrichten über einen kostenlosen Internetservice versenden, die dann wie eine SMS auf dem Telefon angezeigt werden.

Mit einer solchen Anbindung kann man sich z.B. (kostenlos!) benachrichtigen lassen, wenn beim Monitoring im Rechenzentrum ein Server ausgefallen ist, man könnte an Termine erinnert werden oder anderen Personen die Möglichkeit bieten, günstig eine Nachricht auf das Telefon schicken zu lassen.

Ich habe nun in Java eine kleine Bibliothek geschrieben, mit der man solche Anwendungen leicht entwickeln kann. Vielleicht hat ja jemand Interesse es einzusetzen. Ich habe die Bibliothek als ZIP angehängt. Es handelt sich um Version 0.1, da es die erste Veröffentlichung ist. Ich hoffe auf viel Feedback (bitte unten in den Kommentaren hinterlassen).

Hier ein kurzes Beispielprogramm, wie die Bibliothek bedient wird. Momentan habe ich leider noch keine ausführliche Dokumentation zu der Lib, aber vielleicht kommt das ja noch, wenn ich entsprechendes Feedback bekomme.

public static void main(String[] args) throws JgrliException {
  String apiKey = "<API-Key>";
  String applicationName = "Application name";
  String eventName = "Event name";
  String description = "Description";

  System.out.println("Creating client with API key "" + apiKey + """);
  JgrliClient JgrliClient = new JgrliClient(apiKey);

  System.out.println("Calling Prowl with application name "" + applicationName + "", event "" + eventName + "", description "" + description + """);
  JgrliResult result = JgrliClient.add(applicationName, eventName, description);
  if (result instanceof JgrliSuccessResult) {
    JgrliSuccessResult successResult = (JgrliSuccessResult) result;
    System.out.println("Successfully sent message!");
    System.out.println("Status code is " + successResult.getErrorCode().getCode());
    System.out.println(successResult.getRemaining() + " calls left");
    System.out.println("Reset date is " + new SimpleDateFormat().format(successResult.getResetDate()));
  } else if (result instanceof JgrliErrorResult) {
    JgrliErrorResult errorResult = (JgrliErrorResult) result;
    System.out.println("An error occured during call!");
    System.out.println("Error code is " + errorResult.getErrorCode().getCode());
    System.out.println("Error message is " + errorResult.getErrorMessage());
  } else {
    System.out.println("Unknown result type!");
  }
}

Download

Ich habe die Quelltexte in zwei Versionen abgelegt: mit benötigten Libraries und ohne.

Wer die Zwischenablage mit Konsolenausgaben befüllen will, um etwa über einen Shortcut mit ac'tivaid schnell die aktuelle IP zu bekommen, kann unter cygwin das Kommando putclip benutzen. Zum Holen der Zwischenablage benutzt man getclip.

Will man in JSP-Dateien Attribute verwenden, die man zuvor in der Tiles-Konfigurationsdatei oder im Preparer verwendet hat, so kann man sich die Werte über ein Tag <tiles:importAttribute/> in den EL-Kontext holen, so dass man darüber auf die Attribute zugreifen kann. Hat man also in einem Preparer etwas geschrieben wie

 

[...]
@Override
public void execute(TilesRequestContext tilesRequestContext, AttributeContext attributeContext) {
  attributeContext.putAttribute("meinString", new Attribute(meinString));
}
[...]

so kann man in einem JSP folgendermaßen darauf zugreifen:

[...]
<tiles:importAttributes/>
[...]
Dies ist mein String: ${meinString}
[...]

Manch einer mag sich gewundert haben, warum Preparer nicht wie unter http://tiles.apache.org/tutorial/advanced/preparer.html dokumentiert ausgeführt werden. Das liegt daran, dass die Dokumentation nicht ganz komplett ist. Hier eine kurze Anleitung, was Ihr tun müsst, um die Preparer tatsächlich zum laufen zu bekommen:

  1. Legt einen Preparer an, der das Interface org.apache.tiles.preparer.ViewPreparer implementiert:
    public class WelcomePreparer implements ViewPreparer { ...}
  2. Dieser Preparer (die Klasse) bekommt eine Annotation @Service:
    @Service
    public class WelcomePreparer implements ViewPreparer { ...}
  3. In der Definition des Views gebt Ihr den entsprechenden Preparer an:
    <definition name="welcome" template="/WEB-INF/tiles/welcome.jsp" preparer="welcomePreparer">
  4. In derSpring-Konfiguration für die Tiles muss eine neue PreparerFactoryClass angegeben werden, damit die Preparer tatsächlich aufgerufen werden können:
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
      {...}
      <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.Spring BeanPreparerFactory"/>
    </bean>

Voilá!

Da ich mir in Kürze eine neue Küche kaufen will, habe ich nach Möbelgeschäften Ausschau gehalten. Folgende Geschäfte fielen mir da ein bzw. habe ich ausfindig gemacht:

Für Ideen und Tipps bin ich offen!