ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2004/freenet.mgp
Revision: 1.4
Committed: Sat Jun 26 21:32:58 2004 UTC (22 years, 3 months ago) by root
Branch: MAIN
Changes since 1.3: +224 -477 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 %include "std.mgp"
2     %%default 1 bimage "gtk/gtk-window.jpg" 1024x768, center
3     %page
4     %%bimage "gtk/screenshot.jpg" 1600x1200
5    
6     Freenet
7    
8     "I worry about my child and the Internet all
9     the time, even though she's too young to have
10     logged on yet. Here's what I worry about. I
11     worry that 10 or 15 years from now, she will
12     come to me and say 'Daddy, where were you
13     when they took freedom of the press away from
14     the Internet?'"
15    
16     --Mike Godwin, Electronic Frontier Foundation
17    
18    
19     %center
20     %%image "gtk/hello31.jpg" 0 200 200 1
21    
22     %page
23    
24     Ziele
25    
26    
27     Projekt, Dokumentation und Implementation frei und für jeden zugänglich
28     %pause
29    
30     Informationsfreiheit ohne Zensur
31     %pause
32    
33     garantiert anonyme Veröffentlichung
34     %pause
35    
36     garantierter Zugang zur Information
37    
38     %page
39    
40     Implementation
41    
42    
43     virtuelles Netzwerk
44     %pause
45     Ausfall auch großer Teile des Netzes werden kompensiert
46    
47     %pause
48     einzelne Knoten
49     %pause
50     kennen die gespeicherten Daten nicht
51     %pause
52 root 1.3 können Datenverkehr anderer Knoten nicht lesen
53 root 1.1 %pause
54     kennen Sender und Empfänger von Daten nicht
55    
56    
57     %page
58    
59 root 1.3 Freenet aus "Benutzersicht"
60 root 1.1
61     %pause
62     Alle Daten werden in Datenblöcken (keys) organisiert
63     %pause
64     Keys werden in das Netzwerk "eingefügt"
65     %pause
66     Maximale Größe eines Datenblocks: 1MB
67     %pause
68     HTML-Seiten werden üblicherweise in einem Key gespeichert
69     %pause
70 root 1.3 Große Dateien werden mit forward error correction in kleinere Blöcke geteilt
71     %pause
72 root 1.1 Algorithm::FEC
73    
74    
75     %page
76    
77     Freenet-URLs
78    
79     Übliche Form eines Freenet-Links:
80    
81     %font "t3"
82     http://localhost:8888/
83 root 1.3 CHK@pfAv9IejYPXDguEkUhiNUMAwI,blzDbhN~q4JrfRWw
84 root 1.1 //Suffix
85     %font "s"
86    
87     %pause
88     http://localhost:8888/ nur der Pfad zum HTTP-Proxy des Knotens
89     %pause
90     CHK ist der Typ (hier: Content Hash Key)
91     %pause
92     Dahinter Folgen Parameter (meist Schlüssel u.ä.), "base64"-codiert
93     %pause
94 root 1.3 Suffix (nach //) wird von Freenet ignoriert
95 root 1.1
96     %page
97    
98     Content Hash Keys
99    
100     %font "t3"
101     CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
102     ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
103     Typ Routing-Key Crypto-Key
104     %font "s"
105    
106     %pause
107     Crypto-Key wird aus den Daten generiert
108     verschlüsselt die Daten
109     %pause
110     Routing-Key wird aus dem Crypto-Key generiert
111     dient zum Indizieren und Suchen der Daten
112     %pause
113     Daten können mehrfach eingefügt werden. Da gleiche Daten == gleicher Key wird das Netzwerk nicht belaste
114    
115     %page
116    
117 root 1.2 Freenet Live
118    
119     %system "/opt/bin/links -g http://129.13.162.73:8888/"
120    
121     %page
122    
123 root 1.3 Abrufen eines Keys (1)
124 root 1.2
125     Beispiel: ein Bild der Seite "Thought-Crime":
126    
127     %font "t3"
128     CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
129     %font "s"
130    
131 root 1.3 1. Suche nach CHK@pfAvI...kUhiNUMAwI
132 root 1.2 %pause
133 root 1.3 (a5f02ff487a36...e12452188d50c0302)
134 root 1.2 %pause
135     0c == 4k, 0302 == CHK + Twofish
136     %pause
137     Skalierbarkeit durch lineare Suche
138     %pause
139     2. Entschlüsseln der Daten mit blzDbhN~8Q28esq4JrfRWw
140     (6e5cc36e137ef10dbc7acab826b7d15b)
141    
142     %page
143    
144 root 1.3 Abrufen eines Keys (2)
145 root 1.2
146 root 1.3 Abgerufen Daten bestehen aus Metadaten und Daten
147 root 1.2
148     Metadaten:
149    
150     %font "t3"
151     Revision=1
152     EndPart
153     Document
154     Info.Format=image/png
155     End
156     %font "s"
157    
158     Daten:
159    
160     %font "t3"
161     PNG^Z...
162     %font "s"
163    
164     %page
165    
166 root 1.1 Signed Subspace Key
167    
168     %font "t3"
169     SSK@Sc6qV~D6iFhaYord6HtbjJ8MaEYPAgM,Jrd6HtbjJfw1UO1g/YoYo
170     ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
171     Typ Public Key PAgM Entropie + Daten
172     %font "s"
173    
174     %pause
175     Daten werden mit einem private Key signiert
176     %pause
177     maximale Größe 32K
178     %pause
179     mit einem Schüsselpaar können viele Keys eingefügt werden
180     Unterscheidung über angehängte Daten
181    
182     %page
183    
184 root 1.2 Und nun: Perl
185 root 1.1
186    
187 root 1.2 Net::Freenet::FCP
188     http://www.sf.net/projects/perlfcp
189     %pause
190     stark bei Metadaten
191     %pause
192 root 1.1
193 root 1.2 Net::FCP
194     CPAN
195     %pause
196     stark beim asynchronen Einfügen bzw. Abrufen
197     %pause
198     ist von mir, daher wird nur dieses Modul angesprochen :)
199 root 1.1
200 root 1.2 %page
201 root 1.1
202 root 1.2 Einfache Abfragen
203 root 1.1
204 root 1.2 Abfragen benutzen das Freenet Client Protocol (FCP)
205     %pause
206     ein einziger Horror
207     %pause
208     zum Glück gibt's Perl :)
209     %pause
210 root 1.1
211 root 1.2 %font "t5"
212     use Net::FCP;
213     my $fcp = new Net::FCP;
214     %pause
215     my ($meta, $data)
216     = @{ $fcp->client_get (
217     "freenet:SSK@0O....PAgM/fx/3//"
218     15
219     ) };
220 root 1.1
221 root 1.2 %font "s"
222 root 1.1
223 root 1.2 %page
224 root 1.1
225 root 1.2 Fehlerbehandlung
226 root 1.1
227 root 1.2 Bei Nichtfinden: die
228     %pause
229     Net::FCP::Exception<<data_not_found,>>
230     %pause
231     einfach nochmal probieren
232     %pause
233     Bei Netzwerkfehlern: die
234     %pause
235     Net::FCP::Exception<<short_data,reason:unexpected eof or internal node error>>
236     %pause
237     einfach nochmal probieren
238     %pause
239     Bei Schluckauf: die
240     %pause
241     einfach nochmal probieren
242     %pause
243 root 1.1
244 root 1.2 Daher: eval { } benutzen.
245 root 1.1
246 root 1.2 %page
247 root 1.1
248 root 1.2 Metadaten in Perl
249 root 1.1
250 root 1.2 %pause
251     Metadaten in Perl: Net::FCP::Metadata-Objekte
252     %pause
253 root 1.1
254 root 1.2 Am besten einmal ausgeben lassen:
255 root 1.1
256 root 1.2 %font "t5"
257     use Data::Dumper;
258     print STDERR Dumper $meta;
259     print $data;
260     %font "s"
261 root 1.1
262 root 1.2 %pause
263     z.B. mit eg/fetch1:
264 root 1.1
265 root 1.2 %font "t4"
266     eg/fetch1 SSK@0OhV.......oPAgM/fx/3// >data
267     %font "s"
268 root 1.1
269 root 1.2 %page
270 root 1.1
271 root 1.2 Metadaten einer Freesite
272 root 1.1
273 root 1.2 Stark gekürzt:
274     %pause
275     %font "t4"
276     version => { 'revision' => '1' },
277     document => [ {
278     info =>{format => 'image/png'},
279     redirect=>{target => 'freenet:CHK@...'},
280     name =>'activelink.png'
281     }, ],
282     raw => 'Version
283     Revision=1
284     ...
285     End
286     '
287     };
288     %font "s"
289 root 1.1
290 root 1.2 %page
291 root 1.1
292 root 1.2 Manifest-Metadaten
293 root 1.1
294    
295 root 1.2 Beispiele für Keys aus den Metadaten der Freesite:
296 root 1.1
297 root 1.2 %pause
298     %font "t3"
299     Hauptseite
300     SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//
301     %pause
302     Icon
303     SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//activelink.png
304     %font "s"
305 root 1.1
306    
307 root 1.2 %pause
308 root 1.3 client_get liefert identische Daten
309 root 1.1
310 root 1.2 %pause
311     Freenet ignoriert alles hinter //
312 root 1.1
313 root 1.2 %page
314 root 1.1
315 root 1.2 Manifest-Metadaten
316 root 1.1
317 root 1.3 Selbst nachschauen durch Lookup in den Metadaten:
318 root 1.2 %pause
319 root 1.1
320 root 1.2 %font "t4"
321     $link = grep $_->{name} eq "activelink.png",
322     @{ $metadata->{document} };
323     %pause
324     print $link->{redirect};
325     %font "s"
326 root 1.1
327 root 1.2 %pause
328     kein Redirect => Daten sind angehängt
329 root 1.1
330 root 1.2 %page
331 root 1.1
332 root 1.3 Freesite-Management
333 root 1.1
334 root 1.3 %pause
335     Wie verändert man Daten, die man nicht mehr verändern kann?
336 root 1.1
337 root 1.3 %pause
338     Lösung 1: Veränderbare Keys (TUKs)
339     %pause
340     Viel Rauch, wenig Realität
341     %pause
342     Lösung 2: Editions
343     %pause
344     Links auf zukünftige Inhalte
345     %pause
346     "verkettete Liste"
347     %pause
348     Lösung 3: DBR-Links
349     %pause
350     Date-Based-Redirects
351 root 1.1
352 root 1.3 %page
353 root 1.1
354 root 1.3 Editions (1)
355 root 1.1
356 root 1.3 A-HREF + IMG-Element, zeigt auf activelink der nächsten Edition.
357 root 1.1
358 root 1.3 %pause
359     Beispiel: Freesite "Freenet Explained"
360 root 1.1
361 root 1.3 %font "t4"
362     SSK@0OhV...oPAgM/fx/4//
363     # Link-Ziel
364     SSK@0OhV...oPAgM/fx/4//activelink.png
365     # IMG-SRC
366     %font "s"
367 root 1.1
368 root 1.3 %pause
369     Edition 4 existiert noch nicht
370     %pause
371     Editionen werden durchnummeriert
372     %pause
373     Für Spider: .next-Eintrag
374 root 1.1
375 root 1.3 %page
376 root 1.1
377 root 1.3 Editions (2)
378 root 1.1
379    
380 root 1.3 %pause
381     Vorteile:
382     %pause
383     "relativ" einfach für Autoren
384     %pause
385     realisierbar mit "Hausmittel"
386     %pause
387     keine Pflege notwendig
388     %pause
389 root 1.1
390 root 1.3 Nachteile:
391     %pause
392     umständlich in der Benutzung
393     %pause
394     "es ist und bleibt ein Hack"
395 root 1.1
396 root 1.3 %page
397 root 1.1
398 root 1.3 Date-Based-Redirects (1)
399 root 1.1
400    
401 root 1.3 Unterstützung spezieller Redirects
402     %pause
403     Datum statt fortlaufender Nummer
404     %pause
405     Metadaten
406     %pause
407 root 1.1
408 root 1.3 Beispiel "The Freenet Help Index":
409     %pause
410 root 1.1
411 root 1.3 %font "t3"
412     'version' => { 'revision' => '1' },
413     'document' => [
414     { 'date_redirect' => {
415     'increment' => '15180',
416     'target' => 'SSK@rjY...8PAgM/FreenetHelp'
417 root 1.1 }
418 root 1.3 }
419     ],
420     %font "s"
421    
422     %page
423 root 1.1
424 root 1.3 Date-Based-Redirects (2)
425 root 1.1
426    
427 root 1.3 Vorteile:
428     %pause
429     einfach in der Benutzung
430     %pause
431     sauber über Metadaten implementiert
432     %pause
433     festgelegter Key
434     %pause
435 root 1.1
436 root 1.3 Nachteile:
437     %pause
438     feste Abstände zwischen Updates
439     %pause
440     häufige Pflege
441     %pause
442     keine inserts == keine Freesite
443 root 1.1
444 root 1.3 %page
445 root 1.1
446 root 1.4 DBRs in Perl
447 root 1.1
448 root 1.3 %font "t4"
449     %pause
450     my $D = $metadata->{document}[0];
451 root 1.4
452 root 1.3 %pause
453     my $incr = (hex $D->{increment}) || 86400;
454     my $offs = (hex $D->{offset}) || 0;
455     my $targ = $D->{target} || die;
456 root 1.4
457 root 1.3 %pause
458 root 1.4 my ($head, $tail) = split /\//, $targ, 2;
459 root 1.1
460 root 1.3 %pause
461     my $NOW = time;
462     my $time = $NOW - $NOW % $incr + $offs;
463     %pause
464     my $result = sprintf "%s/%x-%s",
465     $head, $time, $tail;
466     %pause
467     %font "t3"
468 root 1.1
469     SSK@rjYFfgPHfolmcStiaoxESFfBXz8PAgM/40a16900-FreenetHelp
470    
471 root 1.3 %page
472    
473     Effiziente Freenet-Abfragen
474 root 1.1
475 root 1.3 %pause
476     Problem:
477     hohe Latenz
478 root 1.4 %pause
479 root 1.3 parallele Anfragen absolut notwendig
480 root 1.4 %pause
481 root 1.3 Implementation über Threads schlecht
482 root 1.4 %pause
483 root 1.3 Perl hat keine echten Threads
484    
485 root 1.4 %pause
486 root 1.3 Lösung:
487 root 1.4 %pause
488 root 1.3 Ereignisgesteuert
489 root 1.4 %pause
490     Unterstützung für Coro, Event, Glib, Tk...
491 root 1.3
492     %page
493 root 1.1
494 root 1.4 Transaktionen
495    
496     Implementation von $fcp->client_get:
497 root 1.1
498 root 1.4 %pause
499     %font "t5"
500 root 1.1 my $txn = $fcp->txn_client_get (...);
501    
502 root 1.4 %pause
503     # Achtung: Exceptions abfangen
504     return $txn->result;
505    
506     %pause
507     %font "s"
508     Jeder FCP-Request besitzt eine txn_-Methode.
509 root 1.1
510 root 1.4 %pause
511     Parallelisierung:
512     %pause
513 root 1.1
514 root 1.4 %font "t5"
515 root 1.1 map $_->result,
516     map $_->txn_client_get ($_),
517     @download;
518    
519 root 1.4 %page
520 root 1.1
521 root 1.4 Asynchrone Abfragen
522 root 1.1
523    
524 root 1.4 %pause
525     Ziel: n ausstehende Anfragen zu jedem Zeitpunkt
526 root 1.1
527 root 1.4 %pause
528     Callback bei Beendigung
529 root 1.1
530    
531 root 1.4 %pause
532     %font "t5"
533     my $txn = $fcp->txn_client_get (...)
534     ->cb (\&callback);
535     %font "s"
536 root 1.1
537 root 1.4 %pause
538     txn-Methoden sind i.Allg. "chainbar"
539 root 1.1
540 root 1.4 %page
541 root 1.1
542 root 1.4 Hauptprogramm
543 root 1.1
544 root 1.4 Hauptprogramm muß in die Hauptschleife springen:
545 root 1.1
546 root 1.4 %font "t5"
547     use Net::FCP qw(event=Event);
548 root 1.1
549 root 1.4 %pause
550     my $fcp = new Net::FCP;
551     $fcp->txn_client_get ($_)->cb (\&finished)
552     for @ARGV;
553 root 1.1
554 root 1.4 %pause
555     Event::loop;
556 root 1.1
557 root 1.4 %font "s"
558     %pause
559     Angabe des Event-Moduls nur im Hauptprogramm
560 root 1.1
561 root 1.4 %page
562 root 1.1
563 root 1.4 Callback (1)
564 root 1.1
565    
566    
567 root 1.4 %font "t5"
568 root 1.1 sub finished {
569     my ($txn) = @_;
570 root 1.4 my ($meta, $data) = @{ $txn->result };
571     # tue etwas
572 root 1.1 }
573    
574 root 1.4 %page
575    
576     Callback (2)
577 root 1.1
578 root 1.4
579     %font "t5"
580     sub finished {
581     my ($txn) = @_;
582     my ($meta, $data) = eval { @{ $txn->result } };
583     if ($@) {
584     warn "error $@, who cares :)"
585     } else {
586     warn "Lo and Behold! We got soemthing!";
587     # tue etwas
588 root 1.1 }
589 root 1.4 }
590 root 1.1
591 root 1.4 %page
592 root 1.1
593 root 1.4 Callbacks und Threads
594 root 1.1
595 root 1.4 Das Coro Modul ermöglicht es, Callback-Stil und Thread-Stil zu mischen:
596 root 1.1
597 root 1.4 %pause
598     %font "t3"
599 root 1.1 use Net::FCP qw(event=Coro);
600    
601     my $fcp = new Net::FCP;
602    
603     # Achtung. Pseudocode :)
604     for my $url (@urls) {
605     async {
606     my ($meta, $data) = @{ $fcp->client_get ($url) };
607    
608 root 1.4 for (@alle_splitfile_blöcke) {
609     $fcp->txn_client_get (...)
610     ->cb (\&save_splitfile_block);
611 root 1.1 }
612     };
613     }
614    
615 root 1.4 %page
616 root 1.1
617 root 1.4 Splitfiles
618 root 1.1
619    
620 root 1.4 %pause
621     Zerteilen von großen Dateien in:
622 root 1.1
623 root 1.4 %pause
624     Segmente (max. 128MB)
625 root 1.1
626 root 1.4 %pause
627     Datenblöcke (max 1MB)
628 root 1.1
629 root 1.4 %pause
630     Checkblöcke (50% der Gesamtzahl)
631 root 1.1
632    
633 root 1.4 %page
634 root 1.1
635 root 1.4 Publizieren
636 root 1.1
637 root 1.4 Einfügen von Keys ist so einfach(?) wie auslesen
638 root 1.1
639 root 1.4 %pause
640     %font "t4"
641     $fcp->client_put ($uri, $meta, $data, $htl, $remove);
642     %font "s"
643 root 1.1
644 root 1.4 %pause
645     Parallelität mit txn_client_put
646     %pause
647     Key Collisions sind O.K.
648     %pause
649     Key wird automatisch erzeugt:
650 root 1.1
651 root 1.4 %pause
652     %font "t4"
653     my $attr = $fcp->client_put ('CHK@', "", "Daten\n", 20);
654     print "eingefügte URI: $attr->{uri}\n";
655 root 1.1
656 root 1.4 %pause
657     %font "t3"
658     => freenet:CHK@MT~LuxKHH8fugJehkcgp239h7C4KAwI,378rJzHVZbsQbd7VGMHxSg
659 root 1.1
660 root 1.4 %page
661 root 1.1
662 root 1.4 SSK-Keys generieren
663 root 1.1
664 root 1.4 SSK = Spezialfall von SVK
665 root 1.1
666 root 1.4 %pause
667     %font "t4"
668     my ($public, $private, $crypto)
669     = @{ $fcp->generate_svk_pair };
670     %font "s"
671 root 1.1
672 root 1.4 %pause
673     Einfüge- und Ausleseschlüssel:
674 root 1.1
675 root 1.4 %pause
676     %font "t4"
677     my $name = "..."; # beliebig
678     my $get = "SSK\@${public}PAgM,$crypto/$name";
679     %pause
680     my $put = "SSK\@$private,$crypto/$name";
681     %font "s"
682     %pause
683     Net::FCP::Key::SSK
684 root 1.1
685 root 1.4 %page
686 root 1.1
687 root 1.4 Erzeugen einer Freesite (1)
688 root 1.1
689 root 1.4 %pause
690     %font "t4"
691     perl -MNet::FCP -MNet::FCP::Key::SSK
692     -e 'Net::FCP::Key::SSK->new_from_fcp (Net::FCP->new)
693     ->save ($ARGV[0])' mykey
694 root 1.1
695 root 1.4 %pause
696     # Definitionen
697 root 1.1 my $edition = 1;
698     my $keyfile = "mykey";
699     my $htl = 10;
700    
701 root 1.4 %pause
702     # Module
703 root 1.1 use Net::FCP qw(event=Event);
704     use Net::FCP::Metadata;
705     use Net::FCP::Key::SSK;
706    
707 root 1.4 %page
708    
709     Erzeugen einer Freesite (2)
710    
711     %font "t4"
712     %pause
713     # Notwendige Objekte erzeugen/laden
714     my $fcp = new Net::FCP;
715     my $ssk = new_from_file Net::FCP::Key::SSK $keyfile;
716    
717     %pause
718     \# Hilfsfunktion zum (asynchronen) Einfügen
719     sub add_key {
720     my ($name, $key, $meta, $data) = @_;
721    
722     $fcp->txn_client_put ($chk, $meta, $data, $htl, 1)
723     ->cb (sub {
724     eval {
725     my $attr = $_[0]->result;
726     } or warn "'$name': $@";
727     });
728     }
729 root 1.1
730 root 1.4 %page
731 root 1.1
732 root 1.4 Erzeugen einer Freesite (3)
733 root 1.1
734 root 1.4 %font "t4"
735     \# Hilfsfunktion für Dateien
736     sub add_file {
737     my ($name, $path, $contenttype) = @_;
738    
739     # lies die Datei ein
740     my $data = ...
741    
742     my $chk = $fcp->generate_chk ("", $data);
743     $manifest->add_redirect ($name => $chk,
744     format => $contenttype);
745     add_key $name, $chk, "", $data;
746     }
747 root 1.1
748 root 1.4 %page
749 root 1.1
750 root 1.4 Erzeugen einer Freesite (4)
751 root 1.1
752 root 1.4 %font "t4"
753     \# Hauptprogramm: Manifest erzeugen
754 root 1.1
755 root 1.4 my $manifest = new Net::FCP::Metadata;
756 root 1.1
757 root 1.4 %pause
758     \# .prev-Link
759     $manifest->add_redirect (".prev"
760     => $ssk->gen_pub ($edition - 1))
761     if $edition > 1;
762 root 1.1
763 root 1.4 %pause
764     \# .next-Link
765     $manifest->add_redirect (".next"
766     => $ssk->gen_pub ($edition + 1));
767 root 1.1
768 root 1.4 %page
769 root 1.1
770 root 1.4 Erzeugen einer Freesite (5)
771 root 1.1
772 root 1.4 %font "t4"
773     \# Dateien hinzufügen
774 root 1.1
775 root 1.4 %pause
776     add_file "activelink.png" => "logo.png", "image/png";
777     add_file "" => "index.html", "text/html";
778     add_file "index.html" => "index.html", "text/html";
779     add_file "freesite" => "freesite", "text/plain";
780 root 1.1
781 root 1.4 %pause
782     \# Manifest einfügen
783     my $site = $ssk->gen_pub ($edition);
784     %pause
785     add_key "manifest", $site, $manifest, "";
786 root 1.1
787 root 1.4 %pause
788     print "site generated as $site//\n";
789 root 1.1
790 root 1.4 %pause
791     Event::loop;
792 root 1.1
793    
794 root 1.4 %page
795 root 1.1
796 root 1.4 Erzeugen einer Freesite (6)
797 root 1.1
798    
799 root 1.4 Ausgabe des Programms:
800 root 1.1
801 root 1.4 %font "t4"
802     %pause
803     site generated as SSK@wg...gPAgM,Jr...UO1g/1//
804     %pause
805     Insert of 'freesite' (1688 bytes) ok.
806     Insert of 'activelink.png' (1346 bytes) ok.
807     Insert of 'index.html' (200 bytes) ok.
808     Insert of '' (200 bytes) ok.
809     Insert of 'manifest' (0 bytes) ok.
810 root 1.1
811 root 1.4 %page
812 root 1.1
813 root 1.4 Fragen?
814 root 1.1
815    
816    
817