[Quicktip] mit MYSQL nach % (Prozent) suchen

Gestern stand ich vor der Aufgabe, Datensätze in der Datenbank zu finden, die ein Prozentzeichen an einer bestimmten Stelle in einem Wort hatten. Sagen wir, ich wollte nach “Wo%rt” suchen. Nun könnte man einfach ein

SELECT * FROM `test` WHERE wert LIKE 'Wo%rt'

ausführen, wird aber sehr schnell feststellen, dass das gewünschte Ergebnis bzw. der gewünschte Datensatz zwar dabei ist, aber auch alle weiteren Einträge, die mit “Wo” anfangen und mit “rt” enden – wie z.B. “Wohnort”. Das Prozentzeichen (“%”) und der Unterstrich (“_”) dienen in MySQL als Platzhalter – % für beliebig viele Zeichen beliebigen Typs und _ für ein beliebiges Zeichen.

Pfiffig wie ich war nahm ich den Standard-Escape-Character unter Unix – das Backslash (“\”), um das % zu entschärfen:

SELECT * FROM `test` WHERE wert LIKE 'Wo\%rt'

Natürlich funktionierte das so auch nicht, denn das Backslash ist eben nicht für das Escaping unter MySQL gedacht. Nach ein wenig Recherche im Netz fand ich dann heraus, dass man selbst definieren muss, was das Escape-Zeichen sein soll. Und das geht so:

SELECT * FROM `test` WHERE word LIKE 'Wo!%rt' ESCAPE '!'

In diesem Fall habe ich also das Ausrufezeichen als Escape Character definiert, man kann aber jedes andere Zeichen einsetzen – außer natürlich % und _. Man kann für jedes einzelne Like ein eigenes Escape Zeichen definieren.

Lebenslauf

Jeder gute Blog hat einen Bereich, in dem sich der Autor selbst vorstellt – man will ja schließlich wissen, mit wem man es hier zu tun hat. Da dieser Bereich bisher leicht vernachlässigt wurde freue ich mich umso mehr, endlich den entsprechenden Bereich fertig gestellt zu haben. Ihr findet den Text hier oder ihr klickt einfach rechts im Menü auf “about”. Anmerkungen und Korrekturen sind natürlich immer herzlich willkommen.

statische Code-Analyse mit dem php code sniffer

Foto von Dennis Wegner

Programmierer machen, wie jeder andere Mensch, auch Fehler. Nun gibt es zum einen Fehler in der Syntax, auf der anderen Seite gibt es die Logik-Fehler. Beide verursachen, dass ein Programm entweder gar nicht oder nicht wie erwartet funktioniert. Normalerweise kann (und muss) man diese Fehler entdecken – manchmal geht das leicht, manchmal aber auch nicht. Syntax-Fehler stellen hier den einfachsten Kandidaten dar, da diese meist schon von der verwendeten IDE erkannt werden, spätestens aber bei der Ausführung des Programms ein Fehler auftritt. Logische Fehler sind da schon etwas kniffliger, da sie rein aus Programmiersicht fehlerfrei sind. Nur die Art und Weise, wie sie ein Problem behandeln entspricht nicht dem, was der Programmierer ursprünglich vor hatte.

Zu diesen beiden Kandidaten gesellt sich aber noch eine weitere Gattung, nämlich die Art und Weise, wie Code geschrieben wird. Jeder Programmierer hat – genauso wie jeder Mensch die eigene Handschrift – einen eigenen Programmierstil. Das ist zuersteinmal nichts verwerfliches und wird weder Probleme in der Syntax noch in der Logik hervorrufen. So gesehen gibt es aus betriebswirtschaftlicher Sicht keinerlei Notwendigkeit, sich darum zu kümmern. Problematisch wird es aber dann, wenn mehrere Entwickler mit einem Projekt beschäftigt sind. Spätestens hier treffen Welten auseinander und es kann durchaus vorkommen, dass völlig korrekter Code einfach nicht mehr bzw. nur sehr schwer lesbar ist. Bei geringem Umfang stellt das nicht das große Problem dar, wenn man allerdings mit komplexen Projekten zu tun hat kann dies zu einem großen Hindernis werden. Das fiese daran ist, dass man das Problem anfangs einfach nicht erkennt. Wenn es dann auftritt, ist es meist zu spät.

Um dem Herr zu werden, setzen viele Unternehmen und Entwickler auf Coding-Standards. Dabei handelt es sich um Regeln, wie Code formatiert werden muss und welche Lösungswege nicht verwendet werden sollten. Oder eben, welche Prioritäten bestimmte Lösungswege haben. Dabei geht es z.B. um die Art und Weise, wie Klammern gesetzt werden, die Variablen formatiert werden, wie Klassen und Kontrollstrukturen (Schleifen usw.) auszusehen haben usw. Gerade große Open Source Projekte mit mehreren hundert oder gar tausend Entwicklern müssen einfach derartige Regeln definieren, da sonst reinstes Chaos entsteht. Das würde dann dazu führen, dass Code zwar sehr gut, aber aufgrund von schlechter Lesbarkeit nicht mehr wartbar wäre. Und somit leider unbrauchbar sein würde.

Ok, nun haben wir die Theorie geschafft. Nun kann man die Regeln definieren und jeder hält sich dran, aber wie es so bei den Menschen ist, unterlaufen einem Fehler, man wird faul oder man hat einfach keine Lust auf die Regeln. Die gegenseitige Kontrolle von Code mag bei kleineren Mengen noch durch Menschen machbar sein, wenn ein Projekt aber aus mehreren zehntausenden Zeilen Code besteht, ist das auch nicht mehr machbar. Und an dieser Stelle setzt man auf statische Code-Analyse. Mit den entsprechenden Tools kann man Code analysieren und anschließend anhand definierter Regeln auswerten lassen.

Eines dieser Tools, und das sagt ja schon die Überschrift, befasst sich mit der statischen Analyse von php Code und nennt sich “php code sniffer”. Das Tool ist kostenlos und kann über PEAR geladen werden:

pear install PHP_CodeSniffer-1.3.0RC2

Die Version 1.3 RC2 ist die derzeit aktuelle Version, um auf dem neusten Stand zu sein schaut doch einfach mal hier nach, welche die aktuelle Version ist.

Über die Console ist das Tool nach erfolgreicher Installation mittels “phpcs” verfügbar. Der Aufruf ist dann ganz leicht:

phpcs --standard=zend class.php

In diesem Beispiel wurde die Datei class.php auf die Coding-Standards von Zend hin überprüft. Das Ergebnis sieht dann ungefähr so aus:

FILE: /.../class.php
--------------------------------------------------------------------------------
FOUND 3 ERROR(S) AND 0 WARNING(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
1 | ERROR | End of line character is invalid; expected "\n" but found "\r\n"
9 | ERROR | Expected 0 spaces before opening brace; 2 found
11 | ERROR | Spaces must be used to indent lines; tabs are not allowed

Als kurze Erklärung: In Zeile 1 wurde ein falscher Zeilenumbruch verwendet (kann passieren, wenn man mit Windows und Linux/Unix im Wechsel am gleichen Code arbeitet), in Zeile 9 waren zwei Leerzeichen vor der öffnenden geschweiften Klammer und in Zeile 11 wurde mit Tabs an Stelle von Leerzeichen eingerückt. Die Datei an sich funktioniert tadellos, allerdings verstoßen diese Punkte eben gegen die Konventionen von Zend.

Wie ihr seht, ist es mit dem php code sniffer sehr schnell und vor allem sehr einfach möglich, euren Code auf Regeln hin zu untersuchen und Fehler dieser Art zu finden. Neben den Regeln von Zend gibt es noch einige weitere vorgefertigte Rules, die ware Stärke zeigt das Tool aber mit der Möglichkeit, eigene Regeln zu definieren. Da ich den Umfang dieses Beitrags nicht sprengen will, schaut euch doch einfach mal folgenden Beitrag auf “php hates me” an, der genauer auf dieses Thema eingeht: PHP Code Sniffer – Eigene Regeln erstellen.

Links:
php code sniffer
phphatesme.com

The Trashmaster – ein GTA IV Film

Volle Spielfilmlänge und komplett mit der GTA IV Engine hergestellt? Das ist “The Trashmaster”. Erstellt hat dieses Machinima-Werk Mathieu Weschler – und hat dafür 2 Jahre gebraucht.

Ich habe bisher nur einen Teil gesehen, muss aber sagen, dass da richtig gutes Film-Feeling aufkommt. Die Atmosphäre stimmt, was nicht zuletzt an der sehr guten Grafik des Spiels liegt.

via engadget.com

[Quicktip] Passwort als Parameter an ssh übergeben

Als Erweiterung zu [Quicktip] ssh Verbindung ohne Known-Hosts Eintrag hier noch die Möglichkeit, das Loginpasswort für einen Server an den SSH Befehl zu übergeben:

Aus Sicherheitsgründen ist es nicht möglich, Passwörter an den ssh-Befehl unter Linux/Unix zu übergeben. Damit soll verhindert werden, dass Passwörter in Scripten hardcoded werden und somit nicht mehr sicher sind. Möchte man passwortlos per Script mit anderen Servern arbeiten, gibt es noch immer die Möglichkeit, die RSA Keys zu hinterlegen.

Nun gibt es aber auch einige wenige spezielle Anwendungsfälle, in denen das Passwort nicht wirklich Sicherheitsrelevant ist, man nicht die Möglichkeit hat den RSA Key zu hinterlegen und man immer mit wechselnden Rechnern zu tun hat. Für diese seltenen Fälle kann man sich mit dem “expect” Befehl behelfen. “expect” macht folgendes: man ruft ein Programm per “expect” auf und versieht das ganze mit einem Kontrollscript. Dann kann man mit einer Art regulärer Ausdrücke nach Ausgaben eines Programmes suchen und auf diese reagieren. Im Fall von ssh sucht man nach der Ausgabe “password:”. Findet expect dieses, soll es einen vorgegebenen Wert einsetzen und mittels Enter bestätigen. Wenn man nun noch ein bisschen Bash-Magie betreibt kommt dieses Script heraus.

Der Aufruf läuft dann so:

./sshlogin.exp password 192.168.1.11 who

In dieser Variante wird immer der Benutzer root verwendet, man kann das Script aber einfach noch um einen weiteren Parameter erweitern, schon ist der Benutzername auch variabel.

Und was war mein Anwendungsfall? Darüber gibt es demnächst einen Artikel… 😉

Links:
bash.cyberciti.biz

Mafia II – Review

Auch wenn ich in der letzten Zeit viel zu tun hatte und eher vom Stress geplagt war, so habe ich doch immer versucht, wenigstens am Wochenende ein bisschen vor der Xbox360 zu sitzen. Nachdem ich vor kurzem die GTA IV Reihe durchgespielt hatte, war nun die Suche nach neuem Futter angesagt. Durch einen sehr lukrativen Deal fiel mir Mafia 2 in die Hände. Und das war gut so.

Mein erster Gedanke bei dem Spiel war: GTA IV in den 60er Jahren. Ich hatte noch vage Erinnerungen an den ersten Teil, den ich aber leider nicht ganz durchgespielt hatte (Notiz für mich: nachholen!). Und der hatte mich echt begeistert. Sowohl grafisch als auch, und das vor allem, die Story. Die Erwartungen waren also groß, und ich muss sagen, dass sie vollends erfüllt wurden. Bei Mafia 2 handelt es sich eben nicht um einen GTA Klon, es ist ein völlig anderes Spiel. Leider bietet es nicht so viele Freiheiten wie das große Vorbild. Dafür aber eine sehr spannende und dichte Story.

Die Geschichte beginnt mit einer Videosequenz, die die Kindheit und Jugend von Vito Scaletta, der Spielfigur, erzählt. Man sieht, wie er auf die schiefe Bahn gerät und zwischen die Alternative Militär oder Knast gestellt wird. Und so beginnt man in der alten Heimat – natürlich Italien – für die Amerikaner im 2. Weltkrieg zu kämpfen. Nachdem man verwundet wurde gibt’s einen Heimaturlaub und man trifft auf seinen alten Kumpanen Joe, der bereits für die Mafia tätig ist und dafür sorgt, dass man nicht mehr zurück an die Front muss. Die Geschichte vollführt noch ein paar Zeitsprünge und so spielt man sowohl in den 40er Jahren als dann auch in den 60er Jahren.

Während dieser Zeitsprünge ändern sich sowohl die Fahrzeuge, die Musik als auch natürlich die Kleidung der Leute und das Erscheinungsbild der Stadt. So habe ich das noch nie in einem Spiel gesehen. Und ich muss sagen, dass dies alles zu der sehr dichten Atmosphäre beiträgt.

Wo wie gerade bei Autos sind: Die Fahrphysik ist sehr gut gelungen. Im Allgemeinen ist die Steuerung sehr gut, einzig, dass man innerhalb von Gebäuden nicht rennen kann ist irgendwie komisch – aber sicher zu verkraften. Schusswechsel, die sehr häufig vorkommen, sind auch gut spielbar, allerdings ist die KI der Gegner schon sehr einfach gehalten: man zielt einfach auf die Deckung und wartet, bis der Gegner dahinter hervorkommt, um zu schießen. Ab diesem Zeitpunkt ist es ein leichtes, ihn auszuschalten. Hinzu kommt, dass man auf ein sehr einfaches Deckungssystem zurückgreifen kann, was einen in brenzligen Situationen immer wieder hilft. Man hat zwar wie in GTA einen Gesundheitsbalken, in Mafia 2 füllt sich dieser aber nach kurzer Zeit wieder bis auf 3/4 auf, wenn man verletzt wurde. Wenn man allerdings nicht rechtzeitig in Deckung kommt stirbt man und beginnt am letzten automatischen Speicherpunkt. Die Waffen sind teilweise etwas schlecht ausbalanciert – die Schrotflinte z.B. haut jeden Gegner auch noch in gefühlten 30m Entfernung um. Das macht sie sehr effektiv, allerdings haben auch einige Gegner eine Schrotflinte, was den Schwierigkeitsgrad ungemein erhöht.

Richtig eingeschlagen hat für mich die Grafik. Sowohl das verschneite als auch das sonnige Empire Bay sehen einfach nur Klasse aus. Wenn man auf Details schaut, wie ich das ab und zu mache, dann sieht man, dass sogar in der Felge des Reserve-Rades am Heck der Autos die Umgebung reflektiert wird. Krass! Die Animation der Menschen, Regen, Schnee usw. sieht einfach alles super aus. Nur die Qualmwolken bei Burnouts sehen ein bisschen komisch aus – man sieht sehr deutlich dass es sich um Sprites handelt.

Wie anfangs erwähnt hat man nichtmal ansatzweise die Freiheiten wie in GTA IV. Da kann man, wenn man möchte, den ganzen Tag in der Stadt herumfahren und Taxifahrer spielen. In Mafia 2 kann man sich zwar auch frei durch die Stadt bewegen, allerdings hat man immer nur eine nächste Mission. Die Story läuft also linear, und man hat auch keine freie Entscheidung, wie sich die Story entwickeln soll. Ich muss sagen, dass ich das während des Spiels so gar nicht realisiert habe. Wirklich aufgefallen ist es mir nach dem wirklich sehr abrupten Ende der Story. Denn danach ist auch das Spiel vorbei und man hat keine Möglichkeit, sich anschließend frei in der Stadt zu bewegen.

Während des Spiels kann man 50 Playboyheftchen einsammeln, welche dann schöne Nacktbilder in der Sammlung ergibt. Allerdings muss man die Zeitungen in bestimmten Abschnitten des Spiels finden, danach sind sie nämlich weg. Es gibt bei der Gamestar eine Anleitung, wie man alle Hefte findet. Parallel zu den Heftchen gibt es noch 159 Fahndungsplakate zu entdecken – ich hab kein einziges gesehen.

Mein Fazit: Mafia 2 ist ein sehr gelungenes Spiel mit sehr guter Grafik, aber es ist noch ausbaufähig. Mit ca. 13-15 Stunden Spielzeit für Durchschnittsspieler ist es zwar nicht, was das Preis-Leistungsverhältnis angeht, mit einem Klassiker wie Half Life vergleichbar, aber es bietet solide und spannende Kost.