Java Oster-Rätsel

Über Ostern ist ein bisschen Nachdenken angesagt, und zwar über das hier gestellte Java-Rätsel. Wie verhindert man eine Ausgabe eines Strings?

Zu Ostern hab ich ein kleines Rätsel für euch, welches mir selbst vor kurzem zugeschickt wurde:

public class DontSayIt {

	public static void main(String args[]) {

		//?

		System.out.println(new String("Don't visit nullpointer.at!"));
	}

}

Wie kann ich anstelle des Kommentars in diesen Code einfügen um die Ausgabe des Programms in:

Visit nullpointer.at!

umzuwandeln?

Es gibt hierfür einige richtige Lösungen, die trivialste (in meinen Augen) liefere ich gleich mit, aber vielleicht findet ihr ja eine noch einfachere.

Einfach markieren um den Text sichtbar zu machen:

public class DontSayIt {

	public static void main(String args[]) {

		class String {

			public String(java.lang.String s) {
			}

			@Override
			public java.lang.String toString() {
				return "Visit nullpointer.at!";
			}
		}

		System.out.println(new String("Don't visit nullpointer.at!"));
	}

}

Wer jetzt auf den Geschmack gekommen ist, dem empfehle ich folgendes Buch:
Java Puzzlers: Traps, Pitfalls, and Corner Cases

Das Buch von Joshua Bloch und Neal Gafter ist in englischer Sprache verfasst und beansprucht die grauen Zellen auch von erfahrenen Lesern. Die vorgestellten Codestücke wirken oft relativ trivial, dennoch ist nicht immer auf den ersten Blick ersichtlich, wieso sie nicht so laufen wie vermutet. Eine paar Beispiele haben sie selbst auf der Homepage zum Buch veröffentlicht: http://www.javapuzzlers.com/
Ich konnte selbst damit schon so manches Aha Erlebnis im gemütlichen Sofa verzeichnen und hab wohl noch so einige vor mir.

Ähnliche Artikel:

Maven Repository auf Sourceforge

Ein projektinternes Maven Repository auf Sourceforge ist schnell eingerichtet und erleichtert die Arbeit mit Maven. Wie es geht wird in diesem Artikel erklärt. Das Konzept ist auch leicht auf ein eigenes privates Projekt ohne Sourceforge umlegbar.

Projektabhängigkeiten

Entwickelt man ein Software-Projekt, kommt man wie ich zu dem Punkt, an dem die eigene Software von fremden Bibliotheken abhängig ist. Im Falle von TrayRSS ist das zum Beispiel: hibernate, jdom, rom, junit, log4j. Lauter namhafte Bibliotheken, die auch in den öffentlichen Repositories von Maven verfügbar sind. TrayRSS setzt seit kurzem auf Maven um alle Abhängigkeiten zu sammeln. Doch TrayRSS setzt auch auf Bibliotheken die vielleicht weniger bekannt sind:

Leider sind beide Librarys in keinem Repository vertreten, sodass diese Abhängigkeiten nicht ohne weiteres über Maven aufgelöst werden können.

Damit es nun einem dem Projekt Fremden dennoch möglich ist den Code aus dem Versionierungssystem beziehen und das Projekt zu bauen, kann man ihm natürlich die Bibliotheken oder die Links dazu zur Verfügung stellen. So ist jeder für sich in der Lage die fehlenden Sourcen nachzuziehen und manuell ins lokale Repository zu laden. Ein Aufwand, der dank den Möglichkeiten eines eigenen Webspaces, wie ihn auch Sourceforge bietet, vermieden werden kann.

Aufbau eines Maven Repository

Ein Maven Repository ist eigentlich nichts anderes als ein Haufen Ordner mit ein paar Dateien, die nach folgendem Schema aufgebaut sind:

/gruppe/artefakt/version/artefakt-version.jar

Dabei entspricht die Gruppe den Regeln, die wir schon von Java Packages kennen. Jedes Unterpaket getrennt durch einen Punkt entspricht einem eigenen Verzeichnis. Der Bezeichner Artefakt entspricht der ArtefaktID welches im POM der jeweiligen Bibliothek definiert ist. Versionsnummer und Artefakt kombiniert ergibt die Benennung des Jar Files, welches darin enthalten ist.

Für die Auflösung der Abhängigkeiten des jeweiligen Artefakts liegt neben der Jar Datei auch eine POM Datei auf, in der die entsprechenden Informationen bereitgestellt werden. Beispielhaft der Inhalt einer solchen POM Datei:

<?xml version="1.0" encoding="ISO-8859-1"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>at.nullpointer</groupId>
  <artifactId>paketname</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>
  <name>paketname</name>
  <description>
    Beschreibung des Pakets
  </description>

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.4.3</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

Hier lässt sich auch die Information zur Ordnerstruktur hervorragend auslesen.

Zusätzlich können noch diverse zusätzliche Datein vorhanden sein um zB die md4 Checksum zu verifizieren oder ähnliches.

Internes Repository im Projekt Web

TrayRSS ist ein Open Source Projekt und wird auf Sourceforge gehostet. Damit wir nun unsere Bibliotheken allen Usern zur Verfügung stellen können greifen wir auf die Möglichkeiten von Sourceforge zurück. Hier wird unter anderem Webspace zum Hosten der Projektseite angeboten, auf den man projektrelevante Daten ablegen kann. Also auch unser Repository.

Wie man sich über SFTP dorthin verbindet wird in folgendem Wikieintrag von Sourceforge aufgezeigt: http://sourceforge.net/apps/trac/sourceforge/wiki/Project%20web

SFTP fähige Clients unter Windows sind z.B. WinSCP und Filezilla. Wenn noch nicht installiert findet man unter Linux ein entsprechendes Commandline Tool in der Paketverwaltung der bevorzugten Distribution.

Nun wird einfach ein Verzeichnis unter htdocs angelegt z.B. mit dem Namen repository. In dieses Verzeichnis spielen wir nun wie oben dargestellt eine entsprechende Maven Verzeichnisstruktur ein.

Hier die Beispielhafte Verzeichnis- und Dateistruktur für jNotification:

repository
----de
--------jutzig
------------jnotification
----------------0.3
--------------------jnotification-0.3.jar
--------------------jnotification-0.3.pom

Zugang zum Repository

Dann fehlt nur noch ein Eintrag ins POM des Projektes nach folgendem Beispiel:

<repositories>
  <repository>
    <id>projekt-repository</id>
    <name>projekt Repository</name>
    <url>http://projekt.sourceforge.net/repository/</url>
  </repository>
</repositories>

Nun noch die Abhängigkeiten ganz normal in Maven eingetragen und Maven kann diese nun z.B. mit mvn eclipse:eclipse aus dem Internen Repository auslesen und das Projekt erfolgreich bauen.

Ähnliche Artikel:

JavaScript Countdown vs JQuery Countdown

HOWTO: Ein Countdown auf einer Homepage, z.B. fürs geplante Release, selbstgeschrieben oder mit JQuery realisieren. Hier wird gezeigt, wie es geht.

Was haben Downloadsites die noch auf ihre Werbung aufmerksam machen wollen, Browsergames in denen der aktuelle Auftrag abgearbeitet wird, Releases von Spielen, und die Zeit vor Silvester gemeinsam?

Einen Countdown!

Wie man so einen implementiert wollen wir uns nun ansehen.

Plain JavaScript Countdown

Als Beispiel wollen wir einen Countdown realisieren, der die Sekunden bis Neujahr 2012 anzeigt. Javascript ist dabei unser Freund. Diesmal!

Als aller erstes erzeugen wir uns zwei Objekte, eines für den jetztigen Zeitpunkt und eines für Neujahr 2012, dann berechnen wir uns die Differenz aus den beiden Zeiten:

var jetzt  = new Date();
var neujahr = new Date(2012,01,01,0,0,0);

var secsLeft = Math.floor((neujahr.getTime() - jetzt.getTime()) / 1000);

Diesen Teil des Codes stecken wir zwischen den <head> Tag der Webseite. Die Differenz müssen wir durch 1000 rechnen, da wir uns auf Millisekundenebene befinden und für unsere Anzeige lediglich die Sekunden relevant sein sollen. Math.floor verwenden wir, um ganze Zahlen anzuzeigen.

Dies müssen wir nun noch im HTML anzeigen, dazu benötigen wir zuerst ein Element mit der id counter im body des html codes, dieses befüllen wir dann regelmäßig mittels:

document.getElementById("counter").innerHTML = text;

All das fassen wir in einer Funktion zusammen z.B.

function countdown(){

Damit das Script nun regelmäßig ausgeführt wird rufen wir es rekursiv erneut auf mit einem Versatz von 1000 Millisekunden, also einer Sekunde.

window.setTimeout("countdown()", 1000);

Dies fügen wir als letzte Zeile in der vorher erstellten Funktion ein.

Die Funktion ist nun fertig, doch muss sie noch gestartet werden. Hier sind wir schon zu den ersten kleinen Kunstgriffen gezwungen, damit der Counter nicht nur im Firefox sondern auch im Internetexplorer seine Arbeit tut.

if (window.addEventListener) {
  window.addEventListener('load', countdown, false);
} else if (window.attachEvent) {
  window.attachEvent('onload', countdown);
}

Der Internetexplorer kennt die Methode addEventListener nicht sondern verwendet stattdessen attachEvent.

Hier nochmal das Gesamtwerk:

<html>
<head>
<script language="javascript" type="text/javascript">
function countdown(){
 var jetzt  = new Date();
 var neujahr = new Date(2012,01,01,0,0,0); 

 var secsLeft = Math.floor((neujahr.getTime() - jetzt.getTime()) / 1000);

 if(secsLeft > 0){
 var text = "Noch " + secsLeft + " Sekunden bis Neujahr 2012!";
 } else {
 var text = "Es ist bereits 2012!";
 }
 document.getElementById("counter").innerHTML = text;

 window.setTimeout("countdown()", 1000);
}

if (window.addEventListener) {
 window.addEventListener('load', countdown, false);
} else if (window.attachEvent) {
 window.attachEvent('onload', countdown);
}
</script>

<p id="counter">Noch 26665457 Sekunden bis Neujahr 2012!<p>

</p>
</body>
</html>

Eigentlich recht simpel und gradlinig. Doch wie wir gesehen haben gab es schon kleinere Probleme durch die Browserdiversifikation . Um den Code der eigentlichen Seite übersichtlich und schlank zu halten greife ich daher gerne auf entsprechende JS Libraries zurück.

JQuery Javascript Countdown

Dafür bauen wir zuerst JQuery in unserer Beispiel-Webseite im Head einbinden:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

Die JQuery Standardlibrary bietet viele Funktionen, auf die man aufbauen kann. Damit sie selbst nicht zu aufgebläht und überladen wird, sind Zusatzfunktionen in Plugins ausgelagert. Deshalb besorgen wir uns noch von der Jquery-Homepage http://plugins.jquery.com/project/countdown2 das zugehörige Plugin und binden es ebenfalls ein im Head ein:

<script type="text/javascript" src="jquery.countdown.min.js"></script>

Dann mussen wir noch den Javascript Codeteil abändern:

<script type="text/javascript">
$(document).ready(function(){
   var newYear = new Date(2012,1,1,0,0,0);
   $('#counter').countdown({unitl: newYear, format: 'S'});
});
</script>

Auch hierbei darf der Javascript Code erst loslegen, nachdem das Dokument fertig ist. $(document).ready() ist dafür der Standardaufruf mittels JQuery. Darin erzeugen wir uns wieder ein Date Objekt, dermal das Zieldatum. Dann müssen wir noch das Plugin damit füttern. Per JQuery wird das Element mit der ID #Counter selektiert und dort ein .counter eingefügt, dem wir das Datum als until Parameter übergeben, außerdem legen wir noch ein Format fest, denn wir wollen nur Sekunden anzeigen lassen. Fertig!

Das ganze lässt sich noch weiter feinabstimmen: http://keith-wood.name/countdownRef.html Auf der Dokumentationsseite sind die Möglichkeiten das Plugin zu konfigurieren beschrieben. Sie enthalten unter anderem die Möglichkeit eigene Labels zu vergeben, so spart man sich für jede Sprache die die Website unterstützt die lokalisierte Fassung einzubinden.

Freilich hat der Homepagebesucher mit der JQuery Bibliothek und dem zugehörigen Plugin deutlich mehr Netzwerktraffic zu verbuchen, doch hat man damit für die Übersichtlichkeit und Wartbarkeit einiges gewonnen. Als weiteren Pluspunkt hat man das Gemurkse ob Internetexplorer oder ein anderer Browser an die Bibliothek delegiert. Und ob des Traffics bleibt zu sagen, dass sich das recht bald durch Synergieeffekte durch den Einsatz von JQuery bei anderen Teilen der Homepage bezahlt macht.

Fröhliches Runterzählen!

Ähnliche Artikel:

mail.log – versendete Mails erfassen

Ein Mailserver bedarf eines wachsamen Auges! Um Probleme wie eine Spamschleuder zu entdecken helfen schon ein paar simple Linux Befehle zum filtern von mail.log

Bei der Kontrolle der Aktivitäten eines Mailservers bleibt einem oft nichts anderes über als sich durch die Logfiles zu wälzen. um einen Schnellen blick auf alle Email zu erhalten, die der Server zuletzt verschickt hat, kann man die mail.log Datei folgendermaßen filtern:

cat /var/log/mail.log | grep postfix | grep "to=<" | grep "status=sent"

Damit erhält Informationen zu allen versandten E-Mails: hier eine Beispielausgabe:

Mar  7 16:19:57 mailserver postfix/pipe[17596]: 753C62F9D: to=john@example.org, orig_to=<john@example.org>, relay=dovecot, delay=0.54, delays=0.01/0/0/0.53, dsn=2.0.0, status=sent (delivered via dovecot service)

Anhand der ID (In diesem Fall 753C62F9D lassen sich dann noch detailiertere Informationen zu den jeweiligen Emails auslesen, wie zB den Sender usw.

Für eine schnelle händische Kontrolle zwischendurch absolut ausreichend.

Wer schönere Ausgaben haben möchte splittet die Ausgabe noch etwas auf und lässt sich nur teile ausgeben:

cat /var/log/mail.log | grep postfix | grep "to=<" | grep "status=sent" | cut -d':' -f4-5 | cut -d',' –f1

Ergebnis:

753C62F9D: to=<john@example.org>

Bessere Logauswertungen und Zusammenfassungen bekommt man mit Tools wie zB pflogsumm, awstats oder mailgraph die in den Paket-Repositories der Distribution eurer Wahl auch vorhanden sein sollten.

Mit täglich gemailten Statistiken über pflogsumm habt ihr euren Server im Auge falls Unregelmäßigkeiten auftreten, Wochen- Monats und später mal Jahresstatistiken stellen euch die graphischen Tools awstats oder mailgraph zur Verfügung.

Bei soviel praktischer Hilfe ist das wachsame Auge über dem Mailserver ein leichtes :)

Ähnliche Artikel: