Excel Dateien mit dem PHP-ExcelReader lesen

Für ein Projekt im Geschäft muss ich Daten von einer Excel Datei in eine mySQL Datenbank importieren. Das man im Excel nicht einfach sagen kann "Export zu mySQL" ist ja wohl klar. Also muss man das mit einem Script machen, ich benutze dazu PHP.
Das Problem ist ja bekanntlich nur das Auslesen der Daten aus der Excel Datei, das Schreiben in die DB geht mir PHP ja recht einfach von der Hand.

Eine Möglichkeit ist das Speichern der Excel Datei als XML und dann die XML Datei mit PHP zu lesen. Allerdings speichert Excel beim XML Export noch jede Menge zusätzlicher Informationen mit, die man nicht wirklich braucht, die Datei ist dann etwa doppelt so gross wie vorher und das lesen mit PHP Dauert auch ein weilchen.

Eine Alternative ist der PHP-ExcelReader. Damit kann man sehr einfach auf die Daten in Excel Dateien zugreifen. Das alles ohne einen mühsamen XML-Export und andere Verrenkungen. Hier möchte ich ein an einem kleinen Beispiel zeigen, wie man mit dem PHP-ExcelReader eine Excel Datei ausliest.

Als erstes muss man natürlich die ZIP Datei herunterladen und auf den Webserver kopieren. Dann kanns auch schon losgehen. Diese Datei muss nun natürlich auch eingebunden werden.
<?
// Excel Reader einbinden
require_once("excel/reader.php");
?>

Das das ganze eine Klasse ist kann man nun ein neues Objekt erstellen und auch gleich die Datei öffnen.:
<?
// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");
?>


Da die Excel Dateien mehrere Tabellen (Worksheets) haben, muss man zuerst angeben, von welcher Tabelle man die Daten auslesen will. In diesem Beispiel wird mit einer Schleife jede Tabelle durchgegangen.
<?
// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];
   
    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle

    
$counter++;
}
?>

Mit den beiden Zeigern $worksheet und $sheet ist es nun ein leichtes die gewünschten Daten aus der Datei zu lesen. Nun aber noch ein komplettes Script, welches die Zeilen und Spalten der jeweiligen Tabelle und die Spaltenüberschriften ausgibt.
<?
ini_set
('memory_limit''10M');

// Excel Reader einbinden
require_once("excel/reader.php");

// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");

// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];

    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle
    
$cols=$sheet['numCols'];
    
$rows=$sheet['numRows'];
    echo 
"<b>Arbeitsblatt ".($counter+1).": ".$worksheet['name']."</b><br />";
    echo 
"hat: ".$rows." Zeilen und ".$cols." Spalten.";

    
// Schleife ueber die Daten der Zeile 1 (bzw. 0
    
$celldata=$sheet['cells'];
    
$headrow=1;
    echo 
"<br /><br /><b>Spaltenueberschriften:</b><br />";
    for(
$x=1;$x<=$cols;$x++)
    {
        echo 
$celldata[$headrow][$x]." : ";
    }

    
$counter++;

    echo 
"<br /><br />";
}
?>


Beachten sollte man aber, dass so ein Script, je nach grösser der Excel Datei, einen grossen Speicher Verbrauch hat. Es macht also Sinn mit ini_set() das Memory-Limit etwas nach oben zu setzten, wenn man die Möglichkeit dazu hat.

Bluefish-Editor

http://images.t-error.ch/blog/538/bluefish_logo.pngÜber Yodas Blog bin ich auf den HTML Edior Bluefish gestossen. Ich verwende Bluefish nun schon seit einiger Zeit. Hauptsächlich zum bearbeiten von HTML oder PHP Dateien. Vor Bluefish habe ich Kate genutzt. Nur ist Kate eigentlich für KDE gedacht und hat dementsprechend auch das Look and Feel von KDE. Und das passt nicht so zu Gnome.
Bluefish ist, wie auf der Homepage angegeben, für Programmierer und Webdesigner gedacht.
Bluefish is a powerful editor targeted towards programmers and webdesigners, with many options to write websites, scripts and programming code. Bluefish supports many programming and markup languages, and it focuses on editing dynamic and interactive websites.

Unterstützt werden die folgenden Programmier-/Scriptsprachen:
  • Python
  • HTML
  • PHP
  • C
  • Java
  • JavaScript
  • JSP
  • SQL
  • XML
  • Perl
  • CSS
  • ColdFusion
  • Pascal
  • R
  • Octave/MATLAB
Natürlich kann man auch in anderen Sprachen programmieren und funktioniert dort das Syntaxhighlighting nicht.

http://images.t-error.ch/blog/538/bluefish.png

Ich finde die Benutzeroberfläche äusserst Übersichtlich und sie macht einen guten Eindruck. Auf der linken Seite hat man einen Überblick über die Ordner und Dateien und unten sind die geöffneten Dateien als Tabs dargestellt. Die Schaltflächen oben habe ich noch nie benutzt, für Anfänger im HTML-Bereich kann das aber durchaus ein Vorteil sein.

http://images.t-error.ch/blog/538/bluefish_einstellungen.png

Besonders erfreut hatten mich die Einstellungen. Man kan wirklich fast alles Einstellen. Sei es die Schriftart, die Tabulatorenbreite oder auch das Syntaxhighlighting.

Anfangs hatte ich noch das Problem, dass PHP Blöcke nicht hervorgehoben wurden. Ich kam dem Problem aber relativ schnell auf die Schliche. Das Problem war, dass ich die PHP Blöcke nicht mit einem <?php, sondern mit einem <? begann. Bluefish erkannte dies aber nicht.
Wie schon gesagt, kann man aber die Einstellungen des Syntaxhighlightings verändern. So habe ich das Muster "PHP Block" so angepasst, dass noch auch die kurze Version funktioniert. Bei mir steht im Feld Suchmuster nun das folgende
<\?(php|=|)


Bluefish hat sich nun zu meinem Lieblingseditor gemausert. Unter anderem aufgrund der Übersichtlichen Benutzeroberfläche und auch wegen der super Funktionalität.

Benutzerauthentifizierung mit PHP an einem LDAP Server

Vor längerer Zeit habe ich hier schonmal geschrieben, dass ich an einer PHP Applikation im Geschäft Arbeite. Lieder bin ich da in der letzten Zeit kaum dazugekommen, aber jetzt sieht es doch wieder etwas besser aus.

Diese Applikation hat auch einen geschützten Bereich, wo man sich anmelden muss. Nun wäre es möglich die Benutzerdaten in einer Datenbank zu speichern. Das hätte aber den Nachteil, dass die Benutzer an mehreren Orten verwalten müsste. Nämlich in der mySQL Datenbank und in der Active Directory von unserem Windows 2003 PDC. In der AD müssen die Benutzer ja zwangsläufig gespeichert werden, warum also nicht diese Benutzer zur Authentifizierung in der PHP Applikation verwenden.

Mit LDAP funktioniert das recht einfach, denn wenn man sich mit einem Benutzer über LDAP am PDC anmelden kann, hat man einen gültigen Account. So sieht es in der Theorie aus.

Die Praxis ist da recht ähnlich. Zuerst muss man die LDAP Befehle installieren. Unter Ubuntu funktioniert das so:
sudo apt-get install php5-ldap

Ich habe dann ein kleines Script gebastelt, welches eine Verbindung zum Server herstellt und sich dann versucht einzuloggen. Das sieht so aus:
<?
$conn
=ldap_connect("server")or die("could not connect to the server");

if(@
ldap_bind($conn,"domain\username","password"))
{
    echo 
"login ok";
}
else
{
    echo 
"login falsch";
}

ldap_close($conn);
?>


Wichtig ist, dass man den Benutzernamen im Format domain\username angibt.

Gravatare mit PHP cachen

In meinem Blog verwende ich schon lange den Dienst Gravatar. Dadurch wird zu den Kommentaren ein Bild (Avatar) vom Kommentator angezeigt. Vorausgesetzt, eine Mailadresse wird angegeben und ein Avatar ist bei Gravatar auf diese Adresse registriert. Beim Aufruf meiner Seite wir dieser Avatar von der Gravatarseite geholt und angezeigt.

Für den Benutzer hat das den Vorteil, dass er sich nur an einem Ort registrieren muss und dann auf allen Seiten die Gravatar unterstützen einen Avatar hat. Die Mailadresse bleibt dabei immer geschützt, da sie vor der Übertragung in einen MD5 String umgewandelt wird.

Auch für den Webseitenbetreiber hat Gravatar einige Vorteile. So muss man kein eigenes Avatarsystem zusammenbauen und kann einfach Gravatar nutzen. Das ganze ist sehr einfach zu realisieren. Für Wordpress gibt es ja auch Plugins.

Der Nachteil ist allerdings, dass Gravatar halt auf einer anderen Seite läuft. Sollte diese Seite mal Trafficprobleme haben, oder gar ganz down sein, so wir die eigene Seite auch langsam, da die Bilder nicht geladen werden können. Dieses Problem kann man umgehen, indem man die Bilder in einem Cache abspeichert. Ich habe ein PHP Script geschrieben, welches diese Bilder in einen Cache speichert.

Der Ablauf sieht so aus. Zuerst überprüft das Script, ob sich das Bild schon im Cache befindet. Zur Identifizierung wird die Mailadresse als MD5 String verwendet. Ist das Bild schon im Cache und nicht älter als zwei Tage wird das Bild ausgegeben.
Anders sieht es aus, wenn das Bild noch nicht im Cache, oder schon älter als zwei Tage ist. Dann wir eine Verbindung zum Gravatarserver hergestellt, das Bild heruntergeladen und im Cache gespeichert. Dann wird es auch ausgegeben.

Mir ist klar, dass es (noch) keine perfekte Lösung ist, aber es funktioniert. Natürlich kann man so auch andere Bilder (nicht von Gravatar) cachen. Man muss halt einige Angaben anpassen.

Nun müssen sich nur noch mehr Leute bei Gravatar anmelden.

Hier der Code des Scripts:
<?

// Konfiguration
define("CACHE_FOLDER","cache/");                // cache ordner
define("CACHE_DURATION",48);                    // wie lange die bilder im cache bleiben sollen (tage)
define("GRAVATAR_OPTIONS","size=64&amp;");      // optionen (bild groesse, rating usw)

// ueberprufen ob die mailadresse (als md5 string) gesetzt ist
if(!isSet($_GET['address']))
{
    die(
"no address is set");
}

// cache dauer in sekunden umrechnen
$duration_secs=CACHE_DURATION*60*60;

// adresse ueberpruefen
$address=$_GET['address'];
if(!
preg_match("/[a-z0-9]*/i",$address))
{
    die(
"wrong address");
}

define("GRAVATAR_HOST","www.gravatar.com");
define("GRAVATAR_PATH","/avatar.php?".GRAVATAR_OPTIONS."gravatar_id=".$address);
$filename=CACHE_FOLDER.$address.".jpg";

// ueberprufen, ob die datei heruntergeladen werden muss
$download=TRUE;
if(
file_exists($filename))
{
    if(
fileMTime($filename)>(time()-$duration_secs))
    {
        
$download=FALSE;
    }
}

// wenn ja
if($download)
{
    
// zum host verbinden
    
$source=@fSockOpen(GRAVATAR_HOST,80,$errno,$errstr,30);

    
// wen verbindung hergestellt
    
if($source!=FALSE)
    {
        
// zu sendende headers zusammenstellen
        
$req ="GET ".GRAVATAR_PATH." HTTP/1.0\r\n";
        
$req.="Host: ".GRAVATAR_HOST."\r\n";
        
$req.="Connection: Close\r\n\r\n";

        
// headers senden
        
fWrite($source,$req);
        
        
// headers der antwort auslesen
        
while(!fEof($source))
        {
            
$header=trim(fGets($source,1024));
            if(
$header=="")
            {
                break;
            }
        }

        
// zieldatei oeffnen
        
$dest=fOpen($filename,"w+");

        
// daten auslesen und direkt in die zieldatei schreiben
        
while(!fEof($source))
        {
            
$data=fGets($source,1024);
            
fWrite($dest,$data);
        }

        
// verbindung trennen
        
fClose($source);
        
fClose($dest);
    }
    else
    {
        
// wenn gravatar down und kein bild im cache
        // standardbild verwenden
        
$filename="gravatar.jpg";
    }
}

// Bild ausgeben.
header("Content-type: image/jpeg");
echo 
file_get_contents($filename);
?>

Trackbackspam verhindern

In letzter Zeit hatte ich, wie schonmal schonmal berichtet, vermehrt Trackbackspam. Für das Problem mit dem Kommentarspam habe ich eine gute Lösung gefunden. Seit der Einführung der Matheaufgabe, hatte ich keinen Spamkommentar mehr. Bei den Trackbacks ist das ja nicht so einfach, aber es gibt trotzdem eine recht zuverlässige Lösung.
Wenn ich von einer Seite einen Trackback erhalte, dann sollte auf dieser Seite auch ein Link auf meine Seite sein, oder sie sollte zumindest erwähnt werden. Und genau das überprüft diese Funktion.
Nun habe ich eine kleine PHP Funktiongeschrieben, welche überprüft ob auf der fremden Seite meine URL Vorkommt. So reicht eine Überprüfung des Strings t-error.ch schon. Ich muss nicht mal überprüfen, ob es ein Link ist, denn die Trackbackspammer erwähnen auf ihren Seiten meine Seite ja kaum. Die Funktion überprüft die Seite in der Variable $url und gibt die Variable $spam zurück. Relativ simpel und effektiv. Bisher wurde noch kein Trackbackspam durchgelassen.
<?
function trackbackSpamCheck($url)
{
    
// Spamvariable
    
$spam=1;

    
// die url aufsplitten
    
$parsed=parse_url(trim(addSlashes($url)));

    
// einen pfad angeben wenn noetig
    
if(!isSet($parsed['path']))
    {
        
$parsed['path']="/";
    }

    
// den querystring anfuegen wenn noetig
    
$path=$parsed['path'];
    if(isSet(
$parsed['query']))
    {
        
$path.="?".$parsed['query'];
    }

    
// zum host verbinden
    
$fp=fSockOpen($parsed['host'],80,$errno,$errstr,30);
    if(
$fp)
    {
        
// GET request senden
        
fPuts($fp,"GET ".$path." HTTP/1.0\r\n");
        
fPuts($fp,"Host: ".$parsed['host']."\r\n\r\n");

        
// Den Quelltext auslesen
        
while(!fEof($fp))
        {
            
// auf t-error.ch pruefen
            
if(eregi("t-error.ch",fgets($fp,1024)))
            {
                
// wenn vorhanden $spam auf 0 setzen und abbrechen
                
$spam=0;
                break;
            }
        }

        
// verbindung trennen
        
fclose($fp);
    }
    
    return 
$spam
}
?>

Bilder mit PHP unter Linux verkleinern

Hier im Blog poste ich ja sehr oft Bilder. Meistens sind es selbst gemacht. Nur kann ich diese Bilder nicht einfach von der Kamera herunterkopieren und dann auf den Server laden, nein, ich muss sie auch noch etwas bearbeiten. Meistens beschränkt sich dieses Bearbeiten nur auf das verkleinern. Normalerweise gibt es für jedes Bild zwei Bilder. Ein grösseres mit einer Höhe von 600 Pixel und ein Thumbnail mit einer Höhe von 150 Pixel. Nun habe ich diese Bilder immer im Gimp verkleinert, aber das ist mir jetzt zu dumm geworden. Jedes Bild öffnen, verkleinern, speichern, für das Thumbnail nochmals verkleinern und wieder speichern. sehr aufwändig.
Um das ganze nun etwas zu vereinfachen, habe ich mir ein Script geschreiben, welches alle Bilder in einem Ordner verkleinert. Es gibt wieder zwei Bilder mit den schon genannten Grössen. Da ich nur in PHP weiss wie man so etwas macht, hab ich ein kleines PHP Script geschrieben. Der Quelltext ist weiter unten zu finden. Für das Script wird die GD Library benötigt, welche aber standardmässig schon installiert ist. Zudem habe ich noch die CLI (Command Line Interpreter) Version von PHP installiert, so kann ich das Script wie ein normales Shellscript starten. Bei fertigen Script musste ich nur noch die Dateiendung entfernen und die Datei ausführbar machen (chmod 755). Jetzt kann ich die Datei mit einem Doppelklick ausführen und so werden meine Bilder ohne grossen Aufwand verkleinert. Ein hoch auf die Technik ;)

Nun aber noch der PHP-Code:
#!/usr/bin/php -q
<?
// Ordner
define("FOLDER","./");

// Funktion zum verkleinern der Bilder
function thumb($orig,$thumb,$height)
{
    
// Vorherige Groesse
    
$size=getImageSize(FOLDER.$orig);
    
$orig_width=$size[0];
    
$orig_height=$size[1];

    
// Bild laden
    
$src=imageCreateFromJpeg(FOLDER.$orig);

    
// Neue Groesse bestimmen
    
if($orig_height>$height)
    {
        
$factor=$orig_height/$height;

        
$new_height=round($orig_height/$factor,2);
        
$new_width=round($orig_width/$factor,2);
    }

    
// Zielbild erstellen
    
$dst=imageCreateTrueColor($new_width,$new_height);

    
// Bild kopieren
    
$buffer=imageCopyResized($dst,$src,0,0,0,0,$new_width,$new_height,$orig_width,$orig_height);

    
// Bild speichern
    // Qualitaet ist 85%
    
imageJpeg($dst,FOLDER.$thumb,85);
}

// Order oeffnen
$dir=openDir(FOLDER);

// Ordner durchgehen
while($object=readDir($dir))
{
    
// Wenn Datei im jpg endet
    
if(subStr($object,-3,3)=="jpg")
    {
        
$orig=$object;

        
// Name fuer Thumb bestimmen
        // Aus test.jpg wird test_thumb.jpg
        
$split=explode(".",$object);
        unSet(
$split[count($split)-1]);
        
$thumb=implode(".",$split)."_thumb.jpg";

        
// Bilder verkleinern
        
thumb($orig,$thumb,150);
        
thumb($orig,$orig,600);
    }
}
?>

Tourenverwaltungstool lanciert

Trotz dem nicht gerade umwerfenden Feedback zum Tourenverwaltungstool habe ich mich nun doch entschieden, das ganze zu machen. Zum einen für mich, mein jetziges funktioniert zwar sehr gut, aber das neue Tool könnte mir die Verwaltung noch etwas vereinfachen. Ich habe mir nun auch schon einige Gedanken dazu gemacht. Zum einen natürlich welche Daten man abspeichern kann und zum anderen auch, welche Zusatzfunktionen noch verfügbar sein sollen.
Momentan sieht es so aus:

Daten:
  • Name der Tour
  • Beschreibung / Route
  • Distanz
  • Höhenmeter
  • Durchschnittsgeschwindigkeit
  • Fahrzeit
  • Höchstgeschwindigkeit
  • Durchschnittlicher Puls
  • Temperatur
  • Datum / Zeit
Die Zusatzfunktionen habe ich im ersten Beitrag ja schon beschrieben.

Nun ist es aber nicht so, dass das Tool schon bald fertig ist. Im Geschäft habe ich momentan sehr viel zu tun und dementsprechend habe ich am Abend auch kein Lust um noch stundenlang zu Programmieren. Allerdings würde es mich interessieren, ob jemand noch Ergänzungen hat. Gibt es Dinge, die für euch wichtig wären, Dinge, die ihr gerne in so einem Tool hättet?

RSS Feed mit SimplePie parsen

Ich beschäftige mich nun wieder etwas mehr mit dem Parsen von RSS mit PHP. Unter anderem weil ich mit dem Gedanken spiele einen RSS Aggregator für die Bikeblogs und/oder mir einen Lifestream zu bauen. Dafür eignet sich die Klasse SimplePie sehr gut. Im Gegensatz zu Magpie wird SimplePie etwas aktiver entwickelt.
hier nun mal ein kleines Beispiel, wie man die Daten aus einem RSS Feed ausliest. Wie gesagt ist das mit SimpePie recht einfach.
<?
// SimplePie einbinden
require_once("simplepie/simplepie.inc");

// Neues Objekt erstellen
$pie=new SimplePie;
?>

Nun hat man das SimplePie Objekt erstellt und kann jetzt angeben, welcher Feed geparst werden soll. Alternativ kann man die Feedurl, sowie angeben zum Cachingverhalten auch direkt im Konstruktor angeben. Ich verzichte hier aber darauf, da man bei einem Aggregator oder Lifestream mehrere RSS Dateien parsen muss, ohne jedes mal eine neues Objekt zu erstellen.
<?
// Feed Adresse setzen
$pie->set_feed_url($feed);

// Feed parsen
$pie->init();
?>

Mit der Methode init() wird der Feed nun geparst und man kann sich an das auslesen der Daten machen.
<?
// Anzahl der Elemente im Feed auslesen
$count=$pie->get_item_quantity();

// Jedes Element durchgehen
for($i=0;$i<$count;$i++)
{
    
// Daten auslesen
}
?>
So liest man zuerst die Anzahl der Elemente im Feed aus und geht alle nacheinander durch. Und schlussendlich muss man nur noch die Daten auslesen. Dies sieht so aus:
<?
// Ein "ItemObject" erstellen
$item=$pie->get_item($i);

// Titel
$title=$item->get_title();

// Inhalt
$content=$item->get_content();

// Link
$link=$item->get_link();

// Zeit als Unix Timestamp
$time=$item->get_date("U");
?>

Und alles zusammen sieht dann so aus:
<?
// SimplePie einbinden
require_once("simplepie/simplepie.inc");

// Neues Objekt erstellen
$pie=new SimplePie;

// Feed Adresse setzen
$pie->set_feed_url($feed);

// Feed parsen
$pie->init();

// Anzahl der Elemente im Feed auslesen
$count=$pie->get_item_quantity();

// Jedes Element durchgehen
for($i=0;$i<$count;$i++)
{
    
// Ein "ItemObject" erstellen
    
$item=$pie->get_item($i);

    
// Titel
    
$title=$item->get_title();

    
// Inhalt
    
$content=$item->get_content();

    
// Link
    
$link=$item->get_link();

    
// Zeit als Unix Timestamp
    
$time=$item->get_date("U");
}
?>

In der Api Reference werden alle Funktionen sehr schön und meistens mit einem Beispiel beschrieben.

Tourenverwaltungstool für Biker

Ich verwende wie einigen ja sicher schon bekannt seit anfangs Jahr eine selbstgestrickte PHP Applikation um meine Biketouren zu verwalten. Ich bin damit sehr zufrieden, auch wenn es sicher viele Dinge gibt, die man verbessern könnte.
Nun spiele ich mit dem Gedanken, diese Applikation auszubauen und zum Download zur Verfügung zu stellen. Das heisst, wer will, kann die Applikation herunterladen und auf dem eigenen Webserver installieren. Vorausgesetzt, der Webserver unterstützt PHP und mySQL.
Meine Frage nun an meine treuen Leser und Bikefreunde. Wer hätte Interesse an so einer Applikation? Wenn wirklich Interesse bestehen würde, könnte ich die Applikation auch so einrichten, dass sie bei mir gehostet wird und man sich mit einem Benutzer einloggen kann. Denn nicht jeder hat einen Webserver mit PHP und mySQL zur Verfügung.

Einige Gedanken habe ich mir dazu schon gemacht. Ich habe zwei Listen mit Funktionen gemacht. Erstere beinhaltet Funktionen, die beim ersten Release schon dabei wären. Also das nötigste, so dass man Touren bequem und übersichtlich verwalten könnte. Letztere beinhaltet Funktionen, die das ganze dann noch bequemer machen würden, aber nicht wirklich nötig sind. Zum Beispiel der Import von einer GPX Datei.

Basisfunktionen
  • Angabe der wichtigsten Daten wie Distanz, Höhenmeter, Geschwindigkeit
  • Verwaltung von mehreren Bikes
  • Upload von Fotos zu den jeweiligen Touren
  • Ein Kalender der anzeigt, wann eine Tour gefahren wurde
  • Administrationsoberfläche zur Verwaltung und Erfassung der Touren.
  • Einfache Installation durch ein Script
  • Design mit Templates anpassbar
  • Die Möglichkeit nur Touren von einem Monat, oder mit einem bestimmten Bike anzusehen
  • Graphen mit Distanz pro Monat usw.

Erweiterte Funktionen
  • Wasserzeichen auf Fotos
  • Auslesen der Daten aus einer GPX Datei (Export von SportTracks oder ähnlichem)
  • Automatische Erstellung einer Google Earth Datei, falls GPX Datei vorhanden.
  • Darstellung der Tour mit Google Maps, falls GPX Datei vorhanden.
  • Höhenprofil von der GPX Datei

Das Tool soll keine Konkurrenz zu SportTracks oder ähnlichen Programmen sein, schliesslich ist es damit auch nicht möglich Daten aus dem GPS herunter zu laden, allerdings könnte man damit die gefahrenen Touren im Internet präsentieren und man hat auch immer den Überblick wieviele Kilometer man dieses Jahr oder diesen Monat schon gemacht hat. Für Statistikfans auf jeden Fall eine schöne Sache.

Ich würde mich über Feedback freuen. Wenn einige Leute interesse hätten würde ich mich an die Arbeit machen. Verbesserungsvorschläge sind natürlich auch willkommen.

Installation von Apache, PHP und mySQL unter Ubuntu 6.06

Das Installieren von Programmen in Ubuntu ist nicht wirklich schwierig. Mit den Programm apt kann man ganzen einfach Programme installieren, wenn man weiss wie sie heissen. Und vor allem zu Apache, PHP und mySQL findet man im Internet Dokumentationen bis zum abwinken.
Hier eine kleine Anleitung zur Installation (nicht Konfiguration) von Apache2, PHP5 und mySQL5. Meistens heisst das Packet so wie das Programm, aber es gibt halt auch ausnahmen.
apt-get install apache2
apt-get install php5
apt-get install mysql-server
apt-get install php5-mysql


Die Programmen sind nun installiert. Die Konfigurationsdateien sind an den folgenden Orten abgelegt.
Apache 2: /etc/apache2/apache2.conf
PHP5: /etc/php5/apache2/php.ini
mySQL 5: /etc/mysql/my.ini

Nach der Installation sollte man sicher das Passwort für den mySQL Zugriff ändern, da sonst jeder darauf Zugriff hat.