php – Regular Expression Schnipsel – Escaping “/”

Hier ein kleines Beispiel wie man die Lesbarkeit von RegEx durch den Delimiter  “#” verbessern kann … ;)

$zeichenkette = "suckup.de Informationen / test, lall / Linux / lall123";
#$suchmuster = "/^[^\/]*\/[^\/]*\/[^\/]*\/[^\/]/";
$suchmuster = "#^[^/]*/[^/]*/[^/]*/[^/]#";
preg_match($suchmuster, $zeichenkette, $treffer);
print_r($treffer);

 

Ausgabe:

Array ( [0] => suckup.de Informationen / test, lall / Linux / )

UTF-8 Byte Order Mark (BOM) in php-Dateien …

for Linux (shell):

 

BOM aus allen PHP-Dateien entfernen:

find . -type f -iname "*.php" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;

 

PHP-Dateien mit BOM anzeigen:

find . -type f -iname "*.php" -exec grep -l $'\xEF\xBB\xBF' {} \;

 

mehr Infos:

sed – suckup.de/linux/streameditor-sed

find – suckup.de/linux/find-linux

Byte Order Mark – http://de.wikipedia.org/wiki/Byte_Order_Mark

php – Regular Expression Schnipsel – Links aus -Tags

Habe zu dem Thema (“Reguläre Ausdrücke”) bereits ausführlicher geschrieben -> http://suckup.de/howto/php-howto/php-sicherheit-erhoehen-teil-2/ <- daher folgt hier einfach ein Beispiel, welches man sicherlich noch optimieren kann … :)

<?php
$lall =' lall lall123
<a style="gfsedfd;" href="http://test1.de">test
<a style="gfsedfd;" href="test2.php" target="_blank>test</a> dsadsa
<a style="gfsedfd;" href="http://test3.de" target="_blank>test</a>
dsads
';

$lall = str_ireplace("\r", '', $lall);
$lall = str_ireplace("\n", '', $lall);
$lall = str_ireplace("\t", '', $lall);
preg_match_all('/<a [^>].*href="(.*)".*>/i', $lall, $lall_new);
$allLinks = explode("</a>", $lall_new[0][0]);
foreach ($allLinks as $key => $val) {
  $val = trim($val);
  if ($val != '') {
    $data =preg_replace('/.*<a [^>].*href\s*=\s*(["\'])(.*?)\1.*>.*/i',"$2",$val);
    echo $data . "\n";
  }
}
?>
php testtest.php

http://test1.de
test2.php
http://test3.de

PHP-Sicherheit erhöhen – Teil 2

Kein Programm ist 100% sicher, aber wir wollen es potenziellen Angreifern auch nicht zu leicht machen, daher folgen ein paar Grundlegende Regeln zur Sicherheit von PHP. Ich gehe hier davon aus, dass die installierte PHP-Version auf dem aktuellen Stand ist und somit weniger Angriffsfläche bietet. -> PHP-Sicherheit erhöhen – Teil 1

1.) “register_globals” sollten deaktiviert sein!!!

Falls diese Option aktiv ist, ist das Überschreiben lokaler Variablen via GET / POST möglich z.B.:

test.php:
———

<?php 
if (!isset($test))
{
  $test = 1;
}
echo 'Der Wert von test ist: '.$test;
?>

Browser:
——–
…/test.php?test=2

Ab PHP 4.2 ist diese Option (php.ini -> register_globals = Off) jedoch bereits standardmäßig auf “Off” gesetzt.

 

2.) “Type Casting” verwenden

Casting bedeutet so viel wie Umwandeln einer Variable in einen bestimmten Type z.B. wird aus “123z” -> “123” wenn wir dies zu einer Ganzzahl (int) casten. z.B.

test.php:
———

<?php 
$zahl = (int)$_GET['zahl'];
?>

Browser:
——–
…/test.php?zahl=123z

php.net:
——–
Type Casting -> http://de2.php.net/manual/de/language.types.type-juggling.php

 

3.) Variablen prüfen

Allgemein kann man prüfen, ob die Variablen überhaupt vorhanden/gesetzt sind.

test.php:
———

<?php 
if (empty($_GET['zahl']) { [...]
if (!isset(($_GET['zahl']) { [...]
if (!$_GET['zahl']) { [...] // Warnung ("Notice") falls "error_reporting(E_ALL)" und die Variable nicht definiert wurde

php.net:
——–
empty() -> http://php.net/manual/de/function.empty.php
isset() -> http://php.net/manual/de/function.isset.php

 

4.) Variablen “Type” prüfen

test.php:
———

<?php 
if (gettype($_GET['zahl']) == "integer") { $zahl = $_GET['zahl']; }
else { $zahl = (int) $_GET['zahl']; }
?>

Alternative: if (is_int($_GET[‘zahl’])) { […]

 

5.) “Ctype” Funktionen

Es gibt noch weitere php-Module z.B. “ctype” mit denen sich Variablen überprüfen lassen, ich will jedoch als nächstes einen allgemein gültigen Ansatz via “regulären Ausdrücken” zeigen.

php.net:
——–
http://de2.php.net/manual/de/ref.ctype.php
    
    

6.) Variablen prüfen / zuschneiden via “regulären Ausdrücke”

Reguläre Ausdrücke sind Muster, mit denen Zeichenketten beschrieben werden könnten!

Wer die Syntax noch nicht im Kopf hat sollte sich einmal “The Regex Coach” anschauen -> http://weitz.de/regex-coach/

The Regex Coach
The Regex Coach

 

Zusammenfassung:
—————-

[abc] -> a oder b oder c
[^abc] -> nicht a oder b oder c
[a-z] -> von a bis z -> alle Kleinbuchstaben
[A-Z] -> von A bis Z -> alle Großbuchstaben
[a-zA-Z] -> Buchstaben

[0-9] -> von 0 bis 9 -> Ziffern
\d -> von 0 bis 9 -> Ziffern
\D -> keine Ziffer

[a-zA-Z0-9_] -> Buchstaben, Ziffern, Unterstrich
\w -> Buchstaben, Ziffern, Unterstrich
\W -> keine Buchstaben, Ziffern, Unterstrich

[\r\n\t\f]] -> Wagenrücklauf, New Line, Tabulatur, Seitenwechsel -> Leerzeichen
\s -> Leerzeichen
\S -> keine Leerzeichen

\b -> Wortanfang bzw. Wortende z.B. “/\bWort\b/”
\B -> kein Wortanfang bzw. Wortende z.B. “/\BWort\B/”

. -> ein beliebiges Zeichen (Punkt)

x{m} -> “x” muss genau “m”-Mal vorkommen
x{m,} -> “x” muss min. “m”-Mal vorkommen (Ende offen)
x{,n} -> “x” darf max. “n”-Mal vorkommen (Anfang offen)
x{m,n} -> “x” muss zwischen “m”- und “n”-Mal vorkommen
x? -> “x” kann, muss aber nicht an dieser Stelle vorkommen => x{0,1}
x* -> “x” kann kein, ein oder mehrmals an dieser Stelle vorkommen => x{0,}
x+ -> “x” kann ein oder mehrmals an dieser Stelle vorkommen => x{1,}

^ -> markiert den Beginn einer Zeichenkette
$ -> markiert das Ende einer Zeichenkette

| -> Alternative z.B. “/ae|a/”

\ -> Maskierung (Escape-Zeichen) für z.B. einen Punkt “\.”

[] -> Zusammenfassung von Mustern

() -> Zusammenfassung von Mustern + selektieren und an PHP zurückgeben

 
6.1) ein Beispiel

test.php:
———

<?php 
if((!empty($_GET['Text'])) && (preg_match("/^(T|t)est(ing*){0,1}$/",$_GET['Text'])))
{
    $variable = "OK";
} else {
    $variable = "nicht OK";
}
echo 'Der Wert ist '.$variable;
?>

Browser:
——–
…/test.php?Text=Test -> OK -> (T|t)est
…/test.php?Text=test -> OK -> test(ing){0,1} = test(ing)?
…/test.php?Text=testing -> OK -> test(ing){0,1} = test(ing)?
…/test.php?testinggggg -> OK -> g*

 

6.2) noch ein Beispiel

Hier sind nur Zahlen zugelassen …

test.php:
———

<?php 
if((!empty($_GET['Text'])) && (preg_match("/^\d+([\.,]\d+)?$/",$_GET['Text'])))
{
    $variable = "OK";
} else {
    $variable = "nicht OK";
}
echo 'Der Wert ist '.$variable;
?>

Info:
—–
/^\d+([\.,]\d+)?$/ -> ist gleich -> /^[0-9]{1,}([\.,][0-9]{1,})?$/

Browser:
——–
…/test.php?Text=1 -> OK -> [0-9]{1,}
…/test.php?Text=123456789 -> OK -> [0-9]{1,}
…/test.php?Text=1.9 -> OK -> [0-9][\.,][0-9]
…/test.php?Text=123.789 -> OK -> [0-9]{1,}[\.,][0-9]{1,}
…/test.php?Text=123,789 -> OK -> [0-9]{1,}[\.,][0-9]{1,}

 

6.3) und noch ein Beispiel

Hier schneiden wir einen Teil aus einen String aus und geben diesen aus …

test.php:
———

<?php 
$imagemap = "<map id=\"imgmap201111415460\" name=\"imgmap201111415460\"><area shape=\"rect\" alt=\"\" title=\"\" coords=\"151,58,221,148\" href=\"\" target=\"\" /></map>";

$imagemap_name = preg_replace(‘/^<map(.+)name=\”(.+)\”><area(.+)/i’, “$2”, $imagemap);

echo ‘Imagemap-Name: ‘.$imagemap_name;
?>

Ausgabe => Imagemap-Name: imgmap201111415460

Info:
—–
(.+) -> ist gleich -> (.{1,})

 

php.net:
——–
http://de3.php.net/manual/de/function.preg-replace.php

 

7.) Maskieren von Strings zur Nutzung in Datenbanken

Sobald Daten in einer Datenbank gespeichert werden, sollte man diese via “mysql_real_escape_string” bzw. “mysqli_real_escape_string” maskieren, so dass “SQL Injection Angriffe” verhindert werden.

 

php.net:
——–
http://php.net/manual/de/function.mysql-real-escape-string.php

 

8.) Ein-Weg-Verschlüsselung

Bei der Ein-Weg-Verschlüsselung wird nicht die original Eingabe, sondern ein Hash-Wert davon gespeichert z.B. md5

test.php:
———

<?php $passwort = 'mein_Pwd';
echo md5($passwort); ?>

Ausgabe: b4e28e9d7dbf6d41d6e609b3eb46fac4

Das Problem ist jedoch, dass man diese Verschlüsselung via “Brute-Force-Attacke” erraten bzw. in einer “bösen”-Datenbank ;) mit vielen Kombinationen aus md5-hash und original-Wert auslesen kann.
Daher kann man z.B. auch sha1() anstelle von md5() nutzen, was zwar den Zeitaufwand bei “Brute-Force-Attacke” erhöht, jedoch nicht die Schwachstellen der Ein-Weg-Verschlüsselung behebt.

 

php.net:
——–
http://de.php.net/manual/de/function.md5.php
http://de.php.net/manual/de/function.sha1.php

 

9.) Zwei-Wege-Verschlüsselung

Bei der Zwei-Wege-Verschlüsselung werden Daten über einen Schlüssel verschlüsselt, so dass diese auch wieder entschlüsselt werden können.

test.php:
———

<?php 
function encryptData($value){
$key = "top secret key";
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv);
return $crypttext;
}

function decryptData($value){
$key = “top secret key”;
$crypttext = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}

$test = encryptData(“Dies ist ein TEST!!!”);

echo $test;
echo “<br><br>”;
echo decryptData($test);
?>

 

Algorithmus:
————
-> MCRYPT_BLOWFISH (blowfish)
-> MCRYPT_TRIPLEDES (tripledes)
-> MCRYPT_RJINDAEL_256 (rjindael-256)
-> MCRYPT_CAST_256 (cast-256)

 

Modus:
——
-> MCRYPT_MODE_ECB (electronic codebook): für kurze Zeichenketten
-> MCRYPT_MODE_CBC (cipher block chaining): zur Dateiverschlüsselung
-> MCRYPT_MODE_CFB (cipher feedback): für Byteströme, mit Verschlüsselung einzelner Bytes
-> […]

 

php.net:
——–
http://php.net/manual/de/function.mcrypt-encrypt.php

 

Unter MySQL ist die “Zwei-Wege-Verschlüsselung” einfacher zu handhaben, es gibt nur zwei Alternativen

– AES (Advanced Encryption Standard)
– DES: TripleDES

z.B.:
AES_DECRYPT(verschluesselt,schluessel)
AES_ENCRYPT(text,schluessel)

 

dev.mysql.com:
————–
http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

 

10.) SSL (Secure Socket Layer)

Da das HTTP-Protokoll Daten plain (unverschlüsselt) überträgt, ist eine SSL- bzw. HTTPS-Verschlüsselung immer dann sinnvoll, wenn sensible Daten übertragen werden. So können die Daten beim Transport über das Internet nicht von dritten mitgelesen (Sniffing) werden.

 

11.) Cross-Site-Scripting (XSS)

Es geht darum Code auszuführen, der von einer fremden Webseite, in die aktuelle Webseite eingeschleust wird. Es ist ein Oberbrgriff für unterschiedliche Arten (serverseitiges & clientseitiges Cross-Site-Scripting) von Angriffen.

 

wikipedia.org:
————–
http://de.wikipedia.org/wiki/Cross-Site-Scripting

 

11.1) Serverseitiges Cross-Site-Scripting

Hier wird der “böse” Code direkt auf dem Server der angegriffenen Webseite ausgeführt (z.B.: von PHP) …

… es folgt ein sehr schwerwiegender Programmierfehler, eine include & GET kombination, um serverseitiges XSS zu demonstrieren.

 

test.php:
———

<?php 
inculde($_GET['skript'];
// etc.
...
?>

Info: Clientseitiges Cross-Site-Scripting -> Hier wird der “böse” Code via Browser-Technologien (z.B. via JavaScript, ActiveX …) eingeschleust.

 

11.2) SQL Injection

 

wikipedia.org:
————–
http://de.wikipedia.org/wiki/SQL-Injection

 

Auch dies ist eine Art des serverseitiges Cross-Site-Scriptings und das Ziel des Angreifers ist die Datenbank.

 

test.php:
———

<?php 
[...]
$sql = "SELECT * FROM tabelle WHERE id=" . $id;
[...]
?>

Wenn die Variable die nun per GET, POST oder Cookie überschrieben werden kann, wird eine neue SQL-Query an die Datenbank gesendet. Dabei wird die Tatsache ausgenutzt, dass man mehrere SQL-Befehle mit
Simikolon getrennt, ausführen kann.

Gegenmaßnahmen:

-> Anführungsstriche verwenden

Anführungsstriche werden dazu verwendet um Variablen in SQL-Queries zu benutzen.

 

test.php:
———

[...] SELECT * FROM xyz WHERE id = '$Test' [...]

 

Ein Angreifer, der $Test verändert kann nicht aus den Anführungsstrichen ausbrechen, sloange $Test geparst wurde und alle ‘ mit \’ maskiert sind.
Es gibt jedoch noch weitere Möglichkeiten um sich vor solchen Angriffen zu schützen.

 

-> Keine Strings in numerischen Variablen zulassen

Die Funktion settype wandelt Variablen (var) in einen Integer (int) um:

 

test.php:
———

[...]
settype($Variable, 'integer');
[...]

 

php.net:
——–
settype -> http://www.php.net/manual/de/function.settype.php

 

-> Datenbankverbindungen mit eingeschränkten Rechten

Gehe sparsam mit der Rechtevergabe an die Web (User) um, so dass im Notfall nicht die komplette Datenbank (DROP DATABASE name) betroffen ist. ;)

 

-> Werte maskieren

Mit der Funktion mysql(i)_real_escape_string bietet PHP eine einfache Möglichkeit SQL-Befehle zu maskieren.

Hinweis: Neben dem Semikolon ist auch ein doppelter Bindestrich (Kommentar in MySQL) dazu geeignet SQL-Kommandos nach dem eingeschleusten Code abzubrechen.

 

Zusammenfassung: Wenn man generell Anführungszeichen in den SQL-Kommandos benutzt und Variablen immer maskiert, würde dies zirka wie folgt aussehen…

 

test.php:
———

[...] 
if (!isset($_GET['id'])) { $id = 0; }
else { $id = $_GET['id']; }

if (gettype($id) == “integer”) { $zahl = $id; }
else { $zahl = settype($id, ‘integer’); }

$sql = “SELECT * FROM tabelle
WHERE id='” . mysqli_real_escape_string($zahl) . “‘
AND user=’test’
“;
[…]

Rewrite-Rules: Apache vs Nginx

Bei dem Apache Webserver wird das URL-Handling (Rewrite-Rules) via .htaccess gesteuert, sobald sich eine Datei mit diesem Namen in einem Verzeichnis befindet, werden die darin enthaltenen Befehle vom Apache umgesetzt. Da dieses Verfahren jedoch voraussetzt, dass alle Verzeichnisse zuvor auf eine solche Datei geprüft, diese anschließend eingelesen und verarbeitet werden muss, macht es Sinn wie z.B. beim Nginx Webserver diese in die Konfiguration des Webs aufzunehmen. Leider ist die Syntax und Logik dieser beiden Rewrite-Rules nicht kompatibel, daher folgt eine Einführung in dieses Thema … außerdem habe ich auf github.com/voku/ meine kompletten Konfigurationsdaten für Nginx + PHP + MySQL hochgeladen.

 

Erklärung: einfache Weiterleitung

 

Apa­che:

Redirect /altes_Verzeichnis/alte_Seite.html http://suckup.de/

 

Nginx: 

rewrite /altes_Verzeichnis/alte_Seite.html http://suckup.de/ last;

 

Falls “/altes_Verzeichnis/alte_Seite.html” hinter deiner Domain in der URL steht, wird die Anfrage auf die Domain “meine_domain.de” umgeleitet.

z.B. http://suckup.de/altes_Verzeichnis/alte_Seite.html

 

Erklärung: Domain Weiterleitung

 

Apa­che:

RewriteCond %{HTTP_HOST} ^voku-online.de$ [NC]
RewriteRule ^(.*)$ http://www.suckup.de/$1 [R=301,L]

 

%{HTTP_HOST} -> Hostname

 

Nginx: 

if ($host ~* voku-online.de) {
rewrite ^(.*)$ http://suckup.de$1 permanent;
}

 

Fall der Hostname “voku-online.de” ist, dann wird dieser zu “suckup.de” umgeschrieben und alles was hinter der ursprünglichen Hostnamen stand, wird hinter den neuen gesetzt. 

^ -> Anfang 

.* -> “.” ein beliebiges Zeichen, “*” Wiederholung => alle beliebigen Zeichen

( ) -> erstes Vorkommen der einfachen Klammern wird zur ersten Variable $1 … u.s.w.

$ -> Ende

z.B. http://voku-online.de/altes_Verzeichnis/alte_Seite.html

 

Erklärung: entferne doppelte “/”

 

Apa­che:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

 

 %{REQUEST_URI} -> URL ohne Parameter

 ( ) -> erstes Vorkommen der einfachen Klammern in der “RewriteCond”-Bedingung wird zur ersten Variable %1 … u.s.w.

 

Nginx: 
if ($request_uri ~* “\/\/”) {
rewrite ^(.*)$ $scheme://$host$1 permanent;
}

 

\/ -> Escapezeichen “\” vor “/”

$scheme -> http bzw. https

$host -> Hostname

permanent -> gibt den Statuscode 301 zurück

 

Erklärung: statische Dateien (.css/.js/.html) beschleunigen

 

Nginx:

## static files are served directly
location ~* \.(?:js|css|htm?|js\?ver.*|css\?ver.*)$ {
        set $betterForCache  0;

        if ($args ~* ver=(.*)$) {
                set $betterForCache  1;
        }
        if ($request_uri ~* “/wp-admin”) {
                set $betterForCache  0;
        }
        if ($betterForCache = 1) {
                rewrite ^(.*) $scheme://$host$uri? last;
        }

        gzip_static on;

        autoindex off;
        expires 1d;
        add_header Pragma public;
        # We bypass all delays in the post-check and pre-check parameters of Cache-Control. Both set to 0.
        add_header Pragma public;
        add_header Cache-Control “public, must-revalidate, proxy-revalidate, post-check=0, pre-check=0”;
        ## No need to bleed constant updates. Send the all shebang in one
        ## fell swoop.
        tcp_nodelay off;
        ## Set the OS file cache.
        open_file_cache max=3000 inactive=120s;
        open_file_cache_valid 45s;
        open_file_cache_min_uses 2;
        open_file_cache_errors off;
        break;
}

Verschachtelte if-Abfragen kann man einfach via Hilfsvariablen (z.B. $betterForCache) erstellen …

$uri -> URL ohne Parameter

z.B.: http://suckup.de/wp-content/themes/mystique/css/core.css?ver=3.3.2

 

weitere Infos:

– Nginx & HttpRewriteModule:  http://wiki.nginx.org/HttpRewriteModule

– Apache & mod_rewrite: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

– Beispiel-Konfiguration (WordPress Multi: Nginx + PHP-FPM): https://github.com/voku/CONFIG–nginx—php-fpm—mysql

Scrollen via jQuery

Hier ein kurzes Beispiel, wie man via jQuery die Position eines Elements herausfindet und automatisch an diese Stelle scrollen kann. Wer sich noch nicht so gut mit jQuery- / CSS-Selektoren auskennt, sollte sich einmal folgenden Beitrag durchlesen. -> http://suckup.de/howto/jquery/crashkurs-jquery-selektoren/

 

.scrollTop() -> gibt die Scrollbar Position eines bestimmten Elements zurück 

.scroll() -> wird ausgeführt, wenn gescrollt wird (event handler)

.animate() -> erzeugt animations Effekte via numerischer CSS-Einstellungen

.offset() -> gibt die Koordinaten (x,y) eines Elements zurück 

.height() -> gibt die Höhe eines Elements zurück

 

Beispiel: jQuery_scroll.html

 

onClick=”$(‘#box’).show(); $(‘html,body’).stop(true,true); var target = $(‘#box’); var bottom = target.offset().top+target.height()-250; $(‘html,body’).animate({scrollTop: bottom}, 500); return false;”

 

-> bei “Klick” [onClick] 

    -> zeige das Element mit der ID “box” [#box] an

        -> halte alle Animationen an [stop(true,true)]

          -> die Höhe des Elements auf den x-Koordinate daraufrechnen [offset().top+target.height()]

            -> zu der neuen Koordinate des Elements scrollen [animate({scrollTop: bottom}, 500)]

 

MySQL: Zahl in Datum umwandeln

Falls jemand mal z.B. einen Int-Wert in ein Datum umwandeln muss, kann “CONVERT” bzw. “CAST” weiterhelfen. Auch wenn man eigentlich die Datenbank im Vorhinein so gestalten sollte, dass “date” / “datetime” / … / als Datentyp verwendet wird. ;)

 

Beispiel-Datenbank:

CREATE TABLE `lall` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`IntDate` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `lall` VALUES (1,201001);
INSERT INTO `lall` VALUES (2,201002);
INSERT INTO `lall` VALUES (3,201003);
INSERT INTO `lall` VALUES (4,0);
INSERT INTO `lall` VALUES (5,201011);
INSERT INTO `lall` VALUES (6,201012);
INSERT INTO `lall` VALUES (7,201205);

SQL:

SELECT * FROM lall
WHERE ((CONVERT(CONCAT(IntDate, '01'), datetime))>NOW() - INTERVAL 12 MONTH OR IntDate=0)

< – dieses SELECT-Statement zeigt alle Datensätze an, welche nicht älter als 12 Monate sind oder als (int) Datum “0” eingetragen haben.

CONVERT -> http://dev.mysql.com/doc/refman/5.1/de/charset-convert.html
CONCAT -> http://dev.mysql.com/doc/refman/5.1/de/string-functions.html#id571625
NOW -> http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html#id586485

Cross-Compiling Android Kernel – Samsung GalaxyS2

Das GalaxyS2 läuft ziemlich gut mit dem neuen nightly-builds von CM9 (Android 4.0.4) & den neusten Google-Apps & dem SiyahKernel.

Ich möchte hier kurz erklären, wie du einen Kernel für das Samsung S2 (CM9) auf Basis vom SiyahKernel kompilierst. :) 

 

1.) Installiere Linux + Cross-Compiler 

Als erstes solltest du Linux bereits installiert haben (z.B. Ubuntu, Debian …) ggf. einfach auf einen virtuellen PC z.B. via VirtualBox. Für Ubuntu gibt es bereits ab Werk GCC für ARM, bei Debian habe ich bisher folgende Paket-Quellen ( /etc/apt/sources.list ) mit aufgenommen und anschließend gcc-4.6-arm installiert, jedoch bisher nur mit Debian *sid* getestet.

deb http://www.emdebian.org/debian/ unstable main

Install:

sudo apt-get install build-essential git gcc-4.5-arm-linux-gnueabi wget libncurses5-dev

 

2.) Download der Quellen via github

Fork via github die Quellen welche du kompilieren möchtest und lade deine eigenen “Sources” herunter, um später ggf. “Pull Requests” zu stellen. Daher musst du bei den folgenden Befehlen “voku” durch deinen eigenen User-Namen bei github ersetzen.

 mkdir -p ~/sgs2/kernel/

cd ~/sgs2/kernel/

git clone https://github.com/voku/siyahkernel3

git clone https://github.com/voku/initramfs3

PS: “~” (tilde) = home-Verzeichnis -> info

Falls du nun einen anderen Cross-Compiler installiert hast als ich, musst du in der Datei (build_kernel.sh) die CROSS_COMPILE Variable anpassen. (whereis – locate the binary, source, and manual page files for a command)

cd ~/sgs2/kernel/siyahkernel3

./build_kernel.sh

 

Sobald der Kernel kompiliert wurde findest du folgende Datei “zImage”, welche wiederum der Kernel selber ist. ;)

 

PS: hier meine Version kompiliert mit gcc-4.6 & -Ofast & neuem Tweak-Script ->  http://samdroid.voku-online.de/index.php?action=list&dir=SGS2&order=name&srt=yes

 

Tipps: 

– CyanogenMod 9 Flashen -> AOSP 4.0.4 Cyanogen (mod) 9 Flash Anleitung

– keine Angst vor git -> man braucht meistens nur ein paar Befehle -> “git pull” & “git  push” & “git add –all” 

– git? -> http://rogerdudler.github.com/git-guide/index.de.html 

– Kernel-Config -> ~/sgs2/kernel/siyahkernel3/arch/arm/configs/siyah_defconfig 

– Tweak Skript ->  ~/sgs2/kernel/initramfs3/sbin/ext/thunderbolt.sh

– Makefile ->  ~/sgs2/kernel/siyahkernel3/Makefile 

C-Programm & Cflags

Ich habe vor einiger Zeit das Prinzip von Makefiles anhand eines kleines Beispiels gezeigt -> http://suckup.de/howto/c/c-programm-primzahlen-makefiles/ <- den selben Quelltext kompilieren wir heute mit verschiedenen C-Flags und 1000000 Schleifendurchläufen …

 

1.)  ohne C-Flags

gcc -lm primzahlen.c -o primzahlen_slow

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.760s
user 0m1.420s
sys 0m0.164s

 

2.)  ohne C-Flags & ohne “math.h” (sqrt)

gcc primzahlen.c -o primzahlen_slow

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.407s
user 0m0.988s
sys 0m0.192s

 

3.)  -O2 & ohne “math.h” (sqrt)

gcc -O2 primzahlen.c -o primzahlen_2

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.405s
user 0m0.976s
sys 0m0.188s

 

4.) -Ofast (http://gcc.gnu.org/gcc-4.6/changes.html) & ohne “math.h” (sqrt)

gcc -Ofast primzahlen.c -o primzahlen_fast

 

Output: time ./primzahlen_fast

[...]

999961
999979
999983

real 0m1.377s
user 0m0.980s
sys 0m0.180s

 

5.) -Ofast + amdfam10 (http://en.gentoo-wiki.com/wiki/Safe_Cflags/AMD#Athlon_X2_7x50.2C_Phenom_X3.2FX4.2C_Phenom_II.2C_Athlon_II_X2.2FX3.2FX4

Ein paar spezielle CFlags für meine CPU. :) (cat /proc/cpuinfo)

gcc -Ofast -funsafe-math-optimizations -funsafe-loop-optimizations -m64 -mtune=amdfam10 -mabm -msse4a -floop-parallelize-all -ftree-parallelize-loops=4 -floop-strip-mine -floop-block -funroll-all-loops -fbranch-target-load-optimize -lm primzahlen.c -o primzahlen_fast

 

Output: time ./primzahlen_fast

[...]

999961
999979
999983

real 0m1.327s
user 0m0.944s
sys 0m0.172s

 

Fazit: 

Sobald ich -O1, -O2, -O3 oder -Ofast bei diesem kleinen Beispiel nutze ist der Geschwindigkeitsunterschied minimal und es ist egal, ob vorgefertigte mathematische Funktionen genutzt werden oder nicht.

Google Chrome App für Android 4

Gerade bei Twitter gelesen: “Google veröffentlicht Chrome für Android“. Leider ist die neue Google Chrome App nur für Android 4.0 “Ice Cream Sandwich” und für bestimmte Länder verfügbar… aber da ich seit einigen Wochen ein Galaxy S2 mit CyanogenMod9 nutze, ist das kein Problem für mich. ;)   

Google veröffentlicht Chrome für Android
Google veröffentlicht Chrome für Android
Google Chrome für Android Beta ist da - Alle Infos
Google Chrome für Android Beta ist da - Alle Infos

 

 

 

 

 

 

 

 

 

Tabs: geöffnete Tabs vom PC können auf’s Smartphone übertragen werden, zudem kann man zwischen den Tabs sehr einfach Navigieren und bereits geöffnete Tabs werden auf Chrome-Startseite angezeigt

Google_Chrome_Tabs
Google_Chrome_Tabs

 

Chrome + Google Suche: natürlich ist die Google Suche direkt in der URL integriert 

Chrome_Google
Chrome_Google

 

Synchronisieren: Lesezeichen synchronisieren, an Google Diensten (z.B. Google Mail) automatisch anmelden, automatisch Formular Vervollständigung … 

Chrome_Google_Synchronisieren
Chrome_Google_Synchronisieren

 

Entwickler: via adb kann man die Webseite direkt vom Computer aufrufen und so anzeigen lassen, wie diese auch auf dem Smartphone angezeigt wird. Wer nicht weiß was “adb” ist, kann dies hier nachlesen -> http://suckup.de/windows/android-debug-bridge-adb-howto/

Chrome_App_Develop
Chrome_App_Develop

 

mehr Infos: http://www.google.com/intl/de/chrome/android/features.html