Firefox: Wechseln zwischen zwei Tabs

Ich bin es aus Opera gewohnt, zwischen zwei Tabs mit Tab+Strg hin- und herwechseln zu können, im Firefox habe ich lange nach dieser Möglichkeit gesucht, hier eine kurze Anleitung, wie das zu erreichen ist:
In der Firefox Adresszeile about:config eingeben, dann nach browser.ctrlTab.previews suchen und den Wert auf true setzen, fertig 🙂
Lösung gefunden auf http://superuser.com

DynDNS, FreeDNS und Domain24

Seit vielen Jahren habe ich meine Domains bei Domain24 gehostet und meine dynamische IP über DynDNS verwaltet. Letzterer hat seine kostenlosen Accounts vor einiger Zeit umgestellt, so dass der angegebene Host verfällt, wenn man sich nicht alle 30 Tage einmal einloggt. Genau das habe ich leider versäumt, daher war meine Umleitungsadresse (cyberdogs.homeftp.org) plötzlich weg, also musste eine neue her. Da mir DynDNS nicht mehr so gut gefällt, habe ich mich nach Alternativen umgesehen und bin zuletzt bei FreeDNS gelandet. Dieser Anbieter sieht auf den ersten Blick unscheinbar aus, ist aber um vieles besser als DynDNS. Man kann nicht nur kostenlos dynamische IPs verwalten, sondern kann diese auch direkt auf die angemeldete Domain leiten, man muss keinen Umweg gehen, wie bei DynDNS. Um es zu veranschaulichen: Meine Domain ist bei Domain24 gehostet, meine IP wurde bisher von DynDNS verwaltet und auf die Subdomain cyberdogs.homeftp.org geleitet. Meine Domain olaf-roeder.de wurde dann von Domain24 auf cyberdogs.homeftp.org weitergeleitet, so dass entweder alles in einem Frame geladen wurde, oder die andere Adresse sichtbar war, beides nicht so schön, aber es hat funktioniert. Durch FreeDNS kann ich jetzt meine Domain olaf-roeder.de direkt auf meine dynamische IP zeigen lassen, wodurch die bisher unschöne Variante von vorher entfällt.
Ein kleines Problem gab es mit Domain24, um die Weiterleitung auf die von FreeDNS verwaltete IP zu bewerkstelligen, müssen die Nameserver von FreeDNS bei Domain24 angegeben werden, dies hat wegen eines IPv6 Fehlers allerdings nicht funktioniert. Der fähige Support von Domain24 konnte dieses Problem allerdings lösen.
Alles in allem bin ich sehr zufrieden mit FreeDNS, mehr als ich es mit DynDNS je war. Wer also eine Alternative sucht, dem rate ich dazu.

WordPress Permalinks vs. domain24

Ich habe relativ viel Zeit darauf verschwendet zu versuchen, die Permalinkstruktur hübsch zu machen, allerdings ohne Erfolg. Zuerst dachte ich, es liegt daran, dass ich meinen Server „verkonfiguriert“ habe, mittlerweile glaube ich allerdings, dass es an meinem Domainhoster liegt, der die Weiterleitung auf meinen Server via Frame realisiert, statt mit einer echten Weiterleitung. WordPress ist zwar fähig, die Links auf eine Unterordnerstruktur anzupassen, allerdings habe ich durch die Kombination von DynDNS und domain24 zwei verschiedene Domains, das scheint WordPress nicht zu können.

Umstellung auf WordPress

Nachdem ich jetzt lange Zeit alles manuell gemacht habe, habe ich jetzt doch auf WordPress umgestellt, zuerst nur, um es einfach mal auszuprobieren, es gefällt mir allerdings recht gut, so dass ich erst einmal dabei bleiben werde. Alles, was WordPress kann, kann ich auch (und habe ich zu großen Teilen schon selbst gemacht), aber es ist doch recht komfortabel … wenn man es denn endlich mal eingerichtet hat, die Theme-Auswahl fällt recht schwer, aber auch technisch läuft es noch nicht so wie ich will, denn die Umstellung auf meine Domain will einfach nicht richtig funktionieren, da muss ich wohl noch die Ordnerstruktur anpassen, aber das mache ich später, wenn ich die Zeit dazu habe. Alle alten Artikel sind jetzt auch hier zu finden und da es jetzt einfacher, vor allem aber schneller geht, werde ich vielleicht auch etwas öfter schreiben.

WordPress Kopfzeile ändern

Eigentlich ganz einfach, ab in die Einstellungen, Kopfzeile wählen, Bild hochladen und fertig. Aber nicht immer klappt das auf Anhieb, in meinem Fall kam die Meldung:

Bild konnte nicht verarbeitet werden. Bitte gehe zurück und versuche es erneut.

Leider fehlt die Angabe eines Grundes, aber nach etwas längerer Recherche (also länger als die üblichen 5 Minuten) wurde ich dann doch im WordPress-Forum fündig. Um Bilder verarbeiten zu können, muß ein entsprechendes Modul für PHP installiert sein (Quelle).

Ich habe mich für PHP GD entschieden, was auf meinem Ubuntu-Server ganz einfach mit apt-get install php5-gd zu installieren war, danach noch Apache neu starten und es funktioniert.

Fortschritt von LaTex Projekten anschaulich machen

Wenn man längere Texte mit LaTex schreibt und zu unterschiedlichen Zeitpunkten einen Zwischenstand erzeugt, dann kann es oft wünschenswert sein, diesen Zwischenstand mit einem anderen zu vergleichen.
Um dies zu erreichen kann man das Tool latexdiff benutzen (http://tug.ctan.org/tex-archive/support/latexdiff). Dieses vergleicht zwei LaTex Dateien und erzeugt aus ihnen eine neue LaTex Datei, die die Änderungen kenntlich macht.

Jetzt gibt es aber oft das Szenario, dass das LaTex Projekt nicht in einer einzelnen Datei gepflegt wird, sondern in mehreren Dateien, die mittels include oder input in die Hauptdatei eingebunden werden.
Um solche Projekte dennoch mit latexdiff verarbeiten zu können, müssen sie zuerst in eine einzelne Datei kopiert werden, dafür gibt es ebenfalls ein Tool, nämlich latexpand (http://www.ctan.org/pkg/latexpand).

Das dritte Programm in dieser Reihe ist ein Versionierungssystem, in meinem Fall Subversion.
Um also den Fortschritt zwischen zwei Revisionen des LaTex Projektes in der resultierenden PDF Datei zu veranschaulichen, müssen alle .tex Dateien in ein Dokument kopiert werden (zwei Mal, ein Mal pro Revision), dazu müssen noch zwei unterschiedliche Revisionen ausgecheckt werden, und diese beiden Dokumente dann miteinander verglichen werden, damit das resultierende Dokument erstellt werden kann.
Per Hand ist das sehr viel Arbeit, daher habe ich ein Script geschrieben, dass diese Arbeit auf die Eingabe einer Revisionsnummer reduziert.

Das Script

Um das Script zu nutzen, müssen einige Voraussetzungen erfüllt sein:

  • Linux System
  • LaTex
  • Subversion
  • Zugriff auf alle Dateien der Revisionen
  • Zugriff auf SVN
  • Das Script latexpand.pl von http://www.ctan.org/pkg/latexpand muss im selben Verzeichnis sein wie dieses Script.

Das Script selbst muss nur ein wenig angepasst werden:

  • mainTex – der Name der Hauptdatei im LaTex Projekt
  • newRep – Pfad zum aktuellen Repository (working copy)
  • oldRep – Pfad zum älteren Repository (beliebige Revision, das Script aktualisiert auf die gewünschte Revision)

Achtung! Das Script nutzt Update und Commit von SVN. Damit es funktioniert und die working copy von SVN nicht ändert, sollte das Repository in einem anderen Verzeichnis erneut ausgecheckt werden, dies muss vor der Ausführung des Scripts geschehen, da es ein zweites Verzeichnis voraussetzt. Auch sollte das Script in einem eigenen Verzeichnis ausgeführt werden, um Dateinamenskonflikte zu vermeiden.
Das Script aktualisiert zum Schluß das SVN Repository, fügt die Datei aber nicht hinzu, dies muss einmalig manuell geschehen. Der Name der neuen Datei ist AlterDateiname.diff (also zum Beispiel main.tex.diff).

Eine letzte Hürde gibt es noch, sollte das Paket Hyperref genutzt werden, funktioniert es nicht auf Anhieb, es gibt zwei mögliche Lösungen:
Entweder das Paket Hyperref und alle, die es benutzen, auskommentieren (vor Nutzung des Scripts), oder in der resultierenden .tex.diff Datei die Zeilen

providecommand{DIFadd}[1]{{protectcolor{blue}uwave{#1}}} %DIF PREAMBLE
providecommand{DIFdel}[1]{{protectcolor{red}sout{#1}}} %DIF PREAMBLE

ersetzen durch

providecommand{DIFadd}[1]{{protectcolor{blue}#1}} %DIF PREAMBLE
providecommand{DIFdel}[1]{{protectcolor{red}protectscriptsize{#1}}}

(nach Nutzung des Scripts). Grund ist die Inkompatibilität des latexdiff Scripts mit dem Hyperref Package.

Nutzung des Scripts: ./createLatexSVNDiff.sh rev
Wobei rev die ältere Revisionsnummer ist, zum Beispiel: ./createLatexSVNDiff 42

Code Highlight von http://quickhighlighter.com

  1. #!/bin/bash
  2.  
  3. # This script takes two svn repository revisions and creates two big files,
  4. # both monolithic latex files with all includes and inputs merged into one large file.
  5. # The script then creates one latex file with the differences highlighted.
  6. # Other scripts used are latexdiff (see http://tug.ctan.org/tex-archive/support/latexdiff)
  7. # and latexpand (see http://www.ctan.org/pkg/latexpand).
  8.  
  9. # To accomplish this task, two concurrent repository revisions are needed, one with head revision, one with a custom revision.
  10. # The user executing this script has to have access to the subversion repositories and svn commands.
  11.  
  12. # Usage: createLatexSVNDiff rev
  13. # where ‚rev‘ is the revision number of the older repository, e.g. createLatexSVNDiff 42
  14. # The repositorys used are hardcoded into this file, you have to edit them up to your needs.
  15. # (Together with the name of the main latex file, that includes other.)
  16.  
  17. # Repository variables
  18. mainTex=file.tex
  19. oldRep=/full/path/to/2nd/repo/
  20. newRep=/full/path/to/working/copy/
  21. pathToScript=$(pwd)
  22.  
  23. echo $0 will update $newRep to head revision and $oldRep to revision $1
  24.  
  25. cd $oldRep
  26. svn up -r $1
  27. cd $newRep
  28. svn up
  29.  
  30. echo creating monolithic latex files
  31. cd $oldRep
  32. $pathToScript/latexpand.pl $oldRep$mainTex > old.tex
  33. mv old.tex $pathToScript/old.tex
  34. cd $newRep
  35. $pathToScript/latexpand.pl $newRep$mainTex > new.tex
  36. mv new.tex $pathToScript/new.tex
  37.  
  38. echo creating diff file
  39. cd $pathToScript
  40. latexdiff old.tex new.tex > $mainTex
  41. rm old.tex
  42. rm new.tex
  43.  
  44. echo moving diff file to repository and committing it
  45. mv $mainTex $newRep/$mainTex.diff
  46. cd $newRep
  47. svn ci $mainTex.diff -m "$mainTex.diff updated by $0"

Das Script kann heruntergeladen werden: createLatexSVNDiff.sh

Sierpinski-Dreieck

Sierpinski-Dreieck

Ich habe kürzlich das Sierpinski-Dreieck für mich entdeckt, als ich einem Freund bei seinen Java-Aufgaben geholfen habe. Das Sierpinski-Dreieck ist ein Fraktal aus Dreiecken, die selbstähnlich sind, beschrieben von Waclaw Sierpinski, mehr dazu auf http://de.wikipedia.org/wiki/Sierpinski-Dreieck.
Ich dachte mir, dass muss doch auch für meinen kleinen Blog hier machbar sein, allerdings wollte ich kein JavaApplet haben. Auf http://www.walterzorn.de/jsgraphics/jsgraphics.htm habe ich eine JavaScript Bibliothek gefunden, mit der man mit Hilfe von farbigen DIV Containern malen kann, finde ich toll.
Diese habe ich dann auch benutzt, um das Sierpinski-Dreieck einmal in JavaScript zu implementieren.



Die Zeichnung besteht wirklich nur aus DIVs 🙂
Es folgt der JavaScript Code, den ich dazu geschrieben habe. Die Sierpinski Funktion war ursprünglich eine Java Methode aus einem Übungsblatt, die ich für JavaScript entsprechend angepasst habe.


Code Highlight von http://quickhighlighter.com

<!-- DIV Container, der die Zeichnung aufnimmt -->
<div id="canvas" style="position:relative;width:100%;height:450px;">
</div>

<!-- hier beginnt das Java Script -->
<script id="js" type="text/javascript">
<!--
    var jg = new jsGraphics("canvas"); //Variable für das Zeichenobjekt
   
    function triangle(x1,y1,x2,y2,x3,y3) //Objektdefinition für das Dreieck, inklusive Konstruktor
    {
        //Variablen für Start- und Endpunkte sowie Kantenlänge und Flächeninhalt
        this.x1=x1;
        this.x2=x2;
        this.x3=x3;
        this.y1=y1;
        this.y2=y2;
        this.y3=y3;
        this.a=0;
        this.b=0;
        this.c=0;
        this.area=0;
        //Kantenlängen und Flächeninhalt müssen berechnet werden
        this.update();
    }
   
    //Setter
    triangle.prototype.setx1 = function(x1){
        this.x1=x1;
    }
    triangle.prototype.setx2 = function(x2){
        this.x2=x2;
    }
    triangle.prototype.setx3 = function(x3){
        this.x3=x3;
    }
    triangle.prototype.sety1 = function(y1){
        this.y1=y1;
    }
    triangle.prototype.sety2 = function(y2){
        this.y2=y2;
    }
    triangle.prototype.sety3 = function(y3){
        this.y3=y3;
    }
   
    //Kantenlängen und Flächeninhalt neu berechnen
    triangle.prototype.update = function(){
        this.setA();
        this.setB();
        this.setC();
        this.setArea();
    }
   
    //Berechnung der Kantenlängen nach dem Satz des Pythagoras
    triangle.prototype.setA = function() {this.a = Math.sqrt((this.x2-this.x1)*(this.x2-this.x1)+(this.y2-this.y1)*(this.y2-this.y1));} //Länge eines Vektors a1,a2 ist Wurzel aus(a1*a1 + a2*a2), wobei a1 = this.x2-this.x1 ist usw.
    triangle.prototype.setB = function() {this.b = Math.sqrt((this.x3-this.x2)*(this.x3-this.x2)+(this.y3-this.y2)*(this.y3-this.y2));}
    triangle.prototype.setC = function() {this.c = Math.sqrt((this.x1-this.x3)*(this.x1-this.x3)+(this.y1-this.y3)*(this.y1-this.y3));}
   
    //Berechnung des Flächeninhalts nach dem Satz des Heron
    triangle.prototype.setArea = function()
    {
        this.area = 0.25*Math.sqrt((this.a+this.b+this.c)*(this.a+this.b-this.c)*(this.b+this.c-this.a)*(this.c+this.a-this.b));
    }
   
    //Verschiebung des Dreiecks um einen Vektor (v1,v2)
    triangle.prototype.move = function(v1,v2)
    {
        this.x1 = this.x1+v1;
        this.x2 = this.x2+v1;
        this.x3 = this.x3+v1;
       
        this.y1 = this.y1+v2;
        this.y2 = this.y2+v2;
        this.y3 = this.y3+v2;
    }
   
    //das aktuelle Dreieck wird gezeichnet
    triangle.prototype.draw = function()
    {
        jg.drawLine(this.x1,this.y1,this.x2,this.y2);
        jg.drawLine(this.x2,this.y2,this.x3,this.y3);
        jg.drawLine(this.x3,this.y3,this.x1,this.y1);
        jg.paint();
    }  

    //die Sierpinski Funktion
    function sierpinski(t)
    {
        t.draw();
        if( t.area < 100 ) {
            t.draw();
            return;
        }
        t.setx2((t.x1+t.x2)/2);
        t.sety2((t.y1+t.y2)/2);
        t.setx3((t.x1+t.x3)/2);
        t.sety3((t.y1+t.y3)/2);
        t.move(t.x2-t.x1, t.y2-t.y1);
        t.update();
        sierpinski(t);
        t.move(t.x3-t.x2, t.y3-t.y2);
        t.update();
        sierpinski(t);
        t.move(t.x1-t.x3, t.y1-t.y3);
        t.update();
        sierpinski(t);
        t.setx2(2*t.x2-t.x1);
        t.sety2(2*t.y2-t.y1);
        t.setx3(2*t.x3-t.x1);
        t.sety3(2*t.y3-t.y1);
        t.update();
    }

    //neues Dreieck erzeugen und nach Sierpinski zeichnen
    var t1 = new triangle(0,0,500,0,250,433);
    sierpinski(t1);
   
//-->
</script>

DSL Störung, Server offline

Heute morgen um 08:44 Uhr meldete mein Router, ADSL Medium getrennt.
Aha, verstehe. Die übliche Prozedur, Router Neustart, hat nichts gebracht. Also Kabel und Stecker checken, auch hier optisch alles in Ordnung, nur dass die Lämpchen am Router weder blinken noch dauerhaft leuchten, fällt mir auf. Na gut, es gibt ja noch die Hotline meines Providers, allerdings ist dort Dauerbesetzt, erst der Griff zum Handy verrät mir, dass mein Telefonanschluss auch nicht funktioniert.
Da ich nichts mehr machen konnte, bin ich zur nächsten Niederlassung meines Providers gegangen und habe dort mein Problem vorgetragen. Ein kurzer Anruf von denen beim technischen Service brachte keine Erkenntnis über mein Problem und auch, dass die Lämpchen aus sind, wollte man mir nicht so recht abnehmen. Auf Verdacht sollte ich meinen Splitter austauschen. Dieses habe ich gemacht, ohne Erfolg.
Nach der Arbeit bin ich erneut zum Laden gegangen und habe mein Problem erneut geschildert, dieses Mal wurde ein Test der Leitung in Auftrag gegeben und auch, dass die Lämpchen nicht leuchten, deutete jetzt auf ein Hardwareproblem hin.
Kurz nachdem ich wieder zu Hause war, rief mich die Hotline (auf dem Handy) an und teilte mir mit, dass es ein Problem mit der Leitung sei, dieses muss durch einen Techniker vor Ort behoben werden, was ca. 24 Stunden dauern kann.
Jetzt sitze ich hier (ohne Internet) und frage mich, warum das so kompliziert ist und vor allem, warum ein gründlicher Test seitens meines Providers erst gemacht wird, nachdem ich zum zweiten Mal in Persona vorstellig wurde. Natürlich glaube ich gern, dass die meisten Leute eher wenig Ahnung von der technischen Seite haben und einfach nur das Internet benutzen wollen und das ist auch völlig in Ordnung so, aber ein Mitarbeiter muss doch merken, wenn ein Kunde wie ich sein Problem und die bisherigen Lösungsversuche detailliert vorträgt und auf jede Frage sofort eine Nerdantwort weiß, dass man ihn nicht einfach abspeisen sollte, sondern annehmen, dass das Problem wirklich besteht und nicht an mir liegt. Zugegeben, es hätte an der Hardware liegen können, aber ganz offensichtlich war es kein so großer Aufwand, die Leitung zu prüfen, mich mit neuer Hardware auf Verdacht nach Hause zu schicken hätte man sich also sparen können. Vor allem hätte das mir und auch den Mitarbeitern im Laden Zeit gespart.
Ich bin gespannt, was der Tag morgen bringt, hoffentlich ein bißchen was von diesem Internet.