Hier mal eine kurze Zusammenfassung zum Symfonyday 2011

Igor Wiedler – Silex – Symfony goes micro

Als erstes sprach Igor Wiedler über Silex, einem micro-framework, dass auf Symfony2 Komponenten aufbaut. Genauer gesagt, auf einzelnen Elmenten, die auch in Symfony2 genutzt werden. Es ist auch eines der ersten Projekte, die ich kenne, dass mit Phar gebaut wurde. Phar ist eine, in PHP5.3 eingeführte Erweiterung, die es erlaubt Mehrere Dateien, ja sogar Verzeichnisse, in eine, per PHP, ausführbare Datei zu verwandeln. Man erhält etwas ähnliches, wie eine Java “.jar” Datei.
Das Ziel von Silex ist es eine schnelle Entwicklung zu ermöglichen, z.B. Prototyping, oder auch kleine überschaubare Microsites zu bauen ohne gleich alle Funktionen von Symfony2 zu nutzen. Es ist aber auch ideal geeignet um z.B. einen REST-Webservice zu entwickeln, bei dem keine Seiten generiert werden müssen, sondern einfach eine Request eingeht und dieser mit geringem Aufwand über eine API beantwortet wird.
Igor hatte bei seiner Präsentation auch den ein oder anderen “eyeopener” dabei. Zum Beispiel wie man die, mit PHP5.3 eingeführten Lambda-Funktionen, (anonyme Funktionen) praktisch einsetzt. Weiterhin gab er einen Einblick, wie umfangreich dieses Microframework ist und welche Symfony2 Komponenten verwendet werden.

Marc Weistroff – Inspire yourself of Symfony2 to create better code

Marc Weistroff wollte uns mit Symfony2 inspierieren, besseren Code zu schreiben. Ich glaube, dass ist ihm gelungen. Er hat die wichtigsten “State of the Art” Paradigmen genannt und gezeigt, wie diese in Symfony2 eingesetzt werden. Zum Beispiel, wie wichtig Separation of Conserns ist. Eigentlich ist es aber auch ganz einfach, wenn man an die Trennung von HTML und CSS denkt. HTML ist für den Inhalt da, CSS für die Gestaltung. Ganz wichtig ist auch, dass man nicht mit “Magie” anfängt. Es gibt in der Programmierung so etwas wie Magie nicht, denn sobald man etwas als Magie bezeichnet, ist es nicht mehr nachvollziehbar und verletzt sicherlich das “Separation of Conserns” Prinzip. Er beschrieb anhand Symfony2 wie man z.B. sinnvolle Fehlermeldungen ausgibt, oder auch wie wichtig es ist Coding Standards zu folgen. Denn es ist wichtig, dass auch jemand anders den Code versteht. Wenn dies nämlich nicht der Fall ist, wird derjenige um diesen Code herum bauen und es entsteht ein Gewirr, was keiner mehr versteht. Marc sprach auch noch einen wichtigen Punkt an: Interfaces. Wenn man Interfaces nutzt, wird die Schnittstelle definiert. Wenn sich dann etwas an der Programmierung ändert, kein Problem. Mit einem Interface ist genau vorgegeben, was eine Klasse wie machen soll, bzw. wie diese reagiert. So kann man die zu Grunde liegende Klasse (z.B. Anbindung an eine Datenbank) ändern, ohne dass etwas anderes geändert werden muss. Tests dürfen natürlich in so einer Präsentation nicht fehlen. Symfony2 wird mit 5000 Tests ausgeliefert und es kommen immer neue dazu. Dies verhindert schlaflose Nächte für einen Programmierer, da man sich darauf verlassen kann, dass man sofort erfährt, dass die letzte Änderung nicht gut durchdacht war ;-) . Ein weiteres “Paradigma” welches ich sehr gut finde, war “If standard sollutions exist use it”. Wenn es bereits eine Lösung für ein Problem gibt, dann sollte man diese auch nutzen. Zur Not kann man diese Lösung, wenn sie z.B. in einer anderen Programmiersprache vorliegt, migrieren. Alles ist besser, als beim Reißbrett an zu fangen. Wenn man, zum Beispiel wie Marc, einen Single-Sign-On realisieren möchte gibt es den Standard OAuth2 (ca. 40 Seiten Beschreibung). Er fand eine gute Umsetzung, jedoch in Ruby. Er kannte Ruby bis dato nicht, begann aber mit der Portierung. (Ruby U R so Weird => “Ruby, du bist so schräg”) Er hat als erstes die Tests migriert und sich dann daran durch gearbeitet. Wichtig dabei ist auch, zu überlegen, ob man die gesamte Implementierung benötigt, oder nur einen Teil. (YAGNI - You Ain’t Gonna Need It) Man sollte sich vorher überlegen, welche Methoden und Klassen man wirklich benötigt und nicht etwas schreiben, was man “bestimmt mal braucht” oder “wenn ich schon mal dabei bin”. Diese Zeit sollte man lieber in das Schreiben von Tests oder dem refaktorieren legen.

Stefan Koopmanschap & Christian Schaefer – Catching Opportunities with Open Source

Ein Highlight des Tages (neben dem Auftritt von @fabpot) war sicherlich der Talk von Christian und Stefan. Sie haben eine Stunde lang darüber geredet, wie wichtig es für einen selbst ist, wenn man sich an Open Source aktiv beteiligt und ich glaube sie haben bei so manchem eine “Inception” vorgenommen. Soll heißen sie haben uns gezeigt, was man alles gewinnt, wenn man sich aktiv beteiligt und nicht nur die Open Source Software nutzt. Stefan meinte z.B., dass man allein durch die Beteiligung an Reputation gewinnt. Dass klingt erst mal nach nicht viel, er hat sich aber inzwischen so einen Namen gemacht, dass er, als er eine neue Stelle suchte zehn Angebote bekommen hatte und sich seinen Arbeitgeber aussuchen konnte. Es bringt einem aber auch persönlich sehr viel, da man Feedback provoziert. Andere beschäftigen sich mit dem Beitrag (es muss nicht immer Quellcode sein, es kann z.B. auch Dokumentation sein) und geben Tipps oder freuen sich einfach nur, dass es jetzt eine neue Funktion gibt, die sie gebrauchen können. Und Christan und Stefan meinten, ganz nebenbei kann es passieren, dass man zu Konferenzen in der ganzen Welt eingeladen wird. Wir wollen ja keine Superstars werden, aber so ein klein wenig berühmt wäre schon nicht schlecht. Warum aber sollten Firmen in Open Source investieren, oder gar ihre Produkte offen legen? Wenn man diesen Schritt geht provoziert man auch hier Feedback und es ist wahrscheinlich, dass Bugs oder auch Sicherheitslücken gefunden werden. Meine Befürchtung habe ich dann auch in der Fragerunde zum Ausdruck gebracht. Die beiden beruhigten mich aber, indem sie mir sagten, dass es wahrscheinlicher ist, dass eine Sicherheitslücke von einem der Helfen möchte gefunden wird, als von Kriminellen. Zu guter Letzt haben sie den wohl wichtigsten Punkt angesprochen. Wenn man sich an Open Source beteiligt, ist man nicht allein und dieses Gefühl gibt einem Kraft. Man merkt, dass einem auch von anderen geholfen wird, wenn man mal nicht weiter kommt. Wenn man denen dann im Gegenzug auch hilft, wenn diese nicht weiter kommen, dann hat man nicht nur ein gutes Gefühl sondern es entwickelt sich ein richtiges “soziales Netzwerk”.

Lunch

Das  Mittagessen war gut, leider gab es nur zwei “Ausgabestellen”. Da ca. 300 Leute da waren, war die Schlange natürlich recht lang. Vermutlich war dies auch eine der wenigen Veranstaltungen, bei denen sich die Schlange vor den Männer-Toiletten bildet, es waren nämlich nur drei Frauen im Publikum. Gestärkt mit Currywurst ging es in die nächste Runde.

Thomas Rabaix – The Sonata AdminBundle

Eigentlich habe ich mich auf die Präsentation von Thomas Rabaix gefreut, da der Admin-Generator bei Symfony1 ein sehr mächtiges Tool ist und ich es gelernt habe, zu lieben. Das Sonata AdminBundle soll dieses beerben. Leider war die Aussprache von Thomas ein sehr französisches Englisch. Außerdem hat er sich in Details verloren, die einem das Gefühl gaben, dass dieses Tool mehr Aufwand als Nutzen bringt. Ich werde es mir auf jeden Fall ansehen und wir werden es auf Arbeit sicherlich einsetzen, aber der Vortrag hat mir ein wenig die Vorfreude genommen.

Hugo Hamon – Extending and Leveraging the Power of the Command Line Interface

Hugo wollte mit uns spielen und zwar Hangman. Anhand des einfachen Spielprinzips hat er uns gezeigt, wie einfach es ist mit Symfony2 Konsolenanwendungen zu schreiben. Dies ist sicherlich nicht immer von Nöten, aber gerade bei Cronjobs ist die Kommandozeile einfach unschlagbar. Oder auch immer wiederkehrende Sachen kann man damit sehr gut automatisieren. Man kann das Ganze sogar richtig hübsch machen, indem man Farben verwendet. Natürlich durfte auch in diesem Vortrag die Erwähnung von UnitTests nicht fehlen und Hugo zeigte auch gleich an seinem Hangman-Spiel wie man Code refakturiert und ihn testbar gestaltet.

Richard Miller – Dependency Injection and the Symfony2 Service Container

Richard Miller gab dann einen sehr guten Einblick in die Logik der DependencyInjection. Endlich ist mir klar geworden, wie dies genau funktioniert und warum man es einsetzt. Ich denke es ging einigen im Publikum so. Stück für Stück ging es weiter, jeder Schritt war nachvollziehbar und man konnte am Ende zu keinem anderen Schluss kommen: DependenyInjection ist die Zukunft der Softwareentwicklung. Zumindest im Symfony2 Umfeld. Richard erwähnte aber nicht nur die “Sonnenseiten”. Es ist nämlich sehr schwer Fehler zu finden, da der Container ja bei Symfony2 in einer XMLI(YML/PHP)-Datei liegt und nicht ohne weiteres mit dem restlichen Code verknüpft werden kann. Um den Überblick zu behalten gibt es aber das Kommando symfony container:debug und wer noch mehr Hilfe braucht das JMSDebuggingBundle.

Fabien Potencier – The State of Symfony

Symfony2 ist das Produkt einer Community und doch ist es ein Mann der dahinter steht und dieses Framework geformt und maßgeblich entwickelt hat (Contributors to Symfony2) Fabien Potencier! Er hat eine Keynote gehalten, die er auch noch mal unter ”What is Symfony2” zusammen gefasst hat. Im Kern geht es darum, dass er mit Symfony die Weltherrschaft anstrebt. ;-) Nein, Scherz. Er möchte dass Symfony2 nicht als klassisches MVC-Framework verstanden wird, sondern als ein wiederverwendbares Set von einzelnen entkoppelten, zusammenhängenden PHP Komponenten die weit verbreitete Webentwicklungsprobleme lösen. Basierend auf diesen Komponenten ist Symfony2 auch ein vollständiges Framework.

First, Symfony2 is a reusable set of standalone, decoupled, and cohesive PHP components that solve common web development problems.

Then, based on these components, Symfony2 is also a full-stack web framework.

Die Frage, ob Symfony2 ein MVC-Framework ist, beantwortet Fabien in seiner unnachahmlichen Art: “I don’t care”. Er ist der Meinung, dass das MVC Pattern nicht die Art ist, wie das Web heute funktioniert. Symfony2 ist ein HTTP- nein, besser ein Frage/Antwort-Framework. Fabien verheimlicht nicht, dass er das Enterprise Umfeld im Blick hat und betont, dass dort nur 2-3 Frameworks überleben werden. Er wirft die Frage in den Raum, wie Symfony diese Herausforderung meistern kann. Natürlich hat er auch schon eine Antwort darauf. Er will alles mit den einzelnen Komponenten “infiltrieren”. Er brachte dann auch gleich noch ein paar Beispiele wo dies schon gelückt ist. Doctrine2, Propel2, PHPUnit Flow3, phpBB, Drupal8 und einige andere mehr. Diese verwenden Komponenten, z.B. den YML-Parser oder die Console oder als die wichtigsten Komponenten die httpFoundation und den DependencyInjectionContainer.

Alles in allem war es ein sehr guter Vortrag. Aber Fabien hat auch ein Live Beispiel gebracht, als er zu einer Firma gerufen wurde, bei denen eine Symfony2 Anwendung langsam lief. Fabien hat sich alles sehr genau angesehen und sich an Symfony1 erinnert. Dort gab es eine Möglichkeit um zu sehen, welche Aktionen, wie lang gedauert haben. Leider war dieses Tool immer recht ungenau, deshalb wurde es nicht in Symfony2 übernommen. Da hat sich Fabien noch einmal hingesetzt und eine “stopwatch” Implementierung gemacht, die sich gewaschen hat. Man kann sich jetzt mit der Developer Toolbar eine genauen Ablauf der Ladezeiten ansehen.

Bei der obligatorischen Fragerunde fragte jemand, ab wann denn dieses coole Feature verfügbar sei. Fabien wechselt auf seine Konsole und macht ein “git push” (er lädt dieses Feature sozusagen direkt zu github hoch und das live :-) ) und der ganze Saal ist begeistert. Man kam sich bei seinem Auftritt ein wenig an Steve Jobs erinnert vor, was aber durchaus positiv gemeint ist. Da auch Fabien ein Visionär ist. Als ein Teilnehmer ihn fragte, woher er die Zeit nehme so viel an Symfony zu bauen, sagte er nur “I don play games”. (Er spielt keine Computerspiele und hat somit offensichtlich viel Zeit).

Fazit

Es war ein rundum gelungener Tag. Da der nächste Symfonyday in Berlin sein wird, werde ich sicherlich wieder mit dabei sein. Es ist einfach toll auch mal mit dem ein oder anderen in Gespräch zu kommen oder zumindest die Köpfe hinter den Twitternamen zu sehen. Die Veranstaltung, insbesondere Stefan und Christian, haben mir gezeigt, dass es eine tolle Sache sein kann sich aktiv ein zu bringen und zu helfen. Man macht zwar gern einmal Versprechen, die man nicht hält, aber ich denke dass ich mich in Zukunft auch einbringen werde, wie das sei erst einmal dahin gestellt.

Die Slides kann man sich übrigens bei symfony-zone.com ansehen.

 

Der Admin Generator von Symfony ist schon toll, wenn man Daten schnell anzeigen und bearbeiten möchten. Manchmal stößt man allerdings an die Grenzen der Automatisierung, z.B. wenn man alle aktuell gültigen Artikel (in einem eigenen FormFilter) angezeigt haben möchte. Man kann zwar die Ansicht einschränken mit einem “von” und “bis” Datum, aber es geht auch einfacher.
In der betreffenden *FromFilter.class.php setzt man ein Widget (in die Methode configure()).

$formFilterCheckbox = new sfWidgetFormInputCheckbox();
$this->setWidget('aktiv', $formFilterCheckbox);

Dann muss man nur noch eine Funktion mit der Syntax add*Widgetname*ColumnQuery einfügen.
Diese bekommt die Grund SQL übergeben, (es können ja auch mehrere Filteroptionen ausgewählt worden sein) das betreffende Feld und natürlich den Wert.
Sicherlich ist es sinnvoll, den Query in der ArticlesTable zu kapseln, aber für das Beispiel genügt das, denk ich.

/**
     * Adds the possibility to filter only active articles
     * @param string $query
     * @param string $field
     * @param boolean $value
     * @return type string
     */
    public function addAktivColumnQuery($query, $field, $value)
    {
        if($value == 1)
        {
            ArticleTable::getInstance();
            $query = $query->from('Article a')
                    ->where('valid_till >= ?', date('Y-m-d 00:00:00'));
        }
        return $query;
    }
Aug 232011
 

Es ist immer wieder erstaunlich, dass die beste Hilfe für Linux immer noch in der Community zu suchen ist. Die Hardwarehersteller, in meinem Fall Cherry, schaffen es nicht, eine vernünftige Anleitung für die Einrichtung einer Tastatur bereit zu stellen. Da wird von Kernel kompilieren gesprochen und das ist eine Sache, die ich versuche zu vermeiden, da es, meiner Meinung nach, heutzutage nur noch einige Spezialfälle gibt, in denen sich das lohnt. Bei jedem Kernel Update der Distribution muss ich dann ja wieder neu kompilieren.
Es gibt (von der Community erstellt) ein sehr gutes HowTo für die Einbindung der Cherry Cymotion Master Tastatur in ein Ubuntu.
http://www.ubuntufreunde.de/forum/2987/cherry_cymotion_master_linux.html
Für mich hatte der 3. Schritt völlig ausgereicht: einfach die folgende Datei (cymotion (das .txt entfernen)) herunter laden und in das Verzeichnis
/usr/share/X11/xkb/compat/

legen. Dann noch in der Datei /usr/share/X11/xkb/compat/complete den Zusatz augment “cymotion” hinzufügen und den X-Server neu starten.

Fertig :-)

 

Wenn jemand das Problem haben sollte, dass der Apache-Server sich nach einer Windows-Installation allen verfügbaren RAM nimmt und die Maschine fast zu stehen bekommt, hier zwei Tipps.
1. Es wird immer empfohlen in der Datei:
Apache Software Foundation\Apache2.2\conf\extra\httpd-mpm.conf
Dein Einrtag “Win32DisableAcceptEx” zu aktivieren, bzw. hinzu zu fügen.

 
    ThreadsPerChild      150
    MaxRequestsPerChild    0
    <strong>Win32DisableAcceptEx</strong>

Wenn das nicht helfen sollte muss man den Winsocket-Katalog resetten:
netsh winsock reset
Genaueres zu dem Thema findet man unter:
http://support.microsoft.com/kb/299357/en-us

 

Um mit jQuery auf den Wert eines Radiobuttons zu zu greifen, kann man entweder durch alle Buttons einzeln durch gehen, oder folgenden Codeschnipsel verwenden:

jQuery("input[@name=Name]:checked").val();

jQuery sucht dann alle Elemente mit dem Namen(!) “Name” und gibt den Wert desjenigen zurück, welches gewählt wurde.

 

Eigentlich möchte man ja, dass die CSS und Javascript-Dateien nur einmal vom User herunter geladen werden und dann lange Zeit nicht mehr. Dieser Wunsch ist verständlich, da ja inzwischen Javascript/CSS-Frameworks wie jQuery viele Kilobyte belegen.
Man kann natürlich die alte Datei löschen und eine neue Datei referenzieren. Dies ist aber sehr aufwendig und wenn man irgendwo eine Stelle vergessen hat, wo die CSS/Javascript-Datei noch verwendet wird, kann es zu unschönen Nebeneffekten, bis hin zum Totalausfall der Seite, wegen fehlender CSS-Anweisungen, kommen.
Um das zu verhindern kann man mit einer einfachen RewriteRule in der .htaccess Datei wahre Wunder bewirken.
Mit der Zeile
RewriteRule ^(css|js)/(.*)\.(v_.*)\.(js|css)$ /$1/$2.$4 [L]
wird der Webserver angewiesen nach Anforderungen zu suchen, die CSS bzw. Javascript-Dateien aus dem jeweiligen Verzeichnis laden wollen.
Das “Geheimnis” der Regel, ist der Abschnitt (.*)\.(v_.*)\.(js|css). Es wird nach einem Dateiname gesucht, die in der Mitte “v_” enthält und am Ende eine JS/CSS-Datei ist. Wenn diese gefunden wird, wird der Zweite und der Vierte Teil der Anforderung umgesetzt.
Der Mittlere Teil mit dem “v_” wird einfach ignoriert. Somit ist es möglich, ein und die selbe Datei immer wieder zu bearbeiten, z.B. die main.css, und im Quellecode der Seite steht dann bei der einen Seite main.v_1.1.css und auf einer anderen main.v_1.2.css. Im Hintergrund wird immer die gleiche Datei geladen.

 

Wenn man Textteile suchen und ersetzen möchte, dann geht das in SQL einfach mit der REPLACE-Funktion. Leider stößt die Funktion bei TEXT-Feldern an Ihre Grenzen und verweigert den Dienst.
Um aber dennoch Textteile ersetzen zu können habe ich unter http://blogs.x2line.com/al/archive/2008/05/03/3417.aspx die Lösung gefunden (und noch verfeinert :-) ).
Ich habe es noch ein wenig auf gebohrt, so dass man auch die Tabelle und die Spalte, in der die Ersetzung statt finden soll, selbst bestimmen kann.

CREATE PROCEDURE [dbo].[SearchAndReplace]
@FindString      NVARCHAR(100),
@ReplaceString NVARCHAR(100),
@ReplaceTable  NVARCHAR(100),
@COLUMN	      NVARCHAR(100),
@id_column      NVARCHAR(100)
AS
BEGIN
  DECLARE @TextPointer VARBINARY(16),
               @DeleteLength INT,
               @OffSet INT,
               @id INT,
               @SQL VARCHAR(8000)
 
SET @DeleteLength = LEN(@FindString)
SET @FindString = '%' + @FindString + '%'
 
SET @SQL = '
DECLARE @TextPointer VARBINARY(16), @OffSet INT, @id VARCHAR(50)
 
DECLARE searchReplace CURSOR FOR
SELECT TEXTPTR('+@COLUMN+'), '+@id_column+'
FROM '+@ReplaceTable+'
 
OPEN searchReplace
FETCH NEXT FROM searchReplace INTO
@TextPointer, @id
 
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @id
SET @OffSet = 0
 
WHILE ((SELECT COUNT(*)
FROM '+@ReplaceTable+'
WHERE (PATINDEX('''+@FindString+''', '+@COLUMN+'  COLLATE Latin1_General_BIN)  0 AND '+@id_column+' = @id)) &gt; 0)
 
BEGIN
 
SELECT @OffSet = PATINDEX('''+@FindString+''', '+@COLUMN+'  COLLATE Latin1_General_BIN)
FROM '+@ReplaceTable+'
WHERE PATINDEX('''+@FindString+''', '+@COLUMN+') &lt;&gt; 0
AND '+@id_column+' = @id
 
SET @OffSet = @OffSet -1
UPDATETEXT '+@ReplaceTable+'.'+@COLUMN+'
@TextPointer
@OffSet
'+CAST(LEN(@DeleteLength) AS VARCHAR)+'
'''+@ReplaceString+'''
 
END
 
FETCH NEXT FROM searchReplace INTO
@TextPointer, @id
END
CLOSE searchReplace
DEALLOCATE searchReplace'
PRINT @SQL
EXEC(@SQL)
SELECT 	@FindString+' has been replaced by '+@ReplaceString+' in ReplaceTable "'+@ReplaceTable+'" within column "'+@spalte+'"'
 
END
 

Wenn man doppelte Datensätze in einer Tabelle finden und eliminieren möchte, ist das manuell zwar möglich, es wird aber ab einer gewissen Anzahl von Datensätzen nicht mehr sinnvoll möglich sein. Zum Glück gibt es SQL und dabei speziell den HAVING-Operator. Dieser ermöglicht uns, eine Datenbankabfrage zu starten und danach das Ergebnis zu bearbeiten. Man kann sich also zum Beispiel Umsatzwerte aus geben lassen und mit HAVING nur die, die sehr niedrig oder sehr hoch sind.
Oder, um auf die eigentliche Aufgabe zurück zu kommen, kann man damit auch doppelte Datensätze finden und löschen. Der Einfachheit halber gehen wir trotzdem davon aus, dass es eine ID-Spalte gibt, die aber teilweise doppelt vergeben wurde.

-- Damit wir sehen, wie viel Zeilen wir eingespart haben
DECLARE @COUNT AS INT
SELECT @COUNT = COUNT(*) FROM quell_tabelle
-- Wir nehmen alle Zeilen, die bei einem <code>GROUP BY</code> 
-- Mehr als einmal vorkommen (HAVING count(*) > 1). 
-- Diese werden in eine temporäre Tabelle gespeichert
SELECT id, spalte1, spalte2, spalte3, zaehler = COUNT(*)
 INTO #temp_tabelle
FROM quell_tabelle
 GROUP BY  id, spalte1, spalte2, spalte3
HAVING COUNT(*) > 1
-- Es werden alle Zeilen aus der ursprünglichen Tabelle gelöscht, die auch in
-- der temporären Tabelle, jetzt aber nur einmal, gelöscht.
DELETE FROM quell_tabelle
WHERE ID IN(
SELECT ID FROM #temp_tabelle)
-- Jetzt müssen wir noch die Daten aus der temporären 
-- in die richtige Tabelle zurück schreiben
INSERT INTO quell_tabelle
SELECT id, spalte1, spalte2, spalte3
      FROM #temp_tabelle
-- die temporäre Tabelle können wir jetzt löschen
DROP TABLE #temp_tabelle
SELECT @COUNT - COUNT(*) AS Anzahl_geloeschter_Datensaetze
FROM quell_tabelle
 

Wenn man im Nagios3 über die Oberfläche z.B. einen restart des Services oder einen Check-Befehl manuell aus führen muss, muss man in der Datei “/etc/nagios3/nagios.cfg” die Variable “check_external_commands” auf “1″ setzen. (“check_external_commands=1″)

Leider funktioniert das aber nicht unter Ubuntu. Es kommt die Fehlermeldung:

error: Could not stat() command file ‘/var/lib/nagios3/rw/nagios.cmd’!

Dies deutet auf ein Rechteproblem hin. Um dieses zu umgehen muss man dem Dienst die Rechte von www-data geben:

service nagios3 stop
dpkg-statoverride –-update –-add nagios www-data 2710 /var/lib/nagios3/rw
dpkg-statoverride -–update –-add nagios nagios 751 /var/lib/nagios3
service nagios3 start

Originallink:
lars-schenk.com

 

Wenn man einen bestimmten Text z.B. eine Verwendung eines Tabellennamens oder einer Variable sucht, kann man, entweder alle Prozeduren einzeln öffnen, oder folgende SQL verwenden.

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_DEFINITION LIKE '%TEXT%'
    AND ROUTINE_TYPE='PROCEDURE'

Diese SQL durchsucht alle Prozeduren nach dem Text “TEXT”.

© 2011 Fractalcenter Suffusion theme by Sayontan Sinha