•  
  • Archives for März 2008 (5)

MySQL Sichten(Views) und Prozeduren (Procedures)

by Maik
Categories: SQL
Tags: No Tags
Comments: 1 Comment
Published on: 25.03.2008

Bevor ich bei meiner jetzigen Firma angestellt war, habe ich mir eingebildet etwas über SQL (MySQL) zu wissen. Dann habe ich jedoch den Microsoft-SQL-Server kennen gelernt. Ich bin generell kein Microsoft Fan, der SQL-Server ist aber schon ein sehr leistungsfähiger Server. Durch die bereits vorhandenen Strukturen musste ich mich erst einmal durchfitzen unter anderem auch durch Sichten und Prozeduren. Aus heutiger Sicht weiß ich nicht, wie ich ohne diese SQL Werkzeuge auskommen konnte.

Kommen wir als erstes zu den Sichten (Views):

Um den Sinn einer Sicht zu verstehen, versuche ich es einmal mit einem Beispiel. (dies ist ein MySQL-Code in anderen SQL-Sprachen weicht dieser aber nicht allzu sehr ab)

CREATE VIEW terms AS
select term.term_id, name, slug, term_group,
taxonomy, description, parent, count
from wp_terms as term
INNER JOIN wp_term_taxonomy as tax
ON term.term_id = tax.term_id

Mit

CREATE VIEW * AS

wird eine Sicht eingeleitet. Ich habe hier mal als Beispiel die WordPress Datenbank genommen um einen JOIN über die Tabellen wp_term_taxonomy und wp_terms zu erstellen. Die Frage die ich mir am Anfang gestellt habe war: “Wozu soll ich das so umständlich machen?”. Man kann die SQL ja auch direkt in den PHP-Quellcode schreiben. Das mag zwar fürs erste stimmen, wenn man das Ganze aber etwas weiter spinnt, wird es vielleicht deutlicher. In WordPress ist es prinzipiell möglich den Tabellenpräfix zu ändern. Wenn ich das im Nachhinein ändere, wird das in der WordPress-Programmierung automatisch erledigt, nehmen wir jetzt aber weiter an, dass ich mir ein Plugin oder eine eigene Seite mit SQL-Abfragen geschrieben habe. Ich müsste jetzt manuell durch alle Abfragen durchgehen und die Tabellen umbenennen. Wenn ich aber Sichten einsetzte muss ich dies nur einmalig zentral ändern und alle Scripte die auf die Sicht zugreifen funktionieren weiterhin. Sichten helfen Redundanz zu vermeiden. Ich muss den SQL-Code nicht mehrmals hinterlegen, sondern kann ihn an einer Stelle ändern. Für Webmaster, die sich bis jetzt nur mit “kleinen” Seiten auseinander gesetzt haben, ist der Sinn vielleicht nicht offensichtlich, wenn man jedoch eine Webanwendung mit dutzenden von Tabellen hat, lernt man Views sehr schnell zu schätzen.

Als zweites möchte ich Prozeduren vorstellen.

Eine Prozedur ist ein universelle Werkzeug in der täglichen Arbeit mit SQL. Eine Prozedur ermöglicht es viele SQL-Anweisungen in einer Anweisung zusammen zu fassen. Nehmen wir an, dass ich den Umsatz pro Kunde und Monat ermitteln will. Das geht sicherlich recht einfach mit einigen JOINS und einer GROUP BY Klausel. Jedoch müsste ich diese Werte bei jeder Abfrage erneut generieren. Bei 10.000 Kunden mag das vielleicht noch gehen. Bei 1.000.00 Kunden wird es schon recht aufwendig für den SQL-Server. Die Last ist auf jeden Fall enorm hoch. Am einfachsten wäre es doch, diese Zahlen einmal in der Woche (oder täglich) in eine gesonderte Tabelle weg zu schreiben. Genau dass kann man mit Hilfe einer Prozedur und eines Cronjobs machen.

DELIMITER $$
DROP PROCEDURE IF EXISTS `proc_umsatz_monatlich`$$
CREATE PROCEDURE `proc_umsatz_monatlich` ()
BEGIN
INSERT INTO umsatz_monatlich
SELECT kunde_id, umsatz
FROM rechnungen
GROUP BY YEAR(datum), MONTH(datum), kunde_id
END$$
DELIMITER ;

Der Vorteil von Prozeduren liegt auf der Hand. Man kann sie mit Variablen füttern und somit das Ergebnis beeinflussen (In einer Prozedur kann man z.B. auch IF Abfragen verwenden). Die Prozedur selbst kann beliebig verwandelt und an neue Gegebenheiten angepasst werden, ohne dass sämtlicher SQL-Code umgeschrieben werden muss. Das hat vor allem Vorteile für z.B. die Suche einer Seite. Diese wir normalerweise mit wenigen Parametern angesprochen (Suchbegriff und ggf. Einschränkungen wie Zeitraum o.ä.) und gibt als Ergebnis eine Tabelle zurück. Ich musste in unsere Suche eine Tabelle zusätzlich einbinden. Das ging ohne eine Zeile im PHP-Quellcode zu verändern, nur indem ich die Prozedur verändert habe. Es gibt Programmierer, vor allem in der professionellen Programmierung, die der Meinung sind, dass ein Client (das Clientprogramm) keinen direkten Zugriff auf die Datenbank haben darf. Das ist ein recht radikaler Ansatz, dem ich mich nicht anschließen möchte. Sinnvoll wäre es aber z.B. dass man dem Client, im Falle der Webprogrammierung dürfte das zumeist “www-data” sein, nur SELECT oder UPDATE Befehle erlaubt. DROP und DELETE sind nur Prozeduren vorbehalten. Das würde dem Schutz vor SQL-Injection einigen Vorschub leisten. Wenn man sogar soweit geht, die Einschränkung auf UPDATE Befehle auszuweiten, wäre das ein großer Sicherheitsgewinn.
Eine weitere wichtige Funktion von Prozeduren soll das nachfolgende Beispiel verdeutlichen:

CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur CURSOR FOR SELECT id,data FROM test.t1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a, b;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END

Man kann in einer Prozedur durch ein Ergebnis einer SQL, Zeile für Zeile durchgehen und die Datenwerte für Bedingungen, INSERT, DELETE oder UPDATE Befehle nutzen. Man kann einen CURSOR ähnlich einer while Schleife benutzen. Das zu den Vorteilen. Der Entscheidende Nachteil ist, die Geschwindigkeit. Wenn ich ein UPDATE Befehle ausführe, selbst wenn es zehntausende Zeilen betrifft, ist der Server in meist weniger als einer Sekunde fertig (Abhängig von der Tabelle, dem Index und weiterer Faktoren). Mit einer CURSOR Operation kann ich prinzipiell die gleiche Funktion ausführen, wie mit dem UPDATE Befehl, diese würde jedoch erheblich länger Dauern. Deshalb ein Wort der Warnung. CURSOR Operationen nur mit Bedacht einsetzen und alle Alternativen vorher ausschöpfen. Als bewährtes Mittel um diesen SQL Befehl zu vermeiden, haben sich für mich temporäre Tabellen erwiesen. Man kann das Ergebnis einer SELECT Anweisung in eine Tabelle speichern und diese dann für weiter gehende Aktionen benutzen.
Dazu fällt mir wieder meine Suche ein. Als erstes erstelle ich eine Temporäre Tabelle mit bestimmten IDs die ich aus den Einschränkungen Zeitraum bzw. Thema gewinne. Diese IDs benutze ich dann als Grundlage für die weitere Recherche nach dem Suchwort. Anfänglich hat die Ausführung ca. 30 Sekunden gedauert.

Das ist auch noch ein wichtiger Punkt, den ich ansprechen möchte, obwohl es die meisten Programmierer wissen sollten. Man sollte erst seinen Code schreiben, so dass er einfach zu warten ist und den Anforderungen entspricht. Erst dann sollte man sich auf den Weg von Flaschenhälsen machen, sprich optimieren. Ein gutes Beispiel ist eine Webseite, die mehrere Zehntausend Zugriffe pro Stunde hat. Wenn man diese versucht von Anfang an zu optimieren ohne eine entsprechende Serverlast zum Testen zu haben, ist das bestenfalls verschwendete Zeit, schlimmsten Falls hat man sich auf eine falsche Annahme verlassen und die Optimierung kostet mehr Ausführungszeit als der eigentlich Code.

Zurück zur SQL. Durch schrittweises optimieren, z.B. einen zusätzlichen Index auf die durchsuchten Tabellen und dem Einsatz von temporären Tabellen konnte ich die Ausführung auf, je nach Aufruf, 0.7 – 1.5 Sekunden herunterschrauben. Die Suche geht dabei über 14 Tabellen, von denen 7 durchsucht und 7 für die Ausgabe (z.B. Bilder, Titel, Sortierung etc.) ausgewertet werden.

Das Symfony-Framework

by Maik
Categories: Symfony
Tags: No Tags
Comments: 1 Comment
Published on: 16.03.2008

Hier möchte ich einmal kurz beschreiben, was das Symfony-Framework ist und wie ich dazu kam. Es gibt eine fast unüberschaubare Menge an PHP5-Frameworks. Ich hatte zu Beginn meiner Recherchen ca. 6 Frameworks in der engeren Auswahl. Es kristallisierte sich aber sehr schnell heraus, dass jedes seine Vor- aber noch mehr Nachteile hat. Ein Framework gefiel mir wirklich gut, aber es gab kaum eine Community dazu und es schien nicht mehr recht gepflegt zu sein. Symfony basiert auf Mojavi. Mit Mojavi wiederum hatte ich in meiner vorhergehenden Firma zu tun, das vorhandene System, war ein Mojavi System. Anfangs hatte ich wirklich Probleme mich in die nicht prozedurale Denkweise hinein zu versetzen. Letztendlich bin ich froh, dass ich Mojavi kennen gelernt habe, denn nur so konnte ich die enormen Vorteile von einem Framework verstehen.

Mojavi stand ja auch auf meiner Liste, der zu überprüfenden Framworks, aber eine entscheidende Sache störte mich daran; Mojavi wird von einer Person entwickelt und das in der Freizeit. Ich möchte nicht behaupten, dass das ein Einzelner nicht schaffen kann, aber eine Community kann viel eher Sicherheitslecks entdecken und die Entwicklung vorantreiben. Oder aber andererseits, wie bei Symfony, wenn eine Firma dahinter steht hat diese ein kommerzielles Interesse, dass das System reibungslos läuft. Symfony ist und bleibt trotzdem Open Source und kostenfrei.

So nun aber zum Framework. Laut Symfony-Seite lesen sich die Vorteile wie folgt:

  • simple templating and helpers
  • cache management
  • smart URLs
  • scaffolding
  • multilingualism and I18N support
  • object model and MVC separation
  • Ajax support
  • enterprise ready

Zum ersten Punkt, “einfaches Template-System und die Helper“. Da kann ich nur sagen: “Absolut”. Es ist sehr einfach, in Symfony durch die Helper z.B.  Formulare zu erstellen.
echo select_tag('land', objects_for_select($laender]));
Man hat mit dieser Zeile bereits einen Select-Tag geschrieben. Man muss sich bei den Helpern nicht um HTML-Syntax kümmern, das wird alles automatisch generiert. Zum Template System möchte ich noch hinzufügen, dass es sehr einfach gehalten ist, es muss alles dynamische in <?php ?> eingefügt werden. Es ist also nicht nötig wie mit Smarty eine neue Syntax zu lernen.

Das Cache Management ist wirklich gut. Man kann sehr fein gliedern welche Teile man cachen möchte und welche dynamisch bleiben sollen.

Smart URLs – sind auch aus der heutigen Netzwelt nicht mehr wegzudenken. Durch das zusätzliche Routing, kann man sehr einfache URLs erstellen, welche man auch bewerben kann. Z.B. www.beispiel.de/suche anstatt www.beispiel.de?module=suche&action=index.

Scaffolding – Es ist möglich, wenn man das Datenmodell in Symfony richtig hinterlegt, ohne eine Zeile Code, eine Backendanwendung zu generieren. D.h. man kann nach der Generierung Daten in die Tabelle eintragen, bearbeiten und löschen.

Den Multilingualen Teil konnte ich zum Glück außen vor lassen. In meiner letzten Firma sollte die gesamte Seite in 22 verschieden Sprachen erscheinen. Geschafft hatten wir immerhin 12. Es wird aber mit der Masse der Sprachen immer schwerer den Überblick zu behalten, welche Teile bereits übersetzt (bzw. aktualisiert) sind und welche nicht. Ich bin mir aber sicher, dass das Symfony Team auch hier bei der Implementierung gute Arbeit geleistet hat.

MVC -  Als “Neuling” braucht man eine ganze Weile, bevor man hinter die Logik der Umsetzung gestiegen ist. Dass diese Trennung bei großen Softwareprojekten unumgänglich ist leuchtet schnell ein, aber welcher Teil zu Präsentation, welcher zum Modell und welcher zum Controller passt, ist anfänglich verwirrend. Ein Schleife, würde man denken, gehört nicht in die Präsentation. Wenn es aber nur darum geht, eine Liste, die in einem Array oder Objekt steckt, darzustellen, dann kann man es in der View “machen”.

Ajax Support – hier muss ich die heiligen Hallen von Symfony verlassen. Es wurde sicherlich viel Arbeit in die Implementierung von Ajax und der automatischen Codegenerierung gesteckt. Aber nach einem Monat Programmierung habe ich davon wieder abstand genommen.

  1. Ist mir die Dateigröße des zu Grunde liegenden Prototype zu groß
  2. Ist mir der generierte Code teilweise zu aufgebläht, mit jQuery kann ich ein und die selbe AJAX-Aktion  durch CSS-Selektoren dutzenden Elementen zuweisen. Das soll wohl auch mit Prototype gehen, aber ich finde es wesentlich einfacher mit jQuery.
  3. Die Geschwindigkeit des Codes hat mir auch Probleme bereitet. Als ich eine Aktion ca. 60 Links zugewiesen hatte, kam der Browser schon ins straucheln. Dabei ging es nur um das aus und wieder einblenden, von Navigationspunkten.

Enterprise ready – Kann ich nur bestätigen. Ich verwende Symfony 1.0 bei unserer Firmenseite und kann nur sagen: “Ich bin sehr zufrieden“.

Zusammenfassend kann man sagen:

  1. Symfony ist ein sehr schnelles, stabiles PHP5-Framework welches sich für viele Einsatzzwecke eignet.
  2. Durch die Abstraktion der Datenbankzugriffe könnte man auch das SQL-System ohne Probleme wechseln.
  3. Die Programmierung ist wesentlich schneller, da man sich z.B. nicht mehr mit Session-Management, Cache-Problemen, Datenbankspezifischer Anbindung, E-Mailgenerierung oder falsch geschriebenen HTML-Tags in Formularen, herumschlagen muss.
  4. Nicht zuletzt gibt es ein Buch das kostenlos online gelesen werden kann. Dieses Buch ist nicht nur eine Dokumentation sondern auch eine Programmierhilfe mit vielen Beispielen.
  5. Es gibt auch eine Unit-Test Möglichkeit, an die ich mich allerdins noch nicht getraut habe, da ich den Aufwand scheue, alle Klassen durchzugehen und die entsprechenden Unittests dafür zu schreiben.

mehrere htaccess Dateien gleichzeitig in einem root-Verzeichnis verwenden

by Maik
Categories: Symfony
Tags: ,
Comments: No Comments
Published on: 11.03.2008

Ich stand vor der Aufgabe für eine Internetseite, die in Symfony programmiert ist, einen zweiten Mandanten anzulegen. Das heißt, es sollte die dahinterstehende Programmierung gleich bleiben, nur das Layout sollte anders werden. Man könnte das sicherlich auch mit unterschiedlichen Verzeichnissen erreichen und nur die lib-Ordner (Bibliotheken) teilen. Das Problem dabei ist, dass die Ausgabeseiten doppel gepflegt werden müssten. Das kam nicht in Frage, so begab ich mich wieder auf die Suche und fand eine ganz einfache aber sehr effektive Einstellung für den Apache-Server. http://httpd.apache.org/docs/1.3/mod/core.html#accessfilename

Damit hat man die Möglichkeit mehrere Installationen unter ein und dem selben Verzeichnis zu händeln.
Das muss in die httpd-vhosts.conf-Datei:

AccessFileName .neu_htaccess

Innerhalb der htaccess kann man dann auf eine andere Datei verweisen.
RewriteRule ^(.*)$ neu_front.php [QSA,L]
Die genaue Anleitung, wie man die .htaccess für Symfony aufbauen muss, findet man hier.
Bei Symfony kopiert man dann einfach die front.php in z.B. neu_front.php kopieren.
define('SF_APP', 'front');
define('SF_ENVIRONMENT', 'neu');
define('SF_DEBUG', true);
define('MANDANT', 2);
...

Durch das Environment “neu” kann man viele Sachen individuell anpassen. Z.B. eigene CSS-Dateien einbinden und andere Seitenspezifische Sachen laden.

Suchmaschinen anders bedienen

by Maik
Categories: Allgemein
Tags: No Tags
Comments: No Comments
Published on: 09.03.2008

Ich weiß, dass so ziemlich jeder, der sich im Internet “bewegt” weiß wie man eine Suchmaschine bedienen kann. Ich möchte trotzdem versuchen ein paar Tipps zusammen zu stellen, die vielleicht nicht jeder kennt oder nutzt.

  • Als Erstes und Wichtigstes: den gesuchten Begriff so genau wie nur möglich spezifizieren

    • Als Paradebeispiel kann man einen Durchschnittsuser nehmen, wenn dieser sich für die Insel Java interessiert wird er sicherlich auch Java eingeben. Nur leider wird er unter den ersten Ergebnissen kaum einen relevanten Eintrag finden. Die Programmiersprache Java ist so populär, dass es wesentlich mehr Ergebnisse gibt als für die indonesische Insel Java. Wenn der User nun weiß, dass er ja die Insel bzw. etwas zu Indonesien sucht, hat er eine vielfach höhere Trefferquote.

  • Mehr als nur einen Suchbegriff verwenden, erst wenn man mehrere relevante Suchbegriffe kombiniert, werden die Trefferlisten genauer

    • Wenn man eine Fehlermeldung wie ich sie erst unlängst hatte, sollte man diese so wie sie ist, in die Suchmaschine eingeben. Z.B. “error creating view eclipse“. Das Ergebnis ließ aber sehr zu wünschen übrig. Als ich dann aber ubuntu als zusätzlichen Suchbegriff eingab, kam ich ziemlich schnell auf die Seite von ubuntuformus.org Wodurch ich Sun Java installieren konnte und somit den Fehler beheben konnte.

  • Es gibt andere Suchmaschinen außer Google

    • Google ist unumstritten der Branchenkönig im Suchmaschinenmarkt, vor allem in Deutschland. Aber es gibt noch weitere Suchmaschinen, die ebenfalls gute und schnelle Ergebnisse bringen.

    • Es gibt z.B. ask.de, yahoo.de oder auch eine europäische z.B. exalead.de oder metager2.de.

    • Letztere ist eine so genannte Metasuchmaschine, welche keinen eigenen Index pflegt, sondern bei verschiedenen Suchmaschinen anfragt und die Ergebnisse zusammenstellt. Diese sind meist höherwertig als Ergebnisse einer einzelnen Suchmaschine. Die Geschwindigkeit der Seite hängt aber von der Reaktionszeit der angefragten Suchmaschinen ab.

    • Aber es gibt auch noch Spezialsuchmaschinen die z.B. auf klug-suchen.de aufgelistet sind.

    • Ungemein wertvoll sind auch Foren. Z.B. das ubuntuusers.de-Forum oder das Symfony-Forum. Sicherlich werden diese Foren auch von Suchmaschinen indexiert, aber man hat schnellere und genauere Ergebnisse als bei der reinen Suchmaschine.

    Zusammenfassend kann ich nur sagen, es gibt Alternativen zu Google welche oftmals gleichwertige, wenn nicht gar bessere Ergebnisse erzielen. Hauptkritikpunkt meinerseits ist bei Google die Verflechtung von allen möglichen Services. Google verpflichtet sich Cookies nach 2 Jahren zu löschen, aber nur wenn Google 2 Jahre lang nicht aufgerufen wurde.

Der erste Eintrag …

by Maik
Categories: Allgemein
Tags: No Tags
Comments: No Comments
Published on: 09.03.2008

Ist wohl immer der schwerste. Man muss sich überlegen, wie man meine seine Leser/Besucher ansprechen möchte, wie man sich geben möchte und so weiter und so fort. Ich werde versuchen einfach ich selbst zu sein. Der Inhalt meines Blogs soll sich nicht, wie man vom Name vielleicht ableiten könnte, um Fraktale drehen sondern vielmehr mit den Problemen und vor allem den Lösungen rund um Programmierung (PHP5), Datenbanken (MSSQL, MySQL), (X)HTML, JavaScript, CSS und den Frameworks Symfony (PHP) und jQuery (JS). Weiterhin möchte ich Lösungen, die mir bei der Arbeit als Systemadministrator immer wieder unter kommen, hier veröffentlichen. Einerseits um für mich eine Gedankenstütze zu haben, andererseits, so hoffe ich, soll der der Blog Leuten helfen, die wie ich, verzweifelt nach einer Lösung suchen und diese erst nach Stunden irgendo in einem Winkel des Netzes finden. Mein Grundsatz lautet: Fast jedes Problem, vor allem EDV-technischer Natur, das existiert wurde bereits irgendwo schon einmal gelöst, man muss nur intensiv genug danach suchen.

Eines muss ich noch anmerken, die Seite befindet sich noch im Aufbau und das Design ist sicherlich noch nicht das was ich mir vorstelle, aber ich will trotzdem schon mal “drin” sein, sodass es in den nächsten Tagen sicherlich die ein oder andere Änderung geben wird.

page 1 of 1

Welcome , today is Sonntag, 05.02.2012