Immagine
 E le foglie? - Catanzaro, Parco della Biodiversità Mediterranea... di DrCrocco
 
"
"It's not enough to bash in heads, you've got to bash in minds"

Joss Whedon
"
 
  Home| Chi Sono| Contatti| |La Ricetta
 
Di seguito tutti gli interventi pubblicati sul sito, in ordine cronologico.

Di vittorio (del 15/01/2008 @ 23:21:53, in Sistemi, linkato 1179 volte)
Ho notato che sono veramente poche le persone che dedicano il tempo necessario per fare il backup dei dati importanti. Spesso ricevo telefonate da parte di amici e parenti che mi chiedono: Hai per caso un disco di ripristino per Windows? il computer non si accende più. Come se io avessi una cassaforte con dentro un disco di ripristino per tutto il mondo.
In realtà la maggior parte degli utenti sa che è necessario fare il backup, ma non ha tempo di farlo oppure non sa come farlo.

Questo articolo è dedicato a chi vuole mettere in piedi un sistema pratico e veloce per fare il backup.

Il metodo più banale per fare un backup è quello di fare una copia da un dispositivo ad un'altro, possibilmente removibile. E' il caso in cui ad esempio si vuole fare una copia di files su una chiavetta usb o hard disk esterno.
Si tratta di una soluzione veloce ma non di certo ottimale; ci sono alcuni fattori da tenere in considerazione:
  • Per garantire un ripristino sicuro bisognerebbe fare la copia dei dati ogni giorno; ciò significa che l'utente deve ogni giorno selezione e copiare i files a mano. Esiste un comando DOS, chiamato copy in grado di fare la copia di uno o più files ma non consente la copia delle sottocartelle, di conseguenza risulta poco pratico (per ogni sottocartella è necessario impartire un comando copy). In realtà esiste anche un altro comando per fare una copia, una sorta di comando copy avanzato ma di questo ne parleremo più avanti.
  • Nel caso in cui venga utilizzata sempre la stessa locazione come destinazione della copia, molti files verranno sovrascritti, di conseguenza si perde la cronologia dei cambiamenti e l'impossibilità di recuperare una versione precedente del file.
  • Optando per una locazione differente ad ogni copia, nella destinazione verranno copiati sempre tutti i files, anche quelli che non sono stati modificati nella copia precedente con una inutile perdita di spazio.
Fatta questa osservazione, procediamo con un po' di teoria.

Lo scopo di fare il backup è sostanzialmente quello di poter tornare indietro qual'ora le cose dovessero andare male. Per tornare indiero nel tempo è necessario disporre di tutti files e delle loro modifiche nel tempo.
In teoria, tutti i file di nuova creazione e quelli modificati, dovrebbero entrare a far parte del backup.

Le diverse tipologie di backup
Esistono sostanzialmente quattro tipi di backup:
  • Completo - è una copia di tutti i files, indipendentemente dal fatto che questi siano stati modificati o meno. Viene generato per essere certi di poter ripristinare in futuro tutti files. In parole povere, ripristinare un backup completo equivale a tornare in dietro nel tempo alla data in cui lo stesso è stato generato.
  • Incrementale - è una copia dei soli files che sono stati creati/modificati dopo aver fatto l'ultimo backup. Di conseguenza garantisce solo un ripristino parziale. Per poter ripristinare la sistuazione aggiornata è necessario disporre del backup completo e di tutti gli incrementali fatti.

    Supponiamo di avere un backup a cadenza giornaliera suddivisa nel modo seguente:

    Lun - Completo
    Mar - Incrementale
    Mer - Incrementale
    Gio - Incrementale
    Ven - Incrementale
    Sab - Incrementale
    Dom - Incrementale

    Supponiamo inoltre che sia domenica e che vi sia la necessità di ripristinare i dati aggiornati; è necessario disporre del backup completo del lunedì e di tutti gli incrementali, da martedì a domenica.
  • Differenziale - è una copia dei soli files che sono stati creati/modificati dopo aver fatto l'ultimo backup completo. Di conseguenza garantisce solo un ripristino parziale. Per poter ripristinare la situazione aggiornata è necessario disporre del backup completo e dell'ultimo differenziale.

    Supponendo di avere un backup a cadenza giornaliera suddivisa nel modo seguente:

    Lun - Completo
    Mar - Differenziale
    Mer - Differenziale
    Gio - Differenziale
    Ven - Differenziale
    Sab - Differenziale
    Dom - Differenziale

    qual'ora ci fosse la necessità di ripristinare i dati alla domenica, è necessario disporre del backup completo del lunedì e del differenziale del giorno (domenica).
  • Giornaliero - è la copia dei soli files che sono stati creati/modificati nel giorno in cui il backup viene eseguito. Perchè risulti efficiente è necessario eseguire il backup giornaliero ogni giorno.
Fermiamoci un attimo per fare alcune considerazioni. In primo luogo l'utente potrebbe pensare che dal momento che per fare un ripristino sicuro è necessario un backup completo, tanto vale fare ogni giorno un backup completo per stare tranquilli. Fare un backup completo ogni giorno ovvero a cadenza regolare (es: settimanale, mensile, annuale, ...) equivale a fare un copia/incolla dei files in cartelle di destinazione diverse (sistema poco pratico che occupa tanto spazio).
Sia il differenziale che l'incrementale consentono di salvare spazio poichè copiano solo i files che vengono modificati. L'unica differenza sta nel fatto che l'incrementale non copia i files creati/modificati dall'ultimo backup completo, se questi sono già stati inclusi in un altro backup incrementale eseguito in precedenza.

Tutte le tipologie di backup hanno ragione di esistere ed escludendo il backup giornaliero, direi che tutti sono complementari per ottenere una politica di backup efficace e sicura.


L'attributo Archivio
Probabilmente vi chiederete come viene gestita la creazione/modifica dei files dal sistema operativo dal momento che la data di creazione e modifica di un file viene presa in esame solo da un backup giornaliero.
Windows, o per meglio dire il DOS, imposta una serie di attributi per ogni file. I più importanti vengono elencati di seguito:
  • Sola Lettura - I files con questo attributo non possono essere modificati/eliminati se non previa rimozione dello stesso.
  • Sistema - I files con questo attributo sono da ritenersi vitali per il corretto funzionamento del sistema operativo. Pertanto è doveroso fare attenzione prima di rimuovere un file "di sistema" dal proprio disco.
  • Nascosto - I files con questo attributo non vengono di norma elencati all'interno di Gestione Risorse. Per visualizzare questi files è necessario modificare le impostazioni predefinite.
  • Archivio - I files con questo attributo si presume siano stati modificati dopo aver eseguito un backup completo/incrementale.
Per visualizzare gli attributi di un file è possibile utilizzare il comando attrib in dos oppure cliccare con il tasto destro sul file e scegliere proprietà in gestione risorse.
Ad ogni modo il flag che indica "teoricamente" se un file è stato già incluso in un backup oppure no è il flag archivio. Teniamo a precisare "teoricamente" perchè nessuno vieta di modificare a piacimento gli attributi di un file.

Non resta che spiegare come l'attributo archivio venga impiegato durante il processo di backup.
  • Backup Completo - Per fare un backup completo è necessario considerare tutti i files, indipendentemente che abbiamo l'attributo archivio impostato o meno. Se presente, l'attributo archivio viene rimosso.
  • Backup Incrementale - Per fare un backup incrementale è necessario considerare solo i files che presentano l'attributo archivio. I files considerati perdono l'attributo dopo il backup.
  • Backup Differenziale - Per fare un backup differenziale è necessario considerare solo i files che presentano l'attributo archivio. I files considerati non perdono però l'attributo dopo l'esecuzione del backup.
  • Backup Giornaliero - Non tiene assolutamente conto dell'attributo archivio.

Concludiamo con la teoria
Alla luce di quanto abbiamo affermato prima, possiamo implementare un backup che mantenga una certa cronologia delle modifiche (completo+incrementale/i) oppure un backup salvaspazio che tenga tutto il necessario per ripristinare i files correnti (completo+differenziale). Ad ogni modo per implementare un backup generalmente è necessario tenere presente:
  1. La frequenza - Prima di tutto è necessario stabilire la cadenza degli internventi. Per fare ciò bisogna considerare i files oggetto del backup. Se questi vengono modificati di frequente e si vuole mantenere un certo dettaglio nel backup, allora si sceglierà una cadenza oraria o giornaliera; se i dati invece cambiano meno frequentemente, si opterà per backup con cadenza settimanale, mensile e così vià, l'importnate è trovare il giusto equilibrio.
  2. Lo storico - Se vogliamo avere la facoltà di ripristinare un file eliminato/modificato che non è più presente nel backup corrente allora è necessario conservare uno o più cicli di backup. Ad esempio potremmo decidere di conservare gli ultimi quattro backup settimanali per avere uno storico di un mese. Il quinto backup andrebbe a sostituire il primo e così via.
  3. Il supporto - Non tutti i supporti sono uguali quando parliamo di backup. Le grandi aziende usano le così dette unità a nastro. Si tratta di dispositivi simili ad audio cassette e create proprio per questo scopo. E' ovvio che per implementare un backup a basso costo non è necessario munisri di unità a nastro, ma sicuramente una chiavetta usb o un cdrom non sono certo affidabili come un DAT (Digital Audio Tape).
  4. La conservazione - Infine parliamo di conservazione in senso figurato ed in senso fisico. Figurato perchè è inutile conservare i file sullo stesso supporto/computer sul quale risiedono i file; fisico perchè il luogo in cui conserveremo il backup deve essere scelto con cura. Eviteremo dunque di lasciare i supporti alla luce diretta del sole o nelle vicinanze di fonti di calore. Per una maggiore sicurezza è bene tenere il backup lontano dal luogo in cui si trovano i file (pensate ad incendi ed allagamenti) e lontano da occhi indiscreti (meglio se messi sotto chiave). I perfezionisti faranno sempre almeno due copie dello stesso backup su supporti diversi che verranno conservati in luoghi diversi (questo per confermare ancora una volta che la sfortuna ci vede benissimo).
Nei prossimi articoli vedremo quali sono gli strumenti che Windows mette a disposizione dell'utente per gestire il backup.

Per il momento è tutto.
Alla prossima.
Articolo (p)Link Commenti Commenti (0)  Storico Storico  Stampa Stampa
 
Di vittorio (del 09/01/2008 @ 21:42:40, in Network, linkato 412 volte)
Il titolo di questo articolo la dice lunga.
Non smetterò mai di dire quanto sia importante fare il backup dei propri dati.
Oggi presento una soluzione per chi non è dotato di masterizzatori, unità a nastro, chiavette usb ed hard disk esterni.
Se possedete una buona quantità di spazio su un server remoto, allora potreste prendere in considerazione la possibilità di fare un backup strutturato per mezzo del buon vecchio protocollo ftp.

Chi opera in ambito IT sicuramente conoscerà questo protocollo. Una volta era molto utilizzato, oggi è stato in parte superato dall'avvento dell'http e del moderno bittorrent.
Resta comunque un modo del tutto valido per lo scambio di files su Internet.
Esistono client di ogni genere e per tutti i sistemi operativi. Si va dal browser web ai client distribuiti con il sistema operativo. Insomma i modi per sfruttare l'ftp non sono pochi.

Per fare un buon backup senza dover perdere ore nel programmare i vari client ci vorrebbe una soluzione semplice.
Forse non tutti sanno che è possibile interrogare un server ftp mediante la Gestione Risorse di Windows, proprio come se fosse una connessione di rete. Un apposito wizard è raggiungibile tramite il menu:

Strumenti > Connetti unità di rete... > Iscriversi ad un servizio di archiviazione...

Seguendo le istruzioni a video è possibile sfogliare le cartelle del sito remoto cliccando l'icona: Risorse di rete.

Questa soluzione consente di sfruttare il server ftp per fare il backup al pari di altre periferiche di archiviazione (hard disk, chiavette usb, ...).

NetDrive. Montare un sito ftp in locale
Volgliamo spingerci oltre però, dando la possibilità all'utente di poter usufruire del sito ftp tramite l'assegnazione di una lettera, proprio come avviene per le periferiche locali.
A questo proposito ho pensato a NetDrive, un prodotto freeware di Novell che consente di associare una lettera ad un sito ftp mediante semplici operazioni.
In realtà questo tool è molto ben articolato e consente di definire diversi parametri come ad esempio la conversione dei files tra client e server oppure la definizione di una periferica a cui possono accedere tutti gli utenti locali.
Questo articolo però non vuole essere un tutorial sull'uso di questo tool, anche perchè su Internet esistono tanti siti che trattano l'argomento per i quali basta fare una ricerca.

Per montare localmente un sito ftp è sufficiente cliccare su "Nuovo sito" ed indicare i parametri di connessione. A questo punto è possibile compilare tutti gli altri parametri richiesti come ad esempio: login, password, lettera, ...
Chi volesse può spuntare l'apposito flag per riconnettere la periferica al riavvio del sistema operativo.

Montare un sito ftp su Linux
Gli utentui di Windows saranno soddisfatti ma cosa possono fare gli amanti del pinguino?
Linux non si smentisce mai ed ovviamente le possibilità di manovra sono molto più elevate. C’è da dire però che non tutte le distribuzioni supportano il montaggio in locale di siti ftp.

Stiamo parlando di ftpfs (FTP File System): un modulo del kernel che permette di gestire i contenuti di un sito ftp per mezzo del ben noto comando mount.

ftpfs è un progetto oggi superato da un altro chiamato LUFS (UserLand FileSystem) che consente di utilizzare connessioni sicure tramite SSH su server SFTP.

Utilizzare questo modulo è molto intuitivo.
Chi ha installato sulla propria distribuzione autofs/automount può utilizzare la cartella /mnt/ftpfs per accedere al sito ftp tramite il comando:

cd /mnt/ftpfs/[user:pass@]ftp_server[:port]

dove user, pass, ftp_server e port sono i parametri di connessione.
Un altro metodo semplice prevede l’impiego del comando ftpmount:

ftpmount ftpuser@ftp.mysite.org /mnt/ftpfs -uid=500 -gid=500 -dmask=555

Anche in questo caso i parametri disponibili sono tanti ma sostanzialmente si tratta di specificare il modo in cui la cartella locale deve essere mappata nel sistema operativo.

Infine come abbiamo detto in precedenza è possibile utilizzare il comando mount specificando il tipo di flie system appropriato (-t ftpfs)

mount -n -t ftpfs none /mnt/ftpfs -o ip=192.168.0.1,user=ftpuser,pass=ftp_pass

Questo articolo si conclude qui. Di cose da dire ce ne sarebbero ancora molte ma penso che questa piccola guida sia utile come punto di partenza.

Alla prossima.

Per saperne di più
Scarica NetDrive
Introduzione a NetDrive
Il progetto FTP File System
Articolo (p)Link Commenti Commenti (0)  Storico Storico  Stampa Stampa
 
Di vittorio (del 07/01/2008 @ 12:25:28, in Network, linkato 7094 volte)
Chi come me usa un computer portatile fornito dall’azienda per lavoro, ha spesso la necessità di modificare al volo le impostazioni di rete.
Qualche anno fa, prima di diventare un consulente, lavoravo come amministratore di rete per la stessa società in cui lavoro oggi.
Le richieste di aiuto più frequenti erano legate alla impossibilità di navigare sulla rete. Nella maggior parte dei casi passavo ore al telefono spiegando cosa fare per cambiare indirizzo IP, DNS, Proxy, …
Senza considerare poi che quasi tutti i consulenti “vorrebbero” utilizzare il portatile sdraiati sul divano davanti la tv con la scusa di “lavorare da casa”.
Oggi esistono tanti programmi in grado di modificare in tempo reale le impostazioni di rete ma qualche anno fa trovare una soluzione completa non era facile.
Di seguito vi presento due script in VB Script che ho scritto velocemente nel mio tempo libero e che aiutano l’utente a modificare le impostazioni di rete senza dover installare programmi sul portatile.

Change IP
Il primo script si chiama Change IP ed implementa un piccolo tool che raccoglie le preferenze dell’utente e le salva in un file di input compatibile con netsh (network shell).
netsh è una utilità di windows eseguibile dalla console che consente di modificare tutti i parametri di rete che normalmente vengono gestiti tramite le proprietà della periferica ovvero tramite il pannello di controllo.
Dopo aver salvato il file di input (con estensione .conf), viene creato un link a netsh sul desktop.
Basta richiamare il link (con privilegi di amministratore) per cambiare al volo le impostazioni di rete.
Nonostante fosse possibile fare a meno di netsh impiegando solo codice vbscript, scelsi questa soluzione perchè non avevo molto tempo da dedicare allo sviluppo e volevo dare all’utente la possibilità di spostare le preferenze di rete da un portatile ad un altro senza per forza dover utilizzare il codice vbs.
Per chi deve gestire una rete questo approccio torna comodo perché basta creare il file di input una sola volta per poi distribuirla su tutti i portatili aziendali.

Cosa fa il codice sorgente
Lo script si limita a catalogare le risorse di rete disponibili e raccogliere le preferenze espresse dall’utente inserendole in un file di testo con estensione .conf.
Per enumerare le periferiche di rete viene richiamato il comando netsh:

netsh interface ip show config

E questo è un esempio del risultato:

Configurazione per l'interfaccia "Connessione alla rete locale (LAN)"
DHCP abilitato: Sì
MetricaInterfaccia: 0
Server DNS configurati tramite DHCP: Nessuno
Server WINS configurati tramite DHCP: 10.0.0.20
10.0.0.130
Registratore con suffisso: Solo primario

Configurazione per l'interfaccia "Connessione rete senza fili"
DHCP abilitato: Sì
MetricaInterfaccia: 0
Server DNS configurati tramite DHCP: Nessuno
Server WINS configurati tramite DHCP: Nessuno
Registratore con suffisso: Solo primario

Di seguito riporto per comodità un esempio di file conf creato tempo fa per connettermi ad modem ethernet dotato di bootloader adam2:

#--------------------------------------------------
# Change IP 1.1 by vittorio benintende
#
# Questo file è stato generato automaticamente.
# Non modificarlo!!!
#
# Per informazioni scrivere a:
# vittorio.@lucullo.it
#--------------------------------------------------


# Configurazione IP interfaccia Connessione alla rete locale (LAN)

pushd interface ip
set address name = "Connessione alla rete locale (LAN)" source = static addr = 10.0.0.1 mask = 255.255.255.0
set dns name = "Connessione alla rete locale (LAN)" source = static
set wins name = "Connessione alla rete locale (LAN)" source = static
popd

# Termine della configurazione IP interfaccia

Change Proxy
Il secondo script si comporta in modo differente. Questa volta viene demandato al programma di salvare le preferenze dell'utente in un file (sempre con estensione .conf) e di modificare le chiavi di registro per rendere effettive le modifiche necessarie.

Le informazioni gestite con questo piccolo tools sono le stesse raggiungibili tramite l'icona Opzioni Internet ovvero Internet Explorer (Strumenti > Opzioni Internet).
All'avvio dello script un apposito menu guida l'utente tra le varie opzioni.
Le impostazioni relative alla connessione con il proxy vengono tenute nel file di registro di windows e sono reperibili tramite il comando regedit al seguente percorso:

HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings

VB script ed antivirus
Mi è capitato di notare che alcuni antivirus (vedi ad esempio Norton AV) inibiscono l'esecuzione degli script.
Qualora ci fossero problemi in tal senso il mio consiglio è quello di impostare l'av in modo da consentirne l'esecuzione piuttosto che disattivare il programma di scansione residente in memoria.

Sorgenti
Network Manager 1.1

Per saperne di più
Il comando netsh
Impostare il proxy in MS Windows
Articolo (p)Link Commenti Commenti (8)  Storico Storico  Stampa Stampa
 
Di vittorio (del 30/12/2007 @ 22:06:53, in SGCop, linkato 184 volte)
Ho appena finito di caricare sul sito tutti i files relativi alla nuova versione di SGCop.

Sostanzialmente non ci sono particolari modifiche al sistema operativo se non quelle indicate già nella release di IPCop 1.4.18.

Da parte mia ho solo aggiunto il certificato GPG al fine di rendere possibile gli upgrade direttamente dal frontend web come avviene per IPCop.
Poichè questa opzione è stata aggiunta solo adesso, chi volesse aggiornare il software già dalla versione 1.4.16 deve scaricare la patch sgcop-1.4.16-gnupg-patch.tar.gz disponibile su questo sito e copiarne il contenuto nella cartella /root.

Per quanto riguarda la release 1.4.17 tengo a precisare che non dovrebbero esserci problemi di spazio dato che non sono a conoscenza di Magnia multiprocessore. Il kernel smp non è disponibile in SGCop, dunque la directory /boot dovrebbe avere spazio sufficiente per fare l'aggiornamento alla versione 1.4.18 senza rimuovere alcun file.

Enjoy.
Articolo (p)Link Commenti Commenti (1)  Storico Storico  Stampa Stampa
 
Di vittorio (del 22/12/2007 @ 10:57:33, in Programmazione, linkato 363 volte)
La settimana scorsa, durante la pausa pranzo, parlavo con alcuni colleghi del più e del meno.
Parlare con me però significa quasi sempre parlare di informatica.
E' venuto fuori il solito discorso sulla programmazione ed in particolare si è parlato di Visual Basic.

Il VB, come anche altri linguaggi interpretati, è uno strumento che consente di ottenere soluzioni valide scrivendo poche righe di codice. L'ideale per implementazioni veloci ad hoc.
Durante la breve chiacchierata mi è stata rivolta questa domanda:

Gli indici di un array in vb partono da zero a meno di non specificare il contrario. Ma non sarebbe più semplice se partissero da uno?

E' seguito un breve silenzio ed un sorriso da parte mia. Odio le persone che rispondono alle domande con altre domande ma questa volta è capitato a me che replico:

Conosci l'assembly?

Come risposta è veramente antipatica e poco professionale.
Il fatto è che se durante la pausa pranzo, incomincio a parlare di registri, locazioni di memoria e contatori, la gente mi guarda male e finisce per dire: "ma perchè ho fatto questa domanda?"
Lo ammetto, la sintesi non è il mio forte.

Comunque sia, chi ha studiato l'assembly conosce bene il motivo per cui gli array, a meno di non specificare diversamente, partono con indici pari a zero.
Alla fine della pausa pranzo, avevo già in mente un piccolo test per fare una dimostrazione.

Di seguito riporto due procedure scritte in Visual Basic che lasciano il tempo che trovano. Si tratta di poche righe che non hanno alcuna pretesa ma che secondo me possono rendere l'idea.

Option Explicit

Sub test1()
Dim j(0 To 9) As Long
Dim x As Integer
Dim Conta As Long
Dim Time1 As Date
Dim Time2 As Date

Time1 = Now
Time2 = DateAdd("s", 60, Time1)
Conta = 0
While Now < Time2
  For x = LBound(j) To UBound(j)
    j(x) = Conta
    Conta = Conta + 1
  Next
Wend
MsgBox Conta
End Sub

Sub test2()
Dim j(1 To 10) As Long
Dim x As Integer
Dim Conta As Long
Dim Time1 As Date
Dim Time2 As Date

Time1 = Now
Time2 = DateAdd("s", 60, Time1)
Conta = 0
While Now < Time2
  For x = LBound(j) To UBound(j)
    j(x) = Conta
    Conta = Conta + 1
  Next
Wend
MsgBox Conta
End Sub

test1 e test2 sono 2 procedure identiche, si differenziano solamente per la dichiarazione dell'array j che per test1 va da 0 a 9 mentre per test2 va da 1 a 10. Sempre 10 elementi per entrambi gli array.
Vinene chiesto al programma di eseguire un ciclo per la durata di un minuto. In detto ciclo una variabile viene costantemente sommata ad 1 come fosse un contatore. Alla fine della esecuzione, viene mostrato all'utente il numero di volte che è stato eseguito il ciclo. Poichè ad ogni iterazione viene aggiornato un elemento diverso dell'array, il numero di volte che il ciclo viene eseguito dipende anche dall'array stesso.

Proviamo adesso ad eseguire test1 e successivamente test2 prendendo nota del valore di Conta alla fine di ogni esecuzione.

Nel mio caso, il valore per test1 è stato 329.842.430 mentre per test2 è stato 326.544.260.
E' inutile dire che il valore dipende dalla velocità del processore e del sistema operativo ma quello che a noi interessa non è il valore assoluto ma la semplice differenza.

Durante la prova dunque, test1 è stato più veloce di test2 perchè ha eseguito 3.298.170 cicli in più.

Questo può sembrare banale ad un programmatore di visual basic, sopratutto ora che i processori sono molto veloci e la memoria non è più un problema.
In ambienti in cui la velocità è molto importante però, l'attenzione del programmatore è un aspetto da non sottovalutare. C'è da dire comunque che chi vuole ottenere la massima velocità dal processore non si affida certo a vb.

Mi capita però di vedere in giro codice bizzarro e ridondante come ad esempio:

if blVar = true then ...

Che senso ha testare se VERO è uguale a VERO oppure VERO è uguale a FALSO? E' più semplice testare la condizione con:

if blVar then ...

L'esecuzione risulterà sicuramente più veloce.

Abbiamo eseguito il test ma non abbiamo ancora dimostrato perchè gli array con indice iniziale pari a zero sono più veloci degli altri.
Per fare le cose come si deve, avrei dovuto prendere un disassemblatore e portarmi nel punto in cui avviene l'esecuzione delle due procedure per analizzarne il contenuto.

Ma questo non è un documento tecnico e non vuole essere una lezione di assembly.

Chi volesse approfondire l'argomento può leggere il quinto capitolo presente in: The Art Of Assembly un libro che per me è stato fondamentale e che può essere scaricato dal link riportato alla fine di questo articolo.
Ed è proprio dal quinto capitolo di questo meraviglioso libro che prendiamo spunto per dare la dostra spiegazione.



Come è possibile vedere dalla immagine riportata in alto, la memoria viene vista dal computer come una grande pila di mattoncini. Ogni mattoncino è una locazione di memoria delle dimenzioni necessarie per conservare la variabile (nel nostro esempio l'array è composto da 10 elementi di tipo Long. In questo caso ogni mattoncino rappresenta 4 byte).

Di consenguenza, per accedere ad un elemento dell'array è necessario applicare la seguente formula:

Element_Address = Base_Address + ((Index - Initial_Index) * Element_Size)

Base_Address è l'indirizzo di memoria da cui parte l'array, Index è l'indice dell'elemento che ci interessa, Initial_Index è l'indice del primo elemento dell'array ed Element_Size è la dimensione occupata in memoria da ciascun elemento.
Se l'indice iniziale dell'array è zero, allora la formula può essere semplificata nel modo seguente:

Element_Address = Base_Address + (Index * Element_Size)

Per questo motivo è preferibile utilizzare array con indici iniziali pari a zero.

Per saperne di più:
The Art Of Assembly (download formato pdf)
Visual Basic Array Tutorial
Articolo (p)Link Commenti Commenti (3)  Storico Storico  Stampa Stampa
 
Di vittorio (del 18/12/2007 @ 13:16:15, in Sistemi, linkato 266 volte)
Tempo fa ho comprato un hard disk da mezzo tera in un centro commerciale della mia città.
Piano piano l'ho riempito di files di ogni genere: backup, posta, sorgenti, progetti, distribuzioni linux, ...

In breve tempo non ero più in grado di trovare facilmente i files che mi servivano.
Così le soluzioni al problema erano due:

- Mettere in ordine l'archivio e darsi un metodo per copiare i files
- Trovare un piccolo crowler a cui richiedere i files quando servono.

Forse non tutti sanno cos'è un crowler. In parole povere si tratta di un software che indicizza le risorse in rete e le rende disponibili ad un motore di ricerca.

Ovviamente ho optato per la seconda opzione.

Durante una delle tante presentazioni sul software alle quali assisto per lavoro, sono venuto a conoscenza di Google Mini, un motore di ricerca per le aziende mantenuto da Google.
Non si tratta di un pacchetto gratuito anche perchè viene venduto insieme all'hardware su cui "gira" il motore di ricerca.

Dopo varie ricerche sono incappato su una soluzione di IBM e Yahoo! Search.

Sto parlando di OmniFind, un crowler scritto in Java e disponibile per Windows e Linux.

Ho deciso di provarlo subito ma purtroppo il supporto per Linux è limitato alla distribuzione di Red Hat Enterprise.

Questo significa che è possibile eseguire OmniFind su altre distribuzioni ma è necessario apportare le dovute modifiche al processo di installazione.

La prima cosa da fare in assoluto è disabilitare Selinux in caso sia attivo nell'ambiente operativo altrimenti l'installazione non si concluderà correttamente. Provvederemo in un secondo momento a riabilitarlo.
Chi non avesse impostato Selinux all'avvio del SO può tranquillamente ignorare i comandi che seguono.
Fedora Core mette a disposizione un semplice modo per disabilitare temporaneamente Selinux:

setenforce 0

Per verificare che il comando abbia sortito l'effetto desiderato, procediamo con una verifica:

cat /selinux/enforce

Il comando precedente dovrà restituire 0.

A questo punto è utile creare un utente di sistema con il quale eseguiremo il programma (non è consigliabile eseguire il crowler con le credenziali di root anche perchè non c'è ne la necessità):

groupadd omnifind
useradd -g omnifind omnifind
passwd omnifind

Una volta definita la password per l'utente omnifind procediamo oltre.

OmniFind utilizza una propria Java Virtual Machine, di conseguenza non è necessario installare Java sul SO. Tuttavia il crowler fa uso di librerie condivise, in particolare è necessario disporre di libstc++. Un semplice comando yum list dovrebbe essere sufficiente per fare un controllo. Per installare le librerie possiamo impartire il seguente comando:

yum install compat-libstdc++*

Adesso è possibile procedere con l'installazione di OmniFind seguendo le istruzioni incluse nel manuale del software. Prima di procedere però sostituiamo l'utente omnifind all'utente root.

su omnifind
./setuplinux_i586.bin -console

Il comando precedente prevede una installazione per la riga di comando. Chi volesse procedere in ambiente X può omettere il parametro -console.
Nel caso in cui l'installazione non andasse a buon fine, verificare che l'utente omnifind abbia i permessi di scrittura nella cartella prescelta per l'installazione.

Utilizzando i parametri di default, la directory di installazione dovrebbe essere: /opt/ibm/OmniFindYahooEdition, di conseguenza questa sarà la directory a cui faremo riferimento nei comandi successivi.

Qualora l'applicativo funzionasse alla fine dell'installazione, ritenetevi persone molto fortunate, nel mio caso infatti sono stati necessari altri passaggi.

Nel caso in cui l'esecuzione del programma non vada a buon fine, procediamo con alcune verifiche.
In primo luogo verifichiamo che tutte le librerie siano collegate correttamente:

ldd /opt/ibm/OmniFindYahooEdition/stellent.linux32/tsmanager

L'output dovrebbe essere simile al seguente:

linux-gate.so.1 => (0x00110000)
libpthread.so.0 => /lib/libpthread.so.0 (0x491c2000)
libACE.so.5.5.1 => /opt/.../stellent.linux32/libACE.so.5.5.1 (0x00125000)
libboost_date_time-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_date_time-gcc-mt-1_33_1.so.1.33.1 (0x0029b000)
libboost_filesystem-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_filesystem-gcc-mt-1_33_1.so.1.33.1 (0x002a9000)
libboost_program_options-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_program_options-gcc-mt-1_33_1.so.1.33.1 (0x002b9000)
libboost_regex-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_regex-gcc-mt-1_33_1.so.1.33.1 (0x002fd000)
libboost_serialization-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_serialization-gcc-mt-1_33_1.so.1.33.1 (0x0038f000)
libboost_signals-gcc-mt-1_33_1.so.1.33.1 => /opt/.../stellent.linux32/libboost_signals-gcc-mt-1_33_1.so.1.33.1 (0x00408000)
libdl.so.2 => /lib/libdl.so.2 (0x4cfdb000)
libts_utils.so => /opt/.../stellent.linux32/libts_utils.so (0x0041a000)
libts_logging_facility.so => /opt/.../stellent.linux32/libts_logging_facility.so (0x00431000)
libts_components.so => /opt/.../stellent.linux32/libts_components.so (0x00451000)
libts_soap_ext.so => /opt/.../stellent.linux32/libts_soap_ext.so (0x00461000)
libts_soap_ts_server.so => /opt/.../stellent.linux32/libts_soap_ts_server.so (0x004c9000)
libts_soap_ta_server.so => /opt/.../stellent.linux32/libts_soap_ta_server.so (0x0052f000)
libts_soap_ts_client.so => /opt/.../stellent.linux32/libts_soap_ts_client.so (0x0059e000)
libts_soap_std.so => /opt/.../stellent.linux32/libts_soap_std.so (0x00604000)
libts_soap_tss.so => /opt/.../stellent.linux32/libts_soap_tss.so (0x00687000)
libts_soap_ta_client.so => /opt/.../stellent.linux32/libts_soap_ta_client.so (0x006ea000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00758000)
libm.so.6 => /lib/libm.so.6 (0x4cfe1000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4d149000)
libc.so.6 => /lib/libc.so.6 (0x4ce99000)
/lib/ld-linux.so.2 (0x4ce7c000)
librt.so.1 => /lib/librt.so.1 (0x4447d000)

Nel caso in cui qualche libreria dovesse mancare, verifichiamo che selinux sia disabilitato e che libstc++ sia installato sul SO; quindi seguiamo le istruzioni riportate nel manuale per reinstallare OmniFind.

Se il servizio iptables è in uso da Linux, verifichiamo che la porta definita per contattare OmniFind sia accessibile. Di seguito le impostazioni da aggiungere al file /etc/sysconfig/iptables per abilitare i client a contattare il servizio sulla porta di default proposta dall'installazione (inserire prima del COMMIT):

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT


Se anche in questo caso l'applicativo non parte, assicuriamoci che nel file /etc/hosts sia indicata la voce localhost:

::1 mycomputer.mydomain mycomputer localhost.localdomain localhost
127.0.0.1 localhost.localdomain localhost

Se il problema persiste, scrivete due righe sul problema, tenteremo insieme una soluzione.

Una volta che il servizio "parte" senza problemi, è necessario modificare le policy di selinux.
Chi avesse impostato selinux in modalità permissive può trovare tutte le modifiche da apportare dando uno sguardo ai log di sistema:

cat /var/log/messages | grep audit


chi avesse impostato Selinux in modalità enforced dovrà invece procedere per tentativi successivi.
In pratica si tratta di abilitare l'utente omnifind alla esecuzione delle librerie java. Evidenziamo di seguito i comandi impratiti da console per una singola libreria:

semanage fcontext -a -t textrel_shlib_t
/opt/ibm/OmniFindYahooEdition/_jvm/jre/bin/headless/LIBRERIA.so
restorecon /opt/ibm/OmniFindYahooEdition/_jvm/jre/bin/headless/LIBRERIA.so

Dove LIBRERIA è il nome del file inibito da Selinux.

A questo punto possiamo ripristinare selinux:

setenforce 1

Fare partire il servizio all'avvio:
Di seguito riportiamo una possibile soluzione per chi volesse far partire il crowler all'avvio di Linux:

cat > /etc/rc.d/init.d/omnifind <<EOF
#!/bin/sh
#
# chkconfig: - 99 31
# description: Starts and stops the Omnifind daemon \
#


# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

RETVAL=0

start() {
   KIND="Omnifind"
   echo -n $"Starting $KIND service: "
   su -c /opt/ibm/OmniFindYahooEdition/bin/startup.sh omnifind
   RETVAL=$?
   echo
   return $RETVAL
}

stop() {
   KIND="Omnifind"
   echo -n $"Shutting down $KIND services: "
   su -c /opt/ibm/OmniFindYahooEdition/bin/shutdown.sh omnifind
   RETVAL=$?
   echo
   return $RETVAL
}

restart() {
   stop
   start
}


case "$1" in
start)
   start
   ;;
stop)
   stop
   ;;
restart)
   restart
   ;;
*)
   echo $"Usage: $0 {start|stop|restart}"
   exit 1
esac

exit $?
EOF

Il precedente comando consente di gestire Omnifind tramite chkconfig.
Per installare lo script è sufficiente impartire i seguenti comandi:

chmod 755 /etc/rc.d/init.d/omnifind
chkconfig --add omnifind
chkconfig --level 345 omnifind on

Considerazioni finali:
Secondo me OmniFind è un tool utile per le piccole aziende, almeno nella sua versione free.
Da tenere in considerazione che questa versione non gestisce la segregazione dei dati a nessun livello, di conseguenza, chi riesce a contattare il motore di ricerca, può ottenere tutti i dati indicizzati, senza discriminazioni.
E' molto comodo da usare e riesce a tracciare il contenuto di: file PDF, files Word, files Compressi e siti web interni ed esterni alla rete locale.

Per saperne di più:
OmniFind Home Page
Cos'è un crowler
Articolo (p)Link Commenti Commenti (0)  Storico Storico  Stampa Stampa
 
Di vittorio (del 06/12/2007 @ 15:28:29, in SGCop, linkato 982 volte)
Tempo fa ho attivato un contratto ADSL per connettermi ad Internet da casa. Quasi subito però mi sono accorto che i vari modem/router in circolazione non facevano al caso mio.
Io volevo una soluzione che mi consentisse di fare tante cose (VPN, Wi-Fi, DMZ, un piccolo server Web, ...).
Sul mercato ho trovato tante alternative valide ma nessuna che mi lasciasse peinamente soddisfatto.
Così su Ebay ho comprato un Toshiba Magnia SG30. Si tratta di un banalissimo PC di compatte dimensioni, senza monitor e tastiera ma con integrato due schede di rete ed uno switch.
Come soluzione era l'ideale, però il software che vi era montato non era più manutenuto da Toshiba e poi non era proprio quello che avevo in mente.
Come sistema operativo alternativo pensai subito a Linux, come distribuzione ad IPCop.
Unico problema e che IPCop non è fatto per essere installato su un pc senza mouse e tastiera, almeno non senza problemi. Del resto io volevo sfruttare tutte le potenzialità dell'hardware che avevo a disposizione.

Cos'è SGCop
SGCop nasce da una mia esigenza personale. In parole povere si tratta del porting di IPCop per i PC della serie Magnia SG (SG10,SG20 e SG30).

Le sostanziali differenze con IPCop sono:

- compilazione del codice ottimizzata per i686;
- supporto della console seriale (ttyS);
- supporto "grezzo" del display LCD.

Per quanto riguarda il resto, SGCop è al 100% compatibile con IPCop.

Poichè IPCop esegue codice compatibile con i sistemi i386, gli unici plug in che possono creare problemi sono quelli che installano moduli aggiuntivi nel kernel.

Purtroppo io non ho avuto molto tempo da dedicare al porting ed alcune cose non sono ancora completate.

Installare SGCop
Installare SGCop è facile come IPCop ed infatti è possibile seguire il manuale di IPCop per completare tutto il processo.

Tuttavia il processo di installazione originale prevede l'uso di una console virtuale (tty1,tty2,...) che non sul Magnia.
Poichè ho voluto lasciare la piena compatibilità con IPCop, per avviare l'installazione è necessario impartire il comando da console:

/bin/install [console]

Dove il parametro console puo essere /dev/tty2 se si dispone di un monitor ed una tastiera ovvero /dev/null in caso si stia utilizzando una console seriale (si perdono però i dettagli della installazione che IPCop invia su tty2).
Articolo (p)Link Commenti Commenti (0)  Storico Storico  Stampa Stampa
 
Di vittorio (del 03/12/2007 @ 16:06:59, in Network, linkato 2195 volte)
Vi è capitato di voler lasciare acceso il proprio modem/router ADSL quando siete fuori casa, per poi poterlo interrogare tramite Internet?
I router di ultima generazione hanno la possibilità di utilizzare protocolli come Dynamic DNS (DDNS) che consentono di rintracciare l'IP del modem anche in presenza di un indrizzo dinamico.

Per quanto riguarda i modem, questi sono spesso utilizzati per mezzo di un PC. Se l'opzione DDNS non è disponibile, allora e sufficiente scaricare un client DDNS (basta fare una ricerca su Internet) da installare sulla propria macchina.

Chi inevece come me utilizza un router che non supporta il protocollo DDNS deve inventarsi qualcosa.

Una semplice soluzione fatta in casa
Nel mio caso è possibile interrogare il router per mezzo del protocollo telnet (porta 23).
I modem/router che supportano le sessioni su porta 23 sono tanti (es. Dlink 300T, 302T, 320T, ecc.).
L'idea è quella di prendere l'IP del modem ed inviarlo ad un indirizzo di posta elettronica a cadenza regolare; ad esempio, ogni ora.

Per prima cosa dobbiamo creare uno script in grado di generare l'output per la sessione telnet proprio come se fosse un utente a farlo:

cat > /sbin/runtelnet.sh < #!/bin/sh
host=192.168.1.1
port=23
login=root
passwd=RouterPass

echo open ${host} ${port}
sleep 1
echo ${login}
sleep 1
echo ${passwd}
sleep 1
echo ifconfig ppp0
sleep 1
echo exit
EOF

Questo comando crea un file chiamato /sbin/runtelnet.sh che contiene i comandi da impartire al router per ottenere l'IP della rete WAN. E' necessario modificare le variabili secondo le proprie esigenze.

A questo punto dobbiamo renderlo eseguibile:

chmod 750 /sbin/runtelnet.sh

Adesso bisogna creare un piccolo script che prenda questo indirizzo e lo spedisca in posta elettronica:

cat > /sbin/myIP.sh < #!/bin/sh

SUBJECT="Modem Public Ip"

# A chi spediamo l'email?
EMAIL="noreply@morzello.com"

# inviamo l'email usando /bin/mail
/sbin/runtelnet.sh | telnet 2> /dev/null | grep "addr:" | /bin/mail -s "$SUBJECT" "$EMAIL" > /dev/null 2>&1

echo "done."
EOF

Questo comando genera il file /sbin/myIP.sh con il quale spediremo un messaggio contenente l'IP pubblico del router.
Anche in questo caso è necessario rendere eseguibile il file con il comando:

chmod 750 /sbin/myIP.sh

Prima di concludere, facciamo qualche test per capire se tutto è in ordine.

Quando tutto funzionerà correttamente, potremo procedere con un inserimento nel file /etc/crontab in modo da eseguire questo comando ogni ora:

01 * * * * root /sbin/myIP.sh >/dev/null 2>&1

In alternativa, sui sistemi operativi come ad esempio Fedora, è possibile linkare lo script nella cartella /etc/cron.hourly.

Per saperne di più:
cos'è il DDNS
DynDNS - servizio on-line
No IP - un altro servizio on-line
Articolo (p)Link Commenti Commenti (4)  Storico Storico  Stampa Stampa
 
Di vittorio (del 01/12/2007 @ 14:37:52, in Office Automation, linkato 196 volte)
Ogni società di consulenza trasmette la propria visual identity tramite alcuni strumenti tra cui le presentazioni.
Nel mio ambiente di lavoro, l'imprinting  è così forte che riuscirei a riconoscere la presentazione di un mio collega fra mille anche se non presenta il logo della società.

Il Template utilizzato per la creazione delle slides in MS-Power Point deve presentare, in alto a destra, il nome del file che a sua volta contiene la versione del documento. Questo consente di controllare le revisioni della presentazione anche in forma cartacea.

E qui viene il bello. Ogni volta che cambia la versione oppure il nome del file bisogna cambiare l'apposita etichetta della diapositiva.

Detto questo, di seguito trovate la mia soluzione al problema.
Poche righe di visual basic che, tramite una macro, modificano una etichetta (nell'esempio è myText) sostituendone il contenuto con il nome del file PPT.

Sub naming()
  Dim myViewType As PpViewType
  myViewType = ActiveWindow.ViewType
  ActiveWindow.ViewType = ppViewSlideMaster
  ActivePresentation.SlideMaster.Shapes("myText").Select
  ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Select
  ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Characters(Start:=1, Length:=Len(ActiveWindow.Selection.TextRange.Text)).Select
  ActiveWindow.Selection.TextRange.Text = ActivePresentation.Name
  ActiveWindow.Selection.Unselect
  ActiveWindow.ViewType = myViewType
End Sub

Articolo (p)Link Commenti Commenti (0)  Storico Storico  Stampa Stampa
 
Di vittorio (del 30/11/2007 @ 00:02:52, in Sistemi, linkato 1148 volte)
Tanto tempo fa, con il sudore della fronte, comprai uno splendido monitor 22 pollici crt. Tutt'ora lo uso ad una risoluzione di 1600x1400 anche se supporta risoluzioni decisamente maggiori.

La mia ragazza però adora vedere sullo schermo caratteri "cicciosi" e grandi.
Per questo motivo mi ritrovo sempre a dover cambiare risoluzione ogni volta che mi autentico sulla macchina.

Esiste un programmino chiamato qres.exe che consente la modifica della risoluzione e di altri parametri interessanti da riga di comando.

L'esempio riportato di seguito mostra come sia possibile automatizzare il cambio di risoluzione ad ogni login utente tramite l'impiego di un file batch ed un paio di comandi DOS. Se l'utente si chiama myUser allora la risoluzione sarà di 1024x768 (in presenza di un monitor 4:3) altrimenti sarà di 1600x1400.

::
:: script di avvio per ogni utente
:: di dominio

@ECHO OFF

IF %USERNAME%==myUser (
  %SystemRoot%\qres.exe /x:1024
  GOTO GOEXIT
)
  %SystemRoot%\qres.exe /x:1600
:GOEXIT

Ho copiato l'eseguibile nella %SystemRoot% che per i possessori di Windows XP corrisponde in genere a C:\WINDOWS
Il file .bat l'ho invece inserito tra gli script di avvio nelle policy locali della workstation in modo tale che venga eseguito ogni volta che un utente si autentica.

Chi non avesse voglia di utilizzare le policy oppure il file di registro, può copiare/trascinare il file batch nell'apposita cartella del menù di Windows denominata Esecuzione Automatica.

Per saperne di più
Homepage di QRes
Articolo (p)Link Commenti Commenti (2)  Storico Storico  Stampa Stampa
 
Pagine: 1 2 3 4 5 6
Ci sono 3 persone collegate


Cerca per parola chiave





< settembre 2010 >
L
M
M
G
V
S
D
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
             


Titolo
Calabria (29)
Italia (1)
Sistemi (2)

Le fotografie più cliccate

Titolo
Quale tra questi termini associ alla "Sicurezza Informatica"?

 Firewall
 AntiVirus
 Antispam
 Password

Titolo

Human Calendar

Fedora Project:

Questo sito è segnalato da:
BlogItalia.it - La directory italiana dei blog

Add to Technorati Favorites

Internet Map

Play chess online

Play chess online



09/09/2010 @ 10.07.36
script eseguito in 250 ms