In Deutschland geht heute die Bundesliga wieder los. Ich wollte mal auf bundesliga.de gehen um mir anzuschauen wer denn gegen wen spielt und sehe: Bayern – Hamburg um 20:30 Uhr. Ortszeit versteht sich. Nur weiss der Countdown nix von Zeitzonen, deswegen dauert es in Amerika noch sieben Stunden bis es anfaengt, wobei es eigentlich schon in einer Stunde soweit ist. Jaja, das Internet und die Globalisierung …
Autor: pennywise
MP3s als Bilder
Jaja, die digitale Welt. Alles sind Einsen und Nullen. Warum also nicht einfach MP3s als Bilder abspeichern. Ich finds interessant.
Java Applets und java.util.logging
So, heute habe ich mich mit der internen Logging-Bibliothek von Java rumgeaergert. Aber fangen wir mal von vorne an. In meinem Praxissemester programmiere ich gerade ein paar Perfomancemessungen in ein Applet ein. Prinzipiell ein simpler Arbeitsgang, aber ich wollte jetzt halt gleich alles ’schoen‘ machen. Nachdem mich ein Freund darauf hingewiesen hat das System.out.println() doch nicht das Wahre ist („fooo, lame, nutz nen Loggingframework. FTW!!!!11einself“), habe ich mich jetzt fuer java.util.logging entschieden. Kann genau das was ich will. Gut, also angefangen:
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getLogger("foo.PerformanceDebug");
public PerformanceDebug() {
Handler handler = new ConsoleHandler();
handler.setLevel(Level.FINE);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Gut. Oder auch nicht, hat naemlich nicht funktioniert. Hat irgendwelche PermissionExceptions geschmissen. Bissle Recherche: Applets laufen in einem beschraenktem Modus, d.h. sie duerfen z.B. nicht irgendwohin schreiben, z.B. mit dem ConsoleHandler. Aber gut, weitere Recherche ergab, dass ich den ConsoleHandler auch weglassen kann, dann schreibt er einfach nach STDOUT, d.h. in die Java Console. Gut.
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getLogger("foo.PerformanceDebug");
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Jop, hat erstmal nix gebracht, immer noch Fehlermeldungen (kompilieren tut das uebrigens alles prima). Der ConsoleHandler war gar nicht das einzige Problem, im Applet funktioniert auch Logger.getLogger(„package.class“) nicht. Aber dafuer gibts dann ja Logger.getAnonymousLogger().
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getAnonymousLogger();
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Wieder einen Schritt weiter und immer noch nicht am Ziel. Jetzt laeuft es zwar im Applet, aber die Ausgabe ist haesslich (im Sinne von: Ich mag sie nicht :)). Aber dafuer gibts ja java.util.logging.Formatter, damit kann man eigene Formate schreiben. Also flugs eine Subklasse verfasst:
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getAnonymousLogger();
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
public class FooFormatter extends Formatter {
public String format(LogRecord record) {
return "Foo:"
+ record.getMessage()
+ "\n";
}
}
}
Das klappt in jeder Standalone-Applikation und im Applet Viewer, aber im Applet selber gehts wieder nicht. Ein Spass mit den Sicherheitsbeschraenkungen von Applets, da wird das Laden des Formatters einfach unterbunden und eine Exception geschmissen. Also kann ich nicht das machen was ich will. Und Sun hat sich wohl gedacht das man in Applets keine eigenen Formatter braucht. Applets sind eh tot. Genau. Naja, so bringt man auch nen Tag rum, mit wilden Rumprobieren, googlen und fluchen. In diesem Sinne. Feierabend fuer heute.
… interessiert mich jetzt eigentlich eher weniger. Ausser der Medaillenspiegel, sowas finde ich dann interessant. Weils für 2008 noch zu früh ist, hier die Statistik für 2004:
- Vereinigte Staaten 103
- China 63
- Russland 92
- Australien 49
- Japan 37
- Deutschland 49
Die Liste ist offiziel und es sind einfach nur alle Medaillen aufsummiert. Wenn wir jetzt mal die Einwohnerzahlen dazuziehen:
- China 1.321.000.000
- Vereinigte Staaten 303.346.630
- Russland 142.400.000
- Japan 127.417.245
- Deutschland 82.244.000
- Australien 21.360.000
Gut, die Zahlen sind teilweise von 2005 – 2008, aber sollte nicht soviel ausmachen. Jetzt gehen verteilen wir die Medallien mal auf die Einwohner:
- Australien 2294,0 * 10^-9
- Russland 646,0 * 10^-9
- Deutschland 449,9 * 10^-9
- Japan 384,6 * 10^-9
- USA 339,5 * 10^-9
- China 47,7 * 10^-9
Gut. Die Zahlen sind unglaublich klein, aber man sieht, wenn man einfach mal davon ausgeht das jedes Land gleich viele gute Sportler produzieren könnte, das Australien UNGLAUBLICH gut ist und das China unglaublich verliert. Klar, das ist Statistik fürn Arsch, weil in China nicht jeder dieselben Chancen hat ein Sportler zu werden wie in Australien, aber so sind Statistken: Zusammenhänge herstellen, wo keine sind.
PS: Deutschland 4tw 🙂
Neues Fahrrad
So, ich bin stolzer Besitzer eines neuen 28″ Herrenfahrrads mit Alufelgen 🙂 Bilder gibts erst nächsten Monat, weil das Fahrrad wurde von der Tina gekauft und die Kleinanzeige wurde schon gelöscht. Nunja, das Fahrrad wird die stolze Nachfolge meines leider verstorbenen Fahrrads.
Nun, seit gestern gibts auch bei mir in der Firma einen „dresscode“, sprich eine Kleiderordnung. Bisher konnte ich ins Geschäft kommen wie ich wollte, solange alle wichtigen Dinge mit Kleidung bedeckt sind 🙂
__FUNCTION__ in Java
Unter PHP gibt es sogenannte Magische Konstanten. Die sind prima, wenn man z.B. eine Debugfunktion schreiben will, die an bestimmten Stellen sagt wo sie aufgerufen wurde. In Java sieht das dann so aus:
class Debug
{
public static void print(String msg)
{
java.lang.Exception e = new java.lang.Exception();
StackTraceElement ste[] = e.getStackTrace();
System.out.println(
new Date().getTime() + " " +
ste[1].getClassName() + " " +
ste[1].getMethodName() + " " +
msg);
}
}
Wird aufgerufen mit:
import mein.tolles.package.Debug;
Debug.print("lalala");
Was hiermit nicht geht ist: getFileName()
und getLineNumber()
, da diese Information nicht zur Verfuegung steht.
SPL – die Standard PHP Library
Kevin Waterson hat einen laengeren Artikel ueber die SPL geschrieben, inkl. so schoener Sachen wie Iterator und ArrayObjects und (endlich) ein OOP-Zugriff aus Dateisystem via SplFileObject.
Link: http://www.phpro.org/tutorials/Introduction-to-SPL.html
… geht mir so langsam auf die Nerven. Knapp 120 Spam-E-Mails pro Tag sind einfach zu viel.