Testanleitung: eigenes X-Display je Projekt fuer Parallelbetrieb
Damit mehrere Agenten gleichzeitig Oberflaechen testen koennen, bekommt jedes Projekt eine feste Displaynummer (Vorgabe Richard): :99 PolyTrader, :98 Predictalytics, :97 ClawdDotNet, :96 IBKRTrader, :95 und absteigend fuer kuenftige Projekte. Zwei Prozesse auf demselben Display sehen die Fenster des jeweils anderen - Klicks landen im falschen Programm, Aufnahmen zeigen fremde Anwendungen. Beim Durcharbeiten fielen zwei weitere Kollisionspunkte auf, die zum Parallelbetrieb dazugehoeren und mit aufgenommen wurden: - Screenshot- und Logdateien in /tmp brauchen ein Projektpraefix. /tmp/v_1.png ueberschreiben sich parallel laufende Projekte gegenseitig. - "xvfb-run -a" darf NICHT mehr verwendet werden: Das -a sucht sich selbst ein freies Display und beginnt dabei bei :99 - ausgerechnet PolyTraders Nummer. Stattdessen "xvfb-run -n <nummer>". Die Warnung ist nicht theoretisch: Auf der VM lag ein verwaister X98-Socket, entstanden durch genau so einen "xvfb-run -a"-Aufruf beim smoke-ui-Test, als :99 belegt war. Er blockierte Predictalytics' reservierte Nummer, ohne dass ein Prozess lief. Entfernt, und die Anleitung erklaert jetzt, wie man verwaiste Sockets erkennt (ls /tmp/.X11-unix/ gegen pgrep -a Xvfb lesen) und aufraeumt. Weiter ergaenzt: - pkill nie ohne Displaynummer - "pkill Xvfb" erschlaegt die Sitzungen aller anderen Projekte. - DISPLAY in jedem Skript setzen, sonst landet man auf :0, dem echten Desktop. - Die Skriptvorlage hat jetzt einen Kopf mit PROJEKT/DISP/FENSTER; das ist alles, was sich je Projekt unterscheidet. Praktisch gegengetestet. - Aufraeumabschnitt und Belegungsliste um Displays und Verzeichnisse erweitert. Nebenbei aufgefallen: Das PolyTrader-Publish lag unter ~/pt-test statt ~/polytrader-test und verletzte damit die eigene Verzeichniskonvention. Umbenannt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
@@ -398,8 +398,10 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
var k7 = TradeAnalytics.ComputeKpis(moduleTrades.Where(t => t.ClosedAt >= week));
|
||||
var k30 = TradeAnalytics.ComputeKpis(moduleTrades);
|
||||
|
||||
string text = $"{module}\n" +
|
||||
$"Heute: {todayPnl:+0.00;-0.00} USDC\n" +
|
||||
// Ohne den Modulnamen: die Kachel traegt ihn bereits als Ueberschrift, im Textblock
|
||||
// stand er ein zweites Mal ("CopyTrading / CopyTrading / Heute: ...") und sah aus
|
||||
// wie ein Darstellungsfehler (Befund B-7 des Linux-Sichttests).
|
||||
string text = $"Heute: {todayPnl:+0.00;-0.00} USDC\n" +
|
||||
$"7T: {k7.NetPnl:+0.00;-0.00} · {k7.WinRatePct:0}% · {k7.TradeCount} Tr.\n" +
|
||||
$"30T: {k30.NetPnl:+0.00;-0.00} · {k30.WinRatePct:0}%";
|
||||
|
||||
@@ -419,7 +421,9 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
try
|
||||
{
|
||||
string logsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
|
||||
string path = Path.Combine(logsDir, $"{DateTime.Now:yyyy-MM-dd}.jsonl");
|
||||
// Tagesdatei nach der Anzeige-Zeitzone, nicht nach der Systemzeit - sonst greift
|
||||
// die Startseite auf einem UTC-Server abends in die Datei des Vortags (§8).
|
||||
string path = Path.Combine(logsDir, $"{AppTimeZone.Today:yyyy-MM-dd}.jsonl");
|
||||
var rows = new List<LogAlertRow>();
|
||||
if (File.Exists(path))
|
||||
{
|
||||
@@ -504,8 +508,13 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
|
||||
// ===== Helfer =====
|
||||
|
||||
// Als DateTimeOffset lesen und die Uhrzeit SO anzeigen, wie sie in der Datei steht:
|
||||
// DateTime.TryParse haette den Zeitstempel zusaetzlich in die Systemzeit gerueckt.
|
||||
private static string ShortTime(string iso) =>
|
||||
DateTime.TryParse(iso, out var dt) ? dt.ToString("HH:mm:ss") : iso;
|
||||
DateTimeOffset.TryParse(iso, System.Globalization.CultureInfo.InvariantCulture,
|
||||
System.Globalization.DateTimeStyles.None, out var dt)
|
||||
? dt.ToString("HH:mm:ss")
|
||||
: iso;
|
||||
|
||||
private static string OneLine(string s) =>
|
||||
(s ?? string.Empty).Replace("\r", " ").Replace("\n", " ").Trim();
|
||||
|
||||
Reference in New Issue
Block a user