argmax und argmin in LaTeX

Als ich gerade anfangen wollte, weiter an meiner Bachelorarbeit zu schreiben, bin ich auf ein Problem gestoßen: LaTeX untersützt nativ weder argmin noch argmax.

Google war hier mein Freund und Helfer und ich möchte euch die wunderbare Lösung natürlich nicht vorenthalten. Mit folgenden Befehlen lassen sich argmax und argmin zum Argument x erzeugen.

\underset{x}{\operatorname{argmax}}
\underset{x}{\operatorname{argmin}}

Da man natürlich nicht immer diesen riesigen Ausdruck schreiben möchte, noch schnell einen neuen Befehl erzeugt

\newcommand{\argmin}[1]{\underset{#1}{\operatorname{argmin}}}
\newcommand{\argmax}[1]{\underset{#1}{\operatorname{argmax}}}

und schon kann man ganz einfach mit

\argmax{x}
\argmin{x}

diese beiden mathematischen Operatoren erzeugen.

Tags: , , ,

Tuesday, November 10th, 2009 LaTeX 1 Comment

Java Multi-Thread Application Debugging Problems

Genaugenommen ist der Titel dieses Posts allein schon eine Qual… Selbst wenn ich am Ende dann doch auf die deutsche Sprache zurückgegriffen hätte, wäre es nicht viel schöner geworden. Aber noch viel schlimmer ist der Inhalt dieses Posts!

Multi-Thread Anwendungen zu schreiben ist in modernen Programmiersprachen eigentlich kein großes Problem. Klar, man kämpft zwar noch immer gegen die Feinde Death Lock und Race Condition, aber im Gegensatz zu pThreads unter C, bietet Java zum Beispiel doch mit dem eingebauten Monitor eine schöne einfache Methode an.

Schlimm wird es eigentlich erst, wenn dann trotz all der schönen Tools, die Java zur Verfügung stellt, nicht alles so funktioniert, wie es soll, und man anfangen darf zu debuggen. Beim Debuggen landet dann doch gerne mal die Faust im Monitor auf dem Tisch.

Wenn nun eine allseits-geliebte Exception geworfen wird, so wird das Debuggen schon durch einen Punkt vereinfacht, denn die Exception gibt einem ja auch aus, von welchem Thread die Exception geworfen wurde. Das ganze sieht dann ungefähr so aus

1
2
3
4
5
6
7
Exception in thread "Thread-2105" java.lang.IndexOutOfBoundsException: Index: 2106, Size: 2106
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at parameterTest.output.GridResultsForMatlabWriter.writeResultsMatrices(GridResultsForMatlabWriter.java:185)
at parameterTest.output.GridResultsForMatlabWriter.write(GridResultsForMatlabWriter.java:28)
at parameterTest.ThreadedGridSettingsFinder.threadFinished(ThreadedGridSettingsFinder.java:180)
at clustering.kernelkmeans.KernelKMeans.run(KernelKMeans.java:603)

Nun gut, Thread-2105 wirft also diese Exception. Also fängt man an sich einen genauen Log zu erstellen, was welcher Thread macht, worauf er zugreift, ob er überhaupt berechtigt ist, diese Methode aufzurufen etc… Damit man im Log auch weiß, welcher Thread was macht, kommt man gerne auf die Idee folgendes zu machen:

System.out.println("Thread " + thread.getID() + " macht grad dies und das!");

Während man dann seinen Log durchwühlt, hier schaut, da schaut, versucht nach zu empfinden, wieso überhaupt Thread-2015 diese Methode aufruft, obwohl er das gar nicht darf und auch laut Log nicht tut, wird man langsam stutzig. Was stimmt an meinem Log denn dann nicht? Die Methode wird ja offensichtlich aufgerufen und irgendwas läuft grundsätzlich schief, denn sonst würde ja auch keine Exception geworfen werden!

Nach einigem Suchen wurde mir dann mein Fehler bewusst. Es gibt noch eine getName()-Methode für jedes Thread-Objekt. Analog zum Getter gibt es auch den Setter setName(). “Praktischerweise” geben die folgenden beiden Zeilen nicht dieselbe Ausgabe,auch wenn man setName() nicht benutzt hat:

1
2
System.out.println("Thread-" + thread.getID());
System.out.println(thread.getName());

Die Ausgaben der beiden Zeilen sind einfach mal grundauf verschieden, wundervoller Weise in meinem Fall auch lediglich um 3 oder 4 Ziffern verschoben, aber eben nicht identisch. Eine Exception die von einem Thread geworfen wird, ruft aber genau diese getName() auf und schon ist die Verwirrung groß.

Dieser Unterschied kostete mich 3 Stunden des Debuggens an völlig falscher Stelle und zudem auch noch das Verrückt-Machen eines Kumpels, der ebenfalls Albträume bekommen hat, weil mein Code ja eigentlich korrekt war….Jedenfalls an den Stellen, an denen wir gesucht haben ;)

So long, happy programming!

Tags: , ,

Monday, November 9th, 2009 Development, Java 1 Comment

System.out.println(”Hello world!”);

Hallo liebe Internetgemeinde,

auch ich bin nun in die Welt der Blogger eingetreten.

Zum einen wegen des Fames um ein Selbstporträt zu erstellen und zum anderen auch, da man als Informatik-Student und leidenschaftlicher Developer und PC-Nutzer ständig auf Probleme stößt, deren Lösung man der Welt nicht vorenthalten möchte.

Ich werde mich nun erstmal ein wenig einleben in WordPress, denn wirklich gearbeitet habe ich mit WordPress noch nicht. Und danach kann es losgehen mit Bloggen.

Monday, November 9th, 2009 General No Comments
  • Rails Vibes A Blog about problems in Ruby on Rails and their solutions.