typos and clarifications
[ambros.git] / Scratch / yargo.md
blob29126146618a1cafb8e313d988f5db43d9678bd1
1 # yargo scratch file for AMBroS
3 ## Konfiguration
5 Kontrollskript `ambros.sh` muss in Verzeichnis gestartet werden,
6 das Kanalverzeichnisse enthaelt, und globale Konfigurationsdatei
7 als Argument erhalten.
9 Jeder Kanal hat ein eigenes Verzeichnis mit Konfigurationsdatei und
10 aktuellem Status sowie den SendeTexten. Die benoetigten Quellen sind
11 implizit dort definiert.
13 Alle Quellen sind in einem separaten Verzeichnis `textsources` abgelegt.
14 Jede Quelle hat ein eigenes Verzeichnis mit abgelegten SauberTexten,
15 benannt nach ihrer Kurzbezeichnung `IDENTIFICATION`.
17 Verzeichnisstruktur:
19 - Kanal1
20 - Kanal2
21 - KanalN
22 - textsources
23   - Quelle1
24   - Quelle2
25   - QuelleN
27 ### Kanal
29 #### Konstanten
31 - SLICETIME: Zeitscheibenlaenge
32 - SLICEDEPTH: Anzahl vorauszuberechnender Zeitscheiben
33 - TOCLENGTH: maximale Laenge [sec] des Inhaltsverzeichnisses
34 - TOCSLICES: Anzahl Zeitscheiben zwischen Inhaltsverzeichnis-Sendungen
35 - POSTPROCESSOR: Skript zum Postprozessing: Umlaute, verbotene Woerter, ...
36 - WPM: Tastgeschwindigkeit (kann durch Rezept oder Prio veraendert werden)
37 - SOURCES: Liste von IDENTIFICATIONs (Quellen), welche gesendet werden sollen
38 - PREFIX: Prefix fuer Quelltexte
40 #### Variablen
42 - XXXSTATUS: oberste aktuell laufende XXX-Prioritaet (25=PPP, falls keine)
44 ### Quelle
46 #### Konstanten
48 - IDENTIFICATION: eindeutiges "Wort" (nur Buchstaben), so kurz wie moeglich,
49   wird durch Verzeichnisname definiert
50 - PRIORITY: Prioritaet P: 10=max, 99=min (kann durch Rezept veraendert werden)
51 - SOURCE: Quelle (URL, Datei, ...); bei mehreren Quellen erste erfolgreich
52   abgerufene, IDENTIFICATION wird dann mit Sub-ID (1,2,...) versehen
53 - POLLING: Abrufintervall oder -zeit
54 - RECIPE: Skript zur Verarbeitung
55 - PERIOD: Sendeperiode (in sec, 0= sofort sobald neue Version)
56 - MININDEX: minimaler INDEX-Wert (zB 100)
57 - MAXINDEX: maximaler INDEX-Wert (zB 999, danach wieder MININDEX)
58 - ERRORRECIPIENT: Fehlermelde-Methode: e-mail, Sendung, Log; optional
59   mit Regexp/Textblock fuer Zusatzinfo
61 #### Variablen
63 - LASTHASH: Hash oder sonstiger Schluessel auf letzte/aktuelle Version
64   (zur Filterung gleicher Quelltexte trotz unterschiedlichem Zeitstempel)
65 - INDEX: laufende Nummer
67 ## Komponenten
69 ### Zeitmesser
71 _ok, shellscript_ `src/morse/sniptime`
73 - Eingabetext auf stdin
74 - wenn `Laenge>0`: stdout erhaelt in Worte getrennten Text (stdin),
75   wobei nach Laenge[sec] (gemaess WpM) Leerzeile eingefuegt wird
76 - sonst erhaelt stdout Textlaenge[sec] (gemaess WpM) von stdin
77 - Zeichenlaenge einmalig aus Textdatei ermittelt:
79     a .-
80     b -...
81     ...
83 ### Kontroller (zentrales Skript)
85 _ok, shellscript_ `src/ambros`
87 - startet und ueberwacht je Kanal einen `Planer` und einen `Sendechef`
88 - ruft Quellen regelmaessig ab mittels `Bereiter`
89 - Argument: Konfigurationsdatei im Kanalverzeichnis
91 ### Bereiter
93 _ok, shellscript_ `src/extractor`
95 - gestartet von `Kontroller`
96 - holt Rohdaten mit `Sauger` und wandelt sie mittels Rezepten
97   in `SauberTexte` um (mit PBL fuer Quellenangaben u Prioritaeten)
98 - Argumente: Prefix, Reportdatei (feedback), Quellenverzeichnisliste
100 ### Sauger
102 _ok, shellscript_ `src/fetcher`
104 - gestartet von `Bereiter`
105 - holt Rohdaten von Net/Mail/File mit Quellenangabe auf erster Zeile und
106   Erstellungszeit auf zweiter Zeile
107 - Argument: PROTO://SOURCE
109 ### Planer
111 _shellscript_ `src/planner`
113 - erstellt `SendeTexte` (formatierte Texte) via Filesystem fuer `Sendechef`,
114   basierend auf aktuellem Status und Durchsatzoptimierung
115 - erzeugt Filenamen aufsteigend je Kanalprefix
116 - erzeugt Sendeplan zur Uebertragung zu vordefinierten Zeiten
117 - eine Instanz je Kanalprefix
119 ### Durchsatz-Optimierer
121 _shellscript_ `src/optimize`
123 - berechnet beste Anordnung der `SendeTexte` (aus stdin) und gibt sie
124   umgestellt wieder aus (stdout)
125 - stdin&stdout: Liste der Textdateinamen und ihrer jeweiligen Kosten
126 - Argumente: Dateien mit Kostenfunktions-Parametern und Kanalkonfiguration
128 ### Sendechef
130 _shellscript_ `scr/sender`
132 - erzeugt Textstrom fuer `Morser`, meldet Filestatus zurueck an `Planer`
133 - unterbricht allenfalls bei Eintreffen von XXX (via Filesystem ueber Datei
134   mit _Index_ `10..19` im Namen, falls kleiner als aktuell laufendes XXX)
135 - nimmt je Kanalprefix ersten `SendeText`, verschiebt ihn nach erfolgreicher
136   Uebergabe an `Morser` in Papierkorb/Log
137 - eine Instanz je Kanalprefix
139 ### Morser
141 - erzeugt A1A-Signal aus Textstrom-Zeichen
142 - je Kanalprefix nur eine Instanz
144 ## Signale
146 ### SIGDAEMONTERMINATE
148 - Abbruchsignal
149 - von ambros.sh
150 - fuer alle Daemons und Subroutinen
152 ### INT,TERM,STOP
154 - Abbruchsignal
155 - von extern
156 - fuer ambros.sh
158 ### SIGDAEMONRESTART
160 - Signal zum Neulesen der Konfiguration und Neustart
161 - von ambros.sh
162 - fuer alle Daemons und Subroutinen
164 ## Prioritaeten
166 _0 ist reserviert fuer SendeText, siehe unten_
168 10..19: XXX (EMERGENCY)
169 20..29: PPP (URGENT)
170 30..39: TTT (IMPORTANT)
171 40..49: RRR (ROUTINE)
172 50..59: VVV (FILLER)
174 ## Dateiformate
176 ### SauberText
178 Dateien enthalten zuerst PBL-Zeilen, eine oder mehrere Leerzeilen, anschliessend Textzeilen.
179 PBL-Zeilen mit anderem als Buchstaben an erster Stelle werden ignoriert (Kommentar).
181 #### Name: PrefixPrioIndex[Suffix]
183 - _Prefix_ `_a..z` (Kanalselektor falls mehrere Sendekanaele, `_` fuer alle)
184 - _Prio_ Zahl `10..99` (`0..9` reserviert)
185 - _Index_ Ganzzahl (`[0*]0` ist reserviert fuer XXX)
186 - _Suffix_ `.txt`
187 - normalerweise im 8.3-Schema PNNMMMMM.YYY, dh Index mindestens bis zu 1E5-1;
188   zB `a4000123.txt` (Kanal a, Prio 40, Nr.123)
189   oder `_123.txt` (alle Kanaele, Prio 12, Nr.3)
191 #### PBL-Zeilen (Bezeichner grossgeschrieben)
193 - `PRIORITY` Prioritaet (10..99, normalerweise nur 10..59)
194 - `INDEX` Index (Ganzzahl)
195 - `DECAY` Zerfallszeit [sec] fuer abnehmende Sendewahrscheinlichkeit
196 - `GENESIS` Erstellungszeit [sec]
197 - `SOURCE` Quelle (URL)
198 - `IDENTIFICATION` Kurzbezeichnung (Wort, optional da durch Quelle gegeben)
199 - `DURATION` Sendedauer [sec] bei angegebener Geschwindigkeit in WPM
200 - `WPM` Speed [WpM]
202 `PRIORITY,INDEX` sind identisch zu entsprechenden Teilen des Dateinamens
203 und deshalb optional; bei Widerspruechen haben sie jedoch Vorrang.
204 `DURATION,WPM` sind optional, sollten aber vorhanden sein, damit Planung
205 rascher berechnet werden kann.
207 #### Beispiel
209 STANDARD (ROUTINE) von info@example.com, erhalten 2010-12-30,12:34, Zerfallszeit 43200 sec
211     PRIORITY    44
212     INDEX       123
213     DECAY       43200
214     GENESIS     201012301234
215     SOURCE      mail:info@example.com
216     
217     == mail: info at example.com = this is a first test for mail input = 73 de example.com +
219 ### SendeText
221 Format wie SauberText, allenfalls whitespace umformatiert
223 #### Namen: PrefixPrioIndex[Suffix]
225 - _Prefix_ `_a..z` (Kanalselektor falls mehrere Sendekanaele, `_` fuer alle)
226 - _Prio_ `00` __fix__ zur Abgrenzung gegen SauberTexte
227 - _Index_ Ganzzahl (`[0*]0` ist reserviert fuer XXX)
228 - _Suffix_ `.txt` oder `.dat`
230 #### PBL-Zeilen (Bezeichner grossgeschrieben)
232 wie oben, jedoch _alle optional ausser:_
234 - `DURATION` Sendedauer [sec]
235 - `WPM` Speed [WpM]
239 ## Morsebroadcast - Plan
241 (basierend auf plan.txt, 2004/05/23)
243 Eine unbediente Funkstation sammelt via Web oder PR oder andere Verfahren
244 (gespeicherte Texte) Texte und Daten, bereitet sie auf und sendet sie in
245 Morse aus. Sie besteht aus einer Sendestation, einem Rechner mit einem
246 Skript, Zusatzprogrammen zum Morsen sowie evtl Kommunikationsverbindungen
247 (Web, PR, lokale Wetterstation).
249 ### Skript:
251 - laedt regelmaessig bestimmte Webseiten (URLs) und vergleicht sie mit den gepufferten Versionen
252 - fuer eine bestimmte Zeitscheibe (z.B. 15min oder 30min) wird aus den Webseiten Text zusammengestellt, der nicht laenger zum Morsen benoetigt
253 - jeder Seite wird eine ID und Versionsnummer ("QTC-Nummer") zugeteilt, die in regelmaessigen Abstaenden in den Text eingebaut (mitgesendet) wird
254 - evtl werden Stationskennungen und andere Angaben in den Text eingebaut
255 - zu den vorgegebenen Zeitpunkten wird die Zeit und Stationskennung gesendet
256 - wenn keine neuen Versionen vorliegen, koennen weniger aktuelle Nachrichten (Hintergrundinfos) gesendet werden
257 - zu jeder bestimmten Webseite gehoert ein Verarbeitungsmuster, das bestimmt, welche Informationen zum Morsen herausgefiltert werden, welche Prioritaet die Seite aufweist, wie lang ihr Beitrag hoechstens sein darf und wie haeufig sie gesendet werden soll (cfg-Dateien)
258 - evtl werden vor dem Einfuegen in den Morsestrom weitere Pruefungen angewendet: nur plausible Zeichen? sinnvoller Text? "verbotene Woerter"?
259 - zur Bestimmung der Morsezeit und zum Morsen dienen separate Programme; Morsen erfolgt bevorzugt ueber ein System wie lpr
261 ### Programm-Erstellung ueber Minimierung einer Kostenfunktion
263 #### allgemeine Kosten:
265 - Leerzeit in Zeitscheibe: `q.n=Zeit([Prio.10-59]/Zeitscheibenlaenge)`
266 - Konstanten in Kostenfunktion: `k.A, k.P, g.(), f.()`
268 #### Einzelkosten:
270 - Prioritaet: `P.j=Prio^k.P` mit zB `k.P=2`
271 - Zerreissen eines Textes: `p.j1=Stueckzahl-1`
272 - Unterdruecken eines Textes: `p.j2=(unterdrueckt?1:0)`
273 - Kuerzen eines Textes: `p.j3=100*Kuerzung/Textlaenge`
274 - Alter relativ zu Sendeintervall: `p.j4=(Alter/Intervall)^k.A` mit zB `k.A=2`
276 #### Kostenfunktion:
278 fuer einzelne Zeitscheibe:
279 `S.n= g.n*q.n + sum.j(P.j*[1+sum.k(f.k*p.jk)])`
281 mit Gewichtungsfaktoren `g.n` und `f.k`
283 Total:
284 `T= sum.n(S.n/n)` mit
285 n="Unsicherheitsfaktor Zukunft"
287 #### Ablauf:
289 - Ziel: Gesamtkosten minimieren
290 - Startwert: Texte nach Prio aufsteigend und Laenge absteigend angeordnet
291 - Verfahren: von vorne beginnend umstellen
292 - Abbruchbedingungen:
293   - neuer Text eingetroffen mit hoeherer Prio als vorhanden
294   - keine Zeit mehr vor Sendebeginn
300 # Archiv / Abfall
302 ## Ideen
304 ### make
306 - vom Quelltext zum SauberText
307 - vom SauberText zum SendeText
309 ### MIDI
311 - [midi1]( http://www.sonicspot.com/guide/midifiles.html )
312 - [midi2]( http://cs.fit.edu/~ryan/cse4051/projects/midi/midi.html )
313 - [midi3]( http://faydoc.tripod.com/formats/mid.htm )
317 ## Bitmorse (binaer, byteorientiert)
319 _eventuell unnoetig: direkt normale ASCII-Text waehrend Senden konvertieren_
321 Bit 7 muss gesetzt sein fuer Morsedaten, geloescht fuer Steuerdaten
323 ### Morsedaten
325 - Bit 7 wird geloescht, dann hoechstes gesetztes Bit gleich Stopbit (erzeugt kein Signal)
326 - nachfolgende Bits in aufsteigender Folge (dh Beginn beim LSB, Ende beim Stopbit): 0=dit 1=dah, jeweils implizit eine Dit-Pause danach, sowie zusaetzlich zwei Dit-Pausen am Ende
327 - Verarbeitung durch Rightshift, Ende wenn 1 vom Stopbit erreicht
329 #### Spezialfaelle (mit Bit 7 bereits geloescht)
331 - 0 = Zeichen-Pause (drei Dit-Pausen)
332 - 1 = Wort-Pause (sieben Dit-Pausen)
333 - 127 (0x7f) = Irrung, dh wird wie 0x100 gesendet (8 dits, Bedeutung waere eigentlich 6 dahs)
335 ### Steuerdaten
337 - Werte kleiner als 128 (0x80) sind Steuerbefehle, werden stets von Start-Byte (beliebiger Wert) gefolgt und von Stop-Byte abgeschlossen, welches gleichen Wert wie Start-Byte haben muss; dazwischen Argument des Steuerbefehles
338 - unbekannte Steuerzeichen oder -befehle werden still ignoriert
339 - 0 = reserviert
340 - 1 = Tempo in WPM mit 1 Byte Argument, minimal Tempo 1WPM, maximal Tempo 255WPM; "Tempo 0" wird ignoriert, folglich am einfachsten 0 fuer Start-&Stopbyte; *muss* vor ersten Morsedaten gegeben sein, sonst Default-Tempo; Tempo-Basis ist PARIS
341 - 0x20 .. 0x2F = Kommentar (inkl Argument komplett ignoriert)