<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" >
<channel>
    
    <title>jtb.blog - Java</title>
    <link>http://www.jens-weibler.de/</link>
    <description>Ein Blog für Technikverliebte, Linux/Windows-Befürworter usw..</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.6 - http://www.s9y.org/</generator>
    <managingEditor>webmaster@jensthebrain.de</managingEditor>
<webMaster>webmaster@jensthebrain.de</webMaster>
<pubDate>Sun, 11 Feb 2007 16:18:12 GMT</pubDate>

    <image>
        <url>http://www.jens-weibler.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: jtb.blog - Java - Ein Blog für Technikverliebte, Linux/Windows-Befürworter usw..</title>
        <link>http://www.jens-weibler.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Webtasks</title>
    <link>http://www.jens-weibler.de/archives/2007/02/09/Webtasks</link>
            <category>Hacking</category>
            <category>Java</category>
            <category>Studium</category>
    
    <comments>http://www.jens-weibler.de/archives/2007/02/09/Webtasks#comments</comments>
    <wfw:comment>http://www.jens-weibler.de/wfwcomment.php?cid=494</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://www.jens-weibler.de/rss.php?version=2.0&amp;type=comments&amp;cid=494</wfw:commentRss>
    

    <author>nospam@example.com (Jtb)</author>
    <content:encoded>
    Meine ehemalige Uni hat ein nettes System im Probebetrieb gestartet: &lt;a href=&quot;http://webtasks.informatik.tu-darmstadt.de/webtasks/index.jsp&quot;&gt;Webtasks&lt;/a&gt;&lt;br /&gt;
Idee hinter dem System ist, dass angehende Stundenten kleine Programmieraufgaben und Wissenstests online lösen können. Zwar noch stellenweise recht buggy, aber vom Ansatz her wirklich geil.&lt;br /&gt;
&lt;br /&gt;
Interessant für fortgeschrittene Programmierer ist hierbei die eingehende Analyse des System bzw der Absicherung &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Viel Spaß beim Lesen der folgenden Seiten &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; Bei den ersten Aufgaben bekommt man auf der Weboberfläche immer die Möglichkeit den Methodenrumpf einzugeben - Anfang und Ende der Methode ist vorgegeben.&lt;br /&gt;
Nachdem man also seinen Sourcecode eingeben hat, fällt schnell einiges auf:&lt;br /&gt;
&lt;br /&gt;
Die Entwickler von Webtasks haben das Schlüsselwort &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html&quot;&gt;System&lt;/a&gt; gesperrt. Somit fallen viele schädliche Funktionen wie beispielsweise &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#exit(int)&quot;&gt;exit(int)&lt;/a&gt; weg. Aber leider auch echt nützliche Funktionen wie &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)&quot;&gt;arraycopy&lt;/a&gt; &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Aber als erfahrener Sicherheitsspezialist sollte man wissen, dass ein &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_input_and_output_handling&quot;&gt;Sperren von Usereingaben&lt;/a&gt; aufgrund einer Blacklist immer aufwändig und häufig fehlerhaft ist.&lt;br /&gt;
&lt;br /&gt;
So bietet sich dank Reflection ein Weg trotzdem auf alle System-Funktionen zuzugreifen:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;try&lt;br /&gt;
{&lt;br /&gt;
&amp;#160;&amp;#160;Class&amp;#160;c&amp;#160;=&amp;#160;Class.forName&amp;#40;&quot;java.lang.System&quot;&amp;#41;;&lt;br /&gt;
}&lt;br /&gt;
catch&amp;#160;&amp;#40;Exception&amp;#160;e&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
&amp;#160;&amp;#160;//&amp;#160;Errorhandling&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Aber es wurden so auch nette Klassen wie beispielsweise &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html&quot;&gt;Runtime&lt;/a&gt; übersehen, vergessen oder ignoriert &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Übernahme des Servers wird aber vom strikt eingestellten &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/SecurityManager.html&quot;&gt;SecurityManager&lt;/a&gt; verhindert - jeglicher Zugriff auf Kommandos, Dateizugriffe allgemein sowie Sockets ist gesperrt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aber es gibt ja noch mehr Optionen zu &quot;stören&quot;. Beispielsweise alle Rechenzeit durch eine Endlosschleife bzw Rekursion ohne Abbruchbedindung aufzubrauchen. Ein Verbrauch der Speicherressourcen ist erstmal nicht möglich da die Java-VM  beim Starten feste Speichergrenzen übergeben bekommen hat.&lt;br /&gt;
Bei den ersten Versuchen zeigt sich, dass die eingesetzten Java-Unittests Zeitlimits gesetzt haben - eine Endlosschleife wird nach 30 Sekunden abgebrochen. Auch eine simple Rekursion wird entdeckt und verhindert: &quot;Rekursiver Aufruf verboten!&quot;&lt;br /&gt;
&lt;br /&gt;
Da erstmal nicht klar ist, wie die Rekursion entdeckt wird (der gesamte Sourcecode liegt ja nicht vor - mehr dazu aber später), kann man einfach eine s.g. unchecked Exception werfen und sich über die Ausgabe des Compilers freuen: &lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;|&amp;#42;Append.java&amp;#58;53&amp;#58;&amp;#160;unreachable&amp;#160;statement&amp;#42;&lt;br /&gt;
		semaphore&amp;#160;=&amp;#160;false;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;^&lt;br /&gt;
1&amp;#160;error&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Ah, eine &lt;a href=&quot;http://de.wikipedia.org/wiki/Semaphor_%28Informatik%29&quot;&gt;Semaphore&lt;/a&gt; &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Und wir wissen nun nicht nur den Dateinamen sondern auch noch den Variablenname der Semaphore sowie der Type &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Also können wir die Rekursionssperre einfach außer Kraft setzen - vor dem rekursiven Aufruf setzt man einfach semaphore auf false. Der Wille wurde gezeigt, aber wirklich ernst muss man diese Sperre nicht nehmen &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Aber viel besser wird es, wenn man bemerkt, dass die Eingabe nicht auf den Methodenrumpf eingeschränkt ist. Man kann die vorgegebene Methode einfach per geschweifte Klammer schließen und eine neue Methode anfangen. Somit ist die vorgegebene Rekursionssperre endgültig sinnlos - immerhin wirkt sie nur auf eine Methode &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Da das System scheinbar noch im Beta-Status ist, gibt es einige Aufgaben die nicht korrekt funktionieren. Durch einen Glücksfall gibt es eine &lt;a href=&quot;http://webtasks.informatik.tu-darmstadt.de/webtasks/uploadsolution.jsp?taskid=109&quot;&gt;Aufgabe&lt;/a&gt;, die den Sourcecode ausspuckt: &lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;01&amp;#160;/&amp;#42;&amp;#42;hide&amp;#42;&amp;#42;/public&amp;#160;class&amp;#160;Rotate_Right&amp;#160;{&lt;br /&gt;
02&amp;#160;&lt;br /&gt;
03&amp;#160;&amp;#160;&amp;#160;private&amp;#160;static&amp;#160;boolean&amp;#160;&amp;#160;semaphore&amp;#160;&amp;#160;=&amp;#160;false;&lt;br /&gt;
04&amp;#160;&lt;br /&gt;
05&amp;#160;&amp;#160;&amp;#160;public&amp;#160;static&amp;#160;void&amp;#160;main&amp;#40;String&amp;#91;&amp;#93;&amp;#160;args&amp;#41;&amp;#160;{&lt;br /&gt;
06&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int&amp;#91;&amp;#93;&amp;#160;input&amp;#160;=&amp;#160;{&amp;#160;0,&amp;#160;1,&amp;#160;2,&amp;#160;3,&amp;#160;4,&amp;#160;5&amp;#160;};&lt;br /&gt;
07&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int&amp;#160;steps&amp;#160;=&amp;#160;2;&lt;br /&gt;
08&amp;#160;&lt;br /&gt;
09&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;Test&lt;br /&gt;
10&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;printArray&amp;#40;&quot;Input&amp;#58;&amp;#160;&quot;,&amp;#160;input&amp;#41;;&lt;br /&gt;
11&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println&amp;#40;&quot;Input&amp;#58;&amp;#160;&quot;&amp;#160;+&amp;#160;steps&amp;#41;;&lt;br /&gt;
12&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;printArray&amp;#40;&quot;Output&amp;#58;&amp;#160;&quot;,&amp;#160;studentsMethod&amp;#40;input,&amp;#160;steps&amp;#41;&amp;#41;;&lt;br /&gt;
13&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
14&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
15&amp;#160;&amp;#160;&amp;#160;public&amp;#160;static&amp;#160;int&amp;#91;&amp;#93;&amp;#160;demoMethod&amp;#40;int&amp;#91;&amp;#93;&amp;#160;array_in,&amp;#160;final&amp;#160;int&amp;#160;steps&amp;#41;&amp;#160;{&lt;br /&gt;
16&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;sempahore&amp;#160;lock&lt;br /&gt;
17&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if&amp;#160;&amp;#40;semaphore&amp;#160;==&amp;#160;false&amp;#41;&lt;br /&gt;
18&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;semaphore&amp;#160;=&amp;#160;true;&lt;br /&gt;
19&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else&amp;#160;{&lt;br /&gt;
20&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println&amp;#40;&quot;Rekursiver&amp;#160;Aufruf&amp;#160;verboten!&quot;&amp;#41;;&lt;br /&gt;
21&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return&amp;#160;null;&lt;br /&gt;
22&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
....&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Hier erkennt man nochmal deutlich, dass die Semaphore nutzlos ist.&lt;br /&gt;
&lt;br /&gt;
Aber dennoch bringt uns die Rekursion nicht weiter - das System verträgt das ohne weiteres. Aber die Spielkiste hat ja noch mehr zu bieten. Analysieren wir zuerst wie die Unittests nach 30 Sekunden abgebrochen werden und versuchen ein Thread.sleep(1000000);&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;ZEITÜBERSCHREITUNG&amp;#58;&lt;br /&gt;
Der&amp;#160;Test&amp;#160;wurde&amp;#160;nach&amp;#160;30&amp;#160;Sekunden&amp;#160;automatisch&amp;#160;abgebrochen,&amp;#160;da&amp;#160;seine&amp;#160;Ausführung&amp;#160;zu&amp;#160;lange&amp;#160;dauerte.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, der Unittest holt sich also den Thread und beendet ihn einfach. Aber wie sieht es mit einem Thread aus? Dank anonymen  Threads ist die schnelle Erzeugung kein Problem:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;new&amp;#160;Thread&amp;#40;new&amp;#160;Runnable&amp;#40;&amp;#41;&amp;#160;{&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;public&amp;#160;void&amp;#160;run&amp;#40;&amp;#41;&amp;#160;{&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try&amp;#160;{&lt;br /&gt;
int&amp;#160;i&amp;#160;=&amp;#160;0;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while&amp;#160;&amp;#40;true&amp;#41;&amp;#160;{&lt;br /&gt;
i++;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catch&amp;#40;Exception&amp;#160;ex&amp;#41;&amp;#160;{}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&amp;#160;&amp;#160;}&amp;#41;.start&amp;#40;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Und schon wird nichts mehr abgebrochen und der Webbrowser lädt Ewigkeiten &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Fazit&lt;/strong&gt;: externen Java-Code zu kompilieren und auszuführen kann unschön werden. Nur ein sinnvoll gesetzer Sicherheitsmanager schützt dann den Server vor einem Angreifer. Wer böswillig Ressourcen verbrauchen will, schafft dieses wenn keine zusätzlichen Sicherheitsmaßnahmen getroffen werden. Ein Blacklisten der Benutzereingaben wird sehr wahrscheinlich leicht umgangen werden können bzw müsste sehr umfangreich sein.&lt;br /&gt;
Externer Benutzercode sollte in einer eigenen Klasse gesetzt werden. Ansonsten sind Sicherheitsmechanismen in derselben Klasse aufgrund fehlender Sicherheit nutzlos. 
    </content:encoded>

    <pubDate>Fri, 09 Feb 2007 22:34:11 +0100</pubDate>
    <guid isPermaLink="false">http://www.jens-weibler.de/archives/2007/02/09/494</guid>
    <creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.5/</creativeCommons:license><category>Hacking</category>
<category>Java</category>
<category>Studium</category>

</item>
<item>
    <title>Seid freundlicher zu den Maschinen und auszulieferender heißer Kaffee</title>
    <link>http://www.jens-weibler.de/archives/2006/09/24/Seid-freundlicher-zu-den-Maschinen-und-auszulieferender-heisser-Kaffee</link>
            <category>Internet</category>
            <category>Java</category>
    
    <comments>http://www.jens-weibler.de/archives/2006/09/24/Seid-freundlicher-zu-den-Maschinen-und-auszulieferender-heisser-Kaffee#comments</comments>
    <wfw:comment>http://www.jens-weibler.de/wfwcomment.php?cid=381</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://www.jens-weibler.de/rss.php?version=2.0&amp;type=comments&amp;cid=381</wfw:commentRss>
    

    <author>nospam@example.com (Jtb)</author>
    <content:encoded>
    Sowas müssen sich die Leute gedacht haben, die sich die Konfigurationsstruktur von Tomcat ausgedacht haben.&lt;br /&gt;
Die ganze Konfiguration baut auf XML auf (solange eine Anwendung sich nicht denkt, weitere Einstellungen über eine Properties-Datei zu machen). Eigentlich eine nette Idee - so kann der Server die Datei leichter parsen. Nur für den Menschen wird die Datei sehr leicht kaum noch lesbar. Es gibt zwar eine Administrationsoberfläche, aber die erwies sich bei meinen Versuchen mit Tomcat dieses Wochenende als unbrauchbar. Ich wollte ja eigentlich mal jboss ausprobieren, aber jboss ist leider unter Gentoo stable gerade nicht installierbar und mir wurde von der Benutzung in Gentoo im #gentoo-java Channel abgeraten. Aber zurück zu Tomcat. Für die gerade erwähnte Administrationsoberfläche muss man sich erstmal von Hand einen User angelegen. Dessen Passwort steht dann erstmal im Klartext in der Datei. Gehashte Passwörter unterstützt Tomcat nicht in einer Passwortdatei - das klappt nur mit einer &lt;a href=&quot;http://tomcat.apache.org/tomcat-5.0-doc/config/realm.html&quot;&gt;Datenbank (per jdbc) bzw Verzeichnisdienst wie LDAP&lt;/a&gt;. Ein nicht zu unterschätzender Aufwand. Denkt man sich nun, dass man ja die Passwortdatei nur vom Serveruser (also beispielsweise tomcat) lesbar/schreibbar machen kann, wird man von der Administrationsoberfläche sanft auf den Boden der Wirklichkeit zurückgeholt: ändert man einen User, wird die Datei wieder world-readable gemacht &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Bei den verfügbaren Webanwendungen, die ich mir angeguckt habe, wurde in der Installationsdokumentation immer die Konfiguration in XML angegeben - also muss ich als Administrator meine Konfig jetzt in einem Format tippen, was eigentlich dafür gedacht ist, maschinenlesbar zu sein &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Aber ansonsten hat die Adminoberfläche so einige Tücken. Ich finde es zwar schön, dass man sich mit ein paar Klicks einen Vhost anlegen kann, vermisse aber dann die Zuordnung von Prioritäten. Weiterhin kann man scheinbar keinen Alias mit einem Wildcard erstellen (also *.domain.tld um alle Subdomains abzufangen). Bzw der Alias wird ohne Fehler erstellt und zeigt keine Wirkung. Wenn schon kein Alias erlaubt ist, dann müsste eigentlich die fehlerhafte Eingabe abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Gibt man einen Vhost im Browser ein, den es nicht gibt, wird der Browser nur eine leere Seite anzeigen - erst ein Blick in die Header der Antwort ergibt:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;HTTP/1.x&amp;#160;400&amp;#160;No&amp;#160;Host&amp;#160;matches&amp;#160;server&amp;#160;name&amp;#160;www.domain.tld&lt;/div&gt;&lt;br /&gt;
Diese Fehlermeldung kommt übrigens auch, wenn man keinen &lt;a href=&quot;http://tomcat.apache.org/tomcat-5.0-doc/config/context.html&quot;&gt;Context&lt;/a&gt; für den Vhost eingerichtet hat - sehr angenehm zum testen &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Wieso man in der Adminoberfläche weniger wesentlich weniger Attribute angeben kann als möglich, will ich garnicht wissen.&lt;br /&gt;
&lt;br /&gt;
Sehr schamant fand ich auch folgenden &quot;Bug&quot;: man lad eine WAR-Datei hoch, die dann vom Tomcat entpackt werden sollte. Dieser macht es nicht und äußert sich im Log nur, dass er das Verzeichnis WEB-INF nicht finden kann. Was irgendwie logisch ist, wenn nichts entpackt wurde.&lt;br /&gt;
Lösung: tomcat hatte nicht die Schreibrechte auf den Ordner, so dass die WAR-Datei nicht entpackt werden konnte. Es kam aber kein Fehler dazu, so dass ich lange rumsuchen musste &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Ich vermute einfach mal, dass dort das Ich-Muss-Alle-Exceptions-Fangen Paradigma von Java zugeschlagen hat..&lt;br /&gt;
&lt;br /&gt;
Bei meiner Installation einer anderen Java-Software kam es zu weiteren Fehlern. Für die Anwendung Roller muss man einen Context anlegen und in diesem die Datenbankverbindung konfigurieren. Das Problem: sobald man den Context anlegt, kommt man in der Administrationsoberfläche nicht weiter - es kam der Fehler &quot;Document base does not exist or is not a readable directory.&quot;. In den Logfiles von Roller fand ich aber den Hinweis, dass die Anwendung schon versuchte, die Datenbankverbindung aufzubauen... Also die Konfigurationsdatei des Contexts von Hand editiert und schon funktionierte alles.. Aber zum Thema Logfiles lesen: wenn ich keinen Debugmodus angeschaltet habe, möchte ich keinen über 20-zeiligen Stacktrace bekommen. Da sieht man ja die Fehlermeldung vor lauter Methodenaufrufen nicht mehr!&lt;br /&gt;
&lt;br /&gt;
Weiterhin hat die Adminoberfläche scheinbar Probleme mit einem Context, dessen Appbase manuell gelöscht wurde:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;HTTP&amp;#160;Status&amp;#160;500&amp;#160;-&amp;#160;Error&amp;#160;retrieving&amp;#160;attribute&amp;#160;debug&lt;/div&gt;&lt;br /&gt;
Davon, dass ich in die Administrationsoberfläche nach einmaligen Anlegen weder Path noch Docbase ändern kann, will ich garnicht erst reden &lt;img src=&quot;http://www.jens-weibler.de/templates/default/img/emoticons/sad.png&quot; alt=&quot;:-(&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danke, mir reicht&#039;s erstmal mit Tomcat&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;#&amp;#160;emerge&amp;#160;-C&amp;#160;tomcat&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wann ist endlich Mono so weit, dass ich ASP.Net 2 unter Linux einsetzen kann?&lt;br /&gt;
Oder es endlich Dedicated Server Angebote mit genug RAM gibt, so dass man dank Virtualisierung sowohl Linux als auch Windows fahren kann?  
    </content:encoded>

    <pubDate>Sun, 24 Sep 2006 15:22:09 +0200</pubDate>
    <guid isPermaLink="false">http://www.jens-weibler.de/archives/2006/09/24/381</guid>
    <creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.5/</creativeCommons:license><category>Internet</category>
<category>Java</category>

</item>
<item>
    <title>Über die Verwendung von Interfaces</title>
    <link>http://www.jens-weibler.de/archives/2006/07/18/UEber-die-Verwendung-von-Interfaces</link>
            <category>Coding</category>
            <category>Java</category>
            <category>Studium</category>
    
    <comments>http://www.jens-weibler.de/archives/2006/07/18/UEber-die-Verwendung-von-Interfaces#comments</comments>
    <wfw:comment>http://www.jens-weibler.de/wfwcomment.php?cid=345</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.jens-weibler.de/rss.php?version=2.0&amp;type=comments&amp;cid=345</wfw:commentRss>
    

    <author>nospam@example.com (Jtb)</author>
    <content:encoded>
    Mal wieder ein schönes Beispiel zum Thema Programmieren an der Uni. Aufgabe war die Implementierung einer HashTable in Java. Schon die Angabe der verschiedenen Modi der HashTable über Strings brachte mich arg zum stauen (wo es doch in Java 5 so schöne Enumerations gibt und man damit sich kostenlos Schutz durch den Compiler erkauft).&lt;br /&gt;
Aber das Beste war die Verwendung eines Interfaces. Man bekam ein Interface namens EntryInterface gestellt und musste nun eine Klasse namens Entry unter Verwendung dieses Interfaces implementieren.&lt;br /&gt;
Moment – Warum ist der Klassenname Entry vorgegeben?&lt;br /&gt;
Wir haben doch eine schön definierte Schnittstelle und die mitgelieferten Testcases können doch einfach diese nutzen. Dank Interface habe ich ja ein Abstraktionslayer, so dass die reelle Implementierung von EntryInterface niemanden außer dem Entwickler der HashTable-Interna interessieren sollte.&lt;br /&gt;
Beim näheren Anschauen der Testcases lief dann auf, dass diese eine Instanz von Entry benötigen:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;	@Test&lt;br /&gt;
	public&amp;#160;void&amp;#160;testHomeAdress_DivisionLinear&amp;#40;&amp;#41;&amp;#160;{&lt;br /&gt;
		Entry&amp;#160;testEntry1&amp;#160;=&amp;#160;new&amp;#160;Entry&amp;#40;&amp;#41;;&lt;br /&gt;
		testEntry1.setKey&amp;#40;&quot;Z8IG4LDXS&quot;&amp;#41;;&lt;br /&gt;
		testEntry1.setData&amp;#40;&quot;OK&quot;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
Es hat schon einen guten Grund, warum die HashTable in Java anders implementiert ist. Dort muss man nicht ein Objekt übergeben, sondern direkt Key und Data. Eine Klasse weniger nötig zum Benutzen.&lt;br /&gt;
Ein Interface auf eine solche Art zu benutzen ist schon arg komisch. Da gibt es nun wirklich bessere Lösungen..&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Tue, 18 Jul 2006 16:26:29 +0200</pubDate>
    <guid isPermaLink="false">http://www.jens-weibler.de/archives/2006/07/18/345</guid>
    <creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.5/</creativeCommons:license><category>Coding</category>
<category>Java</category>
<category>Studium</category>

</item>
<item>
    <title>Webservices in der Praxis</title>
    <link>http://www.jens-weibler.de/archives/2006/01/22/Webservices-in-der-Praxis</link>
            <category>Coding</category>
            <category>dotNet</category>
            <category>Java</category>
            <category>Work</category>
    
    <comments>http://www.jens-weibler.de/archives/2006/01/22/Webservices-in-der-Praxis#comments</comments>
    <wfw:comment>http://www.jens-weibler.de/wfwcomment.php?cid=178</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.jens-weibler.de/rss.php?version=2.0&amp;type=comments&amp;cid=178</wfw:commentRss>
    

    <author>nospam@example.com (Jtb)</author>
    <content:encoded>
    Für einen kleinen Dienst auf der Arbeit habe ich einen Webservice gebaut (klar, die Vorteile sprechen für sich: eingebaute Verschlüsslung dank https und Zugriff von fast überall).&lt;br /&gt;
Da der Client auch in C# 2005 geschrieben werden sollte (man will ja mal die neuen Features ausprobieren), habe ich den Webservice natürlich auch gleich in dotNet geschrieben - geht ja auch schön leicht: ein paar Klicks und fertig ist das ganze im Visual Studio 2005.&lt;br /&gt;
&lt;br /&gt;
Getestet und nun kommt das Problem des Deployments - auf dem passenden Server ist zwar nicht ein, nicht zwei sondern schon drei Webserver installiert (Apache2+Tomcat und Lotus Domino).. Upps, da fehlt IIS...&lt;br /&gt;
na ja, als Workaround schnell mal einen IIS installiert und eingerichet, aber wirklich toll ist es nicht.&lt;br /&gt;
&lt;br /&gt;
Also der Plan: den Server-Teil neu in Java programmieren. In der Theorie kein Problem, in der Praxis aber schon. Das generierte &lt;a href=&quot;http://de.wikipedia.org/wiki/WSDL&quot; target=&quot;_blank&quot;&gt;WSDL&lt;/a&gt; vom dotnet-Webservice will die &lt;a href=&quot;http://www.eclipse.org/webtools/main.html&quot; target=&quot;_blank&quot;&gt;WTP-Extension&lt;/a&gt; von Eclipse nicht als korrekt validieren.&lt;br /&gt;
&lt;br /&gt;
Also alles aus der WSDL-Datei entfernen (eigentlich nur SOAP12) - und die Validierung klappt.&lt;br /&gt;
Nun merkt man, dass es nicht (so einfach) wie bei dotNet möglich ist einen SoapHeader zu definieren und in Implementierung anzusprechen..&lt;br /&gt;
&lt;br /&gt;
Nur mal als Beispiel wie einfach das mit dotNet 2.0 ist:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
[WebService(Namespace = &quot;http://mydomain.tld/&quot;)]&lt;br /&gt;
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]&lt;br /&gt;
public class TrackerWebservice : System.Web.Services.WebService&lt;br /&gt;
{&lt;br /&gt;
    public SoapAuthenticationHeader authentication;&lt;br /&gt;
 &lt;br /&gt;
    public TrackerWebservice()&lt;br /&gt;
    {}&lt;br /&gt;
     &lt;br /&gt;
    [WebMethod(Description = &quot;Adds a trackerentry to the tracker&quot;, EnableSession = false)]&lt;br /&gt;
    [SoapHeader(&quot;authentication&quot;)]    &lt;br /&gt;
    public void addEntry(Entry entry)&lt;br /&gt;
    {&lt;br /&gt;
        /* implementation */&lt;br /&gt;
    }&lt;br /&gt;
    // [..]&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
und &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
public class SoapAuthenticationHeader : SoapHeader&lt;br /&gt;
{&lt;br /&gt;
    private NetworkCredential credentials;&lt;br /&gt;
&lt;br /&gt;
    public NetworkCredential Credentials&lt;br /&gt;
    {&lt;br /&gt;
        get { return credentials; }&lt;br /&gt;
        set { credentials = value; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Sun, 22 Jan 2006 13:57:37 +0100</pubDate>
    <guid isPermaLink="false">http://www.jens-weibler.de/archives/2006/01/22/178</guid>
    <creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.5/</creativeCommons:license><category>Coding</category>
<category>dotNet</category>
<category>Java</category>
<category>Work</category>

</item>

</channel>
</rss>
