Files
Mimante/Mimante/build/AutoBidder.iss
T
Alby96andClaude Opus 5 1d578debe2 Togli dal percorso caldo la rilettura dell'intero storico
Sei modifiche chieste in questa sessione, di cui una pesa piu' di tutte le altre.

CompletedAuctionsStore rileggeva e rideserializzava l'intero file a ogni chiamata:
misurati 72 ms su 5876 record, 3,9 MB. Append pagava quel prezzo piu' la
riserializzazione e la riscrittura completa per cambiare un record solo, 120 ms
in tutto, e la chiamata arriva da un gestore di eventi di MainWindow, quindi dal
thread dell'interfaccia, che restava fermo a ogni asta conclusa. Il recupero
delle puntate dei vincitori lo faceva in un ciclo: 4675 aste erano 7,2 minuti di
solo rimescolamento JSON e 17,8 GB scritti sul disco.

Adesso c'e' una copia in memoria invalidata sulla data di modifica del file, cosi'
resta giusta anche se il file viene sostituito da fuori (ripristino di un backup),
e un AppendMany che applica molti record con un salvataggio solo, con un indice
per id perche' il caso per cui esiste non torni quadratico. Il recupero salva a
blocchi di cinquanta e deposita comunque quello che ha in mano quando esce, anche
per annullamento: le richieste gia' fatte sono state pagate al server.

Misurato sullo stesso file: 95 volte piu' veloce, 7,2 minuti diventano 4,5
secondi, 17,8 GB diventano 0,36 GB.

Le altre cinque:

- Il setup si chiama AutoBidder_<versione>.exe.
- I pulsanti di stop sono rossi, sia quello globale sia quelli per asta nella
  griglia: erano gli unici tre senza colore mentre avvia e osserva ce l'avevano.
- La pulizia dello storico sa togliere le aste seguite solo in parte. Non serve
  nessun campo nuovo: il prezzo finale in centesimi e' il totale delle puntate
  dell'asta, quindi il rapporto con i reset osservati dice quanta asta si e'
  vista, e la regola vale anche sullo storico gia' raccolto. Verificata sui dati
  veri: su 5876 aste nessuna supera copertura 1,02, che e' quanto ci si aspetta
  se l'identita' e' giusta.
- La griglia ricicla i contenitori di riga invece di ricrearli.
- Il costo puntata gia' esisteva col predefinito giusto: al suggerimento e' stato
  aggiunto perche' 0,20 e' il numero da tenere.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 14:48:54 +02:00

124 lines
4.6 KiB
Plaintext

; ─────────────────────────────────────────────────────────────────────────────
; AutoBidder — script di installazione (Inno Setup 6)
;
; Non si compila a mano: lo lancia build/Release.proj, che prima pubblica
; l'eseguibile e poi passa qui versione e percorsi con /D. Compilarlo da solo
; produrrebbe un pacchetto con la versione sbagliata, perché il numero vive
; nel .csproj.
;
; dotnet msbuild build/Release.proj -t:Pacchetto
;
; L'applicazione è un unico .exe self-contained: l'installazione copia quel file,
; crea i collegamenti e registra la voce per "App installate". I dati dell'utente
; stanno in %LocalAppData%\AutoBidder e NON vengono toccati né dall'aggiornamento
; né dalla disinstallazione — sono aste, statistiche e sessione, cioè mesi di
; raccolta che nessun disinstallatore ha il diritto di buttare via.
; ─────────────────────────────────────────────────────────────────────────────
#ifndef AppVersion
#define AppVersion "0.0.0"
#endif
#ifndef SourceExe
#define SourceExe "..\bin\publish\win-x64\AutoBidder.exe"
#endif
#ifndef OutputDir
#define OutputDir "..\bin\installer"
#endif
#define AppName "AutoBidder"
#define AppPublisher "Alberto Balbo"
#define AppExeName "AutoBidder.exe"
[Setup]
; L'AppId identifica il prodotto fra una versione e l'altra: cambiarlo farebbe
; comparire due voci in "App installate" invece di un aggiornamento.
AppId={{9F2C6E14-8B3D-4A57-9E10-6C4B0D7A1F52}
AppName={#AppName}
AppVersion={#AppVersion}
AppVerName={#AppName} {#AppVersion}
AppPublisher={#AppPublisher}
VersionInfoVersion={#AppVersion}
; Installazione per utente: niente richiesta di amministratore, e i dati stanno
; comunque nel profilo di chi la usa.
PrivilegesRequired=lowest
DefaultDirName={autopf}\{#AppName}
DefaultGroupName={#AppName}
DisableProgramGroupPage=yes
DisableDirPage=auto
OutputDir={#OutputDir}
OutputBaseFilename=AutoBidder_{#AppVersion}
SetupIconFile=..\Icon\favicon.ico
UninstallDisplayIcon={app}\{#AppExeName}
UninstallDisplayName={#AppName} {#AppVersion}
; L'eseguibile è già compresso (single-file compresso): comprimerlo di nuovo
; costa minuti di build e guadagna poco.
Compression=lzma2/normal
SolidCompression=no
WizardStyle=modern
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
[Languages]
Name: "italiano"; MessagesFile: "compiler:Languages\Italian.isl"
[Tasks]
Name: "desktopicon"; Description: "Crea un collegamento sul desktop"; GroupDescription: "Collegamenti:"
Name: "avvioautomatico"; Description: "Avvia AutoBidder all'accesso a Windows"; GroupDescription: "Avvio:"; Flags: unchecked
[Files]
Source: "{#SourceExe}"; DestDir: "{app}"; Flags: ignoreversion
[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\Disinstalla {#AppName}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon
[Registry]
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; \
ValueType: string; ValueName: "{#AppName}"; ValueData: """{app}\{#AppExeName}"""; \
Flags: uninsdeletevalue; Tasks: avvioautomatico
[Run]
Filename: "{app}\{#AppExeName}"; Description: "Avvia {#AppName}"; \
Flags: nowait postinstall skipifsilent
[UninstallDelete]
; Solo quello che ha creato l'installazione. I dati restano.
Type: dirifempty; Name: "{app}"
[Code]
{ Un'installazione sopra una copia in esecuzione lascerebbe il vecchio eseguibile
al suo posto senza dirlo, e l'utente si ritroverebbe la versione precedente
convinto di aver aggiornato. Meglio fermarsi e chiedere. }
function IsAppRunning(): Boolean;
var
ResultCode: Integer;
begin
Result := Exec('cmd.exe',
'/C tasklist /FI "IMAGENAME eq {#AppExeName}" | find /I "{#AppExeName}"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0);
end;
function InitializeSetup(): Boolean;
begin
Result := True;
if IsAppRunning() then
begin
if MsgBox('AutoBidder è in esecuzione e sta forse seguendo delle aste.' + #13#10#13#10 +
'Chiudilo prima di continuare, altrimenti il file non può essere sostituito.' + #13#10#13#10 +
'Riprovo?', mbConfirmation, MB_YESNO) = IDYES then
Result := not IsAppRunning()
else
Result := False;
if not Result then
MsgBox('Installazione annullata: AutoBidder è ancora aperto.', mbInformation, MB_OK);
end;
end;