1 # yargo scratch file for AMBroS
5 Kontrollskript `ambros.sh` muss in Verzeichnis gestartet werden,
6 das Kanalverzeichnisse enthaelt, und globale Konfigurationsdatei
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`.
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
42 - XXXSTATUS: oberste aktuell laufende XXX-Prioritaet (25=PPP, falls keine)
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
63 - LASTHASH: Hash oder sonstiger Schluessel auf letzte/aktuelle Version
64 (zur Filterung gleicher Quelltexte trotz unterschiedlichem Zeitstempel)
65 - INDEX: laufende Nummer
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:
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
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
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
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
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
141 - erzeugt A1A-Signal aus Textstrom-Zeichen
142 - je Kanalprefix nur eine Instanz
146 ### SIGDAEMONTERMINATE
150 - fuer alle Daemons und Subroutinen
160 - Signal zum Neulesen der Konfiguration und Neustart
162 - fuer alle Daemons und Subroutinen
166 _0 ist reserviert fuer SendeText, siehe unten_
168 10..19: XXX (EMERGENCY)
170 30..39: TTT (IMPORTANT)
171 40..49: RRR (ROUTINE)
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)
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
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.
209 STANDARD (ROUTINE) von info@example.com, erhalten 2010-12-30,12:34, Zerfallszeit 43200 sec
215 SOURCE mail:info@example.com
217 == mail: info at example.com = this is a first test for mail input = 73 de example.com +
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]
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).
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.()`
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`
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`
284 `T= sum.n(S.n/n)` mit
285 n="Unsicherheitsfaktor Zukunft"
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
306 - vom Quelltext zum SauberText
307 - vom SauberText zum SendeText
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
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)
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
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)