Archiv der Kategorie: Quicktips

MySQL „SHOW PROFILE“

Hab heute in meiner favorisierten Datenbank-GUI HeidiSQL den Query Profiler entdeckt, hinter dem sich bei genauer Recherche das MySQL-Kommando SHOW PROFILE verbirgt – nur grafisch aufgehübscht.

query-profiling

query-profiling

Eine sinnvolle Ergänzung zu EXPLAIN – grade die temporären Tabellen oder unerwartet auffällige Sortierungen fallen hier schnell auf.

Veröffentlicht unter Datenbanken, Quicktips, webdev | 2 Kommentare

Schriftartempfehlung: Consolas

Ein geschätzter Arbeitskollege gab mir neulich den Tipp, es mal mit der von Microsoft speziell für Programmierung entwickelten Schrift Consolas zu versuchen. Ich hab einen Schriftwechsel erst als unnötig abgestempelt, war dann aber doch froh, es getan zu haben.

Meine favorisierte IDE Netbeans kommt standardmäßig mit der Schriftart Monospaced daher. Sieht so aus:

monospaced

monospaced

Enter Consolas

Heruntergeladen und in Netbeans als Standardfont in Größe 14 eingestellt (12 finde ich zu klein). Resultat:

consolas

consolas

Finde ich dann doch deutlich angenehmer.

Veröffentlicht unter Quicktips, misc IT | 8 Kommentare

MySQL PROCEDURE ANALYSE – Optimale Feldtypen ermitteln

Oft wählt man aus Verlegenheit völlig überdimensionierte Datentypen (VARCHAR(512) und gut…). Ist auch irgendwie verständlich, schließlich ist oft nicht bekannt, in welche Sphären die späteren Feldinhalte vorstoßen werden. Wenn sich die Datenbank aber mal etwas eingeschwungen hat, kann es lohnenswert sein, etwas zu tweaken. Dazu hilft MySQL mit der procedure analyse.

Sieht dann so aus:

procedure-analyse

procedure-analyse

Umsetzen muss man die Vorschläge dann selbst.

Veröffentlicht unter Datenbanken, Quicktips, webdev | 3 Kommentare

Per PHP-CLI die eigene IP herausfinden

Bekanntlicherweise ist die IP per $_SERVER auf der CLI nicht verfügbar. Was hilft: gethostbynamel. Die Funktion liefert eine Liste von IPv4 Adressen zu einem Hostname zurück.

print_r(gethostbynamel("microsoft.com"));

/*
Array
(
    [0] => 207.46.232.182
    [1] => 207.46.197.32
)
*/

Lässt sich leicht abgewandelt auch zum herausfinden der eigenen IP benutzen:

function getOwnIP($default = false)
{
	$ips = gethostbynamel('localhost');
	
	foreach ($ips as $ip)
		if ($ip != "127.0.0.1") return $ip;
		
	return $default;
}

Veröffentlicht unter php, Quicktips, webdev | 5 Kommentare

3 nützliche unbekannte PHP Funktionen

Ich hasse ja persönlich Artikel wie diesen (313373 PHP Speed Optimization Tweeks you can not live without … gäähn). Aber beenden wir das Selbstbashing und kommen zum Punkt.

stream_resolve_include_path (php >= 5.3.2)

Manchmal kann es nützlich sein zu wissen, wo genau sich eine includete Datei versteckt. Der include_path macht es einem da ja oft nicht einfach.

var_dump(stream_resolve_include_path("fpdf/fpdf.php"));
//string(31) "D:\xampp\php\PEAR\fpdf\fpdf.php"

DateTime::createFromFormat (php >= 5.3.0)

Zum „entwirren“ von Zeitangaben gehe ich gerne den Weg über strtotime und date. Etwa so:

echo date("d.m.Y H:i:s", strtotime("Mon, 15 Aug 2005 15:12:46 UTC"));
//15.08.2005 17:12:46

Veröffentlicht unter php, Quicktips, webdev | 2 Kommentare

MySQL Limit: Anzahl Ergebnisse ohne LIMIT herausfinden

In einigen Situation ist der geneigte Entwickler interessiert an der Gesamtzahl der Ergebnisse, die eine Abfrage ohne LIMIT – Klausel ergeben hätte. Die Holzhammermethode in so einem Fall ist, die Abfrage einfach nochmal ohne LIMIT abzufeuern. Doch es geht besser. Und zwar mit folgendem Konstrukt:

SELECT SQL_CALC_FOUND_ROWS productid, price, stock 
FROM products 
WHERE price > 100 
LIMIT 10, 30;

SELECT FOUND_ROWS();

Durch das „Einschleusen“ von SQL_CALC_FOUND_ROWS können wir direkt danach mit FOUND_ROWS() die Gesamtzahl an Ergebnissen erfragen. Für den Fall, dass nur ein Attribut selektiert werden soll, kann man auch direkt eine Abfrage draus machen:

SELECT SQL_CALC_FOUND_ROWS productid 
FROM products 
WHERE price > 100 
LIMIT 10, 30 
UNION 
SELECT FOUND_ROWS();

Auf die Art und Weise wird an das Resultset als letzte Zeile noch die Gesamtzahl an Ergebnissen ohne LIMIT angehangen. Mehr dazu direkt im MySQL Manual.

Veröffentlicht unter Datenbanken, Quicktips, webdev | 9 Kommentare

Webtesting mit SimpleTest – Selenium light

SimpleTest führt neben dem übermächtigen PHPUnit ein Schattendasein in der PHP-Community. Vielleicht nicht ganz zu Unrecht, schließlich kommt es mit deutlich weniger Features daher. Eher durch Zufall entdeckte ich beim Durchstöbern der Dokumentation das verdammt coole Webtesting Feature – zwar nicht so mächtig wie Selenium (das ja u.a. einen echten Browser fernsteuern kann), aber für kleine Checks durchaus gut zu gebrauchen. Aber der Reihe nach.

SimpleTest installieren

Die aktuelle Alpha-Version 1.1 herunterladen. Zusätzlich noch das File arguments.php direkt aus dem SVN herunterladen und ins simpletest-Verzeichnis stecken. Das wurde anscheinend in der alpha vergessen und führt sonst zu einem Fehler.

Veröffentlicht unter php, Quicktips, webdev | 2 Kommentare

Zip-Archive entpacken mit Javascript

Unzippen mit Javascript? Wer sollte sowas wollen? Egal! Es geht, reicht das als Begründung? Und das garnicht mal so schlecht. Wie üblich schmeiße ich gleich mit Code um mich:

<script src="ZipFile.complete.js"></script>
<script>
var zipFile = new ZipFile("zipfile.zip", readingDoneCallback);

function readingDoneCallback(zip)
{
	console.log("Zipfile reading finished! " + zip.entries.length + " files found in zip");
	
	for (var i = 0; i < zip.entries.length; i++)
	{
		zip.entries[i].extract(extractCallback);
	}
};

function extractCallback(entry, entryContent) 
{
	var filename = entry.name,
		csize = entry.compressedSize,
		ucsize = entry.uncompressedSize;
	
	console.log("File " + filename + " - comp.: " + csize + ", uncomp.: " + ucsize + "byte");
	console.log("File-Content: " + entryContent);
}
</script>

Simpler Aufbau, logische Implementierung. Alles was zu dieser Magie nötig ist, ist eine 64KB große Javascript-Datei, die auf Binärebene fleißig Bytes umhershiftet.

js-unzipping

js-unzipping

Geht nur mit handelsüblichen Zip-Dateien und auch nur entpacken ist möglich. Die Originalquelle der Library ist diese, eine Readme zur Library gibts auch. Das Ganze ist vollkommen unabhängig von jQuery oder anderen JS-Libraries. Übrigens war der Initiator eine Frage auf Stackoverflow, die der gute Herr Dino Chiesa zum Anreiz genommen hat, da „mal eben was zu schreiben“ ;).

Veröffentlicht unter Javascript, Quicktips, webdev | 7 Kommentare

Systemaufrufe, Linux, Windows, Rückgabewerte und der Errorstream

Heute folgendes Problem gehabt: Es soll ein Systemaufruf an openssl ts zur Signierung von Timestamps (siehe hier) erfolgen. Das an sich ist ja erst mal noch kein Problem. Allerdings soll die geschriebene Klasse gleichermaßen unter Linux und Windows mit möglichst aussagekräftigen Fehlermeldungen zum Einsatz kommen. Jetzt ist die pikante Sache daran, dass der ts-Parameter von openssl erst ab Version 0.99 mit dabei ist, die standardmäßig unter Debian Lenny nicht mit installiert ist. Jetzt erzeugt netterweise ein Aufruf von openssl ts einen Returnwert von 0 (= alles okay), obwohl openssl den ts-Befehl in der installierten Version garnicht kennt – wir haben also keine Möglichkeit über eine Prüfung des Returnwertes alleine über Erfolg oder Misserfolg der Funktion zu entscheiden:

Veröffentlicht unter php, Quicktips, webdev, Linux | 1 Kommentar

Needle/Haystack Übersicht

Ich schreibe bald eine Klausur (so richtig auf Papier). Und da sind keine Handbücher oder Funktionsreferenzen erlaubt. Das befinde ich jetzt erstmal für großen Schwachsinn, weil es total an der Realität vorbeigeht. So. Nun habe ich mal eine kleine Übersicht erstellt, wie die Needle/Haystack-Reihenfolge bei den meistgenutzten Funktionen ist. Durch die Hilfe der IDE ist man ja nicht gezwungen, sich das merken zu müssen. Naja, beim stöbern im PHP Handbuch ist mir nun aufgefallen, dass mein Gefühl der total willkürlichen Reihenfolge gar nicht zutreffend war ;-). Wenn man sich mal ein paar PHP-Basher anhört, ist das ja auch das erste Argument. Schauen wir einfach mal:

Veröffentlicht unter php, Quicktips, webdev | 8 Kommentare