<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.orgamon.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root</id>
	<title>OrgaMon Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.orgamon.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root"/>
	<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Spezial:Beitr%C3%A4ge/Root"/>
	<updated>2026-05-17T10:29:49Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.postfix&amp;diff=33405</id>
		<title>Linux.postfix</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.postfix&amp;diff=33405"/>
		<updated>2026-04-28T17:24:01Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Diagnose Möglichkeiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ziel ==&lt;br /&gt;
&lt;br /&gt;
* Kompletter Mail - Server, der von innen wie von aussen kontaktiert werden kann (via pop3,smtp). Er soll für mehrere Domain-Namen und noch mehr Benutzer (alle auf die eigene ServerIP gebunden) die Post verwalten und natürlich kein offenes Relay sein.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
=== Feste IP ===&lt;br /&gt;
&lt;br /&gt;
* ein Linux Server mit fester IP Adresse. Meine, bei t-com bestellte feste IP ist z.B. &lt;br /&gt;
&lt;br /&gt;
  217.91.31.84&lt;br /&gt;
&lt;br /&gt;
* Du legst eine Domain auf diese IP, das nennen wir ab jetzt &amp;lt;MailAgentDomain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PTR Record ===&lt;br /&gt;
&lt;br /&gt;
* einen PTR Eintrag deiner IP Adresse, ab jetzt &amp;lt;ReverseHost&amp;gt; bezeichnet&lt;br /&gt;
&lt;br /&gt;
  host -t PTR &amp;lt;DeineFesteIP&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  # Bei mir ergibt das z.B. pd95b1f54.dip0.t-ipconnect.de&lt;br /&gt;
  # Leider ist es nicht möglich diesen Eintrag zu belassen, das einigen Mail Server, &lt;br /&gt;
  # so z.B. aol diese Art von Hostnamen so gar nicht mögen. Die meinen dann, man hätte&lt;br /&gt;
  # einen dynamische IP Adresse, und man versuche sich als Mailserver aufzuführen. Leider&lt;br /&gt;
  # löst der Ziel- Mailserver die Absender Domain nicht auf, sonst würde er erkennen&lt;br /&gt;
  # das die IP der Versende-Identität sowie die Identität des senders decken, also&lt;br /&gt;
  # offensichtlich kein relay verwendet wird. Meiner Meinung nach unberechtigt der&lt;br /&gt;
  # Ablehnende Fehlercode :&lt;br /&gt;
  #&lt;br /&gt;
  # 554-:  (DNS:B2) http://postmaster.info.aol.com/errors/554dnsb2.html&lt;br /&gt;
  #&lt;br /&gt;
  # Fehler 1)&lt;br /&gt;
  # &lt;br /&gt;
  # Bezieht man von der t-com eine feste IP, kommt die aus einem zweifelhaften pool,&lt;br /&gt;
  # man sollte diese mit einem schönen PTR Eintrag versehen, so z.B.&lt;br /&gt;
  # HSGWBSGA.t-com-festeip.de&lt;br /&gt;
  # dann müsste man keinen eigenen PTR Eintrag ersinnen. &lt;br /&gt;
  #&lt;br /&gt;
  # Fehler 2)&lt;br /&gt;
  #&lt;br /&gt;
  # &amp;quot;riecht&amp;quot; der PTR Eintrag nach dynamischer IP sollte die püfung der Versende&lt;br /&gt;
  # Identität erfolgen. Ist der A Eintrag wieder die selbe Adresse, so ist das ja&lt;br /&gt;
  # wohl mehr als Beweis, da die IP Adresse und PTR 100% OK ist.&lt;br /&gt;
  #&lt;br /&gt;
&lt;br /&gt;
=== MX Record ===&lt;br /&gt;
&lt;br /&gt;
* bei allen Domains die der Mailserver hosten soll, muss der ReverseHost von oben als der MX Eintrag gemacht sein. So bekommen wir einen ganz soliden MX Eintrag, der den neuesten Forderungen (PTR-fest) entspricht.&lt;br /&gt;
&lt;br /&gt;
  host -t MX &amp;lt;DeineMailDomain&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  # sollte als Ergebnis also pd95b1f54.dip0.t-ipconnect.de &lt;br /&gt;
  # ergeben!&lt;br /&gt;
&lt;br /&gt;
=== SPF Record ===&lt;br /&gt;
&lt;br /&gt;
* Es ist ein TXT Record in &amp;lt;DeineMailDomain&amp;gt; der aussagt WER zuständig für den ausgehenden Mailversand ist&lt;br /&gt;
* Es verbessert nicht die Anzahl der Spam-Mails, die Dich erreichen&lt;br /&gt;
* Es verbessert aber die Anzahl der Spam-Mails in der Welt, die als Absender &amp;lt;DeineMailDomain&amp;gt; missbrauchen, da Du hiermit erklärt hast, welche SendeServer Du benutzt. Alle anderen gelten als nicht berechtigt.&lt;br /&gt;
* In unserem Fall, ist der berechtigte unser MX, sonst niemand: &lt;br /&gt;
** &amp;lt;code&amp;gt;v=spf1 mx -all&amp;lt;/code&amp;gt;&lt;br /&gt;
* Test mit http://spf.myisp.ch/&lt;br /&gt;
&lt;br /&gt;
=== DKIM ===&lt;br /&gt;
&lt;br /&gt;
* https://kofler.info/dkim-konfiguration-fuer-postfix/&lt;br /&gt;
&lt;br /&gt;
=== DMARC ===&lt;br /&gt;
&lt;br /&gt;
* Typischer Snake-Oil Mechanismus der nur scheinbar die Sicherheit erhöht, der _dmarc TXT Record muss bei der Mail-Domain hinzugemacht werden, nicht bei der mx Domain&lt;br /&gt;
&lt;br /&gt;
* https://support.google.com/a/answer/2466563?sjid=13818195432106118449-EU&lt;br /&gt;
&lt;br /&gt;
 _dmarc   TXT    v=DMARC1; p=reject; rua=mailto:postmaster@orgamon.org&lt;br /&gt;
&lt;br /&gt;
== Aktivierung der notwendigen Dienste ==&lt;br /&gt;
&lt;br /&gt;
Neuere Implementierung hier: [[Raspberrypi.mail]]&lt;br /&gt;
&lt;br /&gt;
Wir verwenden das bebliebte Postfix Programm. Es ist sehr umfassend, dennoch kann man die Schritte, die man braucht um alles aufzusetzen (nach Wochen der Forschung) an 2 Händen abzählen. Also wie immer: Die Details später, erst mal soll es funktionieren!&lt;br /&gt;
&lt;br /&gt;
  zypper install cyrus-sasl-saslauthd&lt;br /&gt;
  chkconfig --add postfix&lt;br /&gt;
  chkconfig --add saslauthd&lt;br /&gt;
  rcpostfix start&lt;br /&gt;
  rcsaslauthd start&lt;br /&gt;
&lt;br /&gt;
== main.cf ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  queue_directory = /var/spool/postfix&lt;br /&gt;
  command_directory = /usr/sbin&lt;br /&gt;
  daemon_directory = /usr/lib/postfix&lt;br /&gt;
  mail_owner = postfix&lt;br /&gt;
  myorigin = $myhostname&lt;br /&gt;
  inet_interfaces = all&lt;br /&gt;
  unknown_local_recipient_reject_code = 550&lt;br /&gt;
  mynetworks_style = subnet&lt;br /&gt;
  mynetworks = 192.168.115.0/8, 127.0.0.0/8&lt;br /&gt;
  smtpd_banner = $myhostname ESMTP $mail_name OrgaMon(tm)&lt;br /&gt;
  debug_peer_level = 2&lt;br /&gt;
  debugger_command =&lt;br /&gt;
    PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin&lt;br /&gt;
    xxgdb $daemon_directory/$process_name $process_id &amp;amp; sleep 5&lt;br /&gt;
  sendmail_path = /usr/sbin/sendmail&lt;br /&gt;
  newaliases_path = /usr/bin/newaliases&lt;br /&gt;
  mailq_path = /usr/bin/mailq&lt;br /&gt;
  setgid_group = maildrop&lt;br /&gt;
  html_directory = /usr/share/doc/packages/postfix/html&lt;br /&gt;
  manpage_directory = /usr/share/man&lt;br /&gt;
  sample_directory = /usr/share/doc/packages/postfix/samples&lt;br /&gt;
  readme_directory = /usr/share/doc/packages/postfix/README_FILES&lt;br /&gt;
  biff = no&lt;br /&gt;
  mail_spool_directory = /var/mail&lt;br /&gt;
  canonical_maps = hash:/etc/postfix/canonical&lt;br /&gt;
  virtual_maps = hash:/etc/postfix/virtual&lt;br /&gt;
  relocated_maps = hash:/etc/postfix/relocated&lt;br /&gt;
  transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
  sender_canonical_maps = hash:/etc/postfix/sender_canonical&lt;br /&gt;
  masquerade_exceptions = root&lt;br /&gt;
  masquerade_classes = envelope_sender, header_sender, header_recipient&lt;br /&gt;
  program_directory = /usr/lib/postfix&lt;br /&gt;
  masquerade_domains = &lt;br /&gt;
  myhostname = mx.orgamon.org&lt;br /&gt;
  mydomain = orgamon.org&lt;br /&gt;
  mydestination = localhost, $myhostname, localhost.$mydomain&lt;br /&gt;
  local_recipient_maps = $alias_maps unix:passwd.byname&lt;br /&gt;
  defer_transports = &lt;br /&gt;
  disable_dns_lookups = no&lt;br /&gt;
  relayhost = &lt;br /&gt;
  mailbox_command = &lt;br /&gt;
  mailbox_transport = &lt;br /&gt;
  smtpd_sender_restrictions = hash:/etc/postfix/access&lt;br /&gt;
  smtpd_client_restrictions = &lt;br /&gt;
  smtpd_helo_required = no&lt;br /&gt;
  smtpd_helo_restrictions = &lt;br /&gt;
  strict_rfc821_envelopes = no&lt;br /&gt;
  smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination&lt;br /&gt;
  smtpd_sasl_auth_enable = yes&lt;br /&gt;
  smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
  smtpd_sasl_local_domain = raib90&lt;br /&gt;
  smtpd_sasl_security_options = noanonymous&lt;br /&gt;
  smtpd_sender_login_maps =&lt;br /&gt;
  broken_sasl_auth_clients = yes&lt;br /&gt;
  smtpd_use_tls = no&lt;br /&gt;
  smtp_use_tls = no&lt;br /&gt;
  alias_maps = hash:/etc/aliases&lt;br /&gt;
  mailbox_size_limit = 99999999&lt;br /&gt;
  message_size_limit = 99999999&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anlegen eines neuen eMail Postfaches (und die Zuordnung zu einem Benutzer) ==&lt;br /&gt;
&lt;br /&gt;
  YaST2-&amp;gt;Sicherheit und Benutzer-&amp;gt;Benutzer bearbeiten und anlegen&lt;br /&gt;
  &amp;lt;Alt&amp;gt;&amp;lt;H&amp;gt;(für Hinzufügen)&lt;br /&gt;
  Daten ensprechende Eintrag:&lt;br /&gt;
  POP3 Konto ist der Benutzername&lt;br /&gt;
  POP3 Passwort ist das normale Password&lt;br /&gt;
  Die Gruppenrechte entsprechend völligst minimal einstellen. &lt;br /&gt;
  [x] Leeres Home&lt;br /&gt;
  Standard-Gruppe &amp;quot;postfix&amp;quot;&lt;br /&gt;
  Gruppenzugehörigkeit nur &amp;quot;postfix!&amp;quot;&lt;br /&gt;
  Einen Login verhindern, diese Benutzer dürfen ausschliesslich via popper ihre eMails abholen!&lt;br /&gt;
    &lt;br /&gt;
  -- Mailname korrekt einstellen&lt;br /&gt;
  joe /etc/postfix/virtual&lt;br /&gt;
  unten Eintragen:&lt;br /&gt;
&lt;br /&gt;
  domain.tld                         DOMAIN&lt;br /&gt;
  vorname.nachname@domain.tld        Benutzername@localhost&lt;br /&gt;
&lt;br /&gt;
  # Bemerkung:&lt;br /&gt;
  # ==========&lt;br /&gt;
  # Die erste Zeile &amp;quot;domain.tld&amp;quot; muss nur 1x pro gehostetem Domainname&lt;br /&gt;
  # als &amp;quot;überschrift&amp;quot; über alle User dieser Domain eingetragen werden&lt;br /&gt;
  # damit wird postfix klargemacht, dass es für diese Domains zuständig &lt;br /&gt;
  # ist.&lt;br /&gt;
  &lt;br /&gt;
  -- das ganze compilieren mit postmap&lt;br /&gt;
 &lt;br /&gt;
  postmap /etc/postfix/virtual&lt;br /&gt;
  &lt;br /&gt;
  -- die ganzen Änderungen jetzt bekannt machen&lt;br /&gt;
  postfix reload&lt;br /&gt;
&lt;br /&gt;
== Anlegen einer Weiterleitung ==&lt;br /&gt;
&lt;br /&gt;
Für eine reine Weiterleitung brauchen wir keinen neuen Benutzer anlegen. Es reicht ein Eintrag in die &amp;quot;virtual&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  joe /etc/postfix/virtual&lt;br /&gt;
 &lt;br /&gt;
  domain.tld            DOMAIN&lt;br /&gt;
  name@domain.tld       weiter.leitungs.ziel@fremder-domain.tld&lt;br /&gt;
 &lt;br /&gt;
  postmap /etc/postfix/virtual&lt;br /&gt;
&lt;br /&gt;
== POP3 Dienst starten ==&lt;br /&gt;
&lt;br /&gt;
* Damit die eMails auch abgeholt werden können muss im YaST bei den Netzwerk-Diensten (inetd/xinetd) noch der &amp;quot;pop3&amp;quot; &amp;quot;(q)popper&amp;quot; Dienst aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== Diagnose Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
Zum Test braucht man unbedingt eine funktionierende Mail Adresse, die von einem externen Server aus operiert. Mit dieser identität kann man nun den eigenen Mail Server auf seine Funktion hin testen.&lt;br /&gt;
&lt;br /&gt;
 # in diesem Verzeichnis befinden sich die Mail aller Benutzer (INBOX). &lt;br /&gt;
 # Pro Postfach wird eine Datei mit dem Dateinamen = Benutzername&lt;br /&gt;
 # geführt. Ist diese &amp;gt; 0 Bytes hat der Benutzer unabgerufenen Mail&lt;br /&gt;
 # Dateidatum und Uhrzeit zeigt den Zeitpunkt der Zustellung der &lt;br /&gt;
 # letzten Mail.&lt;br /&gt;
 &lt;br /&gt;
 /var/mail&lt;br /&gt;
&lt;br /&gt;
 # wichtige Informationsquelle bei Störungen&lt;br /&gt;
 &lt;br /&gt;
 /var/log/mail.*&lt;br /&gt;
&lt;br /&gt;
 # Anzeigen des im Moment gültigen Wertes einer Einstellung.&lt;br /&gt;
 &lt;br /&gt;
 postconf &amp;lt;ParameterName&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # Statistik mit interessanten Zusammenfassungen&lt;br /&gt;
 &lt;br /&gt;
 pflogsumm /var/log/mail.log&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.postfix&amp;diff=33404</id>
		<title>Linux.postfix</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.postfix&amp;diff=33404"/>
		<updated>2026-04-28T17:23:43Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Diagnose Möglichkeiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ziel ==&lt;br /&gt;
&lt;br /&gt;
* Kompletter Mail - Server, der von innen wie von aussen kontaktiert werden kann (via pop3,smtp). Er soll für mehrere Domain-Namen und noch mehr Benutzer (alle auf die eigene ServerIP gebunden) die Post verwalten und natürlich kein offenes Relay sein.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
=== Feste IP ===&lt;br /&gt;
&lt;br /&gt;
* ein Linux Server mit fester IP Adresse. Meine, bei t-com bestellte feste IP ist z.B. &lt;br /&gt;
&lt;br /&gt;
  217.91.31.84&lt;br /&gt;
&lt;br /&gt;
* Du legst eine Domain auf diese IP, das nennen wir ab jetzt &amp;lt;MailAgentDomain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PTR Record ===&lt;br /&gt;
&lt;br /&gt;
* einen PTR Eintrag deiner IP Adresse, ab jetzt &amp;lt;ReverseHost&amp;gt; bezeichnet&lt;br /&gt;
&lt;br /&gt;
  host -t PTR &amp;lt;DeineFesteIP&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  # Bei mir ergibt das z.B. pd95b1f54.dip0.t-ipconnect.de&lt;br /&gt;
  # Leider ist es nicht möglich diesen Eintrag zu belassen, das einigen Mail Server, &lt;br /&gt;
  # so z.B. aol diese Art von Hostnamen so gar nicht mögen. Die meinen dann, man hätte&lt;br /&gt;
  # einen dynamische IP Adresse, und man versuche sich als Mailserver aufzuführen. Leider&lt;br /&gt;
  # löst der Ziel- Mailserver die Absender Domain nicht auf, sonst würde er erkennen&lt;br /&gt;
  # das die IP der Versende-Identität sowie die Identität des senders decken, also&lt;br /&gt;
  # offensichtlich kein relay verwendet wird. Meiner Meinung nach unberechtigt der&lt;br /&gt;
  # Ablehnende Fehlercode :&lt;br /&gt;
  #&lt;br /&gt;
  # 554-:  (DNS:B2) http://postmaster.info.aol.com/errors/554dnsb2.html&lt;br /&gt;
  #&lt;br /&gt;
  # Fehler 1)&lt;br /&gt;
  # &lt;br /&gt;
  # Bezieht man von der t-com eine feste IP, kommt die aus einem zweifelhaften pool,&lt;br /&gt;
  # man sollte diese mit einem schönen PTR Eintrag versehen, so z.B.&lt;br /&gt;
  # HSGWBSGA.t-com-festeip.de&lt;br /&gt;
  # dann müsste man keinen eigenen PTR Eintrag ersinnen. &lt;br /&gt;
  #&lt;br /&gt;
  # Fehler 2)&lt;br /&gt;
  #&lt;br /&gt;
  # &amp;quot;riecht&amp;quot; der PTR Eintrag nach dynamischer IP sollte die püfung der Versende&lt;br /&gt;
  # Identität erfolgen. Ist der A Eintrag wieder die selbe Adresse, so ist das ja&lt;br /&gt;
  # wohl mehr als Beweis, da die IP Adresse und PTR 100% OK ist.&lt;br /&gt;
  #&lt;br /&gt;
&lt;br /&gt;
=== MX Record ===&lt;br /&gt;
&lt;br /&gt;
* bei allen Domains die der Mailserver hosten soll, muss der ReverseHost von oben als der MX Eintrag gemacht sein. So bekommen wir einen ganz soliden MX Eintrag, der den neuesten Forderungen (PTR-fest) entspricht.&lt;br /&gt;
&lt;br /&gt;
  host -t MX &amp;lt;DeineMailDomain&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  # sollte als Ergebnis also pd95b1f54.dip0.t-ipconnect.de &lt;br /&gt;
  # ergeben!&lt;br /&gt;
&lt;br /&gt;
=== SPF Record ===&lt;br /&gt;
&lt;br /&gt;
* Es ist ein TXT Record in &amp;lt;DeineMailDomain&amp;gt; der aussagt WER zuständig für den ausgehenden Mailversand ist&lt;br /&gt;
* Es verbessert nicht die Anzahl der Spam-Mails, die Dich erreichen&lt;br /&gt;
* Es verbessert aber die Anzahl der Spam-Mails in der Welt, die als Absender &amp;lt;DeineMailDomain&amp;gt; missbrauchen, da Du hiermit erklärt hast, welche SendeServer Du benutzt. Alle anderen gelten als nicht berechtigt.&lt;br /&gt;
* In unserem Fall, ist der berechtigte unser MX, sonst niemand: &lt;br /&gt;
** &amp;lt;code&amp;gt;v=spf1 mx -all&amp;lt;/code&amp;gt;&lt;br /&gt;
* Test mit http://spf.myisp.ch/&lt;br /&gt;
&lt;br /&gt;
=== DKIM ===&lt;br /&gt;
&lt;br /&gt;
* https://kofler.info/dkim-konfiguration-fuer-postfix/&lt;br /&gt;
&lt;br /&gt;
=== DMARC ===&lt;br /&gt;
&lt;br /&gt;
* Typischer Snake-Oil Mechanismus der nur scheinbar die Sicherheit erhöht, der _dmarc TXT Record muss bei der Mail-Domain hinzugemacht werden, nicht bei der mx Domain&lt;br /&gt;
&lt;br /&gt;
* https://support.google.com/a/answer/2466563?sjid=13818195432106118449-EU&lt;br /&gt;
&lt;br /&gt;
 _dmarc   TXT    v=DMARC1; p=reject; rua=mailto:postmaster@orgamon.org&lt;br /&gt;
&lt;br /&gt;
== Aktivierung der notwendigen Dienste ==&lt;br /&gt;
&lt;br /&gt;
Neuere Implementierung hier: [[Raspberrypi.mail]]&lt;br /&gt;
&lt;br /&gt;
Wir verwenden das bebliebte Postfix Programm. Es ist sehr umfassend, dennoch kann man die Schritte, die man braucht um alles aufzusetzen (nach Wochen der Forschung) an 2 Händen abzählen. Also wie immer: Die Details später, erst mal soll es funktionieren!&lt;br /&gt;
&lt;br /&gt;
  zypper install cyrus-sasl-saslauthd&lt;br /&gt;
  chkconfig --add postfix&lt;br /&gt;
  chkconfig --add saslauthd&lt;br /&gt;
  rcpostfix start&lt;br /&gt;
  rcsaslauthd start&lt;br /&gt;
&lt;br /&gt;
== main.cf ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  queue_directory = /var/spool/postfix&lt;br /&gt;
  command_directory = /usr/sbin&lt;br /&gt;
  daemon_directory = /usr/lib/postfix&lt;br /&gt;
  mail_owner = postfix&lt;br /&gt;
  myorigin = $myhostname&lt;br /&gt;
  inet_interfaces = all&lt;br /&gt;
  unknown_local_recipient_reject_code = 550&lt;br /&gt;
  mynetworks_style = subnet&lt;br /&gt;
  mynetworks = 192.168.115.0/8, 127.0.0.0/8&lt;br /&gt;
  smtpd_banner = $myhostname ESMTP $mail_name OrgaMon(tm)&lt;br /&gt;
  debug_peer_level = 2&lt;br /&gt;
  debugger_command =&lt;br /&gt;
    PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin&lt;br /&gt;
    xxgdb $daemon_directory/$process_name $process_id &amp;amp; sleep 5&lt;br /&gt;
  sendmail_path = /usr/sbin/sendmail&lt;br /&gt;
  newaliases_path = /usr/bin/newaliases&lt;br /&gt;
  mailq_path = /usr/bin/mailq&lt;br /&gt;
  setgid_group = maildrop&lt;br /&gt;
  html_directory = /usr/share/doc/packages/postfix/html&lt;br /&gt;
  manpage_directory = /usr/share/man&lt;br /&gt;
  sample_directory = /usr/share/doc/packages/postfix/samples&lt;br /&gt;
  readme_directory = /usr/share/doc/packages/postfix/README_FILES&lt;br /&gt;
  biff = no&lt;br /&gt;
  mail_spool_directory = /var/mail&lt;br /&gt;
  canonical_maps = hash:/etc/postfix/canonical&lt;br /&gt;
  virtual_maps = hash:/etc/postfix/virtual&lt;br /&gt;
  relocated_maps = hash:/etc/postfix/relocated&lt;br /&gt;
  transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
  sender_canonical_maps = hash:/etc/postfix/sender_canonical&lt;br /&gt;
  masquerade_exceptions = root&lt;br /&gt;
  masquerade_classes = envelope_sender, header_sender, header_recipient&lt;br /&gt;
  program_directory = /usr/lib/postfix&lt;br /&gt;
  masquerade_domains = &lt;br /&gt;
  myhostname = mx.orgamon.org&lt;br /&gt;
  mydomain = orgamon.org&lt;br /&gt;
  mydestination = localhost, $myhostname, localhost.$mydomain&lt;br /&gt;
  local_recipient_maps = $alias_maps unix:passwd.byname&lt;br /&gt;
  defer_transports = &lt;br /&gt;
  disable_dns_lookups = no&lt;br /&gt;
  relayhost = &lt;br /&gt;
  mailbox_command = &lt;br /&gt;
  mailbox_transport = &lt;br /&gt;
  smtpd_sender_restrictions = hash:/etc/postfix/access&lt;br /&gt;
  smtpd_client_restrictions = &lt;br /&gt;
  smtpd_helo_required = no&lt;br /&gt;
  smtpd_helo_restrictions = &lt;br /&gt;
  strict_rfc821_envelopes = no&lt;br /&gt;
  smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination&lt;br /&gt;
  smtpd_sasl_auth_enable = yes&lt;br /&gt;
  smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
  smtpd_sasl_local_domain = raib90&lt;br /&gt;
  smtpd_sasl_security_options = noanonymous&lt;br /&gt;
  smtpd_sender_login_maps =&lt;br /&gt;
  broken_sasl_auth_clients = yes&lt;br /&gt;
  smtpd_use_tls = no&lt;br /&gt;
  smtp_use_tls = no&lt;br /&gt;
  alias_maps = hash:/etc/aliases&lt;br /&gt;
  mailbox_size_limit = 99999999&lt;br /&gt;
  message_size_limit = 99999999&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anlegen eines neuen eMail Postfaches (und die Zuordnung zu einem Benutzer) ==&lt;br /&gt;
&lt;br /&gt;
  YaST2-&amp;gt;Sicherheit und Benutzer-&amp;gt;Benutzer bearbeiten und anlegen&lt;br /&gt;
  &amp;lt;Alt&amp;gt;&amp;lt;H&amp;gt;(für Hinzufügen)&lt;br /&gt;
  Daten ensprechende Eintrag:&lt;br /&gt;
  POP3 Konto ist der Benutzername&lt;br /&gt;
  POP3 Passwort ist das normale Password&lt;br /&gt;
  Die Gruppenrechte entsprechend völligst minimal einstellen. &lt;br /&gt;
  [x] Leeres Home&lt;br /&gt;
  Standard-Gruppe &amp;quot;postfix&amp;quot;&lt;br /&gt;
  Gruppenzugehörigkeit nur &amp;quot;postfix!&amp;quot;&lt;br /&gt;
  Einen Login verhindern, diese Benutzer dürfen ausschliesslich via popper ihre eMails abholen!&lt;br /&gt;
    &lt;br /&gt;
  -- Mailname korrekt einstellen&lt;br /&gt;
  joe /etc/postfix/virtual&lt;br /&gt;
  unten Eintragen:&lt;br /&gt;
&lt;br /&gt;
  domain.tld                         DOMAIN&lt;br /&gt;
  vorname.nachname@domain.tld        Benutzername@localhost&lt;br /&gt;
&lt;br /&gt;
  # Bemerkung:&lt;br /&gt;
  # ==========&lt;br /&gt;
  # Die erste Zeile &amp;quot;domain.tld&amp;quot; muss nur 1x pro gehostetem Domainname&lt;br /&gt;
  # als &amp;quot;überschrift&amp;quot; über alle User dieser Domain eingetragen werden&lt;br /&gt;
  # damit wird postfix klargemacht, dass es für diese Domains zuständig &lt;br /&gt;
  # ist.&lt;br /&gt;
  &lt;br /&gt;
  -- das ganze compilieren mit postmap&lt;br /&gt;
 &lt;br /&gt;
  postmap /etc/postfix/virtual&lt;br /&gt;
  &lt;br /&gt;
  -- die ganzen Änderungen jetzt bekannt machen&lt;br /&gt;
  postfix reload&lt;br /&gt;
&lt;br /&gt;
== Anlegen einer Weiterleitung ==&lt;br /&gt;
&lt;br /&gt;
Für eine reine Weiterleitung brauchen wir keinen neuen Benutzer anlegen. Es reicht ein Eintrag in die &amp;quot;virtual&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  joe /etc/postfix/virtual&lt;br /&gt;
 &lt;br /&gt;
  domain.tld            DOMAIN&lt;br /&gt;
  name@domain.tld       weiter.leitungs.ziel@fremder-domain.tld&lt;br /&gt;
 &lt;br /&gt;
  postmap /etc/postfix/virtual&lt;br /&gt;
&lt;br /&gt;
== POP3 Dienst starten ==&lt;br /&gt;
&lt;br /&gt;
* Damit die eMails auch abgeholt werden können muss im YaST bei den Netzwerk-Diensten (inetd/xinetd) noch der &amp;quot;pop3&amp;quot; &amp;quot;(q)popper&amp;quot; Dienst aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== Diagnose Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
Zum Test braucht man unbedingt eine funktionierende Mail Adresse, die von einem externen Server aus operiert. Mit dieser identität kann man nun den eigenen Mail Server auf seine Funktion hin testen.&lt;br /&gt;
&lt;br /&gt;
 # in diesem Verzeichnis befinden sich die Mail aller Benutzer (INBOX). &lt;br /&gt;
 # Pro Postfach wird eine Datei mit dem Dateinamen = Benutzername&lt;br /&gt;
 # geführt. Ist diese &amp;gt; 0 Bytes hat der Benutzer unabgerufenen Mail&lt;br /&gt;
 # Dateidatum und Uhrzeit zeigt den Zeitpunkt der Zustellung der &lt;br /&gt;
 # letzten Mail.&lt;br /&gt;
 &lt;br /&gt;
 /var/mail&lt;br /&gt;
 &lt;br /&gt;
 # wichtige Informationsquelle bei Störungen&lt;br /&gt;
 &lt;br /&gt;
 /var/log/mail.*&lt;br /&gt;
&lt;br /&gt;
 # Anzeigen des im Moment gültigen Wertes einer Einstellung.&lt;br /&gt;
 &lt;br /&gt;
 postconf &amp;lt;ParameterName&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # Statistik mit interessanten Zusammenfassungen&lt;br /&gt;
 &lt;br /&gt;
 pflogsumm /var/log/mail.log&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33396</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33396"/>
		<updated>2026-03-20T16:40:41Z</updated>

		<summary type="html">&lt;p&gt;Root: /* polyzalos.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== Pascal -&amp;gt; JavaScript ===&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Polyzalos Binary&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf ein Web-Verzeichnis&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33395</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33395"/>
		<updated>2026-03-20T16:40:03Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pascal -&amp;gt; JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
 pacman -S openssl mkcert&lt;br /&gt;
&lt;br /&gt;
=== localhost-Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
=== local.orgamon.net-Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* Die Dev Tools haben im &amp;quot;Netzwerk&amp;quot; ein Toggle oder OFFLINE Knopf um das zu testen&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33394</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33394"/>
		<updated>2026-03-20T16:39:52Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Inbetriebnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
 pacman -S openssl mkcert&lt;br /&gt;
&lt;br /&gt;
=== localhost-Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
=== local.orgamon.net-Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* Die Dev Tools haben im &amp;quot;Netzwerk&amp;quot; ein Toggle oder OFFLINE Knopf um das zu testen&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33393</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33393"/>
		<updated>2026-03-20T16:39:27Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Inbetriebnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
 pacman -S openssl mkcert&lt;br /&gt;
&lt;br /&gt;
=== localhost-Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* Die Dev Tools haben im &amp;quot;Netzwerk&amp;quot; ein Toggle oder OFFLINE Knopf um das zu testen&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33392</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33392"/>
		<updated>2026-03-20T16:38:37Z</updated>

		<summary type="html">&lt;p&gt;Root: /* openSSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
 pacman -S openssl&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* Die Dev Tools haben im &amp;quot;Netzwerk&amp;quot; ein Toggle oder OFFLINE Knopf um das zu testen&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33391</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33391"/>
		<updated>2026-03-20T16:37:23Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Retry-, Reconnect- Fähig */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* Die Dev Tools haben im &amp;quot;Netzwerk&amp;quot; ein Toggle oder OFFLINE Knopf um das zu testen&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33390</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33390"/>
		<updated>2026-03-20T16:31:07Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Informationsquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33389</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33389"/>
		<updated>2026-03-20T16:29:05Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Paralleles Arbeiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33388</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33388"/>
		<updated>2026-03-20T16:28:11Z</updated>

		<summary type="html">&lt;p&gt;Root: /* todo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* zstd shared-compression-dictionaries&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33387</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33387"/>
		<updated>2026-03-20T16:24:56Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Meilensteine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 20.03.2026 SSE für /log in die Client Console&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33386</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33386"/>
		<updated>2026-03-20T16:22:43Z</updated>

		<summary type="html">&lt;p&gt;Root: /* polyzalosd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33385</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33385"/>
		<updated>2026-03-20T16:22:30Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Port 443 auf dem eigenen System öffnen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33384</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33384"/>
		<updated>2026-03-20T16:22:20Z</updated>

		<summary type="html">&lt;p&gt;Root: /* On demand cert generation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
=== Port 443 auf dem eigenen System öffnen ===&lt;br /&gt;
&lt;br /&gt;
Wenn Du einen von aussen sichtbaren Webserver (HTTPS) auf dem eigenen Rechner betreiben willst musst Du Port :443 öffnen.&lt;br /&gt;
&lt;br /&gt;
* http://praxistipps.chip.de/windows-10-ports-in-der-firewall-oeffnen-so-gehts_42589&lt;br /&gt;
&lt;br /&gt;
* Auf deinem Router brauchst Du eine feste IP oder ein Dyndns&lt;br /&gt;
* Auf deinem Router musst Du eingehenden Netzwerkverkehr auf Port :443 auf deinen lokalen Rechner leiten (AVM nennt das &amp;quot;Freigabe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33383</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33383"/>
		<updated>2026-03-20T16:19:05Z</updated>

		<summary type="html">&lt;p&gt;Root: /* localhost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
==== On demand cert generation ====&lt;br /&gt;
&lt;br /&gt;
* Generiere doch ein key/cert für computername.local&lt;br /&gt;
&lt;br /&gt;
https://github.com/marsupilami79/zeoslib/blob/master/src/webservice/server/dbcproxycertstore.pas&lt;br /&gt;
&lt;br /&gt;
=== Port 443 auf dem eigenen System öffnen ===&lt;br /&gt;
&lt;br /&gt;
Wenn Du einen von aussen sichtbaren Webserver (HTTPS) auf dem eigenen Rechner betreiben willst musst Du Port :443 öffnen.&lt;br /&gt;
&lt;br /&gt;
* http://praxistipps.chip.de/windows-10-ports-in-der-firewall-oeffnen-so-gehts_42589&lt;br /&gt;
&lt;br /&gt;
* Auf deinem Router brauchst Du eine feste IP oder ein Dyndns&lt;br /&gt;
* Auf deinem Router musst Du eingehenden Netzwerkverkehr auf Port :443 auf deinen lokalen Rechner leiten (AVM nennt das &amp;quot;Freigabe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33382</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33382"/>
		<updated>2026-03-20T16:17:07Z</updated>

		<summary type="html">&lt;p&gt;Root: /* localhost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;mkcert&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S mkcert&lt;br /&gt;
 mkcert -install&lt;br /&gt;
 &lt;br /&gt;
 # gehe in dein /hosts/localhost Verzeichnis&lt;br /&gt;
 #&lt;br /&gt;
 mkcert -cert-file cert.pem -key-file privkey.pem &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # mit &amp;quot;openssl&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'&lt;br /&gt;
&lt;br /&gt;
 # &lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -out localhost.crt -keyout localhost.key   -newkey rsa:2048 -nodes -days 365 -sha256   -subj '/CN=localhost' -extensions EXT -config &amp;lt;( \&lt;br /&gt;
 printf &amp;quot;[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
* Zertifikat in Google Chrome installieren&lt;br /&gt;
** Einstellung -&amp;gt; Sicherheit und Datenschutz -&amp;gt; Sicherheit -&amp;gt; Zertifikate verwalten -&amp;gt; Reiter &amp;quot;Vertrauenswürdige Stammzertifizierungsstellen&amp;quot; -&amp;gt; Importieren -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
==== On demand cert generation ====&lt;br /&gt;
&lt;br /&gt;
* Generiere doch ein key/cert für computername.local&lt;br /&gt;
&lt;br /&gt;
https://github.com/marsupilami79/zeoslib/blob/master/src/webservice/server/dbcproxycertstore.pas&lt;br /&gt;
&lt;br /&gt;
=== Port 443 auf dem eigenen System öffnen ===&lt;br /&gt;
&lt;br /&gt;
Wenn Du einen von aussen sichtbaren Webserver (HTTPS) auf dem eigenen Rechner betreiben willst musst Du Port :443 öffnen.&lt;br /&gt;
&lt;br /&gt;
* http://praxistipps.chip.de/windows-10-ports-in-der-firewall-oeffnen-so-gehts_42589&lt;br /&gt;
&lt;br /&gt;
* Auf deinem Router brauchst Du eine feste IP oder ein Dyndns&lt;br /&gt;
* Auf deinem Router musst Du eingehenden Netzwerkverkehr auf Port :443 auf deinen lokalen Rechner leiten (AVM nennt das &amp;quot;Freigabe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33381</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33381"/>
		<updated>2026-03-20T15:59:08Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
* mit openssl erst mal key.pem und cert.pem erstellen (hier im Beispiel für die Server-Identität &amp;quot;localhost&amp;quot;)&lt;br /&gt;
** &amp;lt;code&amp;gt;openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;localhost&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # &lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -out localhost.crt -keyout localhost.key   -newkey rsa:2048 -nodes -days 365 -sha256   -subj '/CN=localhost' -extensions EXT -config &amp;lt;( \&lt;br /&gt;
 printf &amp;quot;[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
* Zertifikat in Google Chrome installieren&lt;br /&gt;
** Einstellung -&amp;gt; Sicherheit und Datenschutz -&amp;gt; Sicherheit -&amp;gt; Zertifikate verwalten -&amp;gt; Reiter &amp;quot;Vertrauenswürdige Stammzertifizierungsstellen&amp;quot; -&amp;gt; Importieren -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
==== On demand cert generation ====&lt;br /&gt;
&lt;br /&gt;
* Generiere doch ein key/cert für computername.local&lt;br /&gt;
&lt;br /&gt;
https://github.com/marsupilami79/zeoslib/blob/master/src/webservice/server/dbcproxycertstore.pas&lt;br /&gt;
&lt;br /&gt;
=== Port 443 auf dem eigenen System öffnen ===&lt;br /&gt;
&lt;br /&gt;
Wenn Du einen von aussen sichtbaren Webserver (HTTPS) auf dem eigenen Rechner betreiben willst musst Du Port :443 öffnen.&lt;br /&gt;
&lt;br /&gt;
* http://praxistipps.chip.de/windows-10-ports-in-der-firewall-oeffnen-so-gehts_42589&lt;br /&gt;
&lt;br /&gt;
* Auf deinem Router brauchst Du eine feste IP oder ein Dyndns&lt;br /&gt;
* Auf deinem Router musst Du eingehenden Netzwerkverkehr auf Port :443 auf deinen lokalen Rechner leiten (AVM nennt das &amp;quot;Freigabe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33380</id>
		<title>HTTP2</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=HTTP2&amp;diff=33380"/>
		<updated>2026-03-20T15:58:11Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Das Zukunftsprojekt [[Polyzalos]] erfordert die Integration eines HTTP/2 Servers in OrgaMon&lt;br /&gt;
* Im Moment entsteht deshalb ein HTTP/2 Server in FreePascal, Zielsystem ist im Moment auf Linux beschränkt&lt;br /&gt;
* Alle Quelltexte befinden sich auf GitHub&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/src/cryptossl.pas cryptossl.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/PASconTools/hpack.pas hpack.pas]]&lt;br /&gt;
** [[https://github.com/Andreas-Filsinger/Polyzalos/blob/main/PASconTools/http2.pas http2.pas]]&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
=== openSSL ===&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* Downloade und Installiere die 64bit Light Version (im Moment &amp;quot;Win64 OpenSSL v3.2.0 Light&amp;quot; .exe)&lt;br /&gt;
** Standard-Ziel akzeptieren, &amp;quot;in das Systemverzeichnis&amp;quot; angekreuzt lassen&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
* selbst aus den Quellen compilieren, da zumeist 1.0 Teil der Distributionen ist&lt;br /&gt;
&lt;br /&gt;
=== Zertifikat ===&lt;br /&gt;
&lt;br /&gt;
==== localhost ====&lt;br /&gt;
&lt;br /&gt;
* mit openssl erst mal key.pem und cert.pem erstellen (hier im Beispiel für die Server-Identität &amp;quot;localhost&amp;quot;)&lt;br /&gt;
** &amp;lt;code&amp;gt;openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;localhost&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # &lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 openssl req -x509 -out localhost.crt -keyout localhost.key   -newkey rsa:2048 -nodes -days 365 -sha256   -subj '/CN=localhost' -extensions EXT -config &amp;lt;( \&lt;br /&gt;
 printf &amp;quot;[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ein Hauptverzeichnis ausdenken und dort ein Verzeichnis pro CN erstellen&lt;br /&gt;
* jeweils die 2 Dateien dort rein&lt;br /&gt;
* Beispiel: Dein Server ist als &amp;quot;localhost&amp;quot; auf der Maschine selbst, und als &amp;quot;rom&amp;quot; im eigenen Netz, und als &amp;quot;orgamon-2.dyndns.org&amp;quot; von aussen ansprechbar, dann must Du 3x openssl rifen wir oben angegeben mit wechselnder CN&lt;br /&gt;
&lt;br /&gt;
 \srv\hosts\&lt;br /&gt;
   .\localhost\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\rom\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
   .\orgamon-2.dyndns.org\&lt;br /&gt;
      key.pem&lt;br /&gt;
      cert.pem&lt;br /&gt;
&lt;br /&gt;
* Zertifikat in Google Chrome installieren&lt;br /&gt;
** Einstellung -&amp;gt; Sicherheit und Datenschutz -&amp;gt; Sicherheit -&amp;gt; Zertifikate verwalten -&amp;gt; Reiter &amp;quot;Vertrauenswürdige Stammzertifizierungsstellen&amp;quot; -&amp;gt; Importieren -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== local.orgamon.net ====&lt;br /&gt;
&lt;br /&gt;
* Ich habe bereits ein letsencrypt *.orgamon.net Zertifikat&lt;br /&gt;
* Ich habe (bei schlundtech) &amp;quot;local.orgamon.net&amp;quot; auf 127.0.0.1 zeigen lassen (A-Record)&lt;br /&gt;
* Ich habe in der Fritz!Box die Ausnahme für den lokalen Rebindschutz eingetragen (für &amp;quot;local.orgamon.net&amp;quot;)&lt;br /&gt;
* privkey.pem und cert.pem kann ich so für den Webserver nutzen&lt;br /&gt;
* Meine Entwicklungsumgebung kann somit die lokale Maschine sein, obwohl ich eine richtige Domain angebe deren Namensauflösung im Web läuft&lt;br /&gt;
&lt;br /&gt;
==== On demand cert generation ====&lt;br /&gt;
&lt;br /&gt;
* Generiere doch ein key/cert für computername.local&lt;br /&gt;
&lt;br /&gt;
https://github.com/marsupilami79/zeoslib/blob/master/src/webservice/server/dbcproxycertstore.pas&lt;br /&gt;
&lt;br /&gt;
=== Port 443 auf dem eigenen System öffnen ===&lt;br /&gt;
&lt;br /&gt;
Wenn Du einen von aussen sichtbaren Webserver (HTTPS) auf dem eigenen Rechner betreiben willst musst Du Port :443 öffnen.&lt;br /&gt;
&lt;br /&gt;
* http://praxistipps.chip.de/windows-10-ports-in-der-firewall-oeffnen-so-gehts_42589&lt;br /&gt;
&lt;br /&gt;
* Auf deinem Router brauchst Du eine feste IP oder ein Dyndns&lt;br /&gt;
* Auf deinem Router musst Du eingehenden Netzwerkverkehr auf Port :443 auf deinen lokalen Rechner leiten (AVM nennt das &amp;quot;Freigabe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== polyzalosd ===&lt;br /&gt;
&lt;br /&gt;
* Diese Konsolenanwendung gibt Statusmeldungen (Log) in Farbe aus&lt;br /&gt;
* dies muss unter Windows jedoch aktiviert werden&lt;br /&gt;
&lt;br /&gt;
 reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f&lt;br /&gt;
&lt;br /&gt;
* https://ss64.com/nt/syntax-ansi.html&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|Dies macht polyzalosd inzwischen über eine Windows-API Funktion selbst}}&lt;br /&gt;
&lt;br /&gt;
== Informationsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== HPACK ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HPACK&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7541&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
* RFC &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://datatracker.ietf.org/doc/html/rfc9113&lt;br /&gt;
** veraltet: &amp;lt;b&amp;gt;HTTP/2&amp;lt;/b&amp;gt; https://tools.ietf.org/html/rfc7540&lt;br /&gt;
* https://github.com/nghttp2/nghttp2&lt;br /&gt;
** https://nghttp2.org/blog/2014/04/27/how-dependency-based-prioritization-works/&lt;br /&gt;
* https://github.com/nginx/nginx&lt;br /&gt;
* https://github.com/h2o/h2o&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/&lt;br /&gt;
* Der Client stellt eine Menge Requests, der erste Response (16 MB gross) verstopft aber die sende Richtung&lt;br /&gt;
** die folgenden Responses hätten aber nur minimal kleine Antworten benötigt, also z.B. HTTP 304&lt;br /&gt;
** dann blockiert der lange Response alles andere&lt;br /&gt;
** in der Aufbau-Phase einer Seite wäre es gut der Server hätte eine Kenntniss davon was der Client alles braucht&lt;br /&gt;
** Es ist ja eigentlich klar war ein &amp;quot;full&amp;quot; Reload benötigt, und da sollte man multiplexen solange noch nicht alle Antworten durch sind&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
&lt;br /&gt;
* https://wiki.openssl.org/index.php/Simple_TLS_Server&lt;br /&gt;
* http://openssl.6102.n7.nabble.com/TLS-1-3-client-hello-issue-td72449.html#a72460&lt;br /&gt;
* http://slproweb.com/products/Win32OpenSSL.html&lt;br /&gt;
* https://github.com/openssl/openssl/blob/master/include/openssl/tls1.h&lt;br /&gt;
* https://www.openssl.org/blog/blog/2017/05/04/tlsv1.3/&lt;br /&gt;
* http://gnutls.org/manual/gnutls.html#Server-name-indication&lt;br /&gt;
* https://github.com/jay/http2_blacklisted_ciphers&lt;br /&gt;
* https://wiki.openssl.org/index.php/TLS1.3&lt;br /&gt;
&lt;br /&gt;
=== Konzept ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* cOrgaMon ist ein https:// Server nach HTTP/2 Standard ohne UI&lt;br /&gt;
* &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Instanz von cOrgaMon kümmert sich um &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; langbestehende TCP-Clientverbindung (KEEP_ALIVE)&lt;br /&gt;
* HTTPS:// TLS 1.3 (nichts anderes!) &lt;br /&gt;
* Clients, die NICHT die &amp;quot;Server Name Indication (SNI) extension&amp;quot; liefern werden abgelehnt&lt;br /&gt;
* Target ist win64 und linux&lt;br /&gt;
* openSSL Lib der Version 3.1 oder besser wird verwendet&lt;br /&gt;
* die Verbindung bleibt ständig bestehen&lt;br /&gt;
* Test https://tools.keycdn.com/http2-test&lt;br /&gt;
&lt;br /&gt;
=== Implementierung TCP ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Datei:HTTP2.png|220px]]&lt;br /&gt;
 |[[Datei:SrvOrgaMon.png|220px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* unit HPACK.pas erstellen (Quelle github)&lt;br /&gt;
* testen mit https://github.com/http2jp/hpack-test-case (uses json)&lt;br /&gt;
* unit HTTP2Server.pas erstellen (https://github.com/nghttp2/nghttp2)&lt;br /&gt;
* ev. auch mit https://python-hyper.org/h2/en/stable/index.html und Kopplung über das WSGI Interface&lt;br /&gt;
&lt;br /&gt;
==== Test ====&lt;br /&gt;
&lt;br /&gt;
Sollte dein cOrgaMon-Host ROM heissen:&lt;br /&gt;
&lt;br /&gt;
* openssl s_client -debug -servername &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;rom&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; -connect &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;rom&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;:443&lt;br /&gt;
&lt;br /&gt;
Sollte interessant sein, was der Server so liefert, kann man das in eine Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # openssl s_client -servername rom -nextprotoneg &amp;quot;h2,h3&amp;quot; -sess_out out.http2 -connect rom:443 &amp;gt;o.http2&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # hexdump -C o.http2&lt;br /&gt;
 # (leider ist ein openssl interner Prefix nicht vermeidbar, aber ab einer gewissen Position gehts los!)&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 00000df0  28 73 65 6c 66 20 73 69  67 6e 65 64 20 63 65 72  |(self signed cer|&lt;br /&gt;
 00000e00  74 69 66 69 63 61 74 65  29 0a 2d 2d 2d 0a 50 52  |tificate).---.PR|&lt;br /&gt;
 00000e10  49 20 2a 20 48 54 54 50  2f 32 2e 30 0d 0a 0d 0a  |I * HTTP/2.0....|&lt;br /&gt;
 00000e20  53 4d 0d 0a 0d 0a 00 00  18 04 00 00 00 00 00 00  |SM..............|&lt;br /&gt;
 00000e30  01 00 00 10 00 00 03 00  00 00 65 00 04 00 00 ff  |..........e.....|&lt;br /&gt;
 00000e40  ff 00 05 00 10 00 00 00  00 04 08 00 00 00 00 00  |................|&lt;br /&gt;
 00000e50  00 0a 00 00                                       |....|&lt;br /&gt;
 00000e54&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTTP2-Units.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== HTTP2 ====&lt;br /&gt;
&lt;br /&gt;
* Zentrale Steuerunit für den HTTP2 Server&lt;br /&gt;
* Öffnet und Schliesst die Verbindung, dabei wird die openSSL entsprechend Konfiguriert&lt;br /&gt;
* Beobachtet die Verbindungsaushandlung&lt;br /&gt;
* Lehnt ungeeignetes ab&lt;br /&gt;
* Verhindert Fallbacks in unsichere Technik&lt;br /&gt;
* Verarbeitet den Server-Domain Namen Callback&lt;br /&gt;
* Stellt .pem und .cert zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* implementiert den Datenmultiplexer laut RFC, fügt also den fragmentierten Netzwerkverkehr wieder in geordnete Bahnen&lt;br /&gt;
* Feuert Events wenn Daten &amp;quot;fertig&amp;quot; vorliegen an HTTP2&lt;br /&gt;
&lt;br /&gt;
typischer HTTP/2 Content am Anfang der Verbindung.&lt;br /&gt;
&lt;br /&gt;
 Client -&amp;gt; Server&lt;br /&gt;
 &lt;br /&gt;
 50 52 49 20 2A 20 48 54 54 50 2F 32 2E 30 0D 0A  PRI.*.HTTP/2.0..&lt;br /&gt;
 0D 0A 53 4D 0D 0A 0D 0A &lt;br /&gt;
 00 00 12 (18 Bytes Content)&lt;br /&gt;
 04 00 00 00 00 00 SETTINGS, also 3 Settings!)&lt;br /&gt;
 00 01 00 01 00 00 &lt;br /&gt;
 00 04 00 02 00 00&lt;br /&gt;
 00 05 00 00 40 00&lt;br /&gt;
 00 00 04 (4 Bytes content)&lt;br /&gt;
 08 00 00 00 00 00 WINDOW_UPDATE&lt;br /&gt;
 00 BF 00 01  &lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 03 PRIO&lt;br /&gt;
 00 00 00 00 C8&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 05 PRIO&lt;br /&gt;
 00 00 00 00 64&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 07 PRIO&lt;br /&gt;
 00 00 00 00 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 09  PRIO&lt;br /&gt;
 00 00 00 07 00&lt;br /&gt;
 00 00 05 (5 Bytes Content)&lt;br /&gt;
 02 00 00 00 00 0B PRIO&lt;br /&gt;
 00 00 00 03 00 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 FRAME_SETTINGS&lt;br /&gt;
  HEADER_TABLE_SIZE 65536&lt;br /&gt;
  INITIAL_WINDOW_SIZE 131072&lt;br /&gt;
  MAX_FRAME_SIZE 16384&lt;br /&gt;
 FRAME_WINDOW_UPDATE&lt;br /&gt;
  0 has Window_Size_Increment 12517377&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 3.0 has 200&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 5.0 has 100&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 7.0 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 9.7 has 0&lt;br /&gt;
 FRAME_PRIORITY&lt;br /&gt;
  Stream 11.3 has 0&lt;br /&gt;
&lt;br /&gt;
==== HMUX ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Entfällt, wurde in HTTP2 integriert&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HPACK ====&lt;br /&gt;
&lt;br /&gt;
* implementiert die Header Compression laut RFC&lt;br /&gt;
&lt;br /&gt;
==== cryptossl ====&lt;br /&gt;
&lt;br /&gt;
* spricht mit der openSSL Bibliothek und implementiert dabei nur was gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
==== Informationsquellen ====&lt;br /&gt;
&lt;br /&gt;
* https://stackoverflow.com/questions/19029647/ssl-ctx-use-privatekey-file-failed&lt;br /&gt;
* https://letsencrypt.org&lt;br /&gt;
* https://github.com/certbot/certbot&lt;br /&gt;
* Der Client MUSS den Servername mitteilen damit cOrgaMon erkennen kann welcher Mandant geladen werden soll&lt;br /&gt;
** https://tools.ietf.org/html/rfc6066&lt;br /&gt;
* auf diesen Server-Namen MUSS Certifikat Pinnig angewendet werden, er darf also KEIN anderes Zertifikat verwendet werden&lt;br /&gt;
** https://tools.ietf.org/html/rfc7469&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt mit Lets Encrypt ====&lt;br /&gt;
&lt;br /&gt;
Wir sind als in Besitz einer Domain und haben es geschafft Port 80 auf die eigene WIndows 10 Kiste zu lenken&lt;br /&gt;
&lt;br /&gt;
* Sorry, aber wir brauchen als erstes einen HTTP Webserver&lt;br /&gt;
* https://www.windowspro.de/wolfgang-sommergut/web-server-iis-windows-10-installieren-konfigurieren&lt;br /&gt;
&lt;br /&gt;
* letsencrypt-win-simple.V1.9.3.zip&lt;br /&gt;
* https://github.com/Lone-Coder/letsencrypt-win-simple/releases&lt;br /&gt;
&lt;br /&gt;
== Paralleles Arbeiten ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ein einzelner OrgaMon-Prozess ist für eine dauerhafte TCP/Connection zuständig&lt;br /&gt;
* Ich denke dass mit OpenSSL 3.5 QUIC Server Support kommt (https://github.com/openssl/openssl/commit/cb629550cdab518c925e9b402e11b86497a03845)&lt;br /&gt;
&lt;br /&gt;
=== Thread: SSL_read() ===&lt;br /&gt;
&lt;br /&gt;
* Ein Thread sollte SSL_read ausführen, wenn da ein Datenblock oder FRAME fertig ist, sollte dieser als &amp;quot;EventProc&amp;quot; an den Main-Thread übergeben werden&lt;br /&gt;
** https://github.com/BeRo1985/pasmp&lt;br /&gt;
&lt;br /&gt;
=== Thread: JOBs ===&lt;br /&gt;
&lt;br /&gt;
* Möglicherweise startet OrgaMon wiederum SubProgramme mit langen Laufzeiten, diese SubProgramme schreiben Status Infos in memcached&lt;br /&gt;
* Rückmeldungen dieser lang laufenden Prozesse ev. über https://developer.mozilla.org/de/docs/Web/API/Push_API&lt;br /&gt;
&lt;br /&gt;
== Pascal -&amp;gt; JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Durch den Wegfall der GUI muss Code auf der Client GUI autark laufen können. Dieser soll im OrgaMon Programm als FreePascal-Code aufnotiert werden, die compilierung teilt den Code auf (Client Code / Server Code) und verteilt das Java-Script über den HTTP2 Server. Freepascal hat schon eine Implementierung die Pascal nach JS ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
* Die Tatsache &amp;quot;JavaScript&amp;quot; auf der Clientside wird der Lazarus-IDE scheinbar verheimlicht&lt;br /&gt;
** Es muss also der Pascalcode in JavaScript umgewandelt werden&lt;br /&gt;
** Für den Client muss eine Art Code-Lib zur Verfügung stehen, die Pascal rufen kann und umgekehrt&lt;br /&gt;
* Die IDE soll denken/vorleben das Client-Seitig auch &amp;quot;Pascal&amp;quot; gesprochen wird&lt;br /&gt;
** Debugging: Hier muss der WebClient in den remote-Debugging Modus gebracht werden&lt;br /&gt;
*** https://developer.mozilla.org/en-US/docs/Tools/Remote_Debugging&lt;br /&gt;
** Es könnte die Infrastruktur der &amp;quot;Source maps&amp;quot; verwendet werden, also &amp;quot;komprimierte&amp;quot; Zeilen des JavaScript Quellcodes zeigen auf die entsprechenden Zeilen, die in FreePascal formuliert sind. Es werden also &amp;quot;fake&amp;quot;-Source-Maps zur Verfügung gestellt, so das eine korrekte 1:1 Beziehung zwischen Pascal und Javascript bestehen kann.&lt;br /&gt;
** FreePascal und die Lazarus IDE müssen lernen, dass Teile vom Quelltext &amp;quot;remote&amp;quot; executables sind&lt;br /&gt;
** FreePascal Lazarus  muss Möglichkeiten bieten von einem eintretendem JAvaScript Breakpoint gerufen zu werden&lt;br /&gt;
&lt;br /&gt;
** Es soll alles auch in der Lazarus IDE mit Break-Points programmierbar sein, die IDE soll ein Verständnis haben welche Zeile welchen Code verbirgt&lt;br /&gt;
* Die IDE sollte den Client-Side Part ev. farblich hinterlegen?!&lt;br /&gt;
* Es muss so sein, dass eine Unit weiterhin ServerSide- / ClientSide- Code mischen kann&lt;br /&gt;
&lt;br /&gt;
 program SimpleCalculator;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
  Panel : TPanel;&lt;br /&gt;
  Button1 : TButton;&lt;br /&gt;
  Button2 : TButton;&lt;br /&gt;
  &lt;br /&gt;
 procedure Panel.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  beep; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure Button1.OnClick;&lt;br /&gt;
 begin&lt;br /&gt;
  Button2.Disable; // This goes to JavaScript Client Code&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  App.add(Panel);&lt;br /&gt;
  App.add(Button1);&lt;br /&gt;
  App.add(Button2);&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* die IDE soll ein Verständnis haben dass auf Client-Seite nicht &amp;quot;alles&amp;quot; Programmierbar ist&lt;br /&gt;
* aus den JavaScript Parts soll über einen Dispatcher der nonGUI Code aufbar gemacht werden&lt;br /&gt;
* In einer Datenbank soll das Know-How für die Web Objekte gespeichert sein&lt;br /&gt;
&lt;br /&gt;
== Retry-, Reconnect- Fähig ==&lt;br /&gt;
&lt;br /&gt;
* immer eine lang stehende Keep-Alive TCP Verbindung, mit &amp;quot;Full Reconnect&amp;quot;- und &amp;quot;Client-IP-Change&amp;quot;- Möglichkeit&lt;br /&gt;
* Ein kleines Symbol oder eine Uhr, oder ich weis noch nicht, soll symbolisieren wenn es sich um eine frisch aufgebaute Verbindung handelt&lt;br /&gt;
* Es. soll eine Reconnect auch visualisiert werden, oder auch ein Verbindungsende / Abbruch&lt;br /&gt;
* In der Anfangszeit brauche ich aber ein Feedback das mir beweist dass NICHT immer neue TCP verbindungen aufgebaut werden&lt;br /&gt;
* Der HTTP/2 Server soll eine Modus haben, wo er nur EINE Verbindung EINER IP akzetiert&lt;br /&gt;
&lt;br /&gt;
== Meilensteine ==&lt;br /&gt;
&lt;br /&gt;
 08.12.2023 Feature Freeze: Funktionalität für ServiceWorker und sqlite3.wasm Test ausreichend&lt;br /&gt;
 01.12.2023 RFC: &amp;quot;WINDOW_UPDATE&amp;quot; verbessert&lt;br /&gt;
 26.11.2023 erster &amp;quot;polyzalosd.exe&amp;quot; mit Setup für Win64&lt;br /&gt;
 18.11.2023 Server läuft als Konsolen-App&lt;br /&gt;
 14.11.2023 Auslieferung von DATA&amp;gt;MAX_FRAME_SIZE&lt;br /&gt;
 10.11.2023 openSSL 3.1.4 mit TLS 1.3, erstmals von der RFC 9113 erfahren, Festlegung auf Chrome als Client&lt;br /&gt;
 24.02.2022 openSSL 3.0.1 mit TLS 1.3&lt;br /&gt;
 13.10.2021 Umstellung auf OpenSSL 3, bisher noch mit ACCEPT Fehler&lt;br /&gt;
 23.10.2020 erste Seite wird ausgeliefert&lt;br /&gt;
 12.11.2018 FRAME / HPACK decoding im laufenden Betrieb möglich&lt;br /&gt;
 08.11.2018 Firefox 63 macht leider keine TLS 1.3 Verbindung, aber immerhin TLS 1.2&lt;br /&gt;
 26.06.2018 Firefox 61 mit nativ aktiviertem TLS 1.3 ist erschienen&lt;br /&gt;
 24.11.2017 Erster Client Hello via Read-Thread&lt;br /&gt;
 23.08.2017 Erster Client Hello von Chrome&lt;br /&gt;
 14.08.2017 Erster Client Hello von Firefox&lt;br /&gt;
&lt;br /&gt;
== todo ==&lt;br /&gt;
&lt;br /&gt;
* Linux Version&lt;br /&gt;
* HTTP/2 erste Login Seite&lt;br /&gt;
* OLAP -&amp;gt; Migration auf Console&lt;br /&gt;
* Auswertung -&amp;gt; Migration auf Console&lt;br /&gt;
* OrgaMon Workflow Sheet?!&lt;br /&gt;
* OpenSSL QUIC Server Integration&lt;br /&gt;
&lt;br /&gt;
== Screen-Shots ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:PolyZalos-0.png|200px]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33369</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33369"/>
		<updated>2026-03-18T20:18:28Z</updated>

		<summary type="html">&lt;p&gt;Root: /* FreePascal Target Polyzalos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Polyzalos Binary&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf ein Web-Verzeichnis&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33368</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33368"/>
		<updated>2026-03-18T20:16:09Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Bezug zu diesem Polyzalos-Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33367</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33367"/>
		<updated>2026-03-18T20:15:05Z</updated>

		<summary type="html">&lt;p&gt;Root: /* weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33366</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33366"/>
		<updated>2026-03-18T20:14:00Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Namensherkunft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33365</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33365"/>
		<updated>2026-03-18T20:13:22Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Bezug zu diesem Polyzalos-Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33364</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33364"/>
		<updated>2026-03-18T20:11:02Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pure Pascal Prinzip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout, Provider Switch)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33363</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33363"/>
		<updated>2026-03-18T20:10:19Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Hello World */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33362</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33362"/>
		<updated>2026-03-18T20:08:57Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Technologie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33361</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33361"/>
		<updated>2026-03-18T20:08:14Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Wie nutzt man Polyzalos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung &lt;br /&gt;
** Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33360</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33360"/>
		<updated>2026-03-18T20:05:27Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Wie nutzt man Polyzalos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Vorbereitung, benötigt wird ...&lt;br /&gt;
** ... eine URL, die lokal auf die Maschine des Polyzalos-Servers aufgelöst wird - z.B. &amp;quot;local.orgamon.net&amp;quot;, das wird zu 127.0.0.1 aufgelöst&lt;br /&gt;
** ... ein Zertifikat, das diese Domain bestätigt (Ich verwende dazu das *.orgamon.net Zertifikat)&lt;br /&gt;
** ... ein OrgaMon Verzeichnis lokal oder auf einem NAS&lt;br /&gt;
** ... ein firebird Server mit einer OrgaMon Datenbank&lt;br /&gt;
** ... eine lokale Polyzalos Installation&lt;br /&gt;
* Start der Anwendung: Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des lokal installierten Polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://local.orgamon.net:1443/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* der Server (hier &amp;lt;code&amp;gt;joe&amp;lt;/code&amp;gt;) dieser Website kann aber auch ein lokales &amp;lt;code&amp;gt;polyzalos&amp;lt;/code&amp;gt;-Binary sein (https://local.orgamon.net/)&lt;br /&gt;
* der Server kann auch remote eine VM ist Netzwerk, ein dezidierter Server im Netzwerk oder ein Server in der Cloud sein&lt;br /&gt;
** &amp;lt;i&amp;gt;Unsicher ist noch, ob immer eine lokale polyzalos Installation notwendig ist - kommt wohl darauf an von wo aus das OrgaMon-Verzeichnis zugreifbar ist&amp;lt;/i&amp;gt;&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33359</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33359"/>
		<updated>2026-03-18T19:58:54Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Start der Anwendung: Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des installierten polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://polyzalos.joe.local.net/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* der Server (hier &amp;lt;code&amp;gt;joe&amp;lt;/code&amp;gt;) dieser Website kann aber auch ein lokales &amp;lt;code&amp;gt;polyzalos&amp;lt;/code&amp;gt;-Binary sein (https://local.orgamon.net/)&lt;br /&gt;
* der Server kann auch remote eine VM ist Netzwerk, ein dezidierter Server im Netzwerk oder ein Server in der Cloud sein&lt;br /&gt;
** &amp;lt;i&amp;gt;Unsicher ist noch, ob immer eine lokale polyzalos Installation notwendig ist - kommt wohl darauf an von wo aus das OrgaMon-Verzeichnis zugreifbar ist&amp;lt;/i&amp;gt;&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 18.03.2026 vorregistrieren der zu erwarteten SSEs möglich&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33358</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33358"/>
		<updated>2026-03-18T19:56:36Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Was ist Polyzalos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.6, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Start der Anwendung: Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des installierten polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://polyzalos.joe.local.net/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* der Server (hier &amp;lt;code&amp;gt;joe&amp;lt;/code&amp;gt;) dieser Website kann aber auch ein lokales &amp;lt;code&amp;gt;polyzalos&amp;lt;/code&amp;gt;-Binary sein (https://local.orgamon.net/)&lt;br /&gt;
* der Server kann auch remote eine VM ist Netzwerk, ein dezidierter Server im Netzwerk oder ein Server in der Cloud sein&lt;br /&gt;
** &amp;lt;i&amp;gt;Unsicher ist noch, ob immer eine lokale polyzalos Installation notwendig ist - kommt wohl darauf an von wo aus das OrgaMon-Verzeichnis zugreifbar ist&amp;lt;/i&amp;gt;&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33357</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33357"/>
		<updated>2026-03-17T14:18:13Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Daily Driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updated today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updated Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;i&amp;gt;File .gitignore:&amp;lt;/i&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 cp ../Polyzalos.lps .&lt;br /&gt;
 git status&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33356</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33356"/>
		<updated>2026-03-17T14:06:10Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;i&amp;gt;File .gitignore:&amp;lt;/i&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 cp ../Polyzalos.lps .&lt;br /&gt;
 git status&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33355</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33355"/>
		<updated>2026-03-17T14:05:17Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;i&amp;gt;File .gitignore:&amp;lt;/i&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33354</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33354"/>
		<updated>2026-03-17T14:05:07Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;i&amp;gt;File .gitignore&amp;lt;/i&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33353</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33353"/>
		<updated>2026-03-17T14:04:56Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;i&amp;gt;File .gitignore&amp;lt;/i&amp;gt;&lt;br /&gt;
 &amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33352</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33352"/>
		<updated>2026-03-17T14:04:23Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 nano .gitignore&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;b&amp;gt;&lt;br /&gt;
 #&lt;br /&gt;
 # IDE positions / watches / breakpoints&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos.lps &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # App&lt;br /&gt;
 #&lt;br /&gt;
 Polyzalos&lt;br /&gt;
 &amp;lt;/b&amp;gt;&lt;br /&gt;
 git add .gitignore&lt;br /&gt;
 git commit -m &amp;quot;initial .gitignore&amp;quot;&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33351</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33351"/>
		<updated>2026-03-17T13:53:56Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Remove private File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;br /&gt;
&lt;br /&gt;
 cp Polyzalos.lps ..&lt;br /&gt;
 git rm Polyzalos.lps&lt;br /&gt;
 git commit -m &amp;quot;remove Polyzalos.lps&amp;quot;&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33350</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33350"/>
		<updated>2026-03-17T13:49:57Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;br /&gt;
&lt;br /&gt;
== Remove private File ==&lt;br /&gt;
&lt;br /&gt;
* private in a sense that is has not a secret but is useless for cloners&lt;br /&gt;
&lt;br /&gt;
# Make a copy outside the git&lt;br /&gt;
# Remove the file from git&lt;br /&gt;
# Add the File to gitignore&lt;br /&gt;
# Put back the copy&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Arch&amp;diff=33349</id>
		<title>Arch</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Arch&amp;diff=33349"/>
		<updated>2026-03-11T19:53:33Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Lazarus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundausstattung ==&lt;br /&gt;
&lt;br /&gt;
 nano, kdegraphics-thumbnailers, vlc-plugins-all, libfbclient, dosfstools, 7zip, fastfetch&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
&lt;br /&gt;
 pacman -Syu&lt;br /&gt;
&lt;br /&gt;
== Lazarus ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # qooxdoo&lt;br /&gt;
 #&lt;br /&gt;
 pacman -Syu npm&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # lazarus&lt;br /&gt;
 #&lt;br /&gt;
 pacman -S lazarus-qt6 libfbclient {gcc?} {ddcutil?}&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Orgamon.net&amp;diff=33348</id>
		<title>Orgamon.net</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Orgamon.net&amp;diff=33348"/>
		<updated>2026-03-09T18:36:17Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Aktuelles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Überblick ==&lt;br /&gt;
&lt;br /&gt;
*Die OrgaMon-App kontaktiert zum &amp;quot;senden&amp;quot; und &amp;quot;Start&amp;quot; jeweils den Domain &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;firma&amp;lt;/i&amp;gt;.orgamon.net&amp;lt;/code&amp;gt; über https://- und FTPS://- Protokoll&lt;br /&gt;
**Es gibt ein Hauptzertifikat (für &amp;lt;code&amp;gt;cargobay.orgamon.net&amp;lt;/code&amp;gt;) sowie ihre Kopie davon, das Firmenzertifikat (für &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;firma&amp;lt;/i&amp;gt;.orgamon.net&amp;lt;/code&amp;gt;)  &lt;br /&gt;
* Die Firmendomain wird mit einer festen IP-V4-Adresse verbunden, die IP-Adresse haben Sie bei der Beantragung des Subdomains &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;firma&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; angegeben&lt;br /&gt;
**Auf dem Server mit dieser IP-Adresse muss das Firmenzertifikat installiert werden&lt;br /&gt;
* Für die Absicherung des Datenverkehrs muss auf Ihrem Server das *.orgamon.net Haupt-Zertifikat (als Kopie) installiert werden&lt;br /&gt;
* Dieses liegt auf dem bei Strato gemietetem Webserver &amp;quot;cargobay.orgamon.net&amp;quot; - auf dem auch dieses Wiki gehostet ist - für Sie zum Abruf bereit&lt;br /&gt;
** Das Zertifikat wird aus 3 Dateien gebildet:&lt;br /&gt;
** &amp;lt;code&amp;gt;cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;fullchain.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;privkey.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dieses ist immer für 3 Monate gültig und muss vor Ablauf aufgefrischt werden&lt;br /&gt;
* Das jeweils aktuelle Zertifikat ist auf dem Server &amp;quot;orgamon.net&amp;quot; gespeichert und kann von dort abgerufen werden&lt;br /&gt;
* Hier ist die Beschreibung wie Sie dieses Zertifikat herunterladen und auf Ihrem Server aktualisieren können:&lt;br /&gt;
**Zusammengefasst ist die &amp;quot;Installation&amp;quot; eine 1:1 Kopie des Hauptzertifikates auf Ihr System&lt;br /&gt;
&lt;br /&gt;
== Wann läuft das aktuelle Haupt-Zertifikat ab ? ==&lt;br /&gt;
* Anzeigen des ganzen Zertifikates im Browser&lt;br /&gt;
&lt;br /&gt;
 https://cargobay.orgamon.net/&lt;br /&gt;
&lt;br /&gt;
* Firefox: links neben der URL auf das Schlosssymbol klicken&lt;br /&gt;
** Verbindung sicher&lt;br /&gt;
** weitere Informationen&lt;br /&gt;
** Zertifikat anzeigen&lt;br /&gt;
&lt;br /&gt;
* Chrome: links neben der URL auf das Schieberegler-Symbol klicken&lt;br /&gt;
** Verbindung ist sicher&lt;br /&gt;
** Zertifikat ist gültig&lt;br /&gt;
&lt;br /&gt;
* Das Zertifikat auf &amp;quot;orgamon.net&amp;quot; wird in der Regel frühestens 20 Tage vor dem Ablauf aber spätestens 10 Tage vor dem Ablauf erneuert&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
&lt;br /&gt;
* Loggen Sie sich mit Putty in Ihren OrgaMon-App-Server ein: &amp;amp;rarr;&amp;lt;code&amp;gt;Ticket&amp;lt;/code&amp;gt;&amp;amp;rarr;Reiter &amp;lt;code&amp;gt;Rechner&amp;lt;/code&amp;gt;&amp;amp;rarr;Klicken Sie auf Ihren OrgaMon-App-Linux-Server in der Liste&amp;amp;rarr;Symbol &amp;lt;i&amp;gt;schwarzer Schirm mit rot und grün&amp;lt;/i&amp;gt; (ssh root login via putty)&lt;br /&gt;
* Wechseln Sie auf ihrem OrgaMon-App-Server in das Verzeichnis /etc/nginx/orgamon.net&lt;br /&gt;
&lt;br /&gt;
 cd /etc/nginx/orgamon.net&lt;br /&gt;
&lt;br /&gt;
* Starten Sie das dortige Update Script&lt;br /&gt;
&lt;br /&gt;
 ./update.sh&lt;br /&gt;
&lt;br /&gt;
* Geben Sie nun 3 mal ein angefordertes Passwort ein, das Sie bei der Beantragung des Domains &amp;lt;i&amp;gt;firma&amp;lt;/i&amp;gt;.orgamon.net als &amp;quot;Zertifikat-Refresh-Passwort&amp;quot; erhalten haben (Es ist nicht Ihr &amp;quot;Firmenpasswort&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Neustart von Diensten ===&lt;br /&gt;
&lt;br /&gt;
* Starten Sie nginx neu&lt;br /&gt;
&lt;br /&gt;
 systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
* Starten Sie vsftpd neu&lt;br /&gt;
&lt;br /&gt;
 systemctl restart vsftpd&lt;br /&gt;
&lt;br /&gt;
=== Prüfen ===&lt;br /&gt;
&lt;br /&gt;
* Anzeigen des Verfallsdatums des erhaltenen Zertifikates in der Kommandozeile&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -enddate -noout -in cert.pem&lt;br /&gt;
&lt;br /&gt;
=== Ende ===&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Problemlösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Vergessen das Firmenzertifikat zu aktualisieren ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fehlermeldung Orgamob Zertifikatswechsel.jpg]]&lt;br /&gt;
&lt;br /&gt;
*Fehlermeldung nach dem Senden, wenn der Zertifikatswechsel nicht durchgeführt wurde: Handshake Exception &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aktuelles == &lt;br /&gt;
&lt;br /&gt;
* durchgeführte Erneuerungen des Hauptzertifikates auf orgamon.net werden hier durch den Admin protokolliert. &lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|1=ändern Sie bitte hier nichts, das hat nichts mit Ihrer Zertifikatskopie zu tun, dafür sind Sie selbst verantwortlich}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;09.03.2026: Nächster Ablauf des Zertifikates: 07.06.2026&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;19.12.2025: Nächster Ablauf des Zertifikates: 18.03.2026&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;08.10.2025: Nächster Ablauf des Zertifikates: 06.01.2026&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;10.07.2025: Nächster Ablauf des Zertifikates: 08.10.2025&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;17.04.2025: Nächster Ablauf des Zertifikates: 16.07.2025&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;03.02.2025: Nächster Ablauf des Zertifikates: 04.05.2025&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;12.11.2024: Nächster Ablauf des Zertifikates: 10.02.2025&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;26.08.2024: Nächster Ablauf des Zertifikates: 24.11.2024&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;02.06.2024: Nächster Ablauf des Zertifikates: 02.09.2024&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;08.03.2024: Nächster Ablauf des Zertifikates: 06.06.2024&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;21.12.2023: Nächster Ablauf des Zertifikates: 20.03.2024&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;29.09.2023: Nächster Ablauf des Zertifikates: 28.12.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;19.07.2023: Nächster Ablauf des Zertifikates: 17.10.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;15.06.2023: Nächster Ablauf des Zertifikates: 13.09.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;03.04.2023: Nächster Ablauf des Zertifikates: 01.07.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;21.01.2023: Nächster Ablauf des Zertifikates: 21.04.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;24.10.2022: Nächster Ablauf des Zertifikates: 22.01.2023&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;03.08.2022: Nächster Ablauf des Zertifikates: 01.11.2022&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;23.05.2022: Nächster Ablauf des Zertifikates: 21.08.2022&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;01.03.2022: Nächster Ablauf des Zertifikates: 30.05.2022&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33347</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33347"/>
		<updated>2026-03-07T20:19:06Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Rückkanal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.4, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Start der Anwendung: Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des installierten polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://polyzalos.joe.local.net/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* der Server (hier &amp;lt;code&amp;gt;joe&amp;lt;/code&amp;gt;) dieser Website kann aber auch ein lokales &amp;lt;code&amp;gt;polyzalos&amp;lt;/code&amp;gt;-Binary sein (https://local.orgamon.net/)&lt;br /&gt;
* der Server kann auch remote eine VM ist Netzwerk, ein dezidierter Server im Netzwerk oder ein Server in der Cloud sein&lt;br /&gt;
** &amp;lt;i&amp;gt;Unsicher ist noch, ob immer eine lokale polyzalos Installation notwendig ist - kommt wohl darauf an von wo aus das OrgaMon-Verzeichnis zugreifbar ist&amp;lt;/i&amp;gt;&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  const source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
  source.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
    console.log(event.data)&lt;br /&gt;
  })&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33346</id>
		<title>Polyzalos</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Polyzalos&amp;diff=33346"/>
		<updated>2026-03-07T19:50:16Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Rückkanal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anmerkung|Polyzalos befindet sich noch in Entwicklung, eine erste Demo erschien 2023, mit einer ersten Anwendung wird in 2027 gerechnet}}&lt;br /&gt;
&lt;br /&gt;
== Was ist Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Polyzalos ist ein Technologie-Update des OrgaMon, mit folgenden Innovationen:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lazarus/FreePascal wird als Programmiersprache verwendet (bisher Delphi)&lt;br /&gt;
* ([[Arch]]-)Linux ist die einzige Zielplattform (bisher Win32)&lt;br /&gt;
* Es wird ein Server-Dienst unter Linux sein, eine reine Konsolen-Anwendung die via systemd.socket gestartet wird (bisher Windows Anwendung)&lt;br /&gt;
* Das Benutzerinterface läuft in einem Browser (bisher Windows-UI)&lt;br /&gt;
* Es werden keine proritären Tools (Delphi, IBObjects, FlexCell) mehr verwendet - es ist 100% Open-Source (Lazarus 4.4, Zeos 8.0, fpspreadsheet 2.0)&lt;br /&gt;
* Anstelle des &amp;quot;GPL-3.0-or-later&amp;quot; Lizenz wird die &amp;quot;MIT&amp;quot; Lizenz verwendet&lt;br /&gt;
* Keine Trennung mehr wie bisher zwischen cOrgaMon und OrgaMon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Was bleibt so wie es ist:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* der bisherige Funktionsumfang und Mehrwert&lt;br /&gt;
* Ein OrgaMon-Verzeichnis im Netzwerk (Mehrplatz-System) oder in .\Dokumente (Einzelplatz-System)&lt;br /&gt;
* Firebird als Datenbank-Server mit der bisherigen Datenbank-Struktur&lt;br /&gt;
&lt;br /&gt;
== Wie nutzt man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* Start der Anwendung: Ein Web-Browser (Chrome oder Firefox) wird gestartet mit der URL des installierten polyzalos-Servers (z.B. &amp;lt;code&amp;gt;https://polyzalos.joe.local.net/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* der Server (hier &amp;lt;code&amp;gt;joe&amp;lt;/code&amp;gt;) dieser Website kann aber auch ein lokales &amp;lt;code&amp;gt;polyzalos&amp;lt;/code&amp;gt;-Binary sein (https://local.orgamon.net/)&lt;br /&gt;
* der Server kann auch remote eine VM ist Netzwerk, ein dezidierter Server im Netzwerk oder ein Server in der Cloud sein&lt;br /&gt;
** &amp;lt;i&amp;gt;Unsicher ist noch, ob immer eine lokale polyzalos Installation notwendig ist - kommt wohl darauf an von wo aus das OrgaMon-Verzeichnis zugreifbar ist&amp;lt;/i&amp;gt;&lt;br /&gt;
* Das UI läuft als Web-Code (CSS,HTML5,JavaScript) und erledigt triviale Berechnungen sowie Eingabeprüfung, TAB-Reihenfolgen, Text-Editor, Einfärben von DB-Eingabefeldern&lt;br /&gt;
* komplexe Aktionen (Login in einen Server, PDF-Konvertierung, SQL Richtung DB-Server) übernimmt das lokale Binary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Download eines ersten Beispiel-Servers:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (Noch Win32) https://cargobay.orgamon.org/polyzalos.html&lt;br /&gt;
* (Linux) -- noch nicht verfügbar --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wie programmiert man Polyzalos ==&lt;br /&gt;
&lt;br /&gt;
* In der Lazarus-IDE! &lt;br /&gt;
** (es wird eine Anleitung geben wie man eine Entwicklungsumgebung aufsetzt, Basis ist Arch-Linux)&lt;br /&gt;
** (es wird auch eine Anleitung geben wie man eigene Verbesserungen der Allgemeinheit zur Verfügung stellt)&lt;br /&gt;
** (der bisherige Test-Suite wird veröffentlicht werden und Neuerungen werden über Git-Actions durch einen Git-Runner geprüft)&lt;br /&gt;
* Neben der Datenbank-Logik sind auch Benutzer-Interaktionen im selben Quelltext vermischt&lt;br /&gt;
** Der Zugang zu Polyzalos-Entwicklung wird für Programmierer wesentlich einfacher werden wie der Zugang zur OrgaMon-Entwicklung&lt;br /&gt;
* Nach F9 soll man auf dem letzten Fokus-Element stehen und seine Änderung testen können&lt;br /&gt;
&lt;br /&gt;
* Es wird immer 2fach compiliert&lt;br /&gt;
** Erster Compiler-Lauf: Compilierung für die Serverplattform, ein Compilat &amp;lt;code&amp;gt;./polyzalos&amp;lt;/code&amp;gt; (dies inkludiert ein [[HTTP3]]-Server (Kern) mit Verarbeitungs-Code (Logik).&lt;br /&gt;
** Zweiter Compiler-Lauf: Compilierung nach JavaScript und Auslieferung der veränderten Code-Anteile in ein Webserver-Verzeichnis&lt;br /&gt;
* In Wirklichkeit ist ein Webanteil für das GUI und ein Serveranteil für die Programmlogik entstanden&lt;br /&gt;
* dabei werden Objekt-Methoden aufgerufen, die ggf. auf dem Client oder dem Server laufen oder beides&lt;br /&gt;
&lt;br /&gt;
== Technologie ==&lt;br /&gt;
&lt;br /&gt;
* sind Methoden auf dem Client nicht ausführbar (sie erfordern Server-Resourcen wie Dateisystem, Datenbank, oder complexe Bibliotheken) und erfordern somit Aktionen auf dem Server, dies erfolgt grundsätzlich &amp;quot;nonblocking&amp;quot;, also der Client wartet nie, sondern setzt nur Requests ab&lt;br /&gt;
* sind aber Logik-Anteile des Programmes so trivial oder deren Ergebnise einfach nicht persistent, wird der Code direkt in der GUI ausgeführt ohne Beteiligung des Servers&lt;br /&gt;
&lt;br /&gt;
=== Pure Pascal Prinzip ===&lt;br /&gt;
&lt;br /&gt;
* Das DOM-Modell wird per Pascal-Objekt (also nach javascript compiliertes Pascal) abstrahiert, es soll kein &amp;lt;code&amp;gt;writeln('-b-fett-/b-');&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Vegas- Prinzip (What Happens Here, Stays Here)&lt;br /&gt;
** Die Tatsache HTML5/CSS/JavaScript wird völlig verborgen, für den Programmierer ist ALLES Pascal&lt;br /&gt;
* Auf dem Client lauffähiger Code wird zu JavaScript&lt;br /&gt;
* Auf dem Server lauffähiger Code wird zu nativem Linux-Binary&lt;br /&gt;
* Der Sync der Variablen / Datenbank darf nicht die UI blockieren&lt;br /&gt;
* Abbruch der Verbindung zum Server darf nie ein Problem sein (Notebook-Sleep, Network-Disconnect, Timeout, Long-Timeout)&lt;br /&gt;
* die Server-Worker und Client-Worker müssen transaktionsgesteuert und reconnect fähig sein&lt;br /&gt;
&lt;br /&gt;
=== Rückkanal ===&lt;br /&gt;
&lt;br /&gt;
* Polayzalos sendet Logs und Updates lang laufender Aktionen auf der selben TCP Verbindung zum Client zu jeder Zeit ohne das Request/Answer Model&lt;br /&gt;
** https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
* Dazu öffnet der Client über JavaScript &amp;quot;EventSource()&amp;quot; über die HTTP/2 Stream ID kannn der Netzwerkverkehr hier zugeordnet werden&lt;br /&gt;
* Client-Seite:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
  var source = new EventSource('/log');&lt;br /&gt;
  source.onmessage = function(event) {&lt;br /&gt;
    console.log('Incoming date:' + event.data);&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
 // const es = new EventSource('https://my-server.com/sse')&lt;br /&gt;
 es.addEventListener('notice', (event) =&amp;gt; {&lt;br /&gt;
  console.log(event.data)&lt;br /&gt;
})&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asynchron ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos Anwendung läuft im Browser blockiert aber niemals um eine Antwort auf einen Server-Request zu erhalten&lt;br /&gt;
** Anfragen und Calls an den Server werden in eine lokale SQLite3 Datenbank geschrieben (SQLite3 in der Webassembly-Version im Browser, nativ auf dem Server)&lt;br /&gt;
** Ein Worker versucht Antworten vom Server zu erhalten&lt;br /&gt;
** Ein Worker füllt zum passenden Request die Datenbank mit Ergebnisdaten des Servers&lt;br /&gt;
** Der Worker ruft Callbacks des UI-OS um das jeweilige DOM von z.B. &amp;quot;unsaved, =gelb&amp;quot; auf &amp;quot;saved, weiß&amp;quot; zu stellen&lt;br /&gt;
&lt;br /&gt;
=== WVCL-OS (Client) ===&lt;br /&gt;
&lt;br /&gt;
* eine Polyzalos-Anwendung benutzt auf der Web-Seite eine API zu einer statischen css+html+JavaScript Monolith Web-Visual-Component-Library-Operating-System (WVCL-OS)&lt;br /&gt;
** UI-OS ist ein Unterprojekt von Polyzalos und soll langfristig auch die komplette IDE ins Web bringen können&lt;br /&gt;
** UI-OS wird eher durch Web-Leute gepflegt und weiterentwickelt und per JavaScript von der Polyzalos Anwendung gerufen&lt;br /&gt;
** Wird UI-OS einmal inkompatibel mit &amp;quot;alten&amp;quot; Polyzalos Anwendungen müssen moderne Anwendungen in eine bestimmte UI-OS Version hochschalten&lt;br /&gt;
* Um Erfahrung zu sammeln und nicht bei &amp;quot;0&amp;quot; beginnen zu müssen starte ich mit [[https://qooxdoo.org/ Qooxdoo 8.0]]&lt;br /&gt;
&lt;br /&gt;
=== polyzalos.js ===&lt;br /&gt;
&lt;br /&gt;
* die polyzalos.js ist das 2. Compilat das vom Webserver (integriert in polyzalos) ausgeliefert wird und vom Browser ausgeführt wird&lt;br /&gt;
* darin sind lokale &amp;quot;onButtonpressed&amp;quot; Events implementiert, remote- Aktionen gehen an den Service-Worker (PostMessage)&lt;br /&gt;
&lt;br /&gt;
=== ServiceWorker ===&lt;br /&gt;
&lt;br /&gt;
* Es wird ein ServiceWorkerGlobalScope verwendet, er sichert auch die Forderung &amp;quot;Offline&amp;quot; Funktionalität&lt;br /&gt;
* Er hat zugriff auf eine Persistenz (SQLite3.wasm)&lt;br /&gt;
* Er verarbeitet die Messages der App.js (alle messages sind im JSON Format)&lt;br /&gt;
* Er erstellt aus Daten der Datenbank Formulare (statefull)&lt;br /&gt;
&lt;br /&gt;
==== SQLite3.wasm ====&lt;br /&gt;
&lt;br /&gt;
* Only the ServiceWorker see a SQLite3 Database with forms and propertys (edit.text, grids.data)&lt;br /&gt;
* every Request to a &amp;quot;Form&amp;quot; is generated by the ServiceWorker with persistent Data from the DB&lt;br /&gt;
* The DB is synced (non-blocking) with polyzalos storage (Format is JSONB)&lt;br /&gt;
&lt;br /&gt;
=== Hello World ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 program index;&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
  p2020;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
  writeln('Hello World!');&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PolyzalosD Server ===&lt;br /&gt;
&lt;br /&gt;
* Der Server hat die Möglichkeit spontan über Datenbankänderungen zu informieren&lt;br /&gt;
* Der Server kann Alerts beim Client ausführen&lt;br /&gt;
** https://www.npmjs.com/package/web-push&lt;br /&gt;
&lt;br /&gt;
=== Formulardesigner ===&lt;br /&gt;
&lt;br /&gt;
* Migrations-Phase: Aus der Delphi Code-Basis werden alle dfm nach lfm übernommen (132 Formulare!)&lt;br /&gt;
* Das Design/Redesign/Neudesign von Formularen erfolgt ab dann in der Lazarus IDE&lt;br /&gt;
* (unsicher) Ein grober Funktionstest kann so immer in der IDE ohne Web, mit dem Lazarus-Compilier-Ziel LCL (native GUI-Anwendung) gemacht werden&lt;br /&gt;
** dies wird wohl nicht für immer und ewig unterstützt, da der User genau wissen muss welche Komponenten er überhaupt verwenden kann, es wird nicht alles unterstüzt&lt;br /&gt;
** Zumindest solange bis Chrome unzulänglich als compile Target in Lazarus intergriert ist&lt;br /&gt;
** die lfm werden zum Client übertragen der sie in einer Offline-Datenhaltung speichert (Versioning der lfm-Files!)&lt;br /&gt;
* die lfm werden mit ihren Propertys als JSON, dann JSONB in der SQLite3 DB des ServiceWorkers gespeichert&lt;br /&gt;
* der Worker erzeugt auf &amp;quot;fetch&amp;quot; der app.js das Formular als html5&lt;br /&gt;
&lt;br /&gt;
** Im Endausbau soll Lazarus nativ in ein Chromefenster laufen, ev. gibt es auch mal einen lfm Designer fürs Web&lt;br /&gt;
** die compilat erstellung soll aber immer auf einer nativen Plattform ausgeführt werden&lt;br /&gt;
* der Worker erzeugt aus den lfm eine wfm (HTML5-DOM) die entsprechend das Aussehen des lcl-Formulares nur grob imitiert aber&lt;br /&gt;
** wfm ist nicht mehr pixelgenau&lt;br /&gt;
** wfm baut massiv auf der Tab-Order auf, das ist die Vorgabe für das &amp;quot;Verständnis&amp;quot; der UI&lt;br /&gt;
** wfm ist reactive&lt;br /&gt;
** der Worker implementiert eine WCL welcher TButton, TListbox, TLabel kennt, und das zugehörige html5+js ausliefert&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
&lt;br /&gt;
* Polyzalos, originalschreibweise Πολύζαλός [[https://www.fundus.uni-hamburg.de/de/collection_records/92327]]&lt;br /&gt;
* poly = πολύς = viel&lt;br /&gt;
* zalos = ζάλος = Schaum, Schwindel, Ehrgeiz&lt;br /&gt;
* Polyzalos war der siegreiche Wagenlenker von Delphi&lt;br /&gt;
** Es wurde ein Korpus gefunden: https://commons.wikimedia.org/wiki/File:Charioteer_of_Delphi.jpg&lt;br /&gt;
&lt;br /&gt;
* Sein Gewinn eines Wagenrennens (als Gespann-Eigner - nicht als Lenker) wurde einst in einem Büstenmonument verewigt&lt;br /&gt;
* das Monument wurde ausgegraben es ist aber nicht mehr vollständig erhalten&lt;br /&gt;
** So stellt sich die Wissenschaft das komplette Monument vor: http://www2.oberlin.edu/images/Art200-08/200-033.JPG&lt;br /&gt;
** In der Skizze steht der Siegreiche auf dem Wagen als Lenker? oder nicht? Meine persönliche Meinung ist aber dass er als &amp;quot;Eigner&amp;quot; vor den Pferden stand, die Wagenlenker sind in der Regel nackt dargestellt, der Künstler hat viel Arbeit in die Darstellung der Füße gelegt, diese wären auf dem Wagen gar nicht sichtbar) Neue Erkenntnisse sprechen aber davon, dass Polyzalos selbst Teil des Monumentes war, seine Büste aber fehlt!&lt;br /&gt;
** [[Datei:Zuegelhalter.png|100px]]&lt;br /&gt;
** https://www.john-uebersax.com/plato/plato3.htm&lt;br /&gt;
** Der Sponsor oder siegreiche konnte (auch) den Gewinnerkranz für sich beanspruchen, war aber bekleidet&lt;br /&gt;
&lt;br /&gt;
* http://3.bp.blogspot.com/-GwzDsFa2zIA/VCy-_jfVfcI/AAAAAAAAPtY/NtwPdmJIwiM/s1600/Dwie-Judha-Satria-chariot-allegory.jpg&lt;br /&gt;
* https://www.khanacademy.org/humanities/ancient-art-civilizations/greek-art/early-classical/v/charioteer-delphi&lt;br /&gt;
&lt;br /&gt;
=== weiter &amp;quot;Poly&amp;quot;- Bezug (=2 Pferde) ===&lt;br /&gt;
&lt;br /&gt;
* 2 Pferde, Kelpies Falkirk Scotland&lt;br /&gt;
* Er führt ruhig einen Streitwagen mit 2 sehr unterschiedlichen Pferden (Server/Pascal, Browser/JS)&lt;br /&gt;
** ev. auch auseinanderstrebenden Pferden&lt;br /&gt;
&lt;br /&gt;
* http://www.creaturearchives.com/animalia-chariot-allegory/&lt;br /&gt;
&lt;br /&gt;
=== Bezug zu diesem Polyzalos-Projekt ===&lt;br /&gt;
&lt;br /&gt;
* eines der Pferde symbolisiert die JavaScript-Seite des Browsers&lt;br /&gt;
* das andere Pferd symbolisiert die Pascal-Seite des Servers&lt;br /&gt;
* https://www.insegnadelgiglio.it/prodotto/immagini-di-gela/&lt;br /&gt;
&lt;br /&gt;
== Systemvergleich ==&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal 1989 ===&lt;br /&gt;
&lt;br /&gt;
* Der Compiler erzeugt Assemblercode für die x86 Plattform und hat dabei &lt;br /&gt;
** Knowhow über den Umgang mit Heap- und Hauptspeicher&lt;br /&gt;
** Knowhow über elementare Betriebssystemaufrufe für writeln, readln, AssignFile, ...&lt;br /&gt;
* Es wird linearer Code für das Zielsystem DOS erstellt und gestartet (.com)&lt;br /&gt;
* Konsolenanwendungen oder Textmode- Anwendungen sind der Standard&lt;br /&gt;
* Grafik wird völlig selbst berechnet und ausgegeben&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
* Anwendungen sind Konsolenanwendungen oder grafische Anwendungen (Windows)&lt;br /&gt;
* Es wird an eine MessageLoop des Betriebssystems angedockt und so&lt;br /&gt;
** Click- und Mausevents verarbeitet&lt;br /&gt;
** Signale für die GUI verabeitet (close-Window, refresh Window usw.)&lt;br /&gt;
* Es wird ein Single-Thread-Code für das Zielsystem WIN erstellt und gestartet&lt;br /&gt;
* Formulare (GUI), es werden Objekte über deren Namen und Objekt-Eigenschaften als Text-Dateien gespeichert (*.dfm)&lt;br /&gt;
&lt;br /&gt;
=== FreePascal Target Polyzalos ===&lt;br /&gt;
&lt;br /&gt;
* Erstmals werden 2 Compilate erstellt: der Code für UI und der Code für den Server &lt;br /&gt;
* Dies erfolgt durch 2-maliges Compilieren der selben Code-Basis&lt;br /&gt;
* Server-Code ist nah am Zielbetriebssystem mit nativem Assembler Code und OS-Nutzung (klassischer IDE-Betrieb)&lt;br /&gt;
* Client-Code ist erzeugtes JavaScript zusammen mit statischem Content in html5, dem JavaScript steht eine Client-OS-Infrastruktur in Form von einer rtl.js zur Verfügung&lt;br /&gt;
&lt;br /&gt;
* typischer Entwicklungszyklus&lt;br /&gt;
** Die Entwicklung soll also ausschliesslich mit der Lazarus-IDE stattfinden&lt;br /&gt;
** Coding von Funktionen, dabei erlaubter Mix von UI und Verarbeitungsaktionen&lt;br /&gt;
** 1. Compilierung zu einer Server.exe&lt;br /&gt;
** 2. Compilierung zu JavaScript und deploy auf Web-Bereich&lt;br /&gt;
** Der  Pascal-Quelltext soll &amp;quot;debug&amp;quot; infos mit ins JavaScript ausgeben können, so dass ...&lt;br /&gt;
** Start des Servers&lt;br /&gt;
** der Client-Browser bemerkt den erfolgreichen reconnect zum Server&lt;br /&gt;
** ... der native Lazarus-Debugger verwendet werden kann sobald generierter Code durchlaufen wird&lt;br /&gt;
** dabei wird Firefox das Debug-Protokoll an die Lazarus-IDE senden&lt;br /&gt;
*** https://docs.firefox-dev.tools/backend/protocol.html&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend&lt;br /&gt;
*** https://searchfox.org/mozilla-central/source/devtools/docs/backend/client-api.md&lt;br /&gt;
*** Infos über den Internen Debugger: https://developer.mozilla.org/en-US/docs/Tools/Debugger/UI_Tour&lt;br /&gt;
** alternativ kann zum erzeugten JavaScript eine Sourcemap mitgegeben werden&lt;br /&gt;
*** https://developer.mozilla.org/de/docs/Tools/Debugger/How_to/Use_a_source_map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* typische Server-Funktionen&lt;br /&gt;
** eine Verbindung zu firebird&lt;br /&gt;
** Erstellen und Verarbeiten von Dateien im Dateisystem&lt;br /&gt;
** Uploads- Downloads von/auf anderen Servern&lt;br /&gt;
** Hosten der index.html (minimales starres Template, unveränderlich über alle Projekte hinweg)&lt;br /&gt;
** Hosten des Polyzalos Compilates (.js)&lt;br /&gt;
** Hosten der &amp;quot;RTL&amp;quot; (.js)&lt;br /&gt;
* typische Client-Funktionen&lt;br /&gt;
** wird ein Button gedrückt so werden zunächst andere Controls disabled und eine Server-Anforderung gestellt &lt;br /&gt;
** wird eine Drop-Down-Box gedrückt wird eine Liste angefordert, ist eine Liste bereits gespeichert wird geprüft ob diese noch aktuell ist&lt;br /&gt;
** Synchronisation der Server-Datenbank mit einer lokalen sqlite3-Datenbank (als .wasm)&lt;br /&gt;
** Teil des Frameworks https://docs.emmet.io/cheat-sheet/ zur Hilfe bei html Erstellung&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
* ?.2027: OrgaMon-Funktionsumfang ausgehend von der polyzalos-Userbase erreicht&lt;br /&gt;
* ?.2026: Umstellen auf OpenSSL QUIC Server&lt;br /&gt;
* --v-Past----------------^-Future------------------&lt;br /&gt;
* 03.03.2026 Server-sent events funktioniert&lt;br /&gt;
* 18.02.2026 Portierung von HTTP/2 nach Linux, erster connect gelungen!&lt;br /&gt;
* 10.02.2026 erstes Arch-Linux Compilat - jedoch viele &amp;quot;imp pend&amp;quot;s &lt;br /&gt;
* 11.12.2024 Michael Jeinski erstellt erste aktualisierte Version&lt;br /&gt;
* 08.12.2023 ServiceWorker und sqlite3 laufen, persistenz ist kvv&lt;br /&gt;
* in 2023 &amp;quot;cOrgaMon&amp;quot; Codeumfang nach Lazarus migriert, HTTP/2 Server&lt;br /&gt;
&lt;br /&gt;
=== TO DO ===&lt;br /&gt;
&lt;br /&gt;
* Lesen: https://github.com/darcien/ese/blob/977371c34621d787a2afae543f3b672c587ab681/SSE_SPEC.md&lt;br /&gt;
* Benutze das PasMP Package, und nicht direkt das PasMP.pas&lt;br /&gt;
* &amp;quot;SQLite3 Worker&amp;quot; innerhalb des ServiceWorkers erstellen, in der Hoffnung dass hier OPFS geht!&lt;br /&gt;
** 08.12.2023: gebe die OPFS Forderung auf akzeptiere dass die Persistenz halt woanders liegt&lt;br /&gt;
&lt;br /&gt;
=== aktuelle Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Im ServiceWorker kann das OPFS wegen nicht vollständiger API nicht genutzt werden&lt;br /&gt;
** Lösung: Auf das AsyncKKKK verzichten&lt;br /&gt;
** ganze klar Dokumentieren, wie persistenz im ServiceWorker erreicht werden kann&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot 20260225 191731.png]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
* https://mdn.github.io/dom-examples/web-workers/offscreen-canvas-worker/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&lt;br /&gt;
* https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker&lt;br /&gt;
* https://github.com/nikhilmwarrier/todomanager/blob/main/sw.js&lt;br /&gt;
* https://github.com/rhashimoto/wa-sqlite&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33345</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33345"/>
		<updated>2026-03-04T18:41:08Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Daily Driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Check whats you updatet today&lt;br /&gt;
 #&lt;br /&gt;
 git status&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # [optional] Add new Files&lt;br /&gt;
 #&lt;br /&gt;
 git add {Path|File}&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 # Send your updatet Files &lt;br /&gt;
 #&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33344</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33344"/>
		<updated>2026-03-04T18:39:02Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Einrichten der Entwicklungsumgebung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sorry alle Schritte nur so aus dem Kopf - beim nächsten Mal kontrolliere ich diese Einträge / versprochen.&lt;br /&gt;
 #&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33343</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33343"/>
		<updated>2026-03-04T18:37:53Z</updated>

		<summary type="html">&lt;p&gt;Root: /* &amp;quot;git push&amp;quot; to github */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33342</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33342"/>
		<updated>2026-03-04T18:37:39Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Einrichten der Entwicklungsumgebung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;quot;git push&amp;quot; to github ==&lt;br /&gt;
&lt;br /&gt;
* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;dein Repo&amp;gt;&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33341</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33341"/>
		<updated>2026-03-04T18:36:22Z</updated>

		<summary type="html">&lt;p&gt;Root: /* As Up */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;quot;git push&amp;quot; to github ==&lt;br /&gt;
&lt;br /&gt;
* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== Einrichten der Entwicklungsumgebung ==&lt;br /&gt;
&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33340</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33340"/>
		<updated>2026-03-04T18:35:47Z</updated>

		<summary type="html">&lt;p&gt;Root: /* &amp;quot;git push&amp;quot; to github */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;quot;git push&amp;quot; to github ==&lt;br /&gt;
&lt;br /&gt;
* Dieses Mini-Howto soll erklären was man als Entwickler auf der Kommandozeile seines Systems tun muss um seinen Quelltext auf github zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
== As Up ==&lt;br /&gt;
&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33339</id>
		<title>Linux.git</title>
		<link rel="alternate" type="text/html" href="https://wiki.orgamon.org/index.php?title=Linux.git&amp;diff=33339"/>
		<updated>2026-03-04T18:27:19Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Daily Driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;quot;git push&amp;quot; to github ==&lt;br /&gt;
&lt;br /&gt;
* Es ist komplex, hier in aller Kürze&lt;br /&gt;
 &lt;br /&gt;
== As Up ==&lt;br /&gt;
&lt;br /&gt;
 on github: enable 2 Factor Autentification &lt;br /&gt;
 local: generate a key&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;andreas.filsinger@orgamon.org&amp;quot;&lt;br /&gt;
 on github: store the .pub-Part Key in github &amp;quot;SSH Keys save&amp;quot;&lt;br /&gt;
 local: login in github&lt;br /&gt;
  ssh -T git@github.com&lt;br /&gt;
 say &amp;quot;yes&amp;quot;&lt;br /&gt;
 change the origin of the git&lt;br /&gt;
 git remote set-url origin git@github.com:Andreas-Filsinger/Polyzalos.git&lt;br /&gt;
&lt;br /&gt;
== Daily Driver ==&lt;br /&gt;
&lt;br /&gt;
 git add -u&lt;br /&gt;
 git commit -m &amp;quot;Describe todays Work&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
== Tag it ==&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # Sample for set a tag &amp;quot;9.004&amp;quot;&lt;br /&gt;
 #&lt;br /&gt;
 git tag -a 9.004 -m &amp;quot;Rev. 9.004 - 04.03.2026&amp;quot;&lt;br /&gt;
 git push origin 9.004&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>