21.Mrz 2007
Weichzeichnen von Bildern
1.Mrz 2007
Mastermind mit MooTools
Zum Studieren der Drag-n-Drop Funktionen der mootools ein kleines Mastermind-Spiel:
Eine kurze Anleitung: der Spieler muss einen Farbcode erraten. Dazu probiert er die Kombinationen durch. Jede Zeile wird vom Computer bewertet, wobei er schwarze und weisse Markierungen setzt. Eine schwarze bedeutet, daß eine Farbe an der richtigen Stelle sitzt — Weiß bedeutet, daß eine Farbe zwar im Code ist, sich aber an der falschen Stelle befindet.
20.Feb 2007
Schräge Menus mit CSS
Schräge Menüs lassen sich einfach mit Imagemaps implementieren. Will man sie aber CSS-konform und als Listenstruktur, kann man einen kleinen Trick anwenden. Dabei werden die diagonal verlaufenden Menüpunkt aus vielen kleinen spans zusammengesetzt. Diese werden dann in der jeweiligen Position angeordnet.
Zur Verdeutlichung sind die span-Felder bei einem Eintrag rot umrahmt. Die Grafik für jeden Menüpunkt sind einmal erstellt und dann nur in der Position angepasst. Der Aufbau ist folgendermaßen:
//Stylesheet-Beispiel fuer ein 40x40-Feld
#menu #menupunkt span {
position: absolute;
width: 40px;
height: 40px;
display: block;
background-repeat: no-repeat;
background-image: url('menupunkt1.gif');
}
#menu .position1 {
left: 0px;
top: 60px;
background-position: 0px -60px;
}
// HTML
<ul id="menu">
<li id="menupunkt">
<a href="xyz">
<span class="verstecktertitel">Menupunkt</span>
<span class="position1"></span>
<span class="position2"></span>
...
</a>
</li>
...
</ul>
Idealerweise fügt man den einzelnen Listenpunkten noch ein unsichtbares span an, welches den Titel enthält (siehe Beispiel).
11.Feb 2007
Festplatten-Image mit dd erstellen
Ein Festplatten Image läßt sich ganz einfach mit Linux-Boardmitteln erstellen.
Das Programm dd (Dump Device), welches zum Standard-Repertoire eines Unix gehört, speichert Daten blockweise.
dd if=/dev/quellgerät of=/name/der/imagedatei bs=64k
Da diese Datei genauso groß wird wie das Quellgerät, lohnt es sich, diese mit gzip zu packen.
dd if=/dev/quellgerät bs=64k | gzip -f >/name/der/imagedatei.gz
Möchte man das Image auf einer Fat32-Partition (mit einer maximalen Dateigröße von 2GB) oder auf CDs/DVDs speichern,
muss es in passende Dateien aufgeteilt werden. Mit dem Kommando split ist das kein Problem.
# fuer fat32: dd if=/dev/quellgerät bs=64k | gzip -c | split -b 2g - /name/der/imagedatei.gz #für CDs: dd if=/dev/quellgerät bs=64k | gzip -c | split -b 700m - /name/der/imagedatei.gz
Um das Image – gesplittet oder als ganze – zu entpacken und zurück zu schreiben genügt ein
cat /name/der/imagedatei.gz* | gzip -d | dd of=/dev/zielgerät bs=64k
7.Feb 2007
window.onload mit mehreren Funktionen
Um eine initialisierende Javascript-Funktion direkt nach dem Laden einer Webseite auszuführen, nutzt man das onload-Ereignis der Fensters. Sollen mehrere Funktionen aufgerufen werden, gilt es aufzupassen. Ein window.onload = f
überschreibt unweigerlich jeden vorher eingebundenen Eintrag. Die nachfolgende Technik ermöglicht ein einfaches und sicheres konkatenieren der Aufrufe.
addWindowOnload = function( f ) {
var current = window.onload;
if( typeof window.onload != 'function' )
window.onload = f;
else window.onload = function() { current(); f() };
}
// Bsp:
a1 = function() { alert("Onload #1"); };
addWindowOnload( a1 );
addWindowOnload( function() { alert("Onload #2"); } );
1.Feb 2007
Javascript Scroller
Kleine Laufschrift, die — im Gegensatz zum proprietären marquee-Tag — auf jedem Browser (mit aktiviertem JavaScript!) funktioniert. Der Text kann frei formatiert werden und natürlich auch Bilder enthalten.
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