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