example source config
[ambros.git] / Scratch / yargo.md
blob31f5bc5c5caa4575f9fb4489bd3ceb1e5ab937b5
1 # yargo scratch file
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 - POSTPROCESSOR: Skript zum Postprozessing: Umlaute, verbotene Woerter, ...
34 - WPM: Tastgeschwindigkeit (kann durch Rezept oder Prio veraendert werden)
35 - SOURCES: Liste von IDENTIFICATIONs (Quellen), welche gesendet werden sollen
37 #### Variablen
39 - XXXSTATUS: oberste aktuell laufende XXX-Prioritaet (20=PPP, falls keine)
41 ### Quelle
43 #### Konstanten
45 - IDENTIFICATION: eindeutiges "Wort" (nur Buchstaben), so kurz wie moeglich,
46   wird durch Verzeichnisname definiert
47 - PRIORITY: Prioritaet P: 10=max, 99=min (kann durch Rezept veraendert werden)
48 - SOURCE: Quelle (URL, Datei, ...); bei mehreren Quellen erste erfolgreich
49   abgerufene, IDENTIFICATION wird dann mit Sub-ID (1,2,...) versehen
50 - POLLING: Abrufintervall oder -zeit (crontab?)
51 - RECIPE: Skript zur Verarbeitung
52 - INTERVAL: Sendeintervall (in sec, 0= sofort sobald neue Version)
53 - ERRORRECIPIENT: Fehlermelde-Methode: e-mail, Sendung, Log; optional
54   mit Regexp/Textblock fuer Zusatzinfo
56 #### Variablen
58 - LASTMARK: Hash oder sonstiger Schluessel auf letzte/aktuelle Version
59   (zur Filterung gleicher Quelltexte trotz unterschiedlichem Zeitstempel)
61 ## Komponenten
63 ### Zeitmesser
65 _ok, shellscript_ `src/morse/sniptime`
67 - Eingabetext auf stdin
68 - wenn `Laenge>0`: stdout erhaelt auf Laenge[sec] (gemaess WpM) abgemessenen Text (stdin abgeschnitten)
69 - sonst erhaelt stdout Laenge[sec] (gemaess WpM) des Textes von stdin
70 - Zeichenlaenge einmalig aus Textdatei ermittelt:
72     a .-
73     b -...
74     ...
76 ### Planer
78 _shellscript_ `src/ambros`
80 - startet und ueberwacht je Kanal einen `Schneider` und einen `Sendechef`
81 - ruft Quellen regelmaessig ab mittels `Bereiter`
83 ### Bereiter
85 _shellscript_ `scr/extractor`
87 - gestartet von `Planer`
88 - holt Rohdaten mit `Sauger` und wandelt sie mittels Rezepten in `SauberTexte` um (mit PBL fuer Quellenangaben u Prioritaeten)
90 ### Sauger
92 _ok, shellscript_ `src/fetcher`
94 - gestartet von `Bereiter`
95 - holt Rohdaten von Net/Mail/File mit Quellenangabe auf erster Zeile, Erstellungszeit auf zweiter Zeile
97 ### Schneider
99 _shellscript_ `src/assembler`
101 - erstellt `SendeTexte` (formatierte Texte) via Filesystem fuer `Sendechef`, basierend auf aktuellem Status und _Durchsatzoptimierung_
102 - erzeugt Filenamen aufsteigend je Kanalprefix
103 - je Kanalprefix nur eine Instanz
105 ### Sendechef
107 _shellscript_ `scr/channelchief`
109 - erzeugt Textstrom fuer `Sender`, meldet Filestatus zurueck an `Schneider`
110 - unterbricht allenfalls bei Eintreffen von XXX (via Filesystem ueber Datei mit _Index_ `10..19` im Namen, falls kleiner als aktuell laufendes XXX)
111 - nimmt je Kanalprefix ersten `SendeText`, verschiebt ihn nach erfolgreicher Uebergabe an `Sender` in Papierkorb/Log
112 - je Kanalprefix nur eine Instanz
114 ### Sender
116 - erzeugt A1A-Signal aus Textstrom-Zeichen
117 - je Kanalprefix nur eine Instanz
119 ## Prioritaeten
121 _0 ist reserviert fuer SendeText, siehe unten_
123 10..19: XXX (EMERGENCY)
124 20..29: PPP (URGENT)
125 30..39: TTT (IMPORTANT)
126 40..49: SSS (STANDARD)
127 50..59: VVV (FILLER)
129 ## Dateiformate
131 ### SauberText
133 Dateien enthalten zuerst PBL-Zeilen, eine oder mehrere Leerzeilen, anschliessend Textzeilen.
134 PBL-Zeilen mit anderem als Buchstaben an erster Stelle werden ignoriert (Kommentar).
136 #### Name: PrefixPrioIndex[Suffix]
138 - _Prefix_ `_a..z` (Kanalselektor falls mehrere Sendekanaele, `_` fuer alle)
139 - _Prio_ Zahl `10..99` (`0..9` reserviert)
140 - _Index_ Ganzzahl (`0[0*]` ist reserviert fuer XXX)
141 - _Suffix_ `.txt`
142 - normalerweise im 8.3-Schema PNNMMMMM.YYY, dh Index mindestens bis zu 1E5-1;
143   zB `a4000123.txt` (Kanal a, Prio 40, Nr.123)
144   oder `_123.txt` (alle Kanaele, Prio 12, Nr.3)
146 #### PBL-Zeilen (Bezeichner grossgeschrieben)
148 - `PRIORITY` Prioritaet (10..99, normalerweise nur 10..59)
149 - `INDEX` Index (Ganzzahl)
150 - `DECAY` Zerfallszeit [sec] fuer abnehmende Sendewahrscheinlichkeit
151 - `DURATION` Dauer [sec], rein informativ (fuer Sendeplanerstellung)
152 - `WPM` Tempo [WPM], minimal 1
153 - `GENESIS` Erstellungszeit [sec]
154 - `SOURCE` Quelle (URL)
155 - `IDENTIFICATION` Kurzbezeichnung (Wort, optional da durch Quelle gegeben)
157 `PRIORITY,INDEX` sind identisch zu entsprechenden Teilen des Dateinamens
158 und deshalb optional; bei Widerspruechen haben sie jedoch Vorrang.
160 #### Beispiel
162 STANDARD (ROUTINE) von info@example.com, erhalten 2010-12-30,12:34, 48 sec lang, Tempo 20 WPM, gueltig (zu senden) bis 2011-2-3,04:05
164     PRIORITY 4
165     DECAY 201102030405
166     DURATION 48
167     WPM 20 wpm
168     GENESIS 201012301234
169     SOURCE mail:info@example.com
170     
171     == mail: info at example.com = this is a first test for mail input = 73 de example.com +
173 ### SendeText
175 Format wie SauberText, allenfalls whitespace umformatiert
177 #### Namen: PrefixPrioIndex[Suffix]
179 - _Prefix_ `_a..z` (Kanalselektor falls mehrere Sendekanaele, `_` fuer alle)
180 - _Prio_ `00` __fix__ zur Abgrenzung gegen SauberTexte
181 - _Index_ Ganzzahl (`[0*]0` ist reserviert fuer XXX)
182 - _Suffix_ `.txt` oder `.dat`
184 #### PBL-Zeilen (Bezeichner grossgeschrieben)
186 wie oben, jedoch _alle optional ausser_ `WPM`
190 ## Morsebroadcast - Plan
192 (basierend auf plan.txt, 2004/05/23)
194 Eine unbediente Funkstation sammelt via Web oder PR oder andere Verfahren
195 (gespeicherte Texte) Texte und Daten, bereitet sie auf und sendet sie in
196 Morse aus. Sie besteht aus einer Sendestation, einem Rechner mit einem
197 Skript, Zusatzprogrammen zum Morsen sowie evtl Kommunikationsverbindungen
198 (Web, PR, lokale Wetterstation).
200 ### Skript:
202 - laedt regelmaessig bestimmte Webseiten (URLs) und vergleicht sie mit den gepufferten Versionen
203 - fuer eine bestimmte Zeitscheibe (z.B. 15min oder 30min) wird aus den Webseiten Text zusammengestellt, der nicht laenger zum Morsen benoetigt
204 - jeder Seite wird eine ID und Versionsnummer ("QTC-Nummer") zugeteilt, die in regelmaessigen Abstaenden in den Text eingebaut (mitgesendet) wird
205 - evtl werden Stationskennungen und andere Angaben in den Text eingebaut
206 - zu den vorgegebenen Zeitpunkten wird die Zeit und Stationskennung gesendet
207 - wenn keine neuen Versionen vorliegen, koennen weniger aktuelle Nachrichten (Hintergrundinfos) gesendet werden
208 - 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)
209 - evtl werden vor dem Einfuegen in den Morsestrom weitere Pruefungen angewendet: nur plausible Zeichen? sinnvoller Text? "verbotene Woerter"?
210 - zur Bestimmung der Morsezeit und zum Morsen dienen separate Programme; Morsen erfolgt bevorzugt ueber ein System wie lpr
212 ### Programm-Erstellung ueber Minimierung einer Kostenfunktion
214 #### allgemeine Kosten:
216 - Leerzeit in Zeitscheibe: `q.n=Zeit([Prio.10-49]/Zeitscheibenlaenge)`
217 - Konstanten in Kostenfunktion: `k.A, k.P, g.(), f.()`
219 #### Einzelkosten:
221 - Prioritaet: `P.j=Prio^k.P` mit zB `k.P=2`
222 - Zerreissen eines Textes: `p.j1=Stueckzahl-1`
223 - Unterdruecken eines Textes: `p.j2=(unterdrueckt?1:0)`
224 - Kuerzen eines Textes: `p.j3=100*Kuerzung/Textlaenge`
225 - Alter relativ zu Sendeintervall: `p.j4=(Alter/Intervall)^k.A` mit zB `k.A=2`
227 #### Kostenfunktion:
229 fuer einzelne Zeitscheibe:
230 `S.n= g.n*q.n + sum.j(P.j*[1+sum.k(f.k*p.jk)])`
232 mit Gewichtungsfaktoren `g.n` und `f.k`
234 Total:
235 `T= sum.n(S.n/n)` mit
236 n="Unsicherheitsfaktor Zukunft"
238 #### Ablauf:
240 - Ziel: Gesamtkosten minimieren
241 - Startwert: Texte nach Prio aufsteigend und Laenge absteigend angeordnet
242 - Verfahren: von vorne beginnend umstellen
243 - Abbruchbedingungen:
244   - neuer Text eingetroffen mit hoeherer Prio als vorhanden
245   - keine Zeit mehr vor Sendebeginn
251 # Archiv / Abfall
253 ## Ideen
255 ### make
257 - vom Quelltext zum SauberText
258 - vom SauberText zum SendeText
260 ### MIDI
262 - [midi1]( http://www.sonicspot.com/guide/midifiles.html )
263 - [midi2]( http://cs.fit.edu/~ryan/cse4051/projects/midi/midi.html )
264 - [midi3]( http://faydoc.tripod.com/formats/mid.htm )
268 ## Bitmorse (binaer, byteorientiert)
270 _eventuell unnoetig: direkt normale ASCII-Text waehrend Senden konvertieren_
272 Bit 7 muss gesetzt sein fuer Morsedaten, geloescht fuer Steuerdaten
274 ### Morsedaten
276 - Bit 7 wird geloescht, dann hoechstes gesetztes Bit gleich Stopbit (erzeugt kein Signal)
277 - 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
278 - Verarbeitung durch Rightshift, Ende wenn 1 vom Stopbit erreicht
280 #### Spezialfaelle (mit Bit 7 bereits geloescht)
282 - 0 = Zeichen-Pause (drei Dit-Pausen)
283 - 1 = Wort-Pause (sieben Dit-Pausen)
284 - 127 (0x7f) = Irrung, dh wird wie 0x100 gesendet (8 dits, Bedeutung waere eigentlich 6 dahs)
286 ### Steuerdaten
288 - 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
289 - unbekannte Steuerzeichen oder -befehle werden still ignoriert
290 - 0 = reserviert
291 - 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
292 - 0x20 .. 0x2F = Kommentar (inkl Argument komplett ignoriert)