* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Maggio 04, 2024, 09:16:52 am

Inserisci il nome utente, la password e la durata della sessione.

486 Visitatori, 0 Utenti

Autore Topic: una classe che dipende da un binario  (Letto 5358 volte)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2873
  • Karma: +20/-4
una classe che dipende da un binario
« il: Gennaio 01, 2013, 02:43:38 pm »
Da un po' di tempo sto lavorando su un sistema di backup basato su rsync.
Nulla di nuovo, c'è già qualcosa di genere in giro (ad es. per Win c'è DeltaCopy), però quello che piacerebbe a me, è realizzare un sistema client che possa girare sui 3 maggiori OS (linux, windows, mac) con la stessa interfaccia grafica, le stesse funzionalità, il più semplice e se necessario più avanzato possibile (a dire il vero però le cose che un sistema di backup dovrebbe fare sono molte e, visto il tempo che ho, tocca fare un passo alla volta ;) ).
Questo perchè a seconda dell'OS ci sono un sacco di cose da vedere per rendere funzionante il backup (ad esempio il charset per il salvataggio dei nomi dei file) e se tra macchine fisiche e virtuali si hanno diversi OS non sarebbe male poter configurare il tutto con un unico tool (e fatto con lazarus!).
Senza considerare poi la "magia" degli hard link ma questo ora è OT.

Sono quindi riuscito a trovare una buona configurazione di uso di rsync per Linux e Windows ma ho delle necessità:
  • linux: la cosa dipende dal pacchetto rsync
  • windows: la cosa dipende da cwRsync
  • mac: non ho ancora approfondito ma sotto c'è FreeBsd e quindi so che un giorno risolverò

La "cosa" sarebbe la classe che ho in mente ed il motivo per cui chiedo il vostro parere.

Domanda 1)
In pratica la classe che voglio realizzare sarebbe un wrapper per l'uso di un binario presente nel filesystem dell'OS attraverso TProcess.
Tramite questa classe ogni applicazione che vorrà usarla avrà la possibilità di impostare il proprio backup dei dati.
Secondo voi, ha senso vincolare una classe alla presenza di un binario?

Domanda 2)
Se ha senso il vincolo classe/binario, la prima cosa che mi è venuta in mente, è quella di usare il costruttore Create per verificare la presenza dei binari (tramite uso direttive di compilazione): se non ci sono, si solleva un'eccezione.

Domanda 3)
C'è un modo migliore per fare il tutto?  ???
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:una classe che dipende da un binario
« Risposta #1 il: Gennaio 01, 2013, 02:55:56 pm »
La mia domanda e' perché' non crei tutto da 0?
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2873
  • Karma: +20/-4
Re:una classe che dipende da un binario
« Risposta #2 il: Gennaio 01, 2013, 03:13:54 pm »
rsync ha un algoritmo veramente particolare per backup differenziali e credo sia il migliore per copie su pc remoti (anche in caso di connessione lenta).
http://it.wikipedia.org/wiki/Rsync

Senza considerare che esiste da anni, è stabilissimo e lo si trova anche come servizio nei nas che usano gli hard link per fare le shapshot ad una certa data.
Se hai ad esempio la cartella A di 1Gb e la copi con gli hard link in B, hai 2 cartelle da 1Gb ciascuna ma l'occupazione del disco è sempre 1Gb.
Se in B cambi un file pre-esistente di 4Kb hai una occupazione totale di 1Gb + 4Kb per 2 cartelle diverse da 1Gb ciascuna.



Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:una classe che dipende da un binario
« Risposta #3 il: Gennaio 01, 2013, 03:26:19 pm »
Risposta 1: Può avere senso vincolare la classe alla presenza di un applicativo, tanto più che è il suo wrapper di lancio. Ma dipense dal design complessivo dell'applicazione. E da che punto di vista vuoi privilegiare.

Risposta 2: Controllare che cosa con le direttive di compilazione? Vuoi lincare l'eseguibile dentro il tuo? Allora non vincoli nulla alla presenza nel file system, stai "inglobando" un'applicazione. In Java mi vengono in mente un paio di trucchetti per farlo, ma con il linker del gcc, non ho idea su come iniziare. Figurati del risultato finale ;)

In generale.
Allora ti darei un consiglio spicciolo.
Non fare una classe che fa tutto, perderesti il controllo del codice abbastanza velocemente in situazioni particolarmente eterogenee.
Fai un classe che funga da facade, questa la "connetti" alla classe wrapper. Ogni classe wrapper specifica implementa un'interfaccia o estende una classe astratta che da a disposizione i metodi base per operare le cose che ti interessano.
Come operare la connessione si può usare qualche altro pattern, quello che mi viene in mente è il factory method, in questo modo l'applicazione conosce molti meno dettagli del tuo driver.

Sempre per "parlare".
Codice: [Seleziona]
TDriverFactory = class(TObject)
  public
    class function getBackupDriver : IBackUpDriver;
end;

Dentro questa funzione metti tutte le cose che ti interessano per il riconoscimento del sistema operativo.
Codice: [Seleziona]
// Importa dai file inc la funzione getMachineDipendentBackUpDriver.
{$IFDEF WINDOW}
  {$INCLUDE BackUp.Windows.inc}
{$ENDIF}
{$IFDEF LINUX}
  {$INCLUDE BackUp.Linux.inc}
{$ENDIF}
{$IFDEF MAC}
  {$INCLUDE BackUp.MAC.inc}
{$ENDIF}
{$IFDEF NEW-OS-BY-NOMORE}
  {$INCLUDE BackUp.NEW-OS-BY-NOMORE.inc}
{$ENDIF}

class function TDriverFactory.getBackupDriver : IBackUpDriver;
begin
  result := getMachineDipendentBackUpDriver;
end;


Ti fai tutti le classi dentro varie unit, in modo da lasciare "pulito" da millanta IFDEF.
Sai che mi piace il codice il più pulito possibile.
 ;)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2873
  • Karma: +20/-4
Re:una classe che dipende da un binario
« Risposta #4 il: Gennaio 01, 2013, 05:35:28 pm »
Risposta 2: Controllare che cosa con le direttive di compilazione? Vuoi lincare l'eseguibile dentro il tuo? Allora non vincoli nulla alla presenza nel file system, stai "inglobando" un'applicazione. In Java mi vengono in mente un paio di trucchetti per farlo, ma con il linker del gcc, non ho idea su come iniziare. Figurati del risultato finale ;)

Niente link, con le direttive di compilazione avevo intenzione di controllare la presenza del binario.
Qualcosa tipo:
Codice: [Seleziona]
constructor TMyBackup.Create(AOwner: TComponent);

   function Test_rsync_binary
   begin
      {$IFDEF LINUX}
       ...
      result :=
      {$ENDIF}
      {$IFDEF WINDOW}
       ...
      result :=
      {$ENDIF}

      ...

   end;

begin
   if not Test_rsync_binary then
      raise exception.Create('unable to find rsync binary!');

   inherited Create(AOwner);
end;

Il problema è che per rilasciare i sorgenti:
[windows]
ho il problema di un setup aggiuntivo di cwRsync: stavo quasi pensando di includere cwRsync come file di risorse e, nel momento del Create, scompatto tutto e lo rendo disponibile; certo che così appesantisco un po' i sorgenti ma almeno chi vorrà usare questa classe sotto win avrà tutto pronto all'uso (anche per la distribuzione finale)

[linux]
potrei provare a testare ed eventualmente richiedere presenza del pacchetto rsync

Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2873
  • Karma: +20/-4
Re:una classe che dipende da un binario
« Risposta #5 il: Gennaio 01, 2013, 05:37:13 pm »
Allora ti darei un consiglio spicciolo.
Non fare una classe che fa tutto, perderesti il controllo del codice abbastanza velocemente in situazioni particolarmente eterogenee.
Fai un classe che funga da facade, questa la "connetti" alla classe wrapper. Ogni classe wrapper specifica implementa un'interfaccia o estende una classe astratta che da a disposizione i metodi base per operare le cose che ti interessano.
Come operare la connessione si può usare qualche altro pattern, quello che mi viene in mente è il factory method, in questo modo l'applicazione conosce molti meno dettagli del tuo driver.

In effetti così sarebbe più pulito e si darebbe la possibilità di espandere il sistema abbastanza agilmente.
E' che così mi tocca riscrivere un po' di cose :(
Pazienza, tocca farlo per bene :)
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:una classe che dipende da un binario
« Risposta #6 il: Gennaio 01, 2013, 10:02:08 pm »
Dai che se funziona per benino lo puoi pubblicare ;)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2873
  • Karma: +20/-4
Re:una classe che dipende da un binario
« Risposta #7 il: Gennaio 02, 2013, 09:59:07 am »
l'idea era quella
speriamo bene
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18796
  • Topic in totale: 2237
  • Online Today: 538
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 486
Total: 486

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.