source: projects/paper-tape-project/trunk/web-frontend/generator.php @ 73

Last change on this file since 73 was 73, checked in by sven, 6 years ago

PaperTape Restauration: Fixed various bugs to bring back Web and visualisation CLI application:

  • Documentation: Fixed Links and added "Page superseded" box
  • Web-Frontend: Replaced buggy no-more-working-in-modern-browsers JavaScript ajax-POST-library by contemporary jquery
  • Visualisator: lochstreifen.c and cli.c, Makefile: Fixed bugs for modern compiler warnings. Now again the code compiles and works.
File size: 23.5 KB
Line 
1<?php
2/**
3 * The Paper Tape Project -- Visualisation Web frontend
4 *
5 * This PHP setup is capable of serving PNG and SVG files to clients
6 * by using the cli.c interface to the LOCHSTREIFEN cairo drawing
7 * routines. See index.html for all possible GET parameters.
8 *
9 * Currently this is a german-only subproject.
10 *
11 * Copyright (C) 2008  Sven Köppel
12 *
13 * This program is free software; you can redistribute
14 * it and/or modify it under the terms of the GNU General
15 * Public License as published by the Free Software
16 * Foundation; either version 3 of the License, or (at
17 * your option) any later version.
18 *
19 * This program is distributed in the hope that it will
20 * be useful, but WITHOUT ANY WARRANTY; without even the
21 * implied warranty of MERCHANTABILITY or FITNESS FOR A
22 * PARTICULAR PURPOSE. See the GNU General Public License
23 * for more details.
24 *
25 * You should have received a copy of the GNU General
26 * Public License along with this program; if not, see
27 * <http://www.gnu.org/licenses/>.
28 *
29 **/
30
31// Konstanten:
32$draw_program = "../visualisator/cli";
33
34// Ausgabeordner (ohne trailing slash)
35$output_dir = "temp";
36
37// mit Verbose-Switch wird der Programmaufruf verbose.
38$verbose = isset($_GET['verbose']) || isset($_POST['verbose']);
39$ajax = isset($_GET['ajax']); // ajax-antwort oder normale Webseite anzeigen?
40
41if(!$ajax)
42    echo makeHeader('Lochstreifenvisualisierung online');
43
44function makeHeader($title) {
45    // als Funktion wg. Report-Datei, die später noch generiert wird.
46    return <<<HERE
47<html>
48<head>
49   <title>$title - technikum29 Private Zone</title>
50   <link rel="stylesheet" href="http://dev.technikum29.de/src/private.design/style.css" type="text/css">
51   <link rel="stylesheet" href="design/formular.css" type="text/css">
52   <!--<script type="text/javascript" src="design/formular.js"></script>--><!-- hier nicht mehr -->
53   <meta name="date.initial" value="02.04.2008">
54   <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
55</head>
56<body>
57<h1><a href="../"><span>technikum29.de interne Projekte:</span></a><strong>Lochstreifenprojekt: Visualisierung</strong></h1>
58HERE;
59}
60
61/*
62 * Übersicht über POST-Parameter, die entgegen genommen werden:
63 
64   *'data-src' = file|input|font
65     -> file => 'data-file' (dateiupload)
66     -> form => 'data-form' = hex[0]|oct|bin|dec
67                'data-input' = auf Länge checken und format
68     -> font => 'data-text' = auf gute Zeichen checken ([a-zA-Z0-9 ])
69
70   *'format' = PNG|SVG
71   *'dimension-src' = width|height|diameter
72     -> width => dimension-width
73     -> height => dimension-height        jeweils auf int checken
74     -> diameter => dimension-diameter
75
76   *'alignment' => hor-[rtl|ltr]-[l|r] | ver-[btt|ttb]-[u|o]
77
78   komponenten = imagebg|tapebg|punched|notpunched|feedholes
79
80   *'show-'+[komponenten]  (nur toggle an/aus)
81   *'color-'+[komponenten] => #RRGGBB
82   *'lucency-'+[komponenten] => AA
83
84   *'empty-start', 'empty-end' => int
85*/
86
87if(empty($_POST)) {
88    // so einfach ist das.
89    print '<h2>Parameter fehlen</h2>';
90    exit; // ;)
91}
92
93function get($var) {
94    // kleine Helperfunktion
95    return isset($_POST[$var]) ? $_POST[$var] : false;
96}
97
98function my_ctype_digit($string) {
99    // meine Implementierung dieser netten Funkion
100    return preg_match('/^[0-9]+$/', $string);
101}
102
103// Sofort tötende Fehler. Anzuwenden bei brutalen Fehlern, die nicht
104// auf Fehleingabe im Formular berufen (Angriffsgefahr)
105function print_fatal($text) {
106    print "<h2>Falsche Benutzung!</h2>\n";
107    print '<p class="big-error">'.$text."</p>\n";
108    print "<p>Dieser Fehler wäre nicht aufgetreten, hätten sie das Formular benutzt.</p>";
109    exit;
110}
111
112// das große Fehlerarray.
113$errors = array();
114// das nicht-tödliche Warnungsarray
115$warnings = array();
116
117// mit allen Fehlern beenden
118function exit_errors() {
119    global $ajax,$errors,$warnings;
120
121    print "<h2>Fehler in den angegeben Daten</h2>";
122    foreach($warnings as $error) {
123        print '<p class="big-warning">'.$error."</p>\n";
124    }
125    foreach($errors as $error) {
126        print '<p class="big-error">'.$error."</p>\n";
127    }
128    if($ajax) {
129        print "<p>Gehen sie zurück zum Formular und korrigieren sie ihre Fehleingaben.
130               Klicken sie dann nochmals auf <i>Generieren</i>.</p>";
131        print '<p><a href="javascript:history.go();">Zurück zum Formular</a></p>';
132    }
133    exit;
134}
135
136// Schritt 0: Ausgabeverzeichnis pruefen
137if(!file_exists($output_dir)) {
138        if(is_writeable($output_dir)) {
139                mkdir($output_dir);
140        } else
141                $errors[] = "Ausgabeverzeichnis <i>$output_dir</i> nicht anlegbar!";
142}
143
144// Schritt 1: Eingaben entgegennehmen und validieren
145
146// 1/6: Punch-Daten
147$input_source = get('data-src');
148switch($input_source) {
149    case 'file': // Dateiupload. Tja. Datei direkt dem Programm übergeben. Vorher
150                 // Größe checken. Also mal los:
151                 if($ajax) {
152                     // wenn Ajax benutzt wird, wird die Datei noch nicht hochgeladen.
153                     break; // also erst anschließend machbar.
154                 }
155                 if(!isset($_FILES['data-file'])) {
156                     $errors[] = "Keine Datei hochgeladen, obwohl Dateiupload als Datenquelle ausgewählt war!";
157                 } elseif($_FILES['data-file']['size'] > 500*1024) {
158                     $errors[] = "Die hochgeladene Datei ist größer als ein 500kb. Derart große
159                                  Lochstreifen sind aus Perfomancegründen nicht erlaubt. Laden sie
160                                  sich das Visualisierungsprogramm runter und erstellen sie lokal
161                                  ihre Mammutlochstreifen.";
162                 } elseif($_FILES['data-file']['size'] == 0) {
163                     $warnings[] = "Die hochgeladene Datei ist leer (0 Bytes Inhalt). Das gibt keinen sonderlich
164                                    spannenden Lochstreifen...";
165                 }
166                 $original_filename = $_FILES['data-file']['name']; // fuer den Report weiter unten
167                 $input_filename = $_FILES['data-file']['tmp_name'];
168                 // usw.
169                 break;
170    case 'input': // Daten direkt eingetippt. Na dann...
171                 $text = get('data-input');
172                 $form = get('data-form');
173                 $input_binary = 'abc';
174                 $parts = preg_split("/\s+|\n+/", $text);
175                 foreach($parts as $x => $byte) {
176                     if(!strlen($byte)) continue; // nur whitespace, Abfall durch das preg_split.
177
178                     // Alle Formen zu dezimal umwandeln.
179                     if($form == 'bin')
180                         $byte = bindec($byte);
181                     elseif($form == 'hex')
182                         $byte = hexdec($byte);
183                     elseif($form == 'oct')
184                         $byte = octdec($byte);
185                     elseif($form == 'hex0')
186                         $byte = hexdec(substr($byte,2)); // 0x wegschneiden.
187                     elseif($form != 'dec') {
188                         $errors[] = "Fehler: Ungültige Datenform <i>$form</i>!";
189                         break;
190                     }
191
192                     if(!is_numeric($byte)) {
193                         $errors[] = "Fehler: Byte $x mit dem Wert <i>$byte</i> ist keine entsprechende
194                                      Zahl des Types <i>$form</i>. Vielleicht haben sie nicht das
195                                      passende Format eingestellt, in dem sie ihre Daten eingegeben haben?";
196                         break;
197                      }
198
199                      $input_binary .= chr($byte); // <- the PHP way | the Perl way -> pack('C', $byte);
200                 } // foreach
201                 if(strlen($input_binary) > 1024*1024) {
202                     $errors[] = 'Sie haben über eine Millionen Bytes eingetippt! Derart große
203                                  Lochstreifen sind aus Perfomancegründen nicht erlaubt. Laden sie
204                                  sich das Visualisieurngsprogramm runter und erstellen sie ihren
205                                  Monsterstreifen lokal.';
206                     break; 
207                 } elseif(strlen($input_binary) == 0) {
208                     $errors[] = 'Sie haben keine Daten eingegeben, obwohl direkte Byteeingabe als
209                                  Datenquelle ausgewählt wurde!';
210                     break;
211                 }
212                 // so, jetzt liegts als $input_binary vor.
213                 break;
214    case 'font': // Text, der gepuncht werden soll
215                 $text = get('data-text');
216                 if(!preg_match('/^[a-zA-Z0-9 ]+$/', $text)) {
217                     $warnings[] = 'Im Text befinden sich nichtdruckbare Zeichen. Nur Buchstaben und Zahlen
218                                    können dargestellt werden, keine anderen Zeichen.';
219                 }
220                 if(strlen($text) == 0) {
221                     $errors[] = 'Sie haben keinen Text eingegeben, obwohl Textgenerierung als Datenquelle
222                                  ausgewählt wurde!';
223                 }
224                 if(strlen($text) > 1000) {
225                     $errors[] = 'Der Text ist mit über 1000 Zeichen eindeutig zu lang.
226                                  Aus Perfomancegründen ist das nicht erlaubt. Laden sie sich die
227                                  entsprechenden Programme runter und erstellen sie ihren Streifen lokal.';
228                 }
229                 // irgendwas mit dem Text machen.
230                 // und als $input_binary fertig machen.
231                 $input_binary = 'abc';
232                 break;
233    default:     $errors[] = "Ungültige Datenquelle! Es konnten keine Daten entgegengenommen werden!";
234}
235
236// 2/6: Formatfragen.
237$format = strtolower(get('format'));
238if($format != 'png' && $format != 'svg') {
239    $errors[] = "Ungültiges Ausgabeformat <i>$format</i>! Erlaubt sind nur PNG und SVG!";
240}
241
242// 3/6: Dimensionen
243$dsrc = get('dimension-src');
244if($dsrc == 'width' || $dsrc == 'height' || $dsrc == 'diameter') {
245    $size = get("dimension-$dsrc");
246    if(!my_ctype_digit($size)) {
247        $errors[] = "Die Größenangabe zu den Dimensionen, die der Lochstreifen annehmen soll,
248                     ist fehlerhaft: $size ist keine positive ganze Dezimazahl!";
249    } elseif($dsrc == 'diameter' && $size > 100) {
250        $errors[] = "Der Durchmesser eines Loches ist mit 100 pxieln zu groß, ein so großes Bild
251                     darf aus Perfomancegründen nicht generiert werden. Bitte kleineren Wert
252                     einstellen.";
253    } elseif($size > 1000*100) {
254        $errors[] = "Die Größenangabe von über 100.000 Pixel ist viel zu groß. Bitte kleineren Wert
255                     einstellen.";
256    }
257    // alles klar. $size und $dsrc
258} else
259    $errors[] = "Es wurde keine Größenangabe zum Lochstreifen gemacht!";
260
261
262// 4/6: Ausrichtung des Lochstreifens
263$alignment = get('alignment');
264if(preg_match('/^(hor)-(rtl|ltr)-([ou])$|^(ver)-(btt|ttb)-([lr])$/', $alignment, $m)) {
265    // so, jetzt mal zusammenpuzzeln...
266} else
267    $errors[] = "Ungültige Ausrichtung des Lochstreifens: $alignment war nicht in der Auswahl!";
268
269
270// 5/6: Den ganzen komponentenweiten Kram
271$comp = array('imagebg', 'tapebg', 'punched', 'notpunched', 'feedholes');
272$comp_visibility = array(); $comp_color = array();
273$comp_translation = array('Bildhintergrund', 'Lochstreifen', 'Löcher', 'Nicht-Löcher', 'Führungslöcher');
274
275foreach($comp as $x => $component) {
276    $comp_visibility[$x] = get("show-$component") ? 1 : 0;
277    $color = substr(get("color-$component"), 1); // das "#" wegstrippen
278    $lucency = get("lucency-$component");
279    if(!preg_match('/^[0-9a-fA-F]{6}$/', $color)) {
280        $errors[] = "Die Farbangabe <i>$color</i> für den Komponenten <i>$component</i> ist keine korrekte Hexadezimalfarbangabe.";
281        continue;
282    } elseif(!preg_match('/^[0-9a-fA-F]{2}$/', $lucency)) {
283        $errors[] = "Die Transparenzangabe <i>$lucency</i> für den Komponenten <i>$component</i> ist nicht korrekt.";
284        continue;
285    }
286    $comp_color[$x] = "#${color}${lucency}";
287}
288
289// 6/6: Empty-start, Empty-End
290$empty_start = get('empty-start');
291$empty_end = get('empty-end');
292if(!my_ctype_digit($empty_start))
293    $errors[] = "Die Anzahl leerer Startbytes ist keine positive ganze Zahl ($empty_start)";
294if(!my_ctype_digit($empty_end))
295    $errors[] = "Die Anzahl leerer Endbytes ist keine positive ganze Zahl ($empty_end)";
296
297// fertig.
298
299// Fehler ausgeben und beenden.
300if(!empty($errors)) {
301    exit_errors();
302}
303
304// keine Fehler aufgetreten und in Ajax-Mode: "ok" zurückgeben
305if($ajax) {
306    echo "ok";
307    exit;
308}
309
310// Wenn wir hier sind, gehts schon mal weiter.
311
312echo '<h2>Lochstreifengenerator</h2>';
313
314if(!empty($warnings)) {
315    // es gibt Warnungen...
316    echo '<p>Es sind Probleme aufgetaucht, die allerdings nicht wirklich schlimm sind, der
317          Lochstreifen wurde trotzdem generiert:</p>';
318    foreach($warnings as $error) {
319        print '<p class="big-warning">'.$error."</p>\n";
320    }
321}
322
323// so, Parameter zusammenfummeln.
324
325$exec_params = '';
326
327// 2/6: Format:
328$exec_params .= "-f$format ";
329
330// 6/6 Empty Bytes:
331if($empty_start) $exec_params .= "--empty-start=$empty_start ";
332if($empty_end)   $exec_params .= "--empty-end=$empty_end ";
333
334// 5/6 Komponenten
335foreach($comp as $x => $component) {
336    if($comp_visibility[$x]) {
337        $exec_params .= "--color-$component=".$comp_color[$x].' ';
338    } else {
339        $exec_params .= "--hide-$component ";
340    }
341}
342
343// 3/6  Dimensionen
344$exec_params .= "--$dsrc=$size";
345
346// 4/6 Transformations and Rotations
347$exec_params .= $transformation_string.' ';
348
349// Output Filename erstellen
350$source_range = array_merge(range('a','z'), range('0', '9'));
351$output_hash = '';
352foreach(array_rand($source_range, 10) as $x) { $output_hash .= $source_range[$x]; }
353/* //alternativ sowas wie:
354$tmpx = mt_rand(0,32); // tempoaer fuer nen kurzen hash
355if($tmpx-32 < 10) $tmpx *= -1;
356$output_hash = substr(md5(rand() * time()), $tmpx, $tmpx+10);*/
357
358$image_filename = $output_dir.'/'.$output_hash.'.'.$format;
359$exec_params .= "--output=$image_filename";
360
361// 1/6 Input Data
362if($input_source == 'file') {
363    $exec_params .= "  '".$input_filename."'";
364} else {
365    // Binäre Daten liegen als $input_binary vor und wollen
366    // per STDIN eingefüttert werden.
367}
368
369print "<p>Der Lochstreifen wird nun generiert...\n";
370flush(); // damit er das wenigstens sieht...
371
372if($verbose) {
373    print "<h2>Verbose-Ausgaben</h2>";
374    print "<p>Alles zusammengepanscht ergibt:</p>";
375    print "<tt>$draw_program $exec_params</tt>";
376    print "<p>Rufe auf...\n";
377}
378
379// in PHP brauchts nen mörderischen Aufwand, um jetzt dieses
380// Programm anzuschmeißen:
381
382$proc_ressource = proc_open("time $draw_program ".($verbose?'--verbose ':' ').$exec_params, array(
383    // descriptor array (0=stdin, 1=stdout, 2=stderr, like sh)
384    0 => array('pipe', 'r'), // Programm wird von STDIN lesen
385    1 => array('pipe', 'w'), // und zu STDOUT schreiben
386    2 => array('pipe', 'w'), // und zu STDERR auch schreiben
387), $pipes, NULL , NULL );
388
389if(is_resource($proc_ressource)) {
390    if($input_source != 'file') {
391        // Daten reinschreiben
392        fwrite($pipes[0], $input_binary);
393    }
394    fclose($pipes[0]); // nichts mehr zu schreiben
395
396    // STDOUT/STDERR lesen
397    $stdout = stream_get_contents($pipes[1]); 
398    $stderr =  stream_get_contents($pipes[2]); // fuer Speicherung der <times>-Ausgaben.
399
400    fclose($pipes[1]);
401    fclose($pipes[2]);
402    $return_value = proc_close($proc_ressource);
403
404    if($return_value) {
405        print "<p class='big-error'>Fehler: Generator wurde nicht ordnungsgemäß ausgeführt, das
406               Programm beendete mit <u>Statuscode $return_value</u>.</p>";
407    }
408
409    if($return_value || $verbose) {
410        if(!$verbose) {
411            print "<p>Folgende Ausgaben wurden zwecks Fehlersuche abgefangen:</p>\n";
412            print "<p>Aufruf: <tt>$draw_program $exec_params</tt>";
413        }
414
415        print "<pre>";
416        print "<b>STDOUT:</b>\n";
417        echo $stdout;
418
419        print "\n<b>STDERR:</b>\n";
420        echo $stderr;
421        print "</pre>";
422        print "\n<b>Return Value $return_value</b>\n";
423
424    }
425
426    // checken ob was gemacht wurde.
427    if(!is_file($image_filename)) {
428        print "<p class='big-error'>Gewünschtes Bild konnte nicht erstellt werden!</p>";
429        exit; // dann brauchts auch kein Report und so. Der braucht nämlich die Datei.
430    }
431} else
432    print '<p class="big-error">Konnte Generatorprozess nicht starten!</p>';
433
434// + Übersichtsseite machen, erst mal in String, und ausgeben.
435$dir_url = dirname($_SERVER['PHP_SELF']);
436$image_url = "$dir_url/$image_filename";
437$report_file = $output_dir.'/'.$output_hash.'.htm';
438$report_url = "$dir_url/$report_file";
439$filesize = DataSizeFormat(filesize($image_filename));
440
441$report = "<p>Der folgende Lochstreifen wurde am <b>".date('m.d.Y')." um ".date('H:i:s')." Uhr</b> von dem
442              Besucher mit der <b>IP-Adresse $_SERVER[REMOTE_ADDR]</b> generiert. Die erstellte Datei vom
443              Typ <b>".strtoupper($format)."</b> ist <b>$filesize</b> groß";
444
445if($format == 'png') {
446    $imagesize = GetImageSize($image_filename);
447    $report .= ", sie hat die Ausmaße von <b>$imagesize[0] x $imagesize[1]</b> Pixel.</p>\n";
448    $report .= "<p>Das Bild wurde gespeichert unter der Adresse <b><a href='$image_url'>$image_url</a></b>
449                und kann z.B. zur Weiterverwendung runtergeladen werden. Es sieht so aus:</p>
450                <p><img src='$image_url' alt='Der generierte Lochstreifen' $imagesize[2]></p>";
451} else {
452    $report .= ".</p><p>Das Bild wurde unter der Adresse <b><a href='$image_url'>$image_url</a></b> gespeichert.
453                Mit einem modernen Browser (Nicht Internet Explorer) können sie sich die SVG-Datei durch
454                Anklicken des Linkes anschauen. Laden sie sich (ansonten) die Datei runter und öffnen sie
455                es mit einem Vektorgrafikprogramm, z.B. mit dem frei erhältlichen <a href='www.inkscape.org'
456                >Inkscape</a>.</p>";
457}
458
459// Discmailer ;-)
460$report .= "<p>Bitte beachten sie: Die Verfügbarkeit des Bildes auf diesem Server gehört nicht in den
461            \"Dienstleistungsumfang\" des Generierungsprogramms. Das heißt, dass sie <u>durch Eingeben ihrer
462            Daten zugestimmt haben, dass diese mit dem Bild nach freiem Ermessen des Administrators gespeichert
463            werden und willkürlich gelöscht werden können</u>. Es besteht kein Anspruch auf selbst zeitlich
464            begrenztes Hosting! Wenn sie das Bild im Internet verfügbar machen wollen, können sie es z.B.
465            auf kostenlosen Bilderhostern hochladen. Suchen sie dazu mit der Suchmaschine ihres Vertrauens
466            nach so etwas wie z.B. \"<a href='http://www.google.de/search?q=free+image+hosting'
467            >image hosting</a>\"</i></p>";
468
469$report .= "<h3>Die Daten</h3>";
470
471// Daten als HEX aufbereiten
472if($input_source == 'file')
473    $input_binary = file_get_contents($input_filename);
474$report_input_source = array(
475    'file' => "als eine Datei mit dem Namen <b>$original_filename</b> hochgeladen",
476    'input' => "<b>$form</b>-kodiert eingetippt",
477    'font' => "als zu generierende Schrift eingetippt, zugrunde lag der Text <b>$text</b>"
478);
479
480$report .= "<p>Die Daten, die dem generierten Lochstreifen zugrundeliegen, wurden vom Benutzer
481            $report_input_source[$input_source]. Im folgenden wird ein Hexdump der <b>".strlen($input_binary)."
482            Bytes</b> angegeben, mit denen letztendlich der Lochstreifen generiert wurde. Mit geeigneten
483            Hilfmitteln (z.B. einem Hexeditor) können sie aus den Daten eine Binärdatei erstellen.";
484
485$report .= "<pre>";
486for($x=0; $x<strlen($input_binary); $x++) {
487    $report .= sprintf("%02x ", ord($input_binary[$x]));
488    if((($x+1) % 20) == 0) {
489        $report .= "\n";
490    }
491}
492$report .= "</pre>";
493
494// weitere Parameter abhandeln.
495
496$report .= "<h3>Weitere Parameter</h3>";
497
498$report .= "<p>Folgende Einstellungen/Farben liegen dem Lochstreifen zugrunde:</p><ul>";
499
500foreach($comp as $x => $c) {
501    $report .= "<li><b>$comp_translation[$x]</b> ($c): ".
502               ($comp_visibility[$x] ? "sichtbar, und zwar mit der Farbe <b>$comp_color[$x]</b> (Format #RRGGBBAA)"
503                                     : "nicht sichtbar (deaktiviert)");
504}
505
506$report .= "</ul>";
507
508$report .= "<p>Außerdem wurden <b>$empty_start leere Startbytes und $empty_end leere Endbytes</b> eingestellt.
509            Die eingestellte Rotation des Lochstreifens wird durch das folgende Bild verdeutlicht:</p>
510            <img src='$dir_url/design/$alignment.png' alt='$alignment'>
511            <p>Die Größe des Lochstreifens wurde von der Dimension <b>$dsrc</b> abhängig gemacht und auf
512            <b>$size</b> eingestellt.</p>";
513
514$report .= "<h3>Generierung</h3>";
515
516$report .= "<p>Mit dem Kommandozeilentool führ(t)en folgende <b>Parameter</b> zu der Generierung eines derart
517            gewünschten Lochstreifens:
518            <br><tt>$exec_params</tt>
519            <br>Durch Eingabe dieser Parameter mit den oben angezeigten Eingabedaten müsste jederzeit
520            das gleiche Bild reproduzierbar sein.</p>";
521
522$report .= "<!-- STDOUT:\n$stdout\n\nSTDERR:\n$stderr\n\n-->"; // debugging...
523
524$report .= "<p>Das Generieren des Lochstreifens nahm die folgende <b>Zeit in Anspruch</b>:<pre>$stderr</pre>
525            <p>Dabei steht <i>real</i> für die wirklich vergangene Zeit, die der Benutzer warten musste,
526            bevor er seinen Lochstreifen bekam, <i>user</i> für die tatsächliche Zeit, die das Programm
527            aktiv war (Abweichungen zu <i>real</i> können dadurch begründet sein, dass der Server noch
528            andere Sachen gleichzeit machte) und <i>system</i> für die Zeit, in der der Server wirklich
529            ernsthaft über den Lochstreifen nachgedacht hat ;-)</p>";
530
531//// REPORT zuende. Jetzt erst mal ausdrucken.
532
533if(!$verbose) echo "fertig</p>\n"; // als Antwort auf die "wird nun generiert..."-Ausgaben weit oben.
534echo "<p>Mit dem generierten Bild wurde eine Urkunde erstellt, in der alle Parameter, Daten und sonstige
535         interessante Dinge festgehalten sind. Es folgt nur dessen Inhalt:</p>";
536
537echo "<div class='big-okay' style='font-weight:normal'>"; // ;)
538echo $report;
539echo "</div>";
540
541echo "<p>Diese \"Urkunde\" wurde mit dem Bild zusammen gespeichert. Sie ist unter einer ähnlichen Adresse
542      wie das Bild erreichbar, und zwar unter <b><a href=\"$report_url\">$report_url</a></b>.</p>";
543
544echo "<p>Möchten sie noch etwas stanzen? <a href='$dir_url'>Erneut zum Stanzereingabeformular</a></p>";
545
546// und jetzt abspeichern!
547$fh = fopen($report_file, 'w');
548
549if(!$fh) {
550    print '<p class="big-error">Fehler: Konnte Report-File '.$report_file.' nicht zum Schreiben öffnen!</p>';
551    exit; // weil gibts ja nichts mehr zu tun.
552}
553
554fwrite($fh, makeHeader("Lochstreifen $output_hash -- Erstellungsbericht"));
555fwrite($fh, "<h2>Lochstreifen $output_hash</h2>");
556fwrite($fh, $report);
557fwrite($fh, "</body></html>");
558
559fclose($fh);
560
561// so, jetzt aber wirklich fertig. :)
562
563function DataSizeFormat($size,$ukb = "1024",$plain = "")
564{
565    // immer wieder eine schöne Funktion, die man sich von seinen
566    // alten Scripten immer wieder neu kopiert ;-)
567    $kb = $ukb;        // Kilobyte
568    $mb = $ukb * $kb;  // Megabyte
569    $gb = $ukb * $mb;  // Gigabyte
570    $tb = $ukb * $gb;  // Terabyte
571    $sp = '&nbsp;';    // No breaking space
572
573    if($size < $kb) {
574        $readable = $size;
575        $definition = $sp.'Byte';
576    }elseif($size < $mb) {
577        $readable = ($size/$kb);
578        $definition = $sp.'KB';
579    }elseif($size < $gb) {
580        $readable = ($size/$mb);
581        $definition = $sp.'MB';
582    }elseif($size < $tb) {
583        $readable = ($size/$gb);
584        $definition = $sp.'GB';
585    }else {
586        $readable = ($size/$tb);
587        $definition = $sp.'TB';
588    }
589    if ($plain == 1) {
590        $definition = "";
591    }
592    if ($size < $kb) {
593        if (empty($readable)) {
594            $readable = 0;
595        }
596        return $readable.$definition;
597    } else {
598        return number_format($readable,2).$definition;
599    }
600}
601
Note: See TracBrowser for help on using the repository browser.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License