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