30.Jan 2007
C-Funktionen mit PHP
Um in PHP C-Funktionen nutzen zu können, muss man diese in einer eigenen Extension verpacken. Dann können diese wie normale Funktionen aufgerufen werden. Dieser Weg ist etwas aufwendiger als in Python.
// myExt.c
#include "php.h"
PHP_FUNCTION(fibonacci)
{
int n;
if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC,
"l|l", &n ) == FAILURE )
RETURN_NULL();
RETURN_LONG(fibonacci(n));
}
int fibonacci( int n )
{
if( n > 2 )
return fibonacci( n - 1 ) + fibonacci( n - 2 );
else
return 1;
}
static function_entry myExt_functions[] = {
PHP_FE(fibonacci, NULL)
{ NULL, NULL, NULL }
};
zend_module_entry myExt_module_entry = {
STANDARD_MODULE_HEADER,
"myExt", // Name der Extension
myExt_functions,
NULL, NULL, NULL, NULL, NULL,
"1.0", // Version
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(myExt)
Übersetzt wird die Extension mit den Kommandos
gcc -fpic -c `php-config --includes` myExt.c
gcc -shared myExt.o -o myExt.so
Um die Bibliothek einzubinden, kopiert man sie in das PHP Modulverzeichnis und ergäzt die php.ini um die Zeile extension=myExt.so
. Zum Testen der Performanceunterschiede kann man folgendes PHP-Skript ausprobieren:
function php_fibonacci( $n )
{
if ( $n > 2 )
return php_fibonacci( $n - 2 ) + php_fibonacci( $n - 1 );
else
return 1;
}
$t = time();
echo php_fibonacci(40);
echo ":" . ( time() - $t ) . "\n";
$t = time();
echo fibonacci(40);
echo ":" . ( time() - $t ) . "\n";
Auf meinem Testrechner benötigt die C-Variante dabei 2 Sekunden und das Skript ca. vier Minuten.
29.Jan 2007
C-Funktionen in Python
Für rechenintensive Vorgänge sind Skriptsprachen nicht immer performant genug. Python bietet über das ctypes-Paket einen komfortablen Weg, dynamische Bibliotheken einzubinden.
// fibonacci.c
int fibonacci( int n ) {
if( n > 2 )
return fibonacci( n - 1 ) + fibonacci( n - 2 );
else
return 1;
}
Um den Quellcodes als Bibliothek zu übersetzen, dienen folgende Kommandos:
gcc -c -fpic fibonacci.c
gcc -shared fibonacci.o -o fibonacci.so
Zum direkten Performancevergleich habe ich die Fibonacci-Funktion zusätzlich in Python eingebunden.
# fibonaccy.py
def fibonacci( n ):
if n > 2:
return fibonacci( n - 1 ) + fibonacci( n - 2 )
else:
return 1
# Python-Variante ausfuehren
print fibonacci(32);
# C-Version einbinden und ausfuehren
import ctypes
DLib = ctypes.cdll.LoadLibrary( "fibonacci.so" )
print DLib.fibonacci(32)
Zum Ausführen muss gegebenenfalls noch der Bibliothekspfad um das eigene Verzeichnis erweitert werden:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./fibonacci.py
22.Jan 2007
Glas mit eingebauten LEDs
Der Glashersteller Schott AG entwickelt mit LightPoints ein Glas mit eingebauten Leuchtdioden. Die Stromversorgung ist nahezu unsichtbar, und die LEDs lassen sich einzeln ansteuern. Auf den diesjährigen Kölner Passagen wurde auf der Grundlage dieses Materials eine schwebende Laufschrift präsentiert.

18.Jan 2007
Compiler Cache – ccache
17.Jan 2007
Gleichzeitiger Schreibzugriff auf eine Datei
Das Beschreiben z.B einer Logdatei mit einer in PHP geschriebenen Webanwendung ist nicht ungefährlich: tritt dabei eine race condition auf, kann auch eine mit flock() blockierte Datei leicht zerstoert werden. Die Lösung dieses Problems läuft über eine zusätzliche angelegten Lock-Datei:
function logData( $filename, $data )
{
$lockhandle = fopen( $filename . ".lock", "w" );
if( flock( $lockhandle, LOCK_EX + LOCK_NB ) ) {
$filehandle = fopen( $filename, "a+" );
fwrite( $filehandle, $data );
fclose( $filehandle );
flock( $lockhandle, LOCK_UN );
fclose( $lockhandle );
return true;
}
return false;
}
10.Jan 2007
Fyre
Fyre erstellt Bilder basierend auf Histogrammen iterierter, chaotischer Funktionen. Das Programm gibt es samt Quellcodes für Linux und Windows.
8.Jan 2007
Elastic Infastructural Highway
8.Jan 2007
Museum of Tolerance and New Media
Gelungener Museumsentwurf von Jesper Bork aus Dänemark.