Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Heft & Abo  »  Heftarchiv  »  2009  »  12  »  Herausgekegelt  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

Auf dem Prüfstand

Bei derart filigranen Problemen schleichen sich fast unweigerlich Bugs ein, deshalb ist eine Regressions-Testsuite unabdingbar. Listing 2 nutzt das Modul Sysadm::Install, um das Skript »bball-drop« wieder und wieder mit unterschiedlichen maximal erreichbaren Stockwerken von 0 bis 100 aufzurufen. Die Funktion »tap()« ruft das Skript auf und fängt praktischerweise Stdout und Stderr in verschiedenen Variablen ab. Die Ausgabe des Skripts sieht in etwa aus wie in Abbildung 4. Der reguläre Ausdruck in Zeile 12 von »suite« schnappt sich das ausgegebene Resultat mit dem höchsten erfolgreich absolvierten Stockwerk und der Gesamtzahl der notwendigen Schritte.

Listing 2:
»suite«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Sysadm::Install qw(:all);
04 use Test::More;
05
06 plan tests => 202;
07
08 for my $floor (0..100) {
09   my($stdout, $stderr, $rc) =
10               tap "bball-drop", $floor;
11
12   if($stderr =~ /floor: (d+) ((d+)/) {
13      my($result, $tries) = ($1, $2);
14
15      is($floor, $result,
16         "result: $result $tries");
17      ok($tries <= 15,
18         "result: $result $tries");
19   } else {
20       die "Unmatched: $stderr";
21   }
22 }


Abbildung 4: Im schlechtesten Fall benötigt der Algorithmus 15 Schritte.

Die zwei Test::More-Prüfkommandos in den Zeilen 15 und 17 verifizieren, ob das vom Skript ermittelte Resultat dem vorgegebenen Parameter entspricht. Das Modul Test::More vom CPAN liefert hierzu die bewährte Ausgabe im TAP-Format (»1 ok«). Das dem Modul beiliegende und generell mit neuen Perl-Distributionen verfügbare Skript »prove« wickelt eine Test-Harness darum, die bestätigt, dass alle 202 Tests erfolgreich abliefen (Abbildung 5). Das ist einfacher als die vom Testskript »suite« ausgegebenen 202 Zeilen manuell nach Fehlern zu durchsuchen. Alle Tests bestanden, der Kandidat hat 100 Punkte, einer erfolgreichen Karriere im IT-Sektor steht nun nichts mehr im Wege! (jcb)


Abbildung 5: Die Testsuite bestätigt, dass das Skript für alle möglichen Stockwerk-Kombinationen das richtige Ergebnis liefert und nie mehr als 15 Versuche benötigt.

Infos

[1] Listings zu diesem Artikel: [ftp://www.linux-magazin.de/pub/listings/magazin/2009/12/Perl]

[2] Gauß-Formel: [http://de.wikipedia.org/wiki/Gaußsche_Summenformel]

Der Autor



Michael Schilli arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. Er hat die Bücher "Goto Perl 5" (deutsch) und "Perl Power" (englisch) für Addison-Wesley geschrieben und ist unter [mschilli@perlmeister.com] zu erreichen.

Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Ähnliche Artikel
Magisches Netz Neuronale Netze mit der Libfann
Doppel-Herz Parallelprogrammierung in C++ mit der OMPTL
Frechheit siegt Die Gewinner des Wettbewerbs zum Snapshot-Jubiläum
Tux liest Abgefeimte Perl-Tricks und benutzerfreundliches Oberflächendesign
Der Protokollant Perl-Skript loggt Chat-Sessions
Wer A sagt, darf nicht B sagen Frage-Antwort-System fürs Web
Whitepaper
Usage Landscape Enterprise Open Source Data Integration

Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.

Download PDF (Registrierung erforderlich)
Daten Migration - Eine Publikation von Bloor Research

Datenmigrationsprojekte überschreiten häufig das Budget, neigen zu Verzögerung und werden unter Umständen komplett abgebrochen. Bloor Research ist eines der weltweit führenden IT-Forschungs-, Analyse- und Beratungsunternehmen und wird in dem vorliegenden White Paper die wichtigsten Aspekte dieser Problematik näher beleuchten. Ferner werden praktische Empfehlungen für erfolgreiche Migrationsprojekte gegeben, die Sie auf Ihr nächstes Projekt übertragen können.

Download PDF (Registrierung erforderlich)
Kommentare (3)
von
squirrel,
10.02.2010 10:53
Komme auch auf max. 14 Versuche
In Lisp:
;; bowl
(defun floorlist (&key (mxfloor 100))
"build 1st list for iteration"
(let ((steps (ceiling (- (sqrt (+ 1 (* 8 mxfloor))) 1) 2)))
(loop for x from steps downto 1
for y = steps then (+ x y)
while (< y mxfloor) collect y)))

(defun thrower (flist smash &key (ball 2) (ok 0))
"start throwing balls and watch what happens"
(let ((tfl (first flist)) (ret 'bang!))
(unless (or (null flist) (zerop ball))
(when (< tfl smash) (pop flist) (setf ok tfl ret 'ok))
(when (>= tfl smash) (decf ball)
(setf flist (loop for i from (1+ ok) to (1- tfl) collect i)))
(cons (list ret tfl) (thrower flist smash :ball ball k ok)))))

(loop for i from 1 to 101 do
(print i) (princ (thrower (floorlist :mxfloor 100) i)))

Die erste Kugel wird gleich aus dem 14. Stock abgeworfen.
von
Toralf Förster,
16.11.2009 11:21
eine Addition zuviel
Zumindest eine Addition läßt sich einsparen durch diese Umsortierung

$sum += $n;
push @stops, $sum;

die kostbare eingesparte CPU Zeit kann man ja dann an den eigenen BOINC Client verfüttern
von
R. Schmidt,
07.11.2009 16:57
13
Nach meinem Dafürhalten geht es auch mit n=13, also maximal 14 Versuchen. Der zweite Abschnitt ist nicht n-1 lang, sondern ebenfalls n. Alle weiteren Abschnitte sind ebenfalls um 1 länger, denn ein Stock ist immer schon durch den vorherigen Versuch erledigt. Hier ein kurzes Skript, das mir meinen Wurfplan erstellt:
#! /usr/bin/perl -w
# s. Linux Magazin Nr. 12 2009 S. 116

$n = 13;

for($i = $n + 1, $inc = $n, $k = 1; $i <= 100 && $inc > 0; $i += $inc, $inc -= 1, $k++)
{
print "Kugel: $k: Stock: $i\n";
}
print "\n";
Man möge mich bitte korrigiern, wenns falsch ist.