Friday, May 15, 2009

How to change root password in linux

If you have to change root password of your linux distribution (obviously if you have the rights to do that!) or if you have forgot it, follows these steps. The following steps suppose you have installed GRUB as a boot loader.

Restart your computer and wait for GRUB. Press Esc to pick from a list of kernels, then type 'e' to edit it.

Scroll down in the showed list until you find something that looks like this: kernel /vmlinuz-x.x.x-x.x ro root=/dev/...
When you find it, type "e" to edit it.

Add at the end of the line(make sure you insert the space at the beginning) the following: init=/bin/bash. Press enter and then type "b" to boot.

Now your system starts in text mode and then you'll get bash. Type mount in order to see the name of the mount. (It should be something like: /dev/sda1)

Remount the file device typing: mount -o remount,rw /dev/sda1 / (/dev/sda1 is your device)

Now, you're ready to change your password simply typing: passwd and typing two times anew password.

Reboot the computer.

Enjoy, you have a new root password in your system!

Tuesday, May 12, 2009

Algoritmi e strutture dati


Il libro Algoritmi e strutture dati, edito dalla casa editrice McGraw-Hill, è un libro indispensabile per tutti coloro che operano nel mondo dell'IT. Autori del libro sono: Camil Demetrescu, Irene Finocchi, e Giuseppe F. Italiano.
Il libro è suddiviso in diciassette capitoli molto eterogenei tra loro. Ogni capitolo infatti si occupa di descrivere e risolvere un particolare problema; tali problemi sono legati sia allo studio degli algoritmi, sia allo studio delle strutture dati. Nel libro non è incluso alcun CD-ROM o DVD.
Il primo capitolo, sebbene introduttivo, fa capire con molta chiarezza il ruolo rivestito dagli algoritmi nelle prestazioni di un progetto informatico. Attraverso un esempio legato al calcolo del numero di Fibonacci, gli autori riescono a mostrare la differenza che intercorre tra l'utilizzo di un algoritmo efficiente da uno inefficiente. Per misurare le prestazioni sono introdotte le quantità di tempo e spazio. Ed infine, è fornita un'introduzione concernente la notazione asintotica.
Il secondo capitolo descrive quali sono le principali metodologie per l'analisi degli algoritmi. La trattazione sottolinea l'importanza di utilizzare opportuni modelli di calcolo per verificare l'utilizzo delle risorse(tempo di esecuzione e spazio di memoria). Nella seconda parte del capitolo è ripresa la trattazione circa la notazione asintotica. Di essa sono affrontati i temi relativi allo studio del caso peggiore e del caso medio(in particolare descrivendo la tecnica della randomizzazione). Infine, è analizzato il tempo di esecuzione degli algoritmi ricorsivi.
Nel terzo capitolo sono descritte le tecniche che consentono la gestione di collezioni di oggetti nella memoria di un calcolatore. E' sottolineata la differenza che esiste tra un tipo di dato e una struttura dati, e sono descritte le principali tecniche di rappresentazione: indicizzata e collegata. Di tali tecniche sono sottolineate le differenze che intercorrono nel loro utilizzo a seguito delle operazioni da effettuare. In conclusione sono descritte le possibili realizzazioni dei tipi di dato pile, code, alberi.
In questo capitolo è affrontato l'importante concetto dell'ordinamento. Inizialmente, la trattazione introduce un modello astratto, per poi mostrare tecniche di progettazione e di analisi degli algoritmi. Tra esse è analizzata la tecnica del divide et impera, l'utilizzo di strutture dati efficienti, la tecnica di randomizzazione, e la dipendenza dal modello.
Il quinto capitolo è incentrato sull'analisi del problema del calcolo del mediano di un insieme di elementi. La trattazione prende ad esempio l'algoritmo quick sort per poter giungere tramite opportuni accorgimenti ad un algoritmo randomizzato. Infine, è progettato un algoritmo lineare deterministico basato su una tecnica di campionamento.
Nel sesto capitolo è affrontato il problema del dizionario analizzandolo mediante strutture basate sul confronto. Nel capitolo sono sottolineati tutti gli aspetti legati agli alberi binari di ricerca relativi al problema dell'inserimento, della cancellazione, e della ricerca di elementi all'interno del dizionario.
In questo capitolo, il problema del dizionario è affrontato utilizzando operazioni che richiedono tempo costante in media. La tecnica descritta è l'hashing. L'hashing è descritto nei particolari, mettendo in evidenza il problema delle collisioni e come risolverlo utilizzando funzioni hash con buon grado di uniformità. Sono trattate due diverse tecniche di risoluzione delle collisioni, esse sono le liste di collisione e l'indirizzamento aperto.
L'ottavo capitolo affronta il tema del mantenimento del minimo valore in un insieme di dati che richiedono frequenti aggiornamenti. Attraverso il tipo di dato coda con priorità sono illustrate quattro realizzazioni del problema. Esse sono: DHeap, HeapBinominale, HeapBinominaleRilassato, HeapFibonacci.
Il capitolo descrive algoritmi efficienti per la risoluzione del problema union-find. Ad una trattazione di strutture molto semplici, quali gli alberi QuickUnion e QuickFind, che non offrono prestazioni soddisfacenti, si passa alla descrizione di euristiche di bilanciamento(union by size e union by rank) che portano risultati ottimi relativamente all'operazione di union. Seguendo, sono descritte le euristiche per la compressione dei cammini molto appropriate per l'operazione di find. L'unione delle due euristiche consente di ottenere algoritmi molto veloci.
Nel decimo capitolo sono affrontate alcune fra le più importanti tecniche algoritmiche. Esse sono: divide et impera, la programmazione dinamica, e il metodo goloso o greedy. Alcune delle tecniche descritte in questo capitolo saranno riprese nel proseguo del libro.
L'undicesimo capitolo si occupa dei problemi riguardanti le stringhe. I problemi per i quali sono proposti algoritmi risolutivi sono il calcolo della distanza tra due stringhe, la ricerca delle occorrenze di una stringa all'interno di un testo, e la ricerca di opportune sottostringhe all'interno di una data stringa.
In questo capitolo è introdotta la nozione di grafo e sono illustrate due modalità di rappresentazione degli stessi mediante liste di adiacenza e matrici di adiacenza. Inoltre sono descritte le tecniche di visita, analizzando sia la visita in profondità che quella in ampiezza. Tale capitolo è propedeutico per i successivi nei quali verranno analizzati specifici problemi legati ai grafi.
Nel capitolo tredici è affrontato il problema del minimo albero ricoprente in un grafo non orientato. Il problema è affrontato mediante un'applicazione di una tecnica golosa che prevede l'utilizzo della regola del taglio e della regola del ciclo. A seguito della descrizione fatta nella prima parte del capitolo, il seguito dimostra la correttezza di alcuni dei più noti algoritmi per il calcolo del minimo albero ricoprente.
Nel quattordicesimo capitolo è affrontato il problema di trovare i cammini minimi in un grafo orientato. Nella prima parte del capitolo vengono fornite delle nozioni generali sul problema. Nella seconda parte dello stesso, invece, sono descritti alcuni algoritmi per la risoluziona del problema. Gli algoritmi descritti sono quelli di Bellman e Ford, di Dijkstra, e infine Floyd e Warshall.
In questo capitolo viene affrontato un problema complementare al problema dei cammini minimi, ossia il problema del flusso. Tale problema studia come inviare la massima quantità di flusso da una sorgente ad una destinazione non eccedendo la capicità degli archi. Due approcci sono descritti per la risoluzione del problema: il metodo delle reti residue e il metodo dei cammini aumentati.
In questo capitolo è affrontato il concetto di classe di complessità. A seguito di una classificazione insiemistica delle classi di complessità, la trattazione si sofferma sulla classe NP dei problemi risolubili in tempo polinomiale non deterministico.
Nell'appendice sono brevemente illustrati alcuni concetti(soprattutto matematici) utili per la comprensione del testo.
In conclusione, il libro affronta in modo completo le problematiche relative all'ottimizzazione degli algoritmi e allo studio delle strutture dati. Molti dei problemi affrontati sono importanti per le persone che lavorano nel mondo dell'informatica. Infatti, saper distinguere tra un algoritmo efficiente ed uno con scarse prestazioni e ciò che distingue il buon software dal software di bassa lega.
Il libro, inoltre, è un ottimo supporto anche per i corsi di laurea universitari poichè spiega ed illustra le problematiche in maniera molto dettagliata ed analitica. Inoltre, gli esercizi proposti ad ogni fine capitolo permettono al lettore di fissare i concetti espressi nello stesso.
Il libro è quindi consigliato in un contesto di corsi universitari, ma altresi che è molto utile a tutti coloro che vogliano approfondire una tra le tematiche più importanti dell'ingegneria del software.
Di seguito è riportata la lista dei capitoli presenti nel libro appena descritto:

  1. Un'introduzione informale agli algoritmi
  2. Modelli di calcolo e metodologie di analisi
  3. Strutture dati elementari
  4. Ordinamento
  5. Selezione e statistiche di ordine
  6. Alberi di ricerca
  7. Tabelle hash
  8. Code con priorità
  9. Union-find
  10. Tecniche algoritmiche
  11. Stringhe
  12. Grafi e visite di grafi
  13. Minimo albero ricoprente
  14. Cammini minimi
  15. Flusso
  16. Teoria della NP-completezza
  17. Appendice

Thursday, March 5, 2009

Linux Ubuntu per server e reti

Il libro di Alessandro Di Nicola Linux Ubuntu per server e reti, edito nel 2008 dalla casa editrice FAG, è un libro che si inserisce bene nella folta letteratura che circonda il mondo Linux. Il libro è composto di dodici capitoli molto eterogenei negli argomenti trattati. A seguito di una serie di capitoli introduttivi si hanno diverse descrizioni di alcune funzionalità avanzate che possono risultare molto interessanti anche a lettori esperti. Il libro è molto ricco di tabelle riassuntive ed esempi che consentono di avere veri e propri esempi applicativi di ciò che si sta leggendo. Infine, nei vari capitoli, viene fatto un ricco uso di immagini che mostrano ciò che l'utente vedrà a video seguendo le indicazioni suggerite nella narrazione. Nel libro non è incluso alcun CD-ROM o DVD.
Dopo una breve introduzione, nel primo capitolo viene dettagliata, con molta dovizia di particolari, un'installazione di Ubuntu Server. La descrizione parte dal download del file di installazione, proseguendo con la descrizione di tutto ciò che viene visualizzato dall'installazione guidata. Degni di nota sono i paragrafi relativi al partizionamento dei dischi e dell'installazione di dischi RAID.
Il secondo capitolo descrive in apertura la gestione degli utenti e dei gruppi, spiegando come aggiungere, disattivare, cancellare sia i primi che i secondi; inoltre, è illustrato come modificare i permessi di lettura, scrittura, esecuzione di un singolo file o di una intera directory. Nella seconda parte del capitolo è descritta in maniera molto sommaria la gestione dei pacchetti mediante l'utilizzo del comando apt-get. La trattazione della gestione delle partizioni è ripresa nell'ultimo paragrafo, questa volta sottolineando aspetti legati alla modifica ed alla manutenzione delle stesse.
Nel terzo capitolo vengono descritti due strumenti fondamentali per la gestione di un server in ambiente linux: la shell BASH e l'editor vi. La shell BASH è decritta in termini di creazione di script, partendo dall'esecuzione di uno semplice script e proseguendo con la descrizione degli strumenti sintattici che il linguaggio mette a disposizione. Vengono descritti i costrutti condizionali, i cicli, e le funzioni. Il paragrafo che descrive l'editor vi, invece, può essere visto come un vademecum delle più importanti funzionalità che tale editor fornisce ai suoi utilizzatori.
Il successivo capitolo affronta i temi dei sistemi di log e degli strumenti di scheduling messi a disposizione da Ubuntu Server. Dei log è descritto come possono essere configurate le politiche di visualizzazione dei dati adatte al proprio sistema. Tutta la spiegazione ruota attorno alla configurazione del file syslog.conf. Gli strumenti di scheduling sono descritti a partire dalla gestione semplificata mediante l'uso dei file di cron predefiniti, fino ad arrivare alla gestione di eventi totalmente personalizzati.
Il quinto capitolo è interamente dedicato alla configurazione delle diverse interfacce di rete presenti sul sistema. Particolare enfasi è data alla gestione delle reti Wi-Fi alle quali è dedicato un intero paragrafo. Oltre alle reti senza fili, è presente una descrizione di alcune operazioni basilari quali la configurazione di un indirizzo statico, l'assegnazione di un nome di host, e l'amministrazione di rete mediante il comando ifconfig. Nella parte finale del capitolo sono descritti sommariamente tre strumenti di controllo: ping, traceroute, e netsat.
Nel sesto capitolo si cominciano a trattare temi via via più avanzati, la cui lettura richiede maggiore attenzione da parte del lettore. Tale capitolo gestisce il delicato tema della gestione avanzata della rete, ed in particolar modo descrive i possibili meccanismi di sicurezza. La configurazione di un firewall è spiegata molto dettagliatamente, descrivendo anche le possibili personalizzazioni mediante il comando iptables; inoltre, sono descritti i meccanismi di IP Masquerading. La seconda parte del capitolo affronta i temi della protezione dei servizi mediante l'utilizzo dei files hosts.allow e hosts.deny. Alla fine del capitolo è descritto brevemente il super-server xinetd.
Il settimo capitolo descrive la gestione di un sistema da remoto, effettuata sia per mezzo della linea di comando, sia mediante l'utilizzo di strumenti grafici. Nel trattare la gestione da linea di comando, il comando descritto è l'SSH. Di tale comando sono descritte le configurazioni sia lato client che lato server, la gestione delle password, e infine la gestione del comando screen per avere più finestre sul terminale connesse tramite ssh. Webmin è l'interfaccia web descritta per la gestione remota della macchina mediante tale tecnologia. VNC, invece, è l'ambiente completamente grafico presentato per la gestione da remoto.
Nel successivo capitolo è descritto l'importante tema della condivisione delle risorse sulla rete. In particolare sono descritte la condivisione di una stampante di rete sia per client Linux che Windows, la condivisione del filesystem di rete NFS. Infine, l'ultimo paragrafo del capitolo prevede una dettagliata trattazione della condivisione di risorse tra sistemi Linux e Windows mediante l'uso di Samba.
Il nono capitolo è legato all'importante tema del backup dei dati. Tale capitolo si apre con l'illustrazione del salvataggio di intere partizioni; tale operazione prevede l'utilizzo dell'applicazione partimage. Nelle successive pagine è descritto come creare un file immagine di una partizione, e di come successivamente questa partizione possa essere ripristinata. Nel trattare del backup di file e directory, l'attenzione è posta sul comando di archiviazione utilizzato da tutti i sistemi linux, ossia il tar. L'ultimo paragrafo tratta del sistema client-server Bacula per la gestione dei backup in maniera molto dettagliata.
Il capitolo dieci è composto di poche pagine che forniscono una breve panoramica sulla creazione di un media center installato sulla propria macchina server. Inizialmente, è mostrato l'esempio di un server musicale per poi passare alla configurazione di un media center completo mediante l'utilizzo di MythTV.
Nell'undicesimo capitolo sono passati in rassegna quattro tipi di server molto importanti in una rete anche domestica: mail server, ftp server, web server, DNS server. Come esempio di mail server è citato Postfix, come ftp server vsftpd, come web server apache, infine come DNS server DNS Bind. Il capitolo spiega molto brevemente come questi server possono essere avviati e configurati.
Nell'ultimo capitolo del libro sono affrontati argomenti molto avanzati, che richiedono una profonda conoscenza del sistema Linux. Gli argomenti trattati sono la compilazione del kernel, e la compilazione dei programmi mediante il comando apt-build. Tale capitolo essendo molto breve vede soltanto accennati questi argomenti che richiederebbero più pagine per una spiegazione esaustiva.
In conclusione, il libro affronta in maniera esauriente alcuni dei temi di base utili alla gestione di un server Linux. In tutto il libro è usato un linguaggio molto comprensibile che sicuramente mette a proprio agio anche il lettore che per la prima volta si accinge ad affrontare una lettura tecnica. Tuttavia, nel susseguirsi dei capitoli, sono offerti spunti interessanti anche per lettori avanzati. Inoltre, nel libro sono forniti molti collegamenti a pagine web che forniscono ulteriori approfondimenti delle tematiche trattate.
Un lato negativo del libro è riscontrabile negli ultimi capitoli, nei quali l'autore affronta molti argomenti molto avanzati che richiedono sicuramente un approfondimento maggiore. Tali capitoli devono essere presi come uno spunto per poi evolvere i concetti con approfondimenti futuri.
Ritengo, comunque, che il libro possa essere rivolto sia ad un pubblico che per la prima volta si affaccia al mondo Linux, sia ad un pubblico che ha una conoscenza avanzata in ambiente desktop, ma che per la prima volta voglia cimentarsi nella gestione di un server.

Di seguito è riportata la lista dei capitoli presenti nel libro appena descritto:

  1. Introduzione
  2. Gestire il sistema
  3. Gli strumenti di amministrazione
  4. Log e processi periodici
  5. Il server è in rete
  6. Configurazione avanzata della rete
  7. Amministrare da remoto
  8. Condividere in rete
  9. Il backup
  10. Costruire un Media Center
  11. I server
  12. Ottimizzare il sistema

Tuesday, March 3, 2009

Hi!!!!!!!!!!!

Hi everyone!!!

This is my blog where I'm going to write my opinions over different topics of my interest: computer science, music, travel, movies, and so forth.

See you soon with my new post!