Developing With Web Standards
Developing With Web Standards Recommendations and best practices. Eine gute Übersicht, auch geeignet um Leute in die Thematik einzuführen.
Via LinkDump
Developing With Web Standards Recommendations and best practices. Eine gute Übersicht, auch geeignet um Leute in die Thematik einzuführen.
Via LinkDump
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?
Nun findet man hier auch diverse RSS-Feeds und es ist auch möglich mittels TrackBack seine Meinung mitzuteilen.
Feeds
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.
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:
La semaine dernière j'ai passé presque tous les jours, soirs et nuits au Satellite . Il y avait la fête de 20 ans de Satellite. Et puis le weekend il y avait des concerts vachement génials.
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'])); }
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.
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 ); } } ); } }
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).