Wednesday, 14. April 2004 Week 16
Tuesday, 13. April 2004 Week 16

Warum?

Kann mir jemand den Gedanken hinter folgendem Verhalten von XML_RPC erklären?

Ich bin dabei, einige XML-RPC Webservices in PHP zu programmieren. Leider gabs immer eine Fehlermeldung wenn ich eine bestimmte Funktion aufrufe.

Zuerst suchte ich den Fehler in der Funktion beim XML-RPC-Server. Jedoch funktionierte die problemlos. Danach habe ich eine Ewigkeit mit den via XML-RPC übergebenen Parameter herumgespielt, hat jedoch nichts gebracht.

Dann habe ich in der XML-RPC-Klasse das Debug-Flag aktiviert. So konnte ich herausfinden, dass der XML-RPC-Server die Ausgabewerte der Funktionen übergibt, was ja auch so sein muss. Das Debug-Flag machte auch, dass im XML-RPC-Client die empfangenen XML-Daten ausgegeben werden. Diese entsprachen den vom Server gesendeten. Doch leider gab mir das Debug-Flag keine Information warum das Parsen der XML-Daten fehlschlug.

So habe ich mir mal den Code der XML-RPC-Klasse angeschaut und habe dort eine Funktion error_log entdeckt. Diese Funktion ist in PHP eingebaut und sendet eine Fehlermeldung. Nach dem Studium der Dokumentation habe ich herausgefunden, dass die Fehlermeldungen damit in den Error-Log vom Apache geschrieben werden!

Also habe ich mir /var/log/apache2/error_log vorgenommen. Darin fand ich Fehlermeldungen des XML-Parsers, der sich über ein invalid token beschwerte!

Nach längerem Herumexperimentieren mit den Eingabewerten, fand ich heraus, dass der XML-Parser an einem nicht enkodierten Umlaut scheiterte.

Da ich Umlaute nicht mehr enkodiere, sondern einfach das entsprechende encoding="iso-8859-15" Attribut setzte, kontrollierte ich zuerst den XML-Header, wie er von der XML-RPC-Klasse generiert wird. Dort fand ich dann auch den Fehler: es wird kein encoding Attribut erzeugt.

Warum werden nicht alle Umlaute etc. automatisch enkodiert, wenn kein encoding Attribut mitgeliefert wird?

Warum gibt es ein Debug-Flag, aber Fehlermeldungen werden trotzdem nicht ausgegeben sondern weiterhin nur nach /var/log/apache2/error_log geschrieben?

Sunday, 11. April 2004 Week 15
Friday, 9. April 2004 Week 15

Inkscape

Gestern habe ich Inkscape entdeckt. Inkscape ist ein Vektor-Graphikprogramm, das SVG als Dateiformat benutzt.

Das Programm lässt sich mit Macromedia Fireworks vergleichen, wennauch der Funktionsumfang noch nicht ganz so gross ist. So kann Inkscape nur nach PNG exportieren und unterstützt keine Animationen. Dafür ist IMHO die Vektorbearbeitung von Inkscape schon jetzt der von Fireworks überlegen.

Nachdem ich auch das Tutorial gemacht habe, durfte ich feststellen, dass das Userinterface von Inkscape grösstenteils absolut top ist. So eine angenehme und einfache Handhabung habe ich bei einem Graphikprogramm bisher vergebens gesucht. Da kann selbst mein bisheriger Favorit Fireworks fast nicht mithalten.

Thursday, 8. April 2004 Week 15

x-log v2.02c

So, nun sind auch die Erweiterungen, welche ich während der letzten Woche offline geschrieben habe, mehr oder weniger erfolgreich integriert.

Erwähnenswerte neue Features:

Sunday, 28. March 2004 Week 13

Neue alte Features

Nun sind wieder ein paar alte Features zum Vorschein gekommen :-)

Dabei hat mir PHP den Weg nicht gerade leicht gemacht. Angenommen, man will ein Array in einem Cookie speichern indem man serialize() und unserialize() benutzt, könnte folgender Code entstehen.

function saveData ( $data ) {
        setcookie('cookiename', serialize($data), time()+3600*24*100);
}

function loadData () {
        return unserialize($_COOKIE['cookiename']);
}

Das funktioniert aber leider nicht. Damit es funktioniert muss noch stripslashes() benutzt werden.

function saveData ( $data ) {
        setcookie('cookiename', serialize($data), time()+3600*24*100);
}

function loadData () {
        return unserialize(stripslashes($_COOKIE['cookiename']));
}
Saturday, 27. March 2004 Week 13
Friday, 26. March 2004 Week 13

Kochsche Kurve

Heute haben wir im Java-Programmieren mit GUI-Programmierung angefangen. Die Exercices waren simpel (Buttons erzeugen, ausrichten etc.), jedoch hatte es als Zusatzaufgabe noch die Kochsche Kurve.

Kochsche Kurve



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *  Kochsche Kurve
 *
 * @author     Andreas Jaggi
 * @created    26. März 2004
 * @version    1.0
 */

public class KochscheKurve
                 extends JFrame {
        /**
         *  Constructor for the KochscheKurve object
         */
        public KochscheKurve() {
                setSize( 600, 600 );
                setTitle( "Die Kochsche Kurve" );
        }


        /**
         *  Überladene "interne" Methode, die aufgerufen wird, wenn das Fenster neu
         *  gezeichnet werden muss
         *
         * @param  g  Graphik-Objekt, auf dem gezeichnet wird
         */
        public void paint( Graphics g ) {
                super.paint( g );

                double  x1;
                double  x2;
                double  x3;
                double  y1;
                double  y2;
                double  y3;
                int     depth  = 13;

                x1 = 100;
                y1 = 400;
                x2 = 500;
                y2 = 400;
                x3 = ( x2 - x1 ) * Math.cos( -Math.PI / 3 ) -
                                ( y2 - y1 ) * Math.sin( -Math.PI / 3 ) + x1;
                y3 = ( x2 - x1 ) * Math.sin( -Math.PI / 3 ) +
                                ( y2 - y1 ) * Math.cos( -Math.PI / 3 ) + y1;

                koch( g, depth, x2, y2, x1, y1 );
                koch( g, depth, x1, y1, x3, y3 );
                koch( g, depth, x3, y3, x2, y2 );
        }


        /**
         *  Rekursive Funktion, welche den Fraktal zwischen zwei Punkten bis zu einer
         *  bestimmten Tiefe zeichnet.
         *
         * @param  g      Graphik-Objekt, auf dem gezeichnet wird
         * @param  depth  Rekursionstiefe
         * @param  x1     X-Koordinate des ersten Punktes
         * @param  y1     Y-Koordinate des ersten Punktes
         * @param  x2     X-Koordinate des zweiten Punktes
         * @param  y2     X-Koordinate des zweiten Punktes
         */
        public void koch( Graphics g, int depth, double x1, double y1, double x2,
                        double y2 ) {
                double  x13  = x1 + ( x2 - x1 ) / 3.0;
                double  x23  = x1 + 2.0 * ( x2 - x1 ) / 3.0;

                double  y13  = y1 + ( y2 - y1 ) / 3.0;
                double  y23  = y1 + 2.0 * ( y2 - y1 ) / 3.0;

                double  xd   = ( x23 - x13 ) * Math.cos( -Math.PI / 3 ) -
                                ( y23 - y13 ) * Math.sin( -Math.PI / 3 ) + x13;
                double  yd   = ( x23 - x13 ) * Math.sin( -Math.PI / 3 ) +
                                ( y23 - y13 ) * Math.cos( -Math.PI / 3 ) + y13;

                if ( depth > 0 ) {
                        koch( g, depth - 1, x1, y1, x13, y13 );
                        koch( g, depth - 1, x13, y13, xd, yd );
                        koch( g, depth - 1, xd, yd, x23, y23 );
                        koch( g, depth - 1, x23, y23, x2, y2 );
                } else {
                        g.drawLine( (int) x1, (int) y1, (int) x2, (int) y2 );
                }
        }


        /**
         *  The main program for the KochscheKurve class
         *
         * @param  args  The command line arguments
         */
        public static void main( String[] args ) {
                KochscheKurve  graf  = new KochscheKurve();

                graf.setVisible( true );

                graf.addWindowListener(
                        new WindowAdapter() {
                                public void windowClosing( WindowEvent e ) {
                                        System.exit( 0 );
                                }
                        }
                                 );

        }

}
Sunday, 14. March 2004 Week 11

Rechnen mit CSS

Im Stylesheet dieser Seite findet sich unter anderem folgende Styledefinition:

#rechts li a {
	display: block;
	border-bottom: 1px solid #FFFFFF;
	width: 100% - 30px;
	padding-left: 30px;
}

Diese macht, dass die Links im rechten Submenu auf der ganzen Breite funktionieren und nicht nur wenn man auf den Text klickt.
Zuerst hatte ich die Weite auf 100% gesetzt. Jedoch hat der Mozilla wegen der 30px Padding noch 30px ausserhalb des Rahmens angezeigt. Mit overflow: hidden habe ich versucht das Problem zu lösen. Jedoch hat das nicht funktioniert, da es ja kein eigentlicher overflow ist.
Schlussendlich bin ich durch ausprobieren von garantiert fehlerhaften Styledefinitionen auf die jetztige Lösung gekommen. Natürlich validiert das nun nicht mehr als korrektes CSS, aber es funktioniert :-)

Da ich nun keine Windows-Maschine mehr habe, wäre ich froh um Screenshots vom Submenu, wenn mit der Maus über ein Link gefahren wird (a:hover).