Martin Lantzsch
Software Entwickler
20. November 2012

jQuery click nicht auf Childs anwenden

20. November 2012 - Geschrieben von Martin - Ein Kommentar

Wenn man mit jQuery einen Klick Event Handler auf ein Element setzt, so wird dieser auch automatisch bei klick auf ein Kindelement ausgeführt.

Um das zu umgehen, habe ich mir folgende if Abfrage mit eingebaut, die prüft ob das geklickte Element auch wirklich das Element ist, dass im Event Handler angegeben wurde und keines der Kind Elemente.

$('.element').click(function(data, handler) {
	if(data.target == this) {
		// Code
	}
});

29. Oktober 2012

Bitfelder/Bitfields mit PHP

29. Oktober 2012 - Geschrieben von Martin - Keine Kommentare

Heute beschäftigte ich mich damit Bitfelder in PHP abzubilden. In meinem Fall wurde eine Variable mit verschiedenen Flags befüllt. Am altbekannten
OOP Beispiel Auto könnten diese Flags zum Beispiel Ausstattungsmerkmale sein:

  • Panoramadach? Ja/Nein
  • Navigationssystem? Ja/Nein
  • Alufelgen? Ja/Nein

Um diese Werte nun besondern Speicherplatzschonend zu sparen, wollen wir nun alles in ein Bitfeld speichern. Ein Bitfield mit Flags ist eigentlich nur eine Folge von Nullen, auf der Bits gesetzt (0 –> 1) werden können.

Beispielsweise hat unser Auto die Merkmale Panoramadach und Alufelgen, dann sieht dieses Bitfield so aus:

101

Gelesen wird die Ausstattungsmerkmalliste von oben nach unten und das Bitfeld von rechts nach links. Die erste 1 sagt, ja wir haben ein Panoramadach, die 0 sagt Nein wir haben kein Navigationssystem und die zweite 1 ganz links verrät Ja wir haben Alufelgen.

Mit PHP können wir dieses Bitfield so erzeugen:

$bitfield;
$bitfield |= 1 << 0; // An die erste (also 0te) Stelle im Bitfield eine 1 setzen
$bitfield |= 0 << 1; // An die zweite eine 0
$bitfield |= 1 << 2; // Und an die dritte eine 1

In der zweiten Codezeile gibt die 1 an, dass das Bit gesetzt ist, das „<<" setzt dann diesen Vorrausgehenden Wert auf die nachfolgende Stelle (in dem Fall 0) im Bitfeld.

0 << 0 // erstes Bit ist Null
0 << 1 // zweites Bit ist Null
0 << 2 // drittes Bit ist Null
1 << 3 // viertes Bit ist Eins
1 << 4 // fünftes Bit ist Eins

Nun können wir uns mit folgender Funktion die Binärzahl ausgeben lassen:

echo base_convert($bitfields, 10, 2);

Dieser Funktionsaufruf konvertiert die Zahl von der Basis 10 zur Basis 2 und gibt sie aus:

101

Passt. Nun können wir noch prüfen, ob z.B. das erste Bit gesetzt ist:

if($bitfield & 1 << 0)
    echo 'Das erste Bit ist gesetzt.';

Hier wird geprüft, ob das gesetzte Bit in der Bitfield Variable und „1 << 0" gleich sind. Wenn ja ergibt der Ausdruck true. Damit das ganze halbwegs dynamisch bleibt und man nicht immer die Bitzuweisung von Hand tippen muss, so können wir diese auch in einer Varibale oder Konstante speichern:

define('MERKMAL_PANORAMADACH', 1 << 0);
define('MERKMAL_NAVIGATIONSSYSTEM', 0 << 1);
define('MERKMAL_ALUFELGEN', 1 << 2);
 
$bitfield;
$bitfield |= MERKMAL_PANORAMADACH;
$bitfield |= MERKMAL_NAVIGATIONSSYSTEM;
$bitfield |= MERKMAL_ALUFELGEN;
 
if($bitfield & MERKMAL_ALUFELGEN)
    echo 'Jep, das Auto hat Alufelgen.';

11. Oktober 2012

HP Elitebook 8470p USB Ports funktionieren nicht mehr

11. Oktober 2012 - Geschrieben von Martin - Keine Kommentare

Mein HP Elitebook 8470p hat seit Anbeginn eine ganz komische Krankheit, und zwar funktioniere die USB Ports beim einstecken in die Dockingstation desöfteren nicht mehr.

Sowohl die Ports an der Docking Station als auch hin und wieder die am Notebook erkennen kein Gerät mehr. Sie tauchen zwar noch im Gerätemanager von Windows 7 auf, aber wenn ich ein Gerät anschließe tut sich gar nichts. Und klicke ich auf „nach geänderter Hardware suchen“ hängt sich die ganze Computerverwaltung auf.

Scheinbar bin ich auch nicht der einzige mit dem Phänomen, denn hier gibt es noch weitere Geschädigte: http://superuser.com/questions/264049/hp-elitebook-8440p-usb-ports-stop-working-on-docking-station

Ein Neustart wie er hier empfohlen wird, hilft nur in den seltensten Fällen, meist muss ich das Notebook aus der Dock herausnehmen, herunterfahren, den Akku kurz entfernen, wieder hochfahren und jetzt hoffen dass meine USB Ports wieder funktionieren. Wenn nicht, muss das Spiel X mal wiederholt werden.

Ich werde die Problematik noch ein wenig beobachten und natürlich berichten, aber wenn sich nichts tut bestehe ich auf ein Ersatzgerät bei HP.

29. August 2012

ExtJS „Uncaught TypeError: Cannot read property ‚internalId‘ of undefined“

29. August 2012 - Geschrieben von Martin - Keine Kommentare

Mein ExtJS 4.1 TreeStore wollte einen Knoten partout nicht laden, es kam jedesmal folgender Fehler in der Chome debug Konsole:

Uncaught TypeError: Cannot read property 'internalId' of undefined

Dank der echt supertollen Dokumentation von ExtJS habe ich verzweifelt alle Parameter ausgetestet doch keiner half, beim Googlen bin ich auf diverse Foren gestossen, doch jedesmal gab es keine richtige Antwort. Doch dieser Blog Post hatte eine.

Die „id“ eines jeden Knotens muss einmalig sein! Das heißt, nicht nur auf einer Ebene, sondern auch in Unterebenen darf keine ID doppelt vorkommen! Das ist natürlich schwer, wenn ich aus zwei Datenbanktabellen mit jeweils einem Auto Increment meine Daten beziehe, denn

- parent[id=1]
-- sub[id=1]
-- sub[id=2]
-- sub[id=3]
- parent[id=2]
-- sub[id=4]

und schon habe ich die „[id=1]“ und „[id=2]“ doppelt. Abhilfe schafft z.B. wenn ich als Index „[id=parent-1]“ und „[id=sub-1]“ verwende. Sollte meine Anwendung mit diesen IDs Arbeiten, z.B. um weitere Abfragen auszuführen, kann ich dafür ein extra Feld verwenden.

22. August 2012

Nach Angriff alle .htaccess von einem Webspace löschen

22. August 2012 - Geschrieben von Martin - Keine Kommentare

Viele Bots platzieren auf Webspaces, die gekapert wurden .htaccess Dateien, in denen Redirects stehen, um die Besucher der jeweiligen Webseite auf dubiose andere Seiten zu leiten. Da man bei einem CMS System durchaus mehrere hundert Verzeichnisse hat, in das die .htaccess rekursiv reingeschrieben wurden, ist der Aufwand natürlich sehr hoch diese einzeln zu löschen.

Ich habe mir hierzu folgendes *zwei Minuten muss unbedingt die .htaccess schnell löschen* Script geschrieben, da doch immer wieder Webspaces bereinigt werden müssen, wenn deren Eigentümer zu einfache Passwörter verwendet oder diese weitergegeben haben.

<?php
function deleteHtaccess($dir) {
	$files = scandir($dir);
	$files[0] = null;
	$files[1] = null;
	foreach($files as $f) {
		if($f != null) {
			if(is_dir($dir.'/'.$f)) {
				deleteHtaccess($dir.'/'.$f);
			} else if($f == '.htaccess') {
				chmod($dir.'/'.$f, 777);
				unlink($dir.'/'.$f);
				echo 'delete '.$dir.'/'.$f.'<br>';
			}
		}
	}
}
deleteHtaccess('./');

17. August 2012

Firefox Hack – onresize page refresh

17. August 2012 - Geschrieben von Martin - Keine Kommentare

Die Entwickler von Firefox meinen es sei nicht nötig, dass man beim resizen des Fensters die Seite neu lädt und haben so bei der Behandlung des Resize Events jegliche Seiten reloads gesperrt.

Da ich das allerdings in einem bestimmten Anwendungsszenario trotzdem benötigte, habe ich herausgefunden, dass man es mit folgendem „Hack“ umgehen kann, weil der Reload dann natürlich nicht mehr vom resize initiiert wird:

$(window).resize(function() {
	setTimeout(function() { window.location.reload() }, 0);
});

Durch den Timeout mit der Verzögerung von 0 Millisekunden (also sofort) wird die aufgerufene Funktion sozusagen in ihrer Herkunft anonymisiert.

Sehr umständlich, in allen anderen Browsern funktioniert es direkt, aber die Saboteure von Mozilla meinten wieder sie müssen die Welt verbessern…

26. Juli 2012

Backups via lftp auf anderem Server archivieren

26. Juli 2012 - Geschrieben von Martin - Keine Kommentare

Mit folgendem Script sichere ich die Backups, welches mir Froxlor täglich von Applikationsverzeichnissen und Datenbanken erstellt auf einen zweiten Server:

#!/bin/bash
DATE=`date +%Y%m%d`
lftp -e "mkdir /backups/server01/"$DATE" && mirror --reverse /var/customers/backups /backups/server01/"$DATE" && exit" ftp://backup-server01:PASSWORT**@backup.storage.net

Hierbei wird auf dem Server ein Verzeichnis namens „/backups/server01/20120726“ erstellt und die Daten aus dem Verzeichnis „/var/customers/backups“ werden hochkopiert.

Das ganze noch in einen Cronjob gepackt und es wird jeden Tag um halb 4 Uhr Morgens ausgeführt.

30 3 * * * /root/backup.sh

19. Juli 2012

PHP – Array zu Excel

19. Juli 2012 - Geschrieben von Martin - Keine Kommentare

Eine Excel Datei generiert man wohl am besten mit „PHPExcel„, hat am meisten Funktionen, unterstützt sehr viele Excel Eigenschaften – aber, genau da liegt der Hund begraben. Es ist für viele Projekte und einfache Exporte einfach zu viel.

Deshalb verwende ich für solche Fälle immer die „php-excel“ Klasse.

Diese hat keine 200 Zeilen Code, ist extrem schnell und wandelt ganz einfach verschachtelte Array’s in Excel Tabellen um.

<?php
require 'php-excel.class.php';
$data = array(
	array('Spaltenüberschrift 1', 'Spaltenüberschrift 2', 'Spaltenüberschrift 3'),
	array('Wert A2', 'Wert B2', 'Wert C2'),
	array('Wert A3', 'Wert B3', 'Wert C3')
);
$xls = new Excel_XML('UTF-8', false, 'Name der Arbeitsmappe');
$xls->addArray($data);
$xls->generateXML('Dateiname');

Dies wird nun dem Browser eine Excel Datei namens „Dateiname.xls“ zum Download anbieten, welche wie folgt aufgebaut ist:

Spaltenüberschrift 1 Spaltenüberschrift 2 Spaltenüberschrift 3
Wert A2 Wert B2 Wert C2
Wert A3 Wert B3 Wert C3