•  
  • Allgemein (20)

Apache lastet nach der Installation den kompletten Arbeitsspeicher aus

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

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
    Win32DisableAcceptEx

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

Die (Un)Verträglichkeit von JavaScript/CSS-Dateien und Browser-Cache

by Maik
Categories: Allgemein, Webserver
Tags: No Tags
Comments: No Comments
Published on: 15.04.2011

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.

Suchen und Ersetzen von Textteilen in MSSQL

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

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)) > 0)

BEGIN

SELECT @OffSet = PATINDEX('''+@FindString+''', '+@column+'  COLLATE Latin1_General_BIN)
FROM '+@ReplaceTable+'
WHERE PATINDEX('''+@FindString+''', '+@column+') <> 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

Doppelte Datensätze finden und löschen

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

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 GROUP BY
-- 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

Nagios Kommandos über das Web-Interface

by Maik
Categories: Allgemein, Webserver
Tags: ,
Comments: No Comments
Published on: 28.02.2011

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

Jquery – jQuery.ajax vereinfachen durch ajax.post

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

Um den Javascript/Jquery Quellcode nicht zu sehr wachsen zu lassen, möchte ich auf zwei alternative (und kürzere) Möglichkeiten bei jQuery hinweisen.
Um einen AJAX POST abzusetzen muss man nicht unbedingt mit jQuery.ajax… arbeiten. Es reicht wenn man

$.post("/rabattSpeichern", function(data){
   alert(data); // Ausgabe des Antwortstrings
 });

verwendet.
Was ich jetzt erst entdeckt habe, ist das JSON Format. Es ist sehr einfach zu verwenden und man kann damit Traffic sparen, da nur Daten, ganz ohne HTML-Overhead, übertragen werden. Meist möchte man ja nicht unbedingt nur einen Wert zurück geben, sondern viele. Mit JSON kann man Arrays aus PHP direkt an Javascript übergeben, so dass man auch große Datenmengen zurück geben kann, ohne dass es langsam wird.
PHP Array:

Array
(
    [ok] => Gespeichert
    [daten] => Array
        (
            [a1] => 1
            [a2] => 2
        )
)
function rabattSpeichern(id, rabatt) {
  var data = {'id': id,'rabatt':rabatt };
  jQuery.post('/rabattSpeichern', data, function (JSON) {
    alert(JSON.ok); // Gibt "Gespeichert" zurück
    jQuery.each(JSON.daten, function(key, data)
    {
      alert(key+' '+data);
    });
  }, "json");
// wichtig ist der letzte Parameter "json", damit weiß jQuery,
// dass die zurück kommenden Daten im JSON-Format vorliegen
}

Update mit Joins – MSSQL

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

Wenn man in Datenbanken mit starker Normalisierung arbeitet, ist es mitunter mühselig die einzelnen Tabellen mit unterschiedlichen SQLs “upzudaten”. Aber es gibt auch die Möglichkeit UPDATE – SQLs mit JOIN zu verknüpfen.

UPDATE adressen
SET name = z.name, plz = z.plz, ort = z.ort
FROM adressen As a
INNER JOIN
  (SELECT name, plz, ort, kundennummer
       FROM
       Buchung_Leistung as b
       WHERE buchung_id = @id
  ) As z
	On z.kundennummer = a.kundennummer

Besser Beispiele und eine gute Anleitung findet man unter:
http://www.sql-und-xml.de/sql-tutorial/update-aktualisieren-der-zeilen.html

größe aller Tabellen ermitteln – MSSQL

by Maik
Categories: Allgemein
Tags: No Tags
Comments: Kommentare deaktiviert
Published on: 06.08.2010
Tabellengrösse in MSSQL
Tabellengrösse MSSQL

Wenn man bei der täglichen Datensicherung so überprüft, fällt einem ab und zu ein richtig großer Brocken auf. Bei Dateien ist das kein Problem, bei Datenbanken hingegen schon. Wenn die SQL-Datenbank plötzlich mehrere Gigabyte (GB) groß ist, fragt man sich, woher das kommt. Es gibt die Möglichkeit, auf jede Tabelle zu klicken und dann
Um den Überblick über alle Tabellen und deren größte Speicherfresser in einer Datenbank zu erhalten, braucht man nur die folgende Prozedur.

CREATE PROCEDURE [dbo].[Groesse_aller_Tabellen_einer_DB]
AS
BEGIN
SET NOCOUNT ON;

declare @RowCount int, @tablename VARCHAR(100)
declare @Tables table (
PK int IDENTITY(1,1),
tablename VARCHAR(100),
processed BIT
)
INSERT INTO  @Tables (tablename)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' and TABLE_NAME NOT LIKE 'dt%' ORDER BY TABLE_NAME asc

declare @Space TABLE (
name VARCHAR(100), rows nVARCHAR(100), reserved VARCHAR(100), data VARCHAR(100), index_size VARCHAR(100), UNUSED VARCHAR(100)
)
SELECT TOP 1 @tablename = tablename FROM @Tables WHERE processed IS NULL
SET @RowCount = 1
WHILE (@RowCount != 0)
BEGIN
insert INTO  @Space exec sp_spaceused @tablename
UPDATE @Tables set processed = 1 WHERE tablename = @tablename
SELECT TOP 1 @tablename = tablename FROM @Tables WHERE processed IS NULL
SET @RowCount = @@RowCount
END

UPDATE @Space set data = replace(data, ' KB', '')
UPDATE @Space set data = convert(int, data)/1000
UPDATE @Space set data = data + ' MB'
UPDATE @Space set reserved = replace(reserved, ' KB', '')
UPDATE @Space set reserved = convert(int, reserved)/1000
UPDATE @Space set reserved = reserved + ' MB'

SELECT * FROM @Space ORDER BY CONVERT(INT, REPLACE(data, ' MB', '')) DESC
END

MySQL Daten Sichern – automatisches Backup

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

Einen Server bei einem der großen Hoster (Hetzner, 1&1 usw.) stehen zu haben ist schon toll. Man muss sich keine Gedanken um Stromkosten, Überhitzung und andere Dinge Gedanken machen. An eines sollte man aber immer denken, an die Datensicherung!
Um dies so automatisiert wie möglich zu machen, hier eine kurze Anleitung.
Als erstes müssen wir ein Backup der Datenbank machen. Dies kann man zwar auch über PhpMyAdmin versuchen, ab einer gewissen DB-Größe geht das aber schief. Außerdem ist der Mensch von Natur aus faul, deshalb hier ein Linux-Bash-Script, bzw. das Ganze gleich in die Cronjob (crontab -e) geschrieben:

# m h  dom mon dow   command
 5 0 * * * root /var/backup/backup.sh

Dieser wird täglich um 00:05 Uhr als “root” ausgeführt.
Die Datei “/var/backup/backup.sh” sieht dann ungefähr so aus:

mysqldump -ubenutzer -ppasswort -Q --all-databases > /var/backup/mysql_backup.sql
tar -zcvpf /var/backup/backup`date +%Y-%m-%d`.tar.gz /var/backup/mysql_backup.sql

Ein mysqldump mit dem angegebenen Benutzernamen, Passwort und aller Datenbanken wird nach /var/backup ablegt. Dannach wird dieser in eine Datei mit dem aktuellem Datum im Namen gezippt.
Damit die Daten auch vom Server gesichert werden können, gibt es viele Möglichkeiten. Wenn man bei sich einen Linuxserver hat, kann man auch diesen Schritt mit einem Cronjob automatisieren.

 /usr/bin/rsync -aptz -e "ssh -i /home/id_rsa" user@server:/var/backup/ /var/backup/

Dieser Job wird auf dem lokalen Server ausgeführt. Er synchronisiert unser Backup-Verzeichnis mit dem lokalen Verzeichnis und kopiert so die gesicherte Datenbank zu uns.
Das Verfahren zur automatischen Generierung eines SSH-Keys habe ich hier bereits kurz beschrieben.

Unable to return ‘affix’ for unknown CreoleType

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

Symfony 1.0 auf PHP 5.3 upzugraden ist eigentlich nicht problematisch.Man braucht nur die aktuellste Version 1.0.22.
Wenn man dann ein “propel-build-model” macht, kommt die Fehlermeldung:

Unable to return 'affix' for unknown CreoleType

Dann muss man noch in der Datei /lib/symfony/vendor/creole/CreoleTypes.php in der Zeile 39 die Konstante TEXT mit dem Wert 30 belegen. Ursprünglich ist diese mit dem Wert 17 belegt, was aber gleichzeitig auch der Wert für den LONGVARCHAR Wert ist.

const TEXT = 17
// wird zu
const TEXT = 30 // debug wegen PHP 5.3

Es ist mehr ein Hack als eine wirkliche Problemlösung aber es ist nicht damit zu rechnen, dass dieser Teil von Creole im Symfony 1.0 noch debuggt wird. Schließlich ist der Support für Symfony 1.0 ausgelaufen.

Meine persönliche Meinung ist, dass es ein tolles System ist, aber das Upgrade auf 1.1 war bei unserem großen System nicht ohne großes Redesign möglich. Jetzt auf die 1.4 umzusteigen wäre auch fast sinnlos, da wiederum ein Upgrade auf das kommende Symfony 2.0 einen weiteren Bruch bedeuten würde. Ich hoffe inständig dass Sensio jetzt endlich mal die API gleich lässt, wenn Symfony wirklich im Enterprise Umfeld erfolgreich werden soll.

page 1 of 2»

Welcome , today is Sonntag, 05.02.2012