<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-825917476334036418</id><updated>2012-01-18T21:11:27.385+01:00</updated><category term='How to e bug'/><category term='Sistemi Distribuiti'/><category term='Ingegneria del software'/><category term='Basi Teoriche INF'/><category term='Le Nostre &quot;Chattate&quot;'/><category term='Multimedialità e Disegno'/><category term='Softpedia'/><category term='Amministrazione dei Sistemi Open Source'/><category term='Programmazione'/><category term='Sistemi Operativi'/><category term='Reti di Calcolatori'/><category term='ComputerPedia'/><category term='Algoritmi'/><category term='Fuori Categoria'/><category term='Basi di Dati'/><category term='Calcolo Scientifico'/><title type='text'>ComputerScience&amp;Co</title><subtitle type='html'>Il blog dedicato all'Informatica,Ingegneria del Software,Progettazione,Architettura HD e SF, Programmazione,Amministrazione,Consulenza,Reti,Algoritmi,Sicurezza ed altro</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default?start-index=101&amp;max-results=100'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>147</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6251509418464386936</id><published>2011-10-28T10:04:00.000+02:00</published><updated>2011-10-28T10:04:37.827+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Esempi di Programmazione in NVIDIA CUDA</title><content type='html'>Esempi di programmazione in CUDA.&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//CUDA.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6251509418464386936?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6251509418464386936/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6251509418464386936' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6251509418464386936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6251509418464386936'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2011/10/esempi-di-programmazione-in-nvidia-cuda.html' title='Esempi di Programmazione in NVIDIA CUDA'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3977104053829583840</id><published>2011-04-12T17:22:00.001+02:00</published><updated>2011-04-12T17:34:16.062+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How to e bug'/><title type='text'>TIM Olicard 100 su Ubuntu 10.10</title><content type='html'>Avendo acquistato la suddetta chiavetta, posto una guida per la corretta configurazione su ubuntu. La prima cosa da NON fare, qualora disponiate di una versione a 32 bit di ubuntu è di non installare il pacchetto presente nella chiavetta. La seconda cosa da non fare è collegare la chiavetta. Prima inseriamo un paio di regole per il corretto riconoscimento del modem. Da un terminale inseriamo prima:&lt;br /&gt;&lt;br /&gt;sudo gedit /etc/udev/rules.d/10-OLIdatacarddisk.rules&lt;br /&gt;&lt;br /&gt;e inseriamo nel file il seguente contenuto.&lt;br /&gt;&lt;br /&gt;KERNEL=="sr[0-9]",SYSFS{idVendor}=="0b3c",SYSFS{idProduct}=="c700",SYMLINK="GKxdatacarddisk",RUN+="/usr/bin/eject -s %k"&lt;br /&gt;&lt;br /&gt;Questo permetterà di disattivare l'unita cd associata alla chiavetta (quella contenente i driver di installazione). Alla inoltre vengono associati altri dispositivi: ttyUSB0, ttyUSB1,ttyUSB2,ttyUSB3,ttyUSB4. Quello che interessa a noi è il primo, ttyUSB0. Tuttavia è possibile, specialmente se disponete di un pc con più di un core, che ttyUSB0 non venga registrato come modem, registrando al suo posto una tra ttyUSB2 e ttyUSB3. In questo caso da terminale digitiamo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sudo gedit /etc/udev/rules.d/11-OLIdatacardmodules.rules&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;e inseriamo nel file il seguente contenuto:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;KERNEL=="ttyUSB[23]",ACTION=="add",SYSFS{idVendor}=="0b3c",SYSFS{idProduct}=="c000",RUN+="/bin/sleep 2"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Se disponiamo di un pc multicore. In ogni caso dobbiamo sempre inserire la seguente riga nello stesso file:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SYSFS{idVendor}=="0b3c",SYSFS{idProduct}=="c000",RUN+="/sbin/modprobe usbserial vendor=0x0b3c product=0xc000"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Che ci permetterà di riconoscere il modem. A questo punto riavviamo e, a sistema completamente carico, inseriamo la chiavetta. Da Network Manager configuriamo una nuova connessione a banda larga mobile (il nostro dispositivo sarà indicato come "0b3c DataCard Device". A questo punto potremmo usare la nuova connessione per collegarci a internet. Se per caso non dovesse connettersi ( verrà mostrato il messaggio "si è ora disconnessi dalla rete") apriamo un terminale e digitiamo:&lt;br /&gt;&lt;br /&gt;sudo gedit /var/log/messages&lt;br /&gt;&lt;br /&gt;Diamo un'occhiata al log file e assicuriamoci che siano presenti delle voci simili alle seguenti:&lt;br /&gt;&lt;br /&gt;usb 2-1.1: generic converter now attached to ttyUSB0&lt;br /&gt;usbserial_generic 2-1.1:1.1: generic converter detected&lt;br /&gt;usb 2-1.1: generic converter now attached to ttyUSB1&lt;br /&gt;usbserial_generic 2-1.1:1.2: generic converter detected&lt;br /&gt;usb 2-1.1: generic converter now attached to ttyUSB2&lt;br /&gt;usbserial_generic 2-1.1:1.3: generic converter detected&lt;br /&gt;usb 2-1.1: generic converter now attached to ttyUSB3&lt;br /&gt;usbserial_generic 2-1.1:1.4: generic converter detected&lt;br /&gt;usb 2-1.1: generic converter now attached to ttyUSB4&lt;br /&gt;usbcore: registered new interface driver usbserial_generic&lt;br /&gt;usbserial: USB Serial Driver coreswitched to 0b3c:c000 (: DataCard Device)&lt;br /&gt;&lt;br /&gt;e le seguenti voce nel momento in cui tentiamo di connetterci:&lt;br /&gt;&lt;br /&gt;Using interface ppp0&lt;br /&gt;Connect: ppp0 &amp;lt;--&amp;gt; /dev/ttyUSB0&lt;br /&gt;&lt;br /&gt;Se in quest'ultima riga, al posto di USB0 appare USB2 o USB3, assicuriamo che il secondo file sia stato creato nel modo corretto (controlliamo bene i doppi apici) ed eventualmente settiamo lo sleep ad un valore più alto (cambiando il 2 con 5 ad esempio).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3977104053829583840?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3977104053829583840/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3977104053829583840' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3977104053829583840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3977104053829583840'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2011/04/tim-olicard-100-su-ubuntu-1010.html' title='TIM Olicard 100 su Ubuntu 10.10'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3675978480220633541</id><published>2011-04-11T15:37:00.003+02:00</published><updated>2011-05-11T19:13:33.139+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>HighLighting Syntax per Cuda su Scite</title><content type='html'>Scaricare il file e sostituirlo a quello presente in Scite. Permette di evidenziare le keyword CUDA.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//cpp.properties"&gt;Download HSCS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aggiornato il 11/05/2011 ore 19.13.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3675978480220633541?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3675978480220633541/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3675978480220633541' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3675978480220633541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3675978480220633541'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2011/04/highlighting-syntax-per-cuda-su-scite.html' title='HighLighting Syntax per Cuda su Scite'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2977960643109750825</id><published>2011-04-02T21:42:00.001+02:00</published><updated>2011-06-04T10:40:52.186+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Il Semantic Web</title><content type='html'>La mia tesi di laurea: " I linguaggi del semantic web e applicazione per la catalogazione di reperti archeologici"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2977960643109750825?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2977960643109750825/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2977960643109750825' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2977960643109750825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2977960643109750825'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2011/04/il-semantic-web.html' title='Il Semantic Web'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-751155336678220271</id><published>2010-09-02T18:37:00.000+02:00</published><updated>2010-09-02T18:37:26.002+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Esempi WebProgramming</title><content type='html'>esempi svolti di web programming (JavaScript,AJAX,PHP).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//esempi_webProg.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-751155336678220271?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/751155336678220271/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=751155336678220271' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/751155336678220271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/751155336678220271'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/09/esempi-webprogramming.html' title='Esempi WebProgramming'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2103059596886062654</id><published>2010-08-29T20:14:00.005+02:00</published><updated>2011-01-27T16:00:20.831+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>N</title><content type='html'>&lt;b&gt;Namespace:&lt;/b&gt; lo spazio dei nomi è un contenitore logico al quale vengono assegnati degli elementi (identificatori). Un namespace è identificato da una URI. Gli elementi che appartengono al namespace hanno la seguente nomenclatura: la URI del namespace seguito da un separatore e &amp;nbsp;da un nome univoco &amp;nbsp;che identifica l'elemento (local name) per quel namespace . Nei linguaggi di programmazione un namespace è un contenitore logico di variabili.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2103059596886062654?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2103059596886062654/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2103059596886062654' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2103059596886062654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2103059596886062654'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/08/n.html' title='N'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3698791353385246935</id><published>2010-08-27T10:27:00.000+02:00</published><updated>2010-08-27T10:28:04.402+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Esercizi Svolti C#</title><content type='html'>Esercizi svolti sul linguaggio C# adatto a chi è nuovo del linguaggio(o della programmazione)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//esempiCSharp.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3698791353385246935?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3698791353385246935/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3698791353385246935' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3698791353385246935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3698791353385246935'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/08/esercizi-svolti-c.html' title='Esercizi Svolti C#'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7154532654170203307</id><published>2010-07-04T11:35:00.002+02:00</published><updated>2010-07-04T11:35:57.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Introduzione a XML</title><content type='html'>Introduzione a XML con esempi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//XML_appunti.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7154532654170203307?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7154532654170203307/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7154532654170203307' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7154532654170203307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7154532654170203307'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/07/introduzione-xml.html' title='Introduzione a XML'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7035690186241099551</id><published>2010-07-02T15:45:00.001+02:00</published><updated>2010-07-02T15:46:18.470+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Softpedia'/><title type='text'>ImageSoft</title><content type='html'>ImageSoft, un software di elaborazione di immagini digitali&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//ImageSoft%20final.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7035690186241099551?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7035690186241099551/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7035690186241099551' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7035690186241099551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7035690186241099551'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/07/imagesoft.html' title='ImageSoft'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8096284085019257242</id><published>2010-06-25T19:03:00.001+02:00</published><updated>2010-06-25T19:04:16.225+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>introduzione ad Ajax-JSON</title><content type='html'>introduzione ad ajax e JSON con esempi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//appunti_Ajax.rar"&gt;Download&amp;nbsp;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8096284085019257242?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8096284085019257242/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8096284085019257242' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8096284085019257242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8096284085019257242'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/06/introduzione-ad-ajax-json.html' title='introduzione ad Ajax-JSON'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3512956479112653554</id><published>2010-06-25T19:02:00.000+02:00</published><updated>2010-06-25T19:04:16.226+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Introduzione a PHP</title><content type='html'>Introduzione a php con esempi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//appunti_php.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3512956479112653554?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3512956479112653554/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3512956479112653554' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3512956479112653554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3512956479112653554'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/06/introduzione-php.html' title='Introduzione a PHP'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4958225528324630549</id><published>2010-06-25T19:01:00.000+02:00</published><updated>2010-06-25T19:04:16.226+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Introduzione a Javascript</title><content type='html'>introduzione a javascript con esempi.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//appunti_javascript.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4958225528324630549?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4958225528324630549/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4958225528324630549' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4958225528324630549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4958225528324630549'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/06/introduzione-javascript.html' title='Introduzione a Javascript'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8980668197154742317</id><published>2010-05-26T17:38:00.000+02:00</published><updated>2010-05-26T17:38:58.075+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedialità e Disegno'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Esempi pratici su Java2D</title><content type='html'>Raccolta di codici sorgenti che mostrano come si realizzano interfaccie grafiche ed effetti su immagini in java.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempi%20java2D.rar"&gt;Raccolta 1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/multimedia_anonimo.zip"&gt;&lt;br /&gt;Raccolta 2 by anonimo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ultima modifica 28/05/2009 ore 13.54&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8980668197154742317?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8980668197154742317/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8980668197154742317' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8980668197154742317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8980668197154742317'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/esempi-pratici-su-java2d.html' title='Esempi pratici su Java2D'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3667856861682987098</id><published>2010-05-26T17:33:00.000+02:00</published><updated>2010-05-26T17:33:31.281+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedialità e Disegno'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Utilizzo delle classi Java2D</title><content type='html'>Codici sorgenti che mostrano come si utilizzano le classi per il disegno di interfaccie grafiche in Java.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempio_interfacciaJava.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3667856861682987098?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3667856861682987098/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3667856861682987098' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3667856861682987098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3667856861682987098'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/utilizzo-delle-classi-java2d.html' title='Utilizzo delle classi Java2D'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2894451629360358790</id><published>2010-04-10T18:11:00.000+02:00</published><updated>2010-04-10T18:12:18.610+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Metodi Formali nel Processo di Sviluppo del Software</title><content type='html'>&lt;div align="justify"&gt;I metodi formali nel processo di sviluppo del software permettono di creare una specifica più completa, uniforme e non ambigua rispetto alle metriche usate tradizionalmente e di ridurre il numero di errori. Tale specifica, basata su cognizioni matematiche, può essere dimostrata, corretta ed eseguita ad alto livello. In questo post ci occuperemo del metodo delle Abstract State Machine per l'analisi e il design del software. Il metodo ASM, permette di seguire il processo di sviluppo dalla raccolta dei requisiti fino all'implementazione, gestendo la dimensione del software, la sua complessità ed affidabilità, permette una modellazione di alto livello accurata, al livello di astrazione attraverso una catena modelli di sistema con livelli di astrazione via via sempre più raffinati. Contrariamente ad UML permette inoltre una maggiore accuratezza. L'Abstract State Machine è un modello di computazione espresso con una notazione rigorosa dal punto di vista matematico e rivolto alla pratica grazie alla sua comprensibilità. Si individuano diverse categorie di ASM: Le Basic ASM, basate su determinismo e parallelismo, idonee per programmi flat; Le Turbo ASM, basate su composizione sequenziale e iterazione, idonee per applicazioni con chiamate ricorsive; Le Multi-Agent ASM&amp;nbsp;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;(sincrone e asincrone) &lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;sono definite come un insieme di agenti che eseguono la loro ASM in parallelo.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&amp;nbsp;&lt;/div&gt;&lt;div align="justify"&gt;Le ABS consistono in un vocabolario &lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;∑, un insieme di stati iniziali, un insieme di regole, un simbolo di regola distinto chiamato &lt;em&gt;"main rule" .&amp;nbsp;&lt;/em&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;Gli stati possono essere visti come delle memorie astratte; il vocabolario&amp;nbsp;&lt;/span&gt;  &lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;∑ è una collezione finita di simboli funzionali tali che:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;ogni simbolo ha una arietà, i nomi di funzione nullari vengono anche chiamati costanti.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;i simboli di funzione possono esseer statici ( undef, true, false)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;oppure dinamici ( monitorati, condivisi, di output ecc)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;Uno stato S sul vocabolario &lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;∑&lt;/span&gt;  &lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;è una coppia (D,I) dove D rappresenta il dominio e I la funzione di interpretazione dei simboli funzionali in &lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;∑&lt;/span&gt;. D è anche chiamato &lt;em&gt;"base set"&lt;/em&gt; dello stato, è possibile definire funzioni parziali, una relazione ha sempre valori true,false o undef, nelle applicazioni D viene spesso suddiviso in universi più piccoli. In uno stato i simboli di funzione e gli argomenti delle funzioni sono le locazioni di memoria mentre i valori delle funzioni sono i loro contenuti. Definiamo una "locazione" di uno stato S come una coppia costituita da un simbolo funzionale n-ario f e un insieme di n elementi (a1,...an)&amp;nbsp; del dominio D. Definiamo un aggiornamento per S, una coppia (l,v) &lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;dove l è una locazione di S e v un elemento di D. Un insieme di aggiornamenti viene detto consistente se non ha aggiornamenti in collisione, ovvero se per ogni locazione l e tutti gli elementi u,w è vero che se (l,v),(l,w) appartengono all'insieme allora v=w. Se un insieme di aggiornamenti consistente U viene &lt;em&gt;"sparato&lt;/em&gt;" in un dato stato allora il risultato è un nuovo stato. In questo nuovo stato rimane inalterato il contenuto delle locazioni non considerate, mentre per ogni (l,v) in U il contenuto della locazione l nel nuovo stato sarà v. Se un insieme di aggiornamenti U consistente viene sparato in un nuovo stato S, il nuovo stato risultante S+U viene determinato univocamente.Le regole di transizione dell'ASM definiscono la sintassi del programma; interpretando il programma nello stato corrente viene determinato un insieme di aggiornamenti che sparati sullo stato corrente realizzano il nuovo stato. Le regole di transizione sono:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;skip&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt; ,regola di skip&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;f(s1,...sn) .= t&lt;/strong&gt; &amp;nbsp;,regola di Update.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;P &lt;strong&gt;par&lt;/strong&gt; Q &amp;nbsp; ,regola di Block.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;if&lt;/strong&gt; t&lt;strong&gt; then&lt;/strong&gt; P &lt;strong&gt;else&lt;/strong&gt; Q &amp;nbsp;,regola di Condition&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;let &lt;/strong&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;x=t &lt;strong&gt;in&lt;/strong&gt; P ,regola di Let&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;forall&lt;/strong&gt; x &lt;strong&gt;with&lt;/strong&gt; y &lt;strong&gt;do&lt;/strong&gt; P &lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&amp;nbsp;, regola di Forall&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;strong&gt;choose&lt;/strong&gt; x &lt;strong&gt;with&lt;/strong&gt; y &lt;strong&gt;do&lt;/strong&gt; P &amp;nbsp;,regola di Choose&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&amp;nbsp;Una &lt;em&gt;dichiarazione di regola&lt;/em&gt; per un simbolo di regola r di arietà n è una espressione r(x1,...xn)=P , dove P è una regola di transizione e x1,...xn sono le variabili libere di P. In una &lt;em&gt;chiamata ad una regola&lt;/em&gt; r(t1,...tn) le variabili xi vengono sostituite con i parametri ti.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;Le ASM non prevedono variabili globali. I parametri formali della testa sono le uniche variabili che hanno uno scope globale. Diciamo che una macchina M può fare una &lt;em&gt;mossa&lt;/em&gt; da uno stato S ad uno stato T e scriviamo &amp;nbsp; &amp;nbsp; S =&amp;gt; T se&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&amp;nbsp;se la main rule di M restituisce un insieme di aggiornamenti consistente U partendo dallo stato S e&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;T = S+U&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;Gli aggiornamenti in U vengono detti aggiornamenti interni ( per distinguerli dai possibili aggiornamenti di locazioni monitorate o condivise). T viene detto stato interno successivo. La &lt;em&gt;computazione&lt;/em&gt; di una ASM comincia nello stato iniziale, non appena viene compiuta una mossa la computazione procede richiedendo solo che le mosse dell'ambiente che aggiornano le locazioni monitorate e condivise producano uno stato nuovo per la mossa successiva. Se uno stato la macchina non può produrre un insieme di aggiornamenti consistente oppure non è in grado di produrre nessun insieme di aggiornamento lo stato viene definito l'ultimo della computazione.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt; &lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2894451629360358790?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2894451629360358790/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2894451629360358790' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2894451629360358790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2894451629360358790'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/04/metodi-formali-nel-processo-di-sviluppo.html' title='Metodi Formali nel Processo di Sviluppo del Software'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2207001432809520499</id><published>2010-03-30T16:30:00.020+02:00</published><updated>2010-06-15T12:12:43.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Il collaudo del software</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;1.0 Introduzione&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prima di essere consegnato un software dovrebbe essere esente da bug. L'attività che mira a scovare i bug viene chiamata "collaudo". Il collaudo può essere condotto dagli stessi sviluppatori o da dei collaudatori esterni, dai clienti (alpha test) o dagli utenti finali (beta test). Il collaudo noto come "black box" mira a dimostrare la correttezza implementativa dei requisiti funzionali (funzioni errati o inesistenti, errori di interfaccia, errori di strutture dati o nei database esterni, errori di comportamento ecc). Solitamente, quando si parla di test sull'input si mira ad realizzare delle classi di equivalenza,ovvero dei gruppi che riunisco i possibili valori che possono essere passati, senza tentarli tutti. Il collaudo "white box" mira invece ad esaminare i cammini logici del software (ad esempio cosa succede quando tutti i cicli iterativi si chiudono ai casi limiti. Una tecnica di collaudo white box è stata proposta da Tom McCabe basata sulla costruzione di un "grafo di flusso" che rappresenti il flusso di controllo del programma. Lo scopo di questo test è far si che il programma esegua ogni istruzione,completi ogni ciclo iterativo, e valuti tutte le condizioni if/else (vedremo in dettaglio dopo). Un altra &amp;nbsp;tecnica white box è la matrice di adiacenza del grafo di flusso basata sulla costruzione di &amp;nbsp;una matrice rappresentante il flusso del programma i cui pesi (1,0) rappresentano la probabilità che un arco venga percorso. Ogni cella può inoltre essere interpretata&amp;nbsp; come il tempo di elaborazione necessario all'attraversamento di un arco e la quantità di memoria richiesta per farlo. Altre tecniche sono mirate esclusivamente a testare i cicli iterativi (Collaudo per cicli) o i costrutti di selezione (collaudo per condizioni). Vediamo adesso alcune categorie precise di difetti:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;1.Esecuzione di un calcolo nella parte errata di un costrutto di controllo: il collaudo per cicli farà eseguire zero,una o più volte un loop per individuare l'errore.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;2.Loop Infinito: anche qui il collaudo per cicli può aiutare a scovare la causa di loop.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;3.Precondizioni per un algoritmo: ciò che deve essere fatto prima che il controllo passi ad uno specifico algoritmo può causare problemi durante l'esecuzione dell'algoritmo stesso. Il collaudo per condizioni può fare emergere il problema.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;4.Null Conditions: quando viene passato un valore null il programma si blocca o si comporta anomalmente. Anche qui risulta utile il collaudo per condizioni e dei testi specifici per scovare eventuale istruzione che assegna il valore null.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;5.Off-by-one errors: Cicli eseguiti troppe volte o poche volte non producono i risultati attesi. La soluzione consiste in test mirati e collaudi per cicli.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;6.Errore di precedenza degli operatori: Soluzione basata sull'ispezione del codice e sul test dei micro-moduli.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;7.Algoritmi numerici: strutture dati o variabili troppo piccole per contenere i dati necessari: Soluzione basata sul testare l'input con valori grandi o grandi mole di dati.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;8.Errori di parsing: passare al programma ciò che non si aspetta. Soluzione basata sul test dei micromoduli e dell'input.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;9.Linguaggi orientati agli oggetti: In questo caso bisogna usare combinazioni di collaudi white box e black box, test mirati delle procedure e dei metodi, test sui micromoduli. Bisogna collaudare anche l'interazione tra le varie classi, basandosi anche sui modelli comportamentali per meglio comprendere come esse interagiscono. Solitamente si procede testando le singole classi e sistematicamente si aggregano altre classi per essere testate insieme (soluzione bottom-up) o in alternativa si testano prima insiemi di classi per poi passare al test delle singole classi (soluzione top-down). Se il software ha subito modifiche,gli stessi test condotti nella versione precedente vanno rieseguiti per assicurare la stabilità e la correttezza delle modifiche stesse. Se si ricorre a collaudatori esterni bisogna fornire una descrizione dettagliata del test da effettuare, dello stato iniziale e finale del sistema, dei risultati attesi. Inoltre il collaudatore non deve essere influenzato dalla struttura interna del software e non deve essere a conoscenza dei meccanismi interni altrimenti la sua capacità di operare potrebbe subirne influenza.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.0 Grafi di flusso e complessità ciclomatica&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Il grafo è una struttura che ben si adatta a rappresentare il flusso del software. Per stimare il numero massimo di collaudi da effettuare per testare ogni istruzione del programma (cioè eseguire almeno una volta ogni singola istruzione, il metodo non comprende test sugli input!) bisogna calcolare la complessità ciclomatica. La complessità ciclomatica è &amp;nbsp;il numero di cammini linearmente indipendenti nel grafo). Esistono diversi metodi per effettuare il calcolo; sia V(G) la complessità ciclomatica, N il numero di nodi, E gli archi, P le componenti connesse. V(G) sarà allora dato da&lt;br /&gt;&lt;br /&gt;1) V(G)=R=E-N+2 ; in questo caso V(G)=R cioè la complessità ciclomatica è uguale al numero delle regioni (cioè le zone che gli archi e i nodi formano).&lt;br /&gt;2) V(G)=E-N+2P;&lt;br /&gt;3)V(G)= &lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;π+1; &amp;nbsp;&lt;/span&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;π è il numero di predicati (cicli for-while e if-else,AND,OR ecc).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;Costruito il grafo e calcolata la complessità ciclomatica è possibile costruire i casi di test che seguano i cammini linearmente indipendenti del grafo.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;3.0 Collaudo d'interclasse e di integrazione&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;E' fondamentale testare i componenti dal punto di vista dell'interfacciamento con altre componenti. Solitamente questa categoria di test viene scritta a partire dai modelli comportamentali. Dopo aver testato i componenti singolarmente questi devono essere aggregati per ottenere il software finale, questa fase prende il nome di integrazione delle componenti. Esistono tre approcci ai test di integrazione:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Collaudo:BingBang; si costruisce tutto il software e poi si testa nella sua interezza.E' una tecnica sconsigliata il più delle volte perchè non mette in evidenza gli errori meno visibili.&lt;/li&gt;&lt;li&gt;Collaudo Incrementale: le componenti vengono aggregate poco per volta (solitamente due componenti per volta) e la componente risultante viene testata singolarmente, poi si procede iterativamente. Può essere Top-Down ( si parte dal modulo principale al quale vengono aggregate via via le componenti di basso livello); Bottom-Up: si parte dalle componenti di basso livello e si termina con il modulo principale.&lt;/li&gt;&lt;li&gt;Collaudo per Regressione: questo genere di collaudo avviene sempre dopo il collaudo di tipo 1. o 2. e mai da solo. Consiste nel ripetere test svolti durante le prime fasi del collaudo (test ai singoli componenti o test di aggregazione) per confermare che le modifiche effettuate per l'integrazione non abbiano ottenuto effetti indesiderati.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Quando un test viene documentato vanno inserite le seguente informazioni:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ID e titolo descrittivo del test; va indicata l'importanza del test, il sistema,sottosistema o modulo testato deve essere chiaramente indicato facendo riferimento anche ai documenti di specifica dei requisiti e architetturale.&lt;/li&gt;&lt;li&gt;Istruzioni del collaudatore: cosa e come fare, come mettere il sistema nello stato iniziale e quale input fornire.&lt;/li&gt;&lt;li&gt;Risultato Atteso: cosa ci si aspetta dal test, ovvero come si dovrebbe comportare il sistema se non vi fossero bug o errori.&lt;/li&gt;&lt;li&gt;CleanUp: come arrestare il sistema dopo il test o riportarlo allo stato precedente all'esecuzione del test.&lt;/li&gt;&lt;li&gt;Risultato: il risultato del test e se l'esito è negativo riportare l'errore (o il bug).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2207001432809520499?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2207001432809520499/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2207001432809520499' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2207001432809520499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2207001432809520499'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/il-collaudo-del-software.html' title='Il collaudo del software'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4607554272524920288</id><published>2010-03-29T22:20:00.002+02:00</published><updated>2010-03-29T22:26:16.331+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>La Seconda Fase del Progetto:Modello Analitico e Progettuale.</title><content type='html'>&lt;strong&gt;1.0 La modellazione Analitica&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La modellazione analitica prevede la revisione di tutti i requisiti (funzionali e non), la definizione degli scenari, degli attori, la modellazione del flusso dei dati, delle classi analitiche e della loro organizzazione, la modellazione comportamentale e la revisione dei diagrammi per verificarne la correttezza e la&amp;nbsp;precisione.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La modellazione basata sugli scenari permette di comprendere come l'utente interagisce con il sistema e di costruire dei modelli analitici&amp;nbsp; e progettuali in base alla specifica dei requisiti. Si utilizzano due tecniche:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;I casi d'uso: descrivono una specifica situazione in cui l'utente interagisce con il sistema, dal punto di vista di un attore ben definito.Un attore può essere una persona fisica o uno strumento che utilizza il sistema.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Diagramma di attività: affianca il caso d'uso fornendo una rappresentazione grafica del flusso di interazioni nella situazione specificata.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Diagramma SwimLane: rappresenta il flusso di attività di un caso d'uso permettendo di individuare l'attore o la classe analitica che ha responsabilità per l'azione descritta.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;La modellazione basata su classi permette di identificare le classi analitiche, gli attributi e le operazioni che definiscono il comportamento di un oggetto. Il modello comportamentale rappresenta invece come il sistema risponderà a stimoli o eventi esterni. Viene rappresentato mediante diagrammi di stato e di sequenza.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;2.0 Modellazione Progettuale&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La modellazione progettuale sfrutta il modello analitico selezionando una architettura appropriata per il software, crea le classi e le componenti del progetto, traducendo ogni descrizione di una classe analitica in una classe progettuale, definendo i metodi associati a ciascuna classe i problemi di ereditarietà, progetta ogni interfaccia necessaria per i sistemi o dispositivi esterni,l'interfaccia utente, specifica la sequenza di attività in base a gli scenari utente, crea un modello comportamentale dell'interfaccia, specifica gli algoritmi a un livello di astrazione basso, le strutture dati e revisiona ciascun componente. La modellazione progettuale deve essere una conseguenza diretta del modello analitico e&amp;nbsp;deve essere incentrata sull'architettura e sul design dei dati.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4607554272524920288?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4607554272524920288/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4607554272524920288' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4607554272524920288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4607554272524920288'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/la-seconda-fase-del-progettomodello.html' title='La Seconda Fase del Progetto:Modello Analitico e Progettuale.'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4903437516595689692</id><published>2010-03-29T21:56:00.000+02:00</published><updated>2010-03-29T21:56:56.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Design dell'interfaccia</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una interfaccia è bene realizzata se essa risponde all'esigenze di coloro che la devono utilizzare. Solitamente essa deve essere&amp;nbsp; facile da imparare,semplice da usare e da capire, deve nascondere i meccanismi interni che la alimentano e deve essere uniforme e &amp;nbsp;in linea con le abitudini e le abilità dell'utente. Non Dovrebbe inoltre non fare uso intesivo della memoria principale. Per tali motivi bisogna prima individuare il tipo di utente destinatario (esperto, tecnico,impiegato ecc),&amp;nbsp;capire le sue necessità e le sue abitudini,comprendere l'ambiente in cui opera e le attività di cui si devono occupare. Bisogna inoltre capire se sono in grado di accedere a funzioni avanzate, se sono abili nell'uso della tastiera, dei tasti di scelta rapida e così via. Utilizzando queste informazioni si può produrre un disegno preliminare e fornire un primo prototipo. In base ai test prodotti e alla valutazione del cliente stesso, i vari prototipi possono essere sviluppati fino al raggiungimento del prodotto finale. Gli errori in cui si incappa spesso durante la realizzazione dell'interfaccia sono i seguenti:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Tempi di risposta eccessivi.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Menù e comandi poco intuitivi.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Errori nell'esecuzione dei comandi&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Scarsa accessibilità dell'applicazione.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Problemi di Internazionalizzazione.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Interfaccia poco intuitiva, a volte frustrante.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4903437516595689692?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4903437516595689692/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4903437516595689692' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4903437516595689692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4903437516595689692'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/design-dellinterfaccia.html' title='Design dell&apos;interfaccia'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-9070648077918234605</id><published>2010-03-29T21:35:00.001+02:00</published><updated>2010-06-15T11:05:57.975+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Gestione delle Configurazioni Software</title><content type='html'>&lt;div style="text-align: justify;"&gt;Il processo di gestione della configurazione software è un attività ausiliaria con lo scopo di riconoscere, gestire e &amp;nbsp;controllare il cambiamento nel&amp;nbsp; software informando gli interessati. La gestione deve godere di alcune proprietà:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gestione delle versioni: ogni versione deve essere archiviata permettendo ai programmatori di fare il downgrade quando necessario.&lt;/li&gt;&lt;li&gt;Monitoraggio delle dipendenze: i cambimenti delle dipendenze devono essere archiviati.&lt;/li&gt;&lt;li&gt;Monitoraggio dei requisiti: i cambiamenti&amp;nbsp;nei requisiti devono essere opportunamente monitorati.&lt;/li&gt;&lt;li&gt;Gestione della configurazione: le configurazioni rappresentano rappresentano&amp;nbsp;specifici risultati del processo.&lt;/li&gt;&lt;li&gt;Audit Trail: bisogna tener conto di chi,quando e perchè ha portato ad un cambiamento.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Un sistema per il controllo delle versioni deve prevedere un database di progetto per catalogare tutti gli oggetti di configurazione rilevanti, deve permettere di gestire le diverse versione consentendo all'ingegnere del software di raccogliere tutti gli oggetti al fine di costruire una specifica versione del software. Anche i bug presenti nelle diversi versioni vanno monitorati. Il controllo di cambiamento prevede diverse fasi. Una volta riconosciuta l'esigenza di una modifica e approvata si assegna del personale al compito, vengono raccolte le informazioni dagli archivi, si procede alla modifica e ai testi, si registrano e si archiviano i nuovi cambiamenti. Il diagramma di flusso è il seguente:&lt;br /&gt;&lt;br /&gt;1.Richiesta di modifica dall’utente&lt;br /&gt;2.Lo sviluppatore valuta la richiesta&lt;br /&gt;3.Si produce una relazione&lt;br /&gt;4.L’autorità di controllo delle modifiche decide&lt;br /&gt;5.a.La richiesta è posta in coda &amp;nbsp; oppure&lt;br /&gt;5.b.Richiesta respinta e l’utente viene informato.&lt;br /&gt;6.Si riconosce l’esigenza di una modifica&lt;br /&gt;7.Assegnazione del personale agli SCI&lt;br /&gt;8.Estrazione degli SCI dall’archivio&lt;br /&gt;9.Modifica&lt;br /&gt;10.Revisione del cambiamento&lt;br /&gt;11.Documento acquisito per il collaudo&lt;br /&gt;12.Esecuzione SQA e collaudo&lt;br /&gt;13.Ratifica delle modifiche da iincludere nella nuova versione&lt;br /&gt;14.Costruzione della nuova versione del software&lt;br /&gt;15.Revisione per tutti gli elementi della configurazione&lt;br /&gt;16.Inserimento delle modifiche nella nuova versione&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-9070648077918234605?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/9070648077918234605/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=9070648077918234605' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/9070648077918234605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/9070648077918234605'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/gestione-delle-configurazioni-software.html' title='Gestione delle Configurazioni Software'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8586081958643334474</id><published>2010-03-27T17:08:00.001+01:00</published><updated>2010-03-27T17:23:30.246+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Piano di Gestione della Qualità</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;strong&gt;1.0 Introduzione&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il &amp;nbsp;piano di gestione della qualità ha lo scopo di pianificare,controllare e migliorare la qualità del prodotto. Per qualità generalmente si indica la conformità del prodotto ai requisiti, alle pratiche e alle&amp;nbsp;politiche&amp;nbsp;stabilite e alle proprietà che i consumatori percepiscono essere di alta qualità. La fase di pianificazione prevede di stabilire le intenzione e l'atteggiamento del team riguardo la qualità del prodotto. I fattori di qualità, individuati da McCall sono:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Correttezza: grado di aderenza del software alle specifiche &lt;/li&gt;&lt;li&gt;Efficienza: quantità di risorse e di codice necessarie perché il programma adempia alla propria funzione&lt;/li&gt;&lt;li&gt;Affidabilità: grado con cui un programma svolge la propria funzione con&amp;nbsp;la precisione richiesta. (tolleranza all’errore, accuratezza, semplicità)&lt;/li&gt;&lt;li&gt;Integrità: grado con cui è possibile controllare l’accesso al software o ai dati da parte di persone non autorizzate. (controllo e valutazione degli accessi)&lt;/li&gt;&lt;li&gt;Facilità d’uso: indical’impegno necessario per imparare a usare il software, a prepararne i dati d’ingresso e a interpretarne i dati d’uscita. &lt;/li&gt;&lt;li&gt;Facilità di manutenzione: misura l’impegno necessario per localizzare e correggere un errore nel programma &lt;/li&gt;&lt;li&gt;Flessibilità: misura l’impegno necessario per modificare il programma&lt;/li&gt;&lt;li&gt;Collaudabilità: misura l’impegno necessario per stabilire, tramite collaudo, se un programma svolge la funzione prevista &lt;/li&gt;&lt;li&gt;Portabilità: misura l’impegno richiesto per trasportare un programma da un ambiente hardware o software, a un altro. &lt;/li&gt;&lt;li&gt;Riutilizzo: misura il grado con cui un programma (o alcune sue parti) può essere utilizzato di nuovo in altre applicazioni.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Interoperabilità: misura l’impegno richiesto a far interagire il programma con altri programmi &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;Un buon piano di qualità inoltre deve includere anche le seguenti attività:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Selezione delle pratiche per la garanzia di qualità: identificazione di tool specifici e tecniche per il monitoraggio della qualità dello sviluppo del software. &lt;/li&gt;&lt;li&gt;Valutazione del piano di progetto software: è una delle revisioni più importanti e difficili da condurre&lt;/li&gt;&lt;li&gt;&amp;nbsp;Accettazione della valutazione dei requisiti:&amp;nbsp; definisce le caratteristiche di un prodotto accettabile.4. &lt;/li&gt;&lt;li&gt;Valutazione della specifica: valuta se le specifiche sono conformi alle attese.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Valutazione del processo di design:&amp;nbsp; valuta se il processo di design è conforme alle attese6. &lt;/li&gt;&lt;li&gt;Valutazione delle pratiche di codifica: come sopra per la codifica.&lt;/li&gt;&lt;li&gt;Valutazione del processo di test ed integrazione:&amp;nbsp;come sopra per test ed integrazione.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Lo scopo delle revisione è individuare gli errore nel processo di sviluppo del software e bloccarne la propagazione. Solitamente il team si riunisce in piccoli gruppi per analizzare parti specifiche e relativamente piccole del software al fine di effettuarne una valutazione. Tutte le revisioni verranno registrate e documentate. Disponendo di una descrizione rigorosa dei requisiti è possibili ricorrere a dimostrazioni formali per verificarne la correttezza. Le revisioni formali sono note con il nome di &lt;strong&gt;Quality Gate.&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;2.0 Quality Gate&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il processo di verifica è basato su checklist (risposte vero o falso su domande standard). Per il processo di sviluppo la checklist è:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La portata del software è definita in maniera chiara?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La terminologia è ben definita?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le risorse sono ragionevoli? Sono disponibili?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;L’analisi dei rischi è stata fatta? E il piano contenimento e/o prevenzione?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I compiti sono stati definiti, programmati e allocati?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le stime di costo e programmazione sono ragionevoli?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;E’ stato applicato uno standard nella stesura della documentazione?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Come sarà controllato il piano del progetto?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;E’ necessario un ambiente per lo sviluppo del software?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;Come è stata condotta la revisione?&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Per i requisiti software invece:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tutte le funzioni sono state definite, descritte, vincolate in maniera non ambigua?&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Per ogni requisito funzionale è stato introdotto anche un requisito di performance, e il requisito funzionale è testabile?&amp;nbsp;&lt;/li&gt;&lt;li&gt;Gli input e gli output sono stati tutti definiti in termini di range, protocolli,.. in modo che il designer del software possa essere soddisfatto?&lt;/li&gt;&lt;li&gt;E’ stato fatto un piano di test e di integrazione? I criteri di accettazione dei test sono stati già negoziati con il cliente?&lt;/li&gt;&lt;li&gt;Lo studio di fattibilità è completo?&lt;/li&gt;&lt;li&gt;L’analisi dei rischi è stata iniziata/completata?&lt;/li&gt;&lt;li&gt;Sono stati applicati degli standard alla documentazione? &lt;/li&gt;&lt;/ul&gt;Per la specifica architetturale:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Ci sono ancora dei requisiti aperti? Se sì, si progetta di chiuderli?&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;Il partizionamento è completo e documentato?&lt;/li&gt;&lt;li&gt;Tutte le interfacce hardware e software interne ed esterne sono state definite adeguatamente in termini di protocolli, range ecc..?&amp;nbsp;&lt;/li&gt;&lt;li&gt;Il modello dei dati è stato completamente e accuratamente definito?&lt;/li&gt;&lt;li&gt;I requisiti software di basso livello sono tracciati nei requisiti software di alto livello in maniera completa ed accurata?&lt;/li&gt;&lt;li&gt;Possono essere soddisfatti i requisiti non funzionali?&lt;/li&gt;&lt;li&gt;Il partizionamento soddisfa i criteri di modularità?&lt;/li&gt;&lt;li&gt;Sono state definite le interfacce fra i moduli?&lt;/li&gt;&lt;li&gt;Il design della struttura dati è consistente con i requisiti dei dati?&lt;/li&gt;&lt;li&gt;Manutenibilità e flessibilità sono attributi di qualità considerati nel design?&lt;/li&gt;&lt;li&gt;Quali attributi di qualità sono applicati?&lt;/li&gt;&lt;li&gt;Gli standard di documentazione sono stati raggiunti?&lt;/li&gt;&lt;li&gt;Sono stati applicati degli standard nella pseudocodifica? Se sì, come sono stati applicati?&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;Per la specifica di dettaglio:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Sono stati tenuti in considerazione tutti i requisiti?&lt;/li&gt;&lt;li&gt;La specifica dettagliata è consistente con la precedente?&lt;/li&gt;&lt;li&gt;Lo pseudocodice o i diagrammi sono stati correttamente trasformati in codice? Hanno soddisfatto gli standard richiesti?&amp;nbsp;&lt;/li&gt;&lt;li&gt;Sono stati soddisfatti gli standard per la documentazione?&lt;/li&gt;&lt;li&gt;I commenti soddisfano degli standard?&lt;/li&gt;&lt;li&gt;I tipi di dati e la dichiarazione dei dati è corretta?&lt;/li&gt;&lt;li&gt;I dati sono corretti?&lt;/li&gt;&lt;li&gt;Sono stati tenuti in conto gli attributi di qualità?&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;Per il testing&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;I criteri di accettazione dei test sono stati definiti, negoziati ed accettati? Le revisioni sono state fatte come richiesto?&lt;/div&gt;&lt;/li&gt;&lt;li&gt;I piani di test sono stati preparati e revisionati?&lt;/li&gt;&lt;li&gt;L’attività di testing è stata presa in considerazione in altre fasi di sviluppo?&lt;/li&gt;&lt;li&gt;Gli ambienti di test (strumenti e risorse) sono definiti in maniera adeguata e disponibili quando necessario?&lt;/li&gt;&lt;li&gt;La tracciabilità fra requisiti e test di conferma è stata completata e corretta?&lt;/li&gt;&lt;li&gt;Le funzioni principali sono confermate presto nella fase di testing?&lt;/li&gt;&lt;li&gt;Sono stati definiti degli standard per condurre i test? I tester sono stati sottoposti a training?&lt;/li&gt;&lt;li&gt;Sono stati definiti test limite e test di stress?&lt;/li&gt;&lt;li&gt;Il testing è fatto in maniera completa?&lt;/li&gt;&lt;li&gt;La gestione degli errori e delle eccezioni è stata testata?&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&amp;nbsp; Per la valutazione della revisione: &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il materiale è completo? &lt;/li&gt;&lt;li&gt;Il materiale è stato distribuito in tempo?&lt;/li&gt;&lt;li&gt;Gli standard applicabili sono disponibili?&lt;/li&gt;&lt;li&gt;I partecipanti erano preparati a contribuire?&lt;/li&gt;&lt;li&gt;La valutazione è iniziata in tempo?&lt;/li&gt;&lt;li&gt;La revisione è stata condotta attraverso protocolli standard?&lt;/li&gt;&lt;li&gt;E’ stato identificato un certo numero di difetti?&lt;/li&gt;&lt;li&gt;Sono stati riportati gli attributi di qualità?&lt;/li&gt;&lt;li&gt;Si e’ cominciato a tracciare i difetti?&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;strong&gt;&amp;nbsp;3.0 Capability Maturity Model&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il Capability Maturity Model&amp;nbsp; è il più famoso modello di valutazione e miglioramento.Ogni processo è caratterizzato da tre proprietà: La capability, l'insieme dei risultati che un processo consente di conseguire; performance, la misura dei risultati effettivi ottenuti nell'applicazione del processo; maturity,l’efficacia del processo e della estensione e precisione con cui le fasi e le attività dello stesso sono esplicitamente definite, gestite, misurate e controllate. Sono individuati 5 livelli di maturità: iniziale,ripetibile,definito,controllato e ottimizzato. Ad ogni livello è associata una previsione di performance. Quando il livello è iniziale, il processo di produzione è instabile e disorganizzato per cui nulla è prevedibile.Al livello ripetibile, esiste già una struttura in grado di gestire costi,scheduling delle attività ed i cambimenti che vengono apportati. Al livello definito, il processo è ben fondato su metodologie e tecniche di ingegneria del software sia per quanto riguarda gli aspetti operativi che quelli manageriali. Al livello gestito, il processo produttivo un dettagliato piano di misura per il controllo della qualità del processo e del prodotto. Al livello ottimizzato,è stata istituzionalizzata una politica di gestione della qualità. Il CMM prevede inoltre per l'accertamento&amp;nbsp;una checklist da tarare ed adottare in base alle realtà aziendali.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8586081958643334474?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8586081958643334474/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8586081958643334474' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8586081958643334474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8586081958643334474'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/piano-di-gestione-della-qualita.html' title='Piano di Gestione della Qualità'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-9218321464347289014</id><published>2010-03-24T11:20:00.002+01:00</published><updated>2010-03-24T11:23:30.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Il Piano di Progetto</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;strong&gt;1.0 Generalità&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il piano di progetto è un documento versionato redatto dal project manager allo scopo di stimare i tempi. i costi e le risorse necessari alla realizzazione del progetto. Si divide in due parti, &lt;strong&gt;La Pianificazione&lt;/strong&gt;, per pianificare le attività future, e&lt;strong&gt; La Consuntivazione&lt;/strong&gt;,per avere un riscontro tra le attività pianificate e quelle effettuate. Il piano di progetto comprende:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Definizione degli Obbiettivi.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Analisi dei Rischi&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Descrizione del modello di processo di sviluppo.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Suddivisioni in milestone.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Attività di progetto.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Stima dei costi.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Consunto di attività.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Chiameremo &lt;strong&gt;Attività&lt;/strong&gt; un lavoro svolto nel progetto, con una durata e un costo ben preciso. Chiameremo invece &lt;strong&gt;Deliverable&lt;/strong&gt; un risultato che deve essere prodotto per completare un progetto o una sua parte.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;2.0 Work BreakDown Strucutre (WBS)&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il WBS è un&amp;nbsp; di elementi del progetto&amp;nbsp; che definisce i limiti complessivi del progetto, ovvero tutto ciò che è dentro i limiti del progetto. E' rappresentato da una struttura gerarchica in cui ogni livello discendente rappresenta una descrizione più dettagliata dell'elemento del progetto. Per costruire un WBS si parte dai deliverable principali, che nello schema rappresentano la radice. Se per il deliverable non siamo in grado di stimare costo e durata, si passa a un successivo&amp;nbsp;livello di dettaglio, rappresentato da un discendente. Ad ogni elemento viene associato un identificatore univoco, gli elementi più in basso nella gerarchia sono chiamati work packages. Le attività che devono essere eseguite per produrre i deliverable vanno identificate e documentate. Ogni attività è descritta da risorse utilizzate&amp;nbsp;e relativi documenti in input, durata (in giorni), costi&amp;nbsp;e realtivi documenti in output, legami di precedenza con altre attività e figura responsabile. Per ogni attività va individuata la dipendenza con altre attività. Si indiviudano tre tipi di dipendenze. Le dipendenze obbligatorie, inerenti alla natura del lavoro che deve essere fatto; le dipendenze discrezionali, definite ed imposte dal team. Questo tipo di dipendenze va documento con attenzione in un documento chiamato Best Practices;le dipendeze esterne, che coinvolgono attività di progetto e non. Le dipendenze vengono rappresentate con un diagramama di precedenza, composto da noti collegati da frecce, in cui&amp;nbsp; i nodi collegati sono le attività legate da dipendenza e la freccia rappresenta il verso della dipendenza (chi dipende da chi). Calcolare il tempo previsto per il completamento del progetto è una operazione affidata a membri con alta esperienza. Solitamente si analizza il percorso critico del progetto (l'attività con minore flessibità di stima) e si sommano i tempi di tutte le attività. Le attività e i relativi tempi sono illustrati graficamente in uno schema chiamato Slack Time. Le attività possono sollevare conflitti nei casi in cui i loro slack time stessi sono in conflitto. Solitamente si tenta di realizzare le attività con slack maggiore, si ridistribuiscono le risorse o si frammentano le attività.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;3.0 Modello COCOMO&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il modello COCOMO (Constructive Cost Model) è un metodo di stima dei costi di sviluppo di un software. Esso prevede che il processo di sviluppo del software sia basato sul modello a cascata. Esso comprende tre diversi livelli di stima. Stima di base, approssimata,veloce,scarna di dettagli limitata dalla mancanza di&amp;nbsp;informazioni più precise circa il&amp;nbsp;progetto; Stima intermedia maggiormente accurate e dettagliate, usufruisce di informazioni quali ambiente di sviluppo e&amp;nbsp;altri parametri;Stima Dettagliata, fornisce la stima migliore in quanto usufruisce di tutte le informazioni sul progetto e sulle sue fasi.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il modello CoCoMo di base distingue tre modalità di sviluppo del software: Organic mode, il team di sviluppo consiste di un numero piccolo di sviluppatori di esperienza che hanno familiarità con l’area di applicazione e con l’ambiente di sviluppo,inoltre e dimensioni del prodotto sono&amp;nbsp; piccole o medie; semidetached mode, il team di sviluppo consiste di un misto di persone con e senza esperienza, che lavorano insieme da poco,la dimensione del prodotto può essere media o grande;Embedded mode,richiede un elevata&amp;nbsp;quantità di risorse,il prodotto ha requisiti stringenti riguardo ad affidabilità, performance,schedule ed interfacce,la dimensione del prodotto è &amp;nbsp;media o grande e generalmente complessa. Il modello CoCoMo intermedio mantiene le stesse distinzioni del modello di base ma introduci 15 nuovi Cost Driver. Il modello dettagliato invece tiene conto dei Cost Drivers del modello precedente ma in funzione delle varie fasi di sviluppo del software. Negli anni '90 fu introdotto il modello CoCoMo II per adattarsi ai nuovi processi di sviluppo come riuso, composizione e paradigmi orientati agli oggetti.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-9218321464347289014?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/9218321464347289014/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=9218321464347289014' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/9218321464347289014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/9218321464347289014'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/il-piano-di-progetto.html' title='Il Piano di Progetto'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2282703056222090957</id><published>2010-03-17T17:23:00.001+01:00</published><updated>2010-03-17T18:21:40.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>La prima fase del progetto: L'Analisi</title><content type='html'>&lt;b&gt;1.0 L'analisi del Dominio&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Studiare e comprendere bene il dominio del problema da affrontare costituisce il primo passo &amp;nbsp;verso lo studio della fattibilità e della comprensione dei requisiti. Le informazioni necessarie a tale scopo posso essere acquisite in modi diversi, interviste a clienti, documentazioni presenti o di progetti passati, soluzioni già note a problemi affrontati in passato. L'analisi del dominio è un documento vitale per la stesura del documento successivo, l'analisi dei requisiti, solitamente è versionato ma può essere mantenuto in forma unica e viene diviso in aree:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&amp;nbsp;Visione generale sulla società committente, breve descrizione del prodotto richiesto, ecc&lt;br /&gt;&amp;nbsp;Glossario (definizioni, acronimi, abbreviazioni)&lt;br /&gt;&amp;nbsp;Conoscenze generali sul dominio&lt;br /&gt;&amp;nbsp;Caratteristiche dei clienti e degli utenti&lt;br /&gt;&amp;nbsp;L’ambiente di utilizzo&lt;br /&gt;&amp;nbsp;Compiti e procedure attualmente eseguiti&lt;br /&gt;&amp;nbsp;Software competitori&lt;br /&gt;&amp;nbsp;Similarità ad altri domini&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.0 Verso i requisiti&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Il passo successivo è stabilire la portata del software., ovvero il contesto in cui si inserisce il software, i dati trattati (input e output), come trasforma l'input in output (funzionalità) e con quali prestazioni. E' una fase critica in quanto può portare al fallimento del prodotto se il team non comprende realmente le esigenze del cliente, e quindi la portata del software è stata mal elaborata, le funzionalità sono state mal elaborate e vanno quindi modificate diverse volte nel corso della realizzazione del progetto. Barry Boehm &amp;nbsp;chiamò W5H2 le sette domandi da porsi in fase di stesura della portata. Esse sono:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Perchè il sistema deve essere realizzato ?&lt;/li&gt;&lt;li&gt;Cosa deve fare ?&lt;/li&gt;&lt;li&gt;Quando sarà completato ?&lt;/li&gt;&lt;li&gt;Chi sono i responsabili ?&lt;/li&gt;&lt;li&gt;Come sono organizzati ?&lt;/li&gt;&lt;li&gt;Come sarà fatto il lavoro dal punto di vista tecnico e manageriale ?&lt;/li&gt;&lt;li&gt;Quante e quali risorse richiede ?&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;3.0 L'analisi dei Requisiti&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Individuiamo due tipi di requisiti. I requisiti funzionali, che rappresentano le caratteristiche che ci si aspetta dal prodotto, senza i quali lo stesso prodotto non ha senso di esistere, ed i requisiti non funzionali, ovvero tutti i requisiti relativi a tempi di consegna (requisiti temporali), budget economico a disposizione del cliente (requisiti economici), disponibilità del servizio offerto dal prodotto, efficienza e carichi elaborativi (requisiti di servizio), responsabilità organizzativa (requisiti organizzativi), architettura, espandibilità, modularità, interoperabilità ed riusabilità ( requisiti di progettazione),caratteristiche di sicurezza (requisiti di sicurezza),specifiche tecnologiche (requisiti tecnologici), usabilità, documentazione, supporto e formazione (requisiti di utilizzo). Ogni requisito deve essere caratterizzato da:&lt;br /&gt;&lt;br /&gt;Numero: identificatore univoco per il requisito&lt;br /&gt;Tipo: categoria a cui il requisito appartiene (organizzativo,economico ecc)&lt;br /&gt;Descrizione: dettagli aggiuntivi&lt;br /&gt;Richiedente: chi ha espresso il requisito.&lt;br /&gt;Data: data di espressione del requisito.&lt;br /&gt;Importanza: quanto è importante per il richiedente (abbastanza,molto,indispensabile ecc)&lt;br /&gt;Priorità: entro quanto tempo il requisito deve essere implementato&lt;br /&gt;Interrelazione: con quali altri requisiti, il requisito ha relazione&lt;br /&gt;Status: grado di stabilità del requisito (in progettazione,verificato,implementato,proposto)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;b&gt;4.0 Analisi dei Punti Funzione&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;L'analisi dei punti funzione è un metodo volto a suddividere un programma in moduli più piccoli al fine di poterli analizzare meglio. Sono un tipo di misura capace di misurare un'applicazione dal punto di vista dell'utente riuscendo a ricavare un indice delle dimensioni dell'applicazione a partire dalle funzionalità che deve fornire. In particolare misurano le funzionalità dell'utente il ritmo di sviluppo e di mantenimento a prescindere dalla tecnologia con cui si implementa il prodotto, consentono di convertire la dimensione, in linee di codice, dell' applicazione in qualsiasi linguaggio &amp;nbsp;nella dimensione dell’applicazione equivalente scritta in un altro linguaggio, consentono di misurare la produttività di un progetto scritto usando più linguaggi di programmazione. Un software è essenzialmente un insieme definito di processi elementari che interagiscono combinandosi tra loro. In una applicazione software individuiamo dati in movimento&amp;nbsp;(external input, external output, external&lt;br /&gt;inquiries) e dati in riposo &amp;nbsp;(internal logic file, external interface file). Il numero di punti funzione per input rappresenta la produttività software. Può essere migliorata incrementando gli output con gli stessi input, decrementando gli input con gli stessi output, decrementando gli input incrementando gli output. Il conteggio dei punti funzione avviene seguendo diverse fasi: 1) determinare il tipo di conteggio ( sviluppo, miglioramento, applicazione). 2) Determinare i confini dell'applicazione. Il confine indica il limite tra l'applicazione che viene misurate e le applicazioni esterne. 3) Identificare e valutare i tipi di funzione di transizione per determinare il loro contributo al conteggio dei punti funzione. 4)Identificare e valutare i tipi di funzione dato per determinare il loro contributo al conteggio dei punti funzione. 5)Determinare il valore del fattore di aggiustamento. 6) Effettuare i calcoli. Individuiamo alcune funzioni standard:&lt;br /&gt;&lt;br /&gt;Data Functions: Internal logical files, dati mantenuti all'interno del confine dell'applicazione&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;External interface files, dati mantenuti all'esterno del confine dell'applicazione&lt;br /&gt;Transactional Functions: External Inputs, processo elementare proveniente dall'esterno del confine&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;External Outputs, processo elementare &amp;nbsp;che invia dati all'esterno&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;External Inquiries, &amp;nbsp;processo elementare che controlla &amp;nbsp;informazioni fuori dal confine&lt;br /&gt;&lt;br /&gt;Tutte queste componenti vengono valutate in base a:&lt;br /&gt;&lt;br /&gt;Record Element Type: sottogruppo di dati riconducibili dall'utente ad un IEF o EIF&lt;br /&gt;File Type Referenced: file a cui si fa riferimento attraverso una transizione.&lt;br /&gt;Data Element Type: campo unico riconoscibile dall'utente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il fattore di aggiustamento è &amp;nbsp;basto su 14 caratteristiche generali di sistema , ogni caratteristica ha delle descrizioni associate per determinare i gradi di influenza, su scala da 0 a 5. Le caratteristiche generali di sistema (GSC) possono così essere elencate:&lt;br /&gt;&lt;br /&gt;General System Characteristic Brief Description&lt;br /&gt;&lt;br /&gt;• 1. Data communications How many communication facilities are there to aid in the transfer or exchange of&lt;br /&gt;information?&lt;br /&gt;• 2. Distributed data processing How are distributed data and processing functions handled?&lt;br /&gt;• 3. Performance Did the user require response time or throughput?&lt;br /&gt;• 4. Heavily used configuration How heavily used is the current hardware platform where the application will be executed?&lt;br /&gt;• 5. Transaction rate How frequently are transactions executed daily,&lt;br /&gt;weekly, monthly, etc.?&lt;br /&gt;• 6. On-Line data entry What percentage of the information is entered On-Line?&lt;br /&gt;7. End-user efficiency Was the application designed for end-user efficiency?&lt;br /&gt;• 8. On-Line update How many ILF’s are updated by On-Line transaction?&lt;br /&gt;• 9. Complex processing Does the application have extensive logical or mathematical processing?&lt;br /&gt;• 10. Reusability Was the application developed to meet one or many user’s needs?&lt;br /&gt;• 11. Installation ease How difficult is conversion and installation?&lt;br /&gt;• 12. Operational ease How effective and/or automated are startup,back up, and recovery procedures?&lt;br /&gt;• 13. Multiple sites Was the application specifically designed, developed, and supported to be installed&lt;br /&gt;at multiple sites for multiple organizations?&lt;br /&gt;• 14. Facilitate change Was the application specifically designed, developed, and supported to facilitate change?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.0 Analisi dei Rischi&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Durante lo sviluppo del software è possibile incorrere in numerose aree di rischio. Un ingegnere del software deve poter sviluppare dei metodi per individuare e gestire i rischi. Alcune aree di rischio di possono essere personale non adeguato o in numero insufficiente, budget non realistico, sviluppo di funzioni software errate, sviluppo di interfaccia utente errata, instabilità dei requisiti. Il fattore di rischio può essere modellato da due variabili: PF, probabilità di fallimento, CF, conseguenza del fallimento. Il fattore di rischio sarà allora dato da:&lt;br /&gt;RF = PF + CF – PF*CF&lt;br /&gt;&lt;br /&gt;Arrivare a un valore per ogni fattore richiede un’analisi completa del fattore e una solida base di esperienza. Di fatti l'assegnamento dei pesi è altamente soggettivo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2282703056222090957?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2282703056222090957/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2282703056222090957' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2282703056222090957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2282703056222090957'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/la-prima-fase-del-progetto-lanalisi.html' title='La prima fase del progetto: L&apos;Analisi'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6890142045169191528</id><published>2010-03-12T23:58:00.001+01:00</published><updated>2010-03-13T00:02:13.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi Teoriche INF'/><title type='text'>Macchina di Turing</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/turingmachine.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6890142045169191528?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6890142045169191528/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6890142045169191528' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6890142045169191528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6890142045169191528'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/macchina-di-turing.html' title='Macchina di Turing'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3256926319920493377</id><published>2010-03-12T23:57:00.002+01:00</published><updated>2010-03-13T00:02:13.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi Teoriche INF'/><title type='text'>Grammatiche Regolari</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/grammatiche_regolari.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3256926319920493377?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3256926319920493377/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3256926319920493377' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3256926319920493377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3256926319920493377'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/grammatiche-regolari.html' title='Grammatiche Regolari'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4506453806056020562</id><published>2010-03-12T23:57:00.001+01:00</published><updated>2010-03-13T00:02:13.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi Teoriche INF'/><title type='text'>Grammatiche Context-Free</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/contextfreegram.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4506453806056020562?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4506453806056020562/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4506453806056020562' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4506453806056020562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4506453806056020562'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/grammatiche-context-free.html' title='Grammatiche Context-Free'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4617774716091965656</id><published>2010-03-12T23:56:00.001+01:00</published><updated>2010-03-13T00:02:13.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi Teoriche INF'/><title type='text'>Automi a Stati Finiti</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/automi.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4617774716091965656?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4617774716091965656/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4617774716091965656' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4617774716091965656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4617774716091965656'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/automi-stati-finiti.html' title='Automi a Stati Finiti'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2818502098530165678</id><published>2010-03-12T23:55:00.002+01:00</published><updated>2010-03-13T00:02:13.699+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi Teoriche INF'/><title type='text'>Introduzioni alle Basi Teoriche dell'Informatica</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/introduzioneBT.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2818502098530165678?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2818502098530165678/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2818502098530165678' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2818502098530165678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2818502098530165678'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/03/introduzioni-basi-teoriche.html' title='Introduzioni alle Basi Teoriche dell&apos;Informatica'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7591303008590246710</id><published>2010-01-29T18:09:00.000+01:00</published><updated>2010-03-12T23:36:27.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Cammini Minimi in Grafi Orientati</title><content type='html'>&lt;p&gt;Appunti su Cammini Minimi in Grafi orientati&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/camminiMin_grafi.zip"&gt;Download&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7591303008590246710?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7591303008590246710/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7591303008590246710' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7591303008590246710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7591303008590246710'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2010/01/cammini-minimi-in-grafi-orientati.html' title='Cammini Minimi in Grafi Orientati'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8530176579265756694</id><published>2009-12-19T13:33:00.002+01:00</published><updated>2009-12-19T13:43:59.963+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Metodologia Greedy (Algoritmi Golosi)</title><content type='html'>Introduzione alla Metodologia Greedy (Algoritmi Golosi)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/met_Greedy_part1.rar"&gt;Download 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/met_Greedy_part2.rar"&gt;Download 2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8530176579265756694?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8530176579265756694/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8530176579265756694' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8530176579265756694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8530176579265756694'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/12/metodologia-greedy-algoritmi-golosi.html' title='Metodologia Greedy (Algoritmi Golosi)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6595739156589849447</id><published>2009-12-10T16:06:00.011+01:00</published><updated>2010-03-05T17:36:05.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Network Simulator 2, Cenni</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div style="TEXT-ALIGN: justify"&gt;Network Simulator 2 è un simulatore di reti scritto in C++ e OTCL. Per poter realizzare una simulazione è necessario impostare mediante uno script uno scenario caratterizzato da nodi di trasmissione con relativi buffer e linee di uscita con una certa capacità, tempo di arrivo e lunghezza dei pacchetti, numero di pacchetti per nodo, ritardo dei pacchetti, topologia della rete da simulare,sorgenti di traffico,perdita di pacchetti ecc. Il simulatore fornirà, avviata la simulazione, un trace-file da analizzare, mediante l’analisi del quale otterremo i dati da rappresentare. La simulazione può avere una durata variabile secondo la complessità del modello. Per potere rappresentare lo scenario ns fornisce diversi oggetti che dovremo accuratamente utilizzare. Essi sono nodi, link, agenti di trasporto, generatori di traffico e ricevitori, applicativi. Bisogna tenere in considerazione, durante le simulazioni, della possibilità di perdita di pacchetti dovuta a errori di trasmissione sui link, eccessivo traffico, ritardi e sottodimensionamenti delle code e così via. Per le code vanno tenuti in considerazione la politica di gestione della coda, degli arrivi dei pacchetti (processo degli arrivi), lunghezza dei pacchetti e capacità dei link (processo dei tempi di servizio). Tra le politiche di gestione dei pacchetti individuiamo:&lt;/div&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;DropTail: i pacchetti vengono elaborati secondo l’ordine di arrivo nella coda&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;SFQ (Stochastic Fair Queue): si cerca di fornire una distribuzione statisticamente uguale ai pacchetti servendo in maniera equa le sorgenti&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;DRR (Deficit Round Robin): ogni sorgente ottiene un quanto di bit da trasmettere.&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;RED (Random Early Detection): si cerca di determinare la soglia di saturazione prima della saturazione stessa e si scartano i pacchetti provenienti da tutti i flussi prevenendo la congestione.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="TEXT-ALIGN: justify"&gt;La componente OTCL di NS permette di definire le classi OTCL direttamente connesse alle classi C++, fornisce i metodi per accedere a tale classi e consente di instanziare gli oggetti che compongono il modello da simulare. Vediamo come utilizzare le classi NS:&lt;/div&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;2.0 Iniziare con NS&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;La prima cosa da fare è instanziare lo schedulatore del simulatore ed è sempre la prima istruzione da inserire:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="TEXT-ALIGN: justify; FONT-STYLE: italic"&gt;set nome_simul [ new Simulator] &lt;/div&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;/p&gt;&lt;p style="LINE-HEIGHT: 100%; MARGIN-BOTTOM: 0cm" lang="it-IT" align="justify"&gt;Possiamo poi instanziare i nodi:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;set primo_nodo [$nome_simul node]&lt;/span&gt; &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;set secondo_nodo [$nome_simul node]&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;e i relativi agenti:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;set primo_agente [ new tipo_agente]&lt;/span&gt; &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;set secondo_agente [ new tipo_agente]&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Gli agenti vanno poi collegati ai relativi nodi&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul attach-agent $nome_nodo $nome_agente&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;E connessi tra loro&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simul connect $primo_agente $secondo_agente&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Due nodi possono essere collegati con il comando&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul duplex-link $primo_nodo $secondo_nodo dimensione_banda tempo_transito tipo_coda&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Possiamo poi instanziare l’applicazione&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;set nome_applicazione [new tipo_Applicazione]&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;e collegarlo all’agente&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_applicazione attach-agent $nome_nodo $nome_agente&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Possiamo poi avviare l’applicazione ad un tempo stabilito, ad esempio 0.1&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul at 0.1 “$nome_applicazione start”&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;E terminarla al tempo 0.3 con il comando&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul at 0.3 “exit”&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Tutto quello che abbiamo visto fino ad ora lo potete trovare sul primo file di esempio presente nell'archivio.&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Adesso facciamo partire il simulatore. Il simulatore avrà bisogno di un tracefile opportunamente gestito.Apriamo il tracefile di NAM come un comune file in sola scrittura:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;set nome_file [open out.nam w]&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;E associamolo al simulatore&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simulatore namtrace-all $fd&lt;/p&gt;&lt;p style="TEXT-ALIGN: justify; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Sarà necessaria una procedura per gestire la chiusura del tracefile e la sua esecuzione. Potete trovare la procedura sul file di esempio presente nell'archivio. La prima cosa che la procedura dovrà fare sarà accedere al tracefile mediante il comando&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;global nome_simulatore nome_file&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Dovrà poi svuotare il buffer con:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simulatore flush-trace&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Dopo dovrà chiudere il file ed eseguire NAM su di esso&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;close $nome_file&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;exec nam out.nam &amp;amp; &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;exit 0&lt;/p&gt;&lt;p style="TEXT-ALIGN: justify; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Nell'esempio allegato sarà mostrata la procedura che non ricorre a variabili globali.Dopo la chiusura della nostra applicazione, possiamo eseguire la procedura finish e avviare il simulatore con il comando:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simulatore run &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Estendiamo l'esempio precedente impostando le regole di routing.Per impostare il protocollo di routing unicast si utilizza il comando:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simul rtproto Static per il routing statico (default)&lt;/span&gt; &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul rtproto Session per il session routing&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_simul rtproto DV $nodo1 ….. $nodoN per il Distance Vector routing sui nodi&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul rtproto LS $nodo1 $nodo2 per il Link State Routing&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Per il multicast, dopo aver instanziato il simulatore eseguiamo il comando&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul multicast&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;e il comando &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul mrtproto type&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;dove type è:&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;CtrMcast per il Centralized Multicast&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;DM per il Dense Mode Multicast&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;ST per il Shared Tree Mode Multicast&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;BST per il Bi-directional Shared Tree Mode Multicast&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Occupiamoci adesso della perdita dei dati. Dobbiamo creare un modello per gestire la perdita dei dati:&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;set nostro_modello [new ErrorModel]&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;E configuriamo il rate di perdita (specificando un valore x)&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nostro_modello set rate_ x&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Possiamo indicare l'unità e la variabile casuale &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nostro_modello unit type&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nostr_modello ranvar type&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;E impostare il target&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nostro_modello drop-target type&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Nell'archivio è presente un esempio sull'uso di questi comandi. Fino ad ora abbiamo utilizzato il prot TCP a livello trasporto. Per settare il protocollo UDP utilizziamo i comandi:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;set sorgente [new Agent/UDP]&lt;/span&gt; &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;set destinazione [new Agent/NULL]&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Sorgente e destinazione vanno poi collegati tra loro e ai rispettivi nodi come visto in precedenza.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;3.0 Classe Node&lt;/span&gt; &lt;/p&gt;&lt;p style="TEXT-ALIGN: justify; MARGIN-BOTTOM: 0cm"&gt;Abbiamo visto che ns supporta due tipi di nodi: Unicast (un solo mittente e un solo destinatario) e Multicast (un mittente e più destinatari).Adesso vediamo le funzioni messe a disposizione per la gestione dei nodi. Ogni nodo ha un identificatore costituito da un intero che viene incrementato ad ogni nuova istanza. Per accedere a tale identificatore usiamo&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;$nome_nodo id&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Mentre per accedere al suo indirizzo usiamo&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_nodo node_addr&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;I nodi vicini sono indicati da una lista accessibile da &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$node neighbors&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Un collegamento tra due nodi è rappresentato da un&lt;b&gt; link.&lt;/b&gt; Esso è costituito da cinque elemneti principali:&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;head_ rappresenta il punto di ingresso del nodo&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;queue_ rappresenta la coda principale del link&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;link_ l'oggetto che modella il link&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;ttl_ oggetto che gestisce il ttl dei pacchetti&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;drophead_ oggetto che gestisce lo scarto dei pacchetti&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;Altri oggetti gestiscono il tracciamento dei pacchetti &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;enqT_ traccia i pacchetti in ingresso&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;deqT_ traccia i pacchetti in uscita&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;drpT_ traccia i pacchetti scartati&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;rcvT_ traccia i pacchetti ricevuti dal nodo successivo&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;La creazione di un link (la abbiamo già vista) viene effettuata tramite il comando&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul type-link node1 node2 bw delay qtype args &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;dove qtype può assumere i valori:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;DropTail per la coda FIFO &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;FQ per il fair queuing&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;SFQ per la stochastic fair queuing&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;DRR per la deficit round robin queue&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;RED per la random early detection queue&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;CBQ per la class-based queuing&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;CBQ/WRR per la weighted round robin CBQ&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;E' possibile definire la dimensione massima della coda con &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul queue_limit _node1_ _node2_ _limit_&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;e il ritardo di propagazione nella direzione indicata (rappresentato da timeinterval) con:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simul delay node1 node2 timeinterval&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Alcuni metodi permettono di gestire lo stato del link:&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul rtmodel-at time command node1 node2&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;dove command può essere:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;up per attivare un collegamento &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;down per disabilitare un collegamento&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;up? per interrogare lo stato del link&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;cost per settare il costo&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;cost? Per interrogare il costo di un link&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm; FONT-WEIGHT: bold" lang="en-US"&gt;4.0 Classi Agent, Application, Traffic Generator&lt;/p&gt;&lt;p style="TEXT-ALIGN: justify; MARGIN-BOTTOM: 0cm"&gt;Un agente è un elemento che genera il traffico dati (trasmettitore), rimuove il traffico ricevuto (ricevitore) o fa entrambe le cose (bidirezionale). In realtà non si opera con dati reali ma solo con le dimensioni delle informazioni al fine di tenere traccia della quantità di dati trasmessi. Esistono numerosi tipi di agenti, ciascuno configurabile manualmente. Consultate il manuale ns per avere informazioni dettagliate sui protocolli. La classe Application permette di definire il modello di applicazione al quale associare un profilo di traffico definito dalla classe TrafficGenerator. Esistono 4 classi derivate da TrafficGenerator, ciascuna rappresentante un modello di traffico differente:&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;EXPOO_TRAFFIC : per il modello di traffico “On/Off” con distribuzione esponenziali dei tempi di permanenza in ogni stato &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;POO_Traffic: per il modello con tempi di permanenza in ciascuno stato distribuiti secondo una distribuzione di Pareto .&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;CBR_Traffic: per il modello di traffico a rate costante, con pacchetti di dimensione fissa &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="en-US"&gt;TrafficTrace:per il modello di traffico basato su misurazioni reali importate da un trace file).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;5.0 Raccolta dei Risultati&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Si può ricorrere a due strategie per raccogliere i risultati della simulazione:&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Mediante tracefile. Un trace è un oggetto inserito in un link, che raccoglie tutti gli eventi che coinvolgono i pacchetti trasmessi su di esso. Ogni pacchetto è tracciato mendiante la sua intestazione costituita da:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;identificativo univoco &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;tipo di pacchetto &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;dimensione del pacchetto &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;identificativo dell’interfaccia di trasmissione (per il multicast) &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;identificativo di flusso &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;nodo sorgente &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;nodo destinazione &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Per utilizzare un tracefile bisogna prima aprirlo in scrittura&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simul nome_trace_file [open nome_file w]&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Scrivere su file tutte le informazioni raccolte:&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul trace-queue $node1 $node2 $nome_trace_file&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;E infine chiudere il file:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;close $nome_trace_file&lt;/span&gt; &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Le voci scritte su file saranno caratterizzate dai seguenti attributi:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;tipo di evento (ricezione, accodamento, trasmissione, scarto) &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;istante in cui si verifica l’evento &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;nodo sorgente &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;nodo destinazione &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;tipo di pacchetto &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;dimensione del pacchetto &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;flag per utilizzi specifici (collegamenti wireless, etc,...) &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;identificativo di flusso &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;indirizzo e porta del mittente &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;indirizzo e porta del destinatario &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;numero di sequenza &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;identificativo univoco di pacchetto &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;E' possibile fare il trace di tutti i pacchetti su tutti i link:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm" lang="it-IT"&gt;&lt;span style="FONT-STYLE: italic"&gt;$nome_simul namtrace-all $nome_nam_file &lt;/span&gt;&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul trace-all $nome_trace_file&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;O su uno specifico link:&lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul trace-queue $node0 $node1 $nome_trace_file &lt;/p&gt;&lt;p style="FONT-STYLE: italic; MARGIN-BOTTOM: 0cm"&gt;$nome_simul namtrace-queue $n0 $n1 $nome_trace_file &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;Mediante Monitor: un monitor consente di analizzare alcune variabili del modello:&lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;size_ dimensione della coda in byte &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;pkts_ numero di pacchetti in coda &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;parrivals_ numero di pacchetti arrivati &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;barrivals_ numero di byte arrivati &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;pdepartures_ numero di pacchetti trasmessi &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;pdrops_ numero di pacchetti scartati &lt;/p&gt;&lt;p style="MARGIN-BOTTOM: 0cm"&gt;bdrops_ numero di byte scartati&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempiNS.zip"&gt;Download 1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6595739156589849447?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6595739156589849447/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6595739156589849447' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6595739156589849447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6595739156589849447'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/12/network-simulator-2.html' title='Network Simulator 2, Cenni'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5156712237386522108</id><published>2009-12-02T22:31:00.002+01:00</published><updated>2009-12-02T22:33:38.459+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>V</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;Validator:&lt;/strong&gt; componente che analizza la struttura grammaticale e sintattica di un testo, costituito da sequenze di tokens, al fine di stabilirne la coerenza con determinati standard linguistici. Appartiene alla famiglia dei &lt;strong&gt;parser&lt;/strong&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5156712237386522108?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5156712237386522108/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5156712237386522108' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5156712237386522108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5156712237386522108'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/12/v.html' title='V'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-255406184691692874</id><published>2009-11-27T17:19:00.003+01:00</published><updated>2009-12-11T18:53:09.256+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Elementi di Programmazione Dinamica</title><content type='html'>&lt;p&gt;Elementi di Programmazione dinamica&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/progrDinamica1_prima.zip"&gt;Download Parte Prima&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/progr_dinamica2.zip"&gt;Download Parte Seconda&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/progr_dinamica3.zip"&gt;Download Parte Terza&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Parte Seconda e Terza inserita il 11/12/09 alle ore 6.35&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-255406184691692874?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/255406184691692874/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=255406184691692874' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/255406184691692874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/255406184691692874'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/11/elementi-di-programmazione-dinamica.html' title='Elementi di Programmazione Dinamica'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-660480586714878481</id><published>2009-11-14T18:21:00.007+01:00</published><updated>2009-11-27T17:48:18.155+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Tabelle Hash</title><content type='html'>&lt;p&gt;introduzione all'hashing&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/tabelleHash.zip"&gt;Download&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Correzione pag.7 il 16/11/2009 ore 12.51&lt;/p&gt;&lt;p&gt;Correzione pag.2 il 27/11/2009 ore 17.48&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-660480586714878481?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/660480586714878481/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=660480586714878481' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/660480586714878481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/660480586714878481'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/11/tabelle-hash.html' title='Tabelle Hash'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-597783008412873072</id><published>2009-11-14T18:21:00.004+01:00</published><updated>2009-11-14T18:41:26.396+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>B-Tree</title><content type='html'>&lt;p&gt;introduzione ai b-alberi&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/b_tree.zip"&gt;Download&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-597783008412873072?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/597783008412873072/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=597783008412873072' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/597783008412873072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/597783008412873072'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/11/b-tree.html' title='B-Tree'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4142381776842785040</id><published>2009-11-01T23:04:00.025+01:00</published><updated>2009-12-05T18:44:22.510+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>TCL\OTCL (Tool Command Language\Object TCL)</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Fondamenti&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Tcl/Otcl è un linguaggio di scripting position-based, solitamente usato su sistemi embedded costituito da una sequenza di comandi separati dal carattere “newline” o ; . Ogni comando è composto da una o più parole che rappresentano la direttiva e i parametri presi in input. Ogni comando genera un suo output costituito da una stringa stampata a video. A differenza di molti linguaggi di scripting il Parser non assegna significati agli argomenti. Ad esempio il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;% set y 4&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Assegna alla variabile y il valore 4 &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;% set x y+5&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;Assegna alla variabile x il valore stringa “y+5”&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%set w $y+10&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Assegna alla variabile w il valore stringa “4+10”. Il simbolo $ permette di accedere alla variabile memorizzata con il nome indicato subito dopo il carattere stesso.&lt;br /&gt;Per effettuare le operazioni aritmetiche si ricorre al comando&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%expr espressione&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Dove espressione rappresenta l’espressione aritmetica che vogliamo calcolare. Il nome di una variabile può contenere lettere , numeri e underscore. Non è necessario definire variabili prima del loro uso. Con la sintassi [ comando ] è possibile inserire comandi come parametri di altri comandi. Ad esempio&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%set x [ set y 10]&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Assegnerà ad x ed a y il valore 10. In alternativa si può usare “ ”.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%set b 5&lt;br /&gt;%set x “ b-5 vale [ expr $b-5] ”&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;/em&gt;&lt;div align="justify"&gt;&lt;br /&gt;Ora x varrà “b-5 vale 0”.&lt;br /&gt;I caratteri speciali come $ possono essere ignorati se preceduti dal caratter \ . Ad esempio &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%set x \$&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Assegnerà ad x il valore stringa $ . Può anche permettere di scrivere un comando su più linee ignorando il carattere “invio”.&lt;br /&gt;Il comando puts permette la scrittura su un determinato device. Per stampare su schermo scriviamo &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%puts “ Esempio di stampa su schermo” &lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;/em&gt;&lt;div align="justify"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;I commenti vanno preceduti dal carattere #&lt;br /&gt;Adesso lavoriamo con le stringhe. Possiamo utilizzare i tradizionali caratteri speciali&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;* zero o più caratteri&lt;br /&gt;? un singolo carattere&lt;br /&gt;[ x-y] un carattere del set compreso dalle lettere qui indicate come x e y&lt;br /&gt;[ ] un set tra i caratteri presenti all’interno delle parentesi. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Le stringhe possono essere manipolate mediante il comando&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%String option ?args? ?args?&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Vediamo alcune opzioni. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;%string first pattern stringa2 ?start_index? &lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Cerca pattern in stringa2 a partire da start_index se specificato. Ritorna la posizione della prima occorrenza trovata, altrimenti ritorna -1. Possiamo usare l’opzione last al posto di first per avviare la ricerca a partire dall’ultimo carattere. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%string length stringa&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;ritorna il numero di caratteri presenti in stringa.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%stringa match ?-nocase? pattern stringa&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;verifica se pattern corrisponde a stringa, altrimenti ritorna -1. Con –nocase è possibile il match è case-unsensitive. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%string range stringa inizio fine&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;ritorna il range di caratteri trovati in stringa a partire dal pattern inizio e a finire con il pattern fine. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%string tolower stringa ?first? ?last?&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;ritorna la conversione in minuscolo di stringa a partire da first e a finire con last se questi sono specificati. Al posto di tolower si può specificare toupper per convertire in maiuscolo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%scan string_format var_name ?var_name2?....&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Effettua il parsing dei parametri indicati come var_name secondo la convenzione specificata da string_format. Ad esempio si può usare &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;%d per intero decimale&lt;br /&gt;%o per intero ottale&lt;br /&gt;%x per intero esadecimale&lt;br /&gt;%b per intero binario&lt;br /&gt;%c per singolo carattere &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%format format_string ?arg1? ?arg2?...&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Formatta arg1,arg2…. Second la convenzione specificata da format_string&lt;br /&gt;Per ulteriori comandi potete consultare il manuale. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;2.0 Liste e Array&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Adesso vediamo come usare le liste. In tcl gli elementi di una lista vanno racchiusi tra {}. È possibile annidare più liste per creare matrici. Per creare una lista useremo il comando&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%set nome_lista { elemento1 elemento2 ….}&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;mentre con il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%list nome_lista { elemento1 elemento2 ….}&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;si ottiene la stampa a video della lista ma non viene memorizzata.&lt;br /&gt;Il primo elemento di una lista viene indicato con l’indice 0 mentre l’ultimo con l’indice end. Il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%lindex nome_lista ?indice?&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;restituisce l’elemento di indice ‘indice’ se specificato, altrimenti restituisce tutta la lista. Possiamo ordinare alfabeticamente una lista con il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%lsort nome_lista&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Il comando supporta diverse opzioni.&lt;br /&gt;Il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%lappend nome_lista elemento&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;inserisce ‘elemento’ alla fine della lista. In questo comando non va specificato il simbolo $ quando ci si riferisce ad una lista memorizzata . Ad esempio se creiamo la lista chiamata elenco e vogliamo inserire l’elemento ‘ultimo’ useremo &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%lappend elenco ultimo&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;E non &lt;em&gt;%lappend $elenco ultimo&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Possiamo inserire un elemento nella posizione desiderata con il comando&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%linsert nome_lista posizione elemento&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;Per sapere quanti elementi contiene una lista impartiamo &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%llength nome_lista&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Passiamo ora agli array. In tcl gli array sono associativi. Ciò vuol dire che l’indice è una stringa che possiamo scegliere a nostro piacere. Per creare una lista o per inserire un elemento usiamo il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%set array nome_array(indice) valore&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Possiamo creare un array a partire da una lista con il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%set array nome_array [ list indice1 elemento1 indice2 elemento2 …]&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Possiamo ottenere l’insieme delle coppie indice-valore con il comando &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%array get nome_array&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Qui non bisogna specificare $.Non otteniamo gli indici ordinati alfabeticamente ne secondo l’ordine di inserimento, ma secondo uno schema utilizzato da tcl per memorizzare la struttura dati. Per ottenere una lista di indici a partire da un pattern specifico usiamo &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%array names nome_array ?pattern?&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Se pattern non è specificato ritorna tutti i valori. Anche qui non va utilizzato il $. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;3.0 Strutture di Controllo&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Le strutture di controllo non differiscono molto dagli altri linguaggi. Qui però è importante rispettare la spaziatura tra un carattere e l’altro. Per maggiore chiarezza guardare gli esempi allegati.&lt;br /&gt;Per la selezione: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;if {espressione} {&lt;br /&gt;body&lt;br /&gt;} elseif {condizione} {&lt;br /&gt;body&lt;br /&gt;} else {&lt;br /&gt;body&lt;br /&gt;} &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per switch: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Switch ?option? string {&lt;br /&gt;pattern1 body1&lt;br /&gt;…..&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Per while:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;while {espressione} {&lt;br /&gt;body&lt;br /&gt;} &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per for:&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;for {variabile} {condizione} {cond_progr} {&lt;br /&gt;body&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Per foreach &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;foreach variabile { elem1 elem2 … } {&lt;br /&gt;body&lt;br /&gt;} &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.0 I/O su file&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Adesso occupiamoci di I/O su file. I file possono essere acceduti mediante una variabile.&lt;/div&gt;&lt;div align="justify"&gt;Per aprire un file impartiamo&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%open nome_var [ open "nome_file" "mod"]&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;dove mod indica la modalità di accesso e può essere:&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;w+ per lettura e scrittura, crea il file se non esiste&lt;/div&gt;&lt;div align="justify"&gt;r+ per lettura e scrittura, il file deve esistere&lt;/div&gt;&lt;div align="justify"&gt;r per lettura&lt;/div&gt;&lt;div align="justify"&gt;w per scrittura&lt;/div&gt;&lt;div align="justify"&gt;..&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per scrivere un file usiamo il comando puts con parametro la nostra variabile.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%puts nome_var stringa&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Chiudiamo il file con il comando&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%close nome_var&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Per leggere una riga usiamo il comando gets:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;em&gt;%gets nome_var&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per leggere byte usiamo il comando read&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;%read nome_var n&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Dove n è il numero di byte che vogliamo leggere. La scrittura e la lettura verrà effettuata nella posizione in cui si trova il puntatore al file. Per muovere il puntatore nella posizione 'n' usiamo il comando:&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;&lt;br /&gt;%seek nome_var n&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per conoscere l'attuale posizione del puntatore invece diamo: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;%tell nome_var&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5.0 Procedure&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;In tcl le procedure possono essere definite per accettare un numero predefinito di elementi oppure un numero variabile. Inoltre possono essere richiamate ricorsivamente, possono ritornare valori o essere "void". Si definisce una procedura mediante la sintassi&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;proc nome_procedura args1... {&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;body&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;Se si decide di accettare un numero variabile di parametri, quando la procedura sarà invoca bisognerà racchiudere tutti i parametri tra " " oppure passarli come lista altrimenti l'interprete non sarà in grado di riconoscerli. Una procedura può anche accedere a variabile globali ma queste vanno prima definite prima della procedura, e poi bisognerà indicare all'interprete di cercare quella variabile fuori dalla procedura definita mediante il comando "%global var_name". Se ad esempio vogliamo usare la variabile globale "ciao" nella procedura "saluti" dobbiamo scrivere:&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%set ciao ciao&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%proc saluti tuo_nome {&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;global ciao&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;puts "$ciao $tuo_nome"&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;strong&gt;6.0 OTCL&lt;/strong&gt; &lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;Otcl è l’estensione ad oggetti di TCL. Anche se si parla di programmazione ad oggetti, OTCL non va pensato come un normale linguaggio Object Oriented come java o C++. In OTCL le classi possono essere definite in maniera incrementale, ovvero i metodi possono essere aggiunti in runtime. Ogni oggetto è un comando, ogni sottocomando è un argomento dell’oggetto. Possiamo definire una classe con il comando&lt;br /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%Class Nome_classe &lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;e un oggetto con il comando&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%Nome_classe nome_oggetto&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Tutti le variabili e i metodo sono pubblici e tutte le classi ereditano dalla superclasse Object. Questa superclasse fornisce alcuni metodo per reperire informazioni sulle classi o sugli oggetti. Un oggetto può essere distrutto con il comando&lt;br /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%nome_oggetto destroy &lt;/em&gt;&lt;/p&gt;&lt;em&gt;&lt;/em&gt;&lt;p align="justify"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;Una variabile di un oggetto può essere instanziata con il comando &lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;em&gt;%nome_oggetto set nome_variabile valore&lt;/em&gt; &lt;/p&gt;&lt;p align="justify"&gt;Se non specifichiamo il valore il comando fornità come risultato il valore attuale della variabile.&lt;br /&gt;Una variabile di classe può essere instanziata con il comando&lt;/p&gt;&lt;p align="justify"&gt;%nome_classe set nome_variabile valore&lt;/p&gt;&lt;p align="justify"&gt;e può essere richiamata all'interno delle procedure mediante il comando&lt;/p&gt;&lt;p align="justify"&gt;%class instvar nome_variabile&lt;/p&gt;&lt;p align="justify"&gt;Da questo momento in poi, all'interno della procedura, la variabile di classe sarà disponibile.&lt;br /&gt;Possiamo aggiungere un metodo ad una classe con il comando &lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%nome_classe instproc nome_metodo args1…. {&lt;br /&gt;body&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;I metodi possono essere richiamati con il comando: &lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%nome_oggetto nome_metodo ?args?&lt;/em&gt; &lt;/p&gt;&lt;p align="justify"&gt;La parola chiave $self può essere utilizzata per riferirsi all’interno di un metodo all’attuale oggetto instanziato . Il comando&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%$self instvar nome_variabile&lt;/em&gt; &lt;/p&gt;&lt;p align="justify"&gt;Permette di accedere alla variabile definita da qualche parte all’interno della classe grazie al comando 'instavar'. Un metodo particolare è il costruttore. Serve all’interprete per poter richiamare il costruttore di Object. Se non viene definito dal programmatore verrà implementato dall’interprete. Un metodo costruttore ha la forma:&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;%nome_classe instproc init {args} {&lt;br /&gt;……body….&lt;br /&gt;eval $self next $args&lt;br /&gt;}&lt;/em&gt; &lt;/p&gt;&lt;p align="justify"&gt;L’ultimo rigo di comando permette all’interprete di richiamare il costruttore della superclasse.&lt;br /&gt;Otcl ammette l'ereditarietà multipla. Per per ereditare da una serie di classi usiamo:&lt;/p&gt;&lt;p align="justify"&gt;%Class nome_classe -superclass {nome_superclasse1 nome_superclasse2....} &lt;/p&gt;&lt;p align="justify"&gt;Nel caso in cui le superclassi implementassero metodi con stess prototipo e firma, uno soltanto dei metodi verrà ereditato. Sarà l'ordine con cui sono indicate le superclassi a stabilire quale sarà il metodo ereditato. Le classe indicata per prima avrà priorità maggiore rispetto alle successive. E' possibile scrivere classi in file script diversi. Basta scrivere il codice su file, ad esempio, un file per ogni classe, scrivere il "main" su di un file aggiungendo come primissime istruzioni i comandi&lt;/p&gt;&lt;p align="justify"&gt;%source nome_script&lt;/p&gt;&lt;p align="justify"&gt;uno per ogni file che abbiamo scritto. Il "main" sarà l'unico file che dovremmo eseguire direttamente.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempi1_tcl.zip"&gt;Download1 &lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempio2_tcl.zip"&gt;Download2&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Archivio Download1 aggiornato il 07/11/2009 alle 14.15&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempi1_tcl.zip"&gt; &lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Archivio Download2 inserito il 10/11/2009 alle 19.55 &lt;/p&gt;&lt;p align="justify"&gt;Correzione post il 12/11/2009 alle 12.26&lt;/p&gt;&lt;p align="justify"&gt;Correzione Download2 il 05/12/2009 alle 18.33&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4142381776842785040?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4142381776842785040/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4142381776842785040' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4142381776842785040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4142381776842785040'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/11/tclotcl.html' title='TCL\OTCL (Tool Command Language\Object TCL)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3648222040825455397</id><published>2009-08-24T10:18:00.002+02:00</published><updated>2009-08-24T10:21:19.538+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>K</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;Known Iusses: &lt;/strong&gt;insieme di problemi noti agli sviluppatori, posti all'attenzione degli utenti. Tali problemi possono  rappresentare bugs non ancora risolti oppure emergono in corrispondenza di cattivi utilizzi da parte degli utenti o in presenza di software con problemi di compatibilità.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3648222040825455397?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3648222040825455397/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3648222040825455397' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3648222040825455397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3648222040825455397'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/08/k.html' title='K'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7723115357304408369</id><published>2009-08-24T10:15:00.002+02:00</published><updated>2009-08-28T11:42:58.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>G</title><content type='html'>&lt;strong&gt;Good Practise:&lt;/strong&gt; Insieme di buone norme da tenere in considerazione quando si programma in un determinato linguaggio o quando si utilizza un determinato software.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Grid Computing: &lt;/strong&gt;infrastruttura informatica costituita da numerosi calcolatori distribuiti, distanti geograficamente, basata sulla condivisione organizzata delle risorse hardware, al fine di risolvere un problema comune all'intera struttura.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7723115357304408369?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7723115357304408369/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7723115357304408369' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7723115357304408369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7723115357304408369'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/08/g.html' title='G'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4891756145617994388</id><published>2009-08-10T22:01:00.001+02:00</published><updated>2009-08-10T22:01:48.255+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Fondamenti di HTML parte terza</title><content type='html'>Terza e ultima parte di fondamenti di html.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/html_parte_terza.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4891756145617994388?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4891756145617994388/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4891756145617994388' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4891756145617994388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4891756145617994388'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/08/fondamenti-di-html-parte-terza.html' title='Fondamenti di HTML parte terza'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1818559984137445453</id><published>2009-08-04T16:11:00.002+02:00</published><updated>2009-08-04T16:13:17.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Fondamenti di HTML parte seconda</title><content type='html'>Seconda parte di fondamenti del linguaggio HTML (4.0)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/html_parte_seconda.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1818559984137445453?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1818559984137445453/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1818559984137445453' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1818559984137445453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1818559984137445453'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/08/fondamenti-di-html-parte-seconda.html' title='Fondamenti di HTML parte seconda'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8003968471980686467</id><published>2009-08-02T11:45:00.001+02:00</published><updated>2009-08-02T11:47:09.442+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Fondamenti di HTML parte prima</title><content type='html'>Prima parte di fondamenti del linguaggio html ( v4.0).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/html_parte_prima.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8003968471980686467?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8003968471980686467/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8003968471980686467' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8003968471980686467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8003968471980686467'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/08/fondamenti-di-html-parte-prima.html' title='Fondamenti di HTML parte prima'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8360179548871574916</id><published>2009-06-27T21:48:00.003+02:00</published><updated>2009-06-27T21:59:33.689+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>VIM Editor</title><content type='html'>&lt;div align="justify"&gt;Questo post riassume le principali funzioni del famoso editor VIM. VIM si basa su due modalità di funzionamento, una a "comandi" e una ad "inserimento". Con la prima modalità è possibile inviare comandi di gestione del programma, con la seconda è possibile modificare il file.All'avvio viene sempre eseguita la modalitàa comandi, per passare a quella ad inserimento premiamo 'i'. Per tornare al prompt dei comandi premiamo ESC. Occupiamoci dei comandi principali. In modalità comandi, inseriamo un comando preceduto dal simbolo ":" e seguito dalla pressione del tasto enter. I comandi preceduti da : sono comandi di fine riga,praticamente quelli che troverete nel 'menù file' di un moderno editor, tutti gli altri ci permettono di operare con il testo.Ad esempio impartiamo&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;:w per salvare le modifiche al file o:w nome_file se abbiamo aperto un nuovo file e vogliamo salvarlo.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;:q per abbandonare la sessione di VIM.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;I comandi possono anche essere concatenati. Ad esempio con&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;:wq nome_file salviamo ed usciamo dalla sessione di VIM.&lt;/div&gt;&lt;div align="justify"&gt;:q! usciamo senza salvare le modifiche o il file.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per operare con il testo useremo i seguenti comandi.Ad esempio:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;w per spostare il cursore sul primo carattere della parola successiva.&lt;/div&gt;&lt;div align="justify"&gt;b per spostarci sul primo carattere della parola precedente.&lt;/div&gt;&lt;div align="justify"&gt;e per spostarci sull'ultimo carattere della parola successiva.&lt;/div&gt;&lt;div align="justify"&gt;ge per spostarci sull'ultimo carattere della parola precedente.&lt;/div&gt;&lt;div align="justify"&gt;$ per spostarci alla fine della riga.&lt;/div&gt;&lt;div align="justify"&gt;^ per spostarci sul primo carattere (non di spaziatura) della riga.&lt;/div&gt;&lt;div align="justify"&gt;0 per spostarci all'inizio della riga.&lt;/div&gt;&lt;div align="justify"&gt;G per spostarci alla fine del documento.&lt;/div&gt;&lt;div align="justify"&gt;gg per spostarci all'inizio del documento.&lt;/div&gt;&lt;div align="justify"&gt;zz per centrare la schermata sulla riga dove è situato il cursore.&lt;/div&gt;&lt;div align="justify"&gt;zt per far diventare la riga dove è situato il cursore la prima riga della schermata.&lt;/div&gt;&lt;div align="justify"&gt;zb per far diventare la riga dove è situato il cursore l'ultima riga della schermata. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Per marcare una riga in modo da poterci tornare rapidamente usiamo il comando&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;mx dove x rappresenta una lettera.Per tornare su quella riga basterà usare il comando&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;'x dove x rappresenta la lettera marcatrice. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;Il comando di fine riga&lt;/div&gt;&lt;div align="justify"&gt;:marks mostra tutte le righe marcate con i rispettivi marcatori. I comandi &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Ctrl+b e Ctrl+f si usano come i comandi page-up e page-down.&lt;/div&gt;&lt;div align="justify"&gt;Ctrl+u e Ctrl+d compiono le stesse operazioni ma con metà schermata.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;Il comando % permette di raggiungere, se il cursore è situato su una parentesi aperta o chiusa, la rispettiva parentesi chiusa o aperta. Altri comandi per l'editing sono&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;a passa alla modalità inserimento dopo aver spostato il cursore a destra dell'ultimo carattere sulla stessa riga.&lt;/div&gt;&lt;div align="justify"&gt;I passa alla modalità inserimento dopo aver spostato il cursore a inizio riga.&lt;/div&gt;&lt;div align="justify"&gt;o passa alla modalità inserimento dopo aver aggiunto una riga sotto il cursore .&lt;/div&gt;&lt;div align="justify"&gt;O come o ma sulla riga sopra il cursore.&lt;/div&gt;&lt;div align="justify"&gt;x cancella il carattere su cui si trova il cursore.&lt;/div&gt;&lt;div align="justify"&gt;X cancella il carattere a sinistra del cursore.&lt;/div&gt;&lt;div align="justify"&gt;dw per cancellare una paroladd per cancellare una intera riga.&lt;/div&gt;&lt;div align="justify"&gt;D cancella tutto quello che segue il cursore fino alla fine della riga.&lt;/div&gt;&lt;div align="justify"&gt;c(seguito da spazio) come d ma passa alla modalità inserimento. &lt;/div&gt;&lt;div align="justify"&gt;cc(seguito da spazio) come dd ma passa alla modalità inserimento.&lt;/div&gt;&lt;div align="justify"&gt;C(seguito da spazio) come D ma passa alla modalità inserimento.&lt;/div&gt;&lt;div align="justify"&gt;u effettua un "undo".&lt;/div&gt;&lt;div align="justify"&gt;CTRL+r effettua l'annullamento di un "undo".&lt;/div&gt;&lt;div align="justify"&gt;. effettua un "redo".&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per cercare una stringa impartiamo&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;/stringa_da_cercare per cercare avanti nel testo.&lt;/div&gt;&lt;div align="justify"&gt;?stringa_da_cercare per cercare indietro nel testo.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per sostituire una stringa str con un'altra str2 impartiamo.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;:s/str/str2 per sostituire una sola occorrenza.&lt;/div&gt;&lt;div align="justify"&gt;:s/str/str2/g per sostiture tutte le occorrenze. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8360179548871574916?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8360179548871574916/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8360179548871574916' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8360179548871574916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8360179548871574916'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/06/vim-editor.html' title='VIM Editor'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-909290347253418339</id><published>2009-06-26T14:22:00.037+02:00</published><updated>2010-05-25T12:38:28.238+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Configurazione delle Reti</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Configurare le reti&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;In questo post vedremo come configurare reti tra macchine GNU-Linux. Utilizzeremo per semplicità macchine virtuali la cui installazione è stata vista in un post precedente. Partiremo da un semplice esempio per poi vederne di più complessi. Cominciamo dalla figura sotto: &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352720359988658514" src="http://1.bp.blogspot.com/_Pti-0b5YBiE/SkiuzrcgAVI/AAAAAAAAAOk/TSvYfAFAAUw/s400/topo1.jpg" style="display: block; height: 331px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Ci viene mostrata una semplice rete locale tra quattro macchine che potranno comunicare tra loro. Dalle impostazioni di una delle quattro macchine virtuali selezioniamo "Rete", e nel menù relativo alla voce "Connessa a" selezioniamo "Rete Interna" e diamo il nome lan0. Per le macchine rimanenti effettuiamo la stessa operazione e colleghiamole alla stessa rete lan0. A questo punto ci basta avviare tutte le quattro macchine, e in ciascuna di essa impartiamo il comando ifconfig eth0 xxx.xxx.xxx.y , dove eth0 indica la prima schede di rete, (eth1 la seconda e così via) e xxx.xxx.xxx.y indica l'indirizzo ip. Affichè le macchine possano comunicare devono appartenere alla stessa rete. Ad esempio se vogliamo che la nostra rete abbia indirizzo 192.168.10.0 impartiamo i seguenti comandi, uno per ogni macchina.&lt;/div&gt;&lt;br /&gt;macchina1 -&amp;gt; ifconfig eth0 192.168.10.1/24&lt;br /&gt;&lt;br /&gt;macchina2-&amp;gt; ifconfig eth0 192.168.10.2/24&lt;br /&gt;&lt;br /&gt;macchina3-&amp;gt; ifconfig eth0 192.168.10.3/24&lt;br /&gt;&lt;br /&gt;macchina4-&amp;gt;ifconfig eth0 192.168.10.4/24&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Con il comando ping xxx.xxx.xxxx.y controlliamo se la rete sta in effetti funzionando. Memorizziamo le modifiche effettuate agli indirizzi IP delle macchine modificando per ciascuna di esse il file di configurazione /etc/rc.d/rc.inet1.conf e inserendo l'indirizzo nella relativa scheda di rete. Adesso passiamo a qualcosina di più complicato. Guardiamo lo schema in basso&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352402537636604786" src="http://3.bp.blogspot.com/_Pti-0b5YBiE/SkeNv-66q3I/AAAAAAAAAN8/b0R4T8lrOlY/s400/topo2.jpg" style="display: block; height: 113px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;div align="justify"&gt;La figura ci mostra due host connessi tra loro attraverso un gateway (anche questo è un macchina virtuale slackware). In questo caso dobbiamo configurare diversamente le schede di rete. Aggiungiamo per la macchina a sinistra una scheda di rete connessa ad una lan interna che chiamiamo lan0. Per la macchina a destra aggiungiamo una schede di rete connessa ad una lan interna che chiamiamo lan1. La macchina al centro avrà ben due schede di rete, la prima (eth0) connessa alla lan0, e la seconda (eth1) connessa alla lan1. E' importante tenere a mente l'ordine delle schede se non vogliamo fare pasticci. A volte le macchine possono rinominare le schede di rete. Cancelliamo il file /etc/udev/rules.d/70-persistent-net.rules e riavviamo per risolvere. Adesso passiamo agli indirizzi IP. Assegniamo alla macchina a sinistra 192.168.10.2/24, al gateway sul dispositivo eth0 192.168.10.1/24 e su eth1 192.168.11.1/24, mentre alla macchina a destra assegnamo l'indirizzo 192.168.11.2/24. Come al solito se tutto è stato configurato per bene, dovremmo pingare il gateway sia dalla macchina a sinistra che da quella a destra. Adesso dobbiamo inserire le nuove regole di routing statico. Per prima cosa assicuriamoci che l'ip fowarding sia abilitato.Posizioniamoci sul gateway ed impartiamo i comandi&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;chmod +x /etc/rc.d/rc.ip_forward&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;e riavviamo il servizio con&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;/etc/rc.d/rc.ip_forward restart&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Siamo già a buon punto. Noi vogliamo che la macchina 192.168.10.2 veda la macchina 192.168.11.2 e viceversa. Nella prima macchina impartiamo il comando&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;route add -net 192.168.11.0/24 gw 192.168.10.1&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;mentre nella seconda impartiamo&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;route add -net 192.168.10/24 gw 192.168.11.1&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Con il primo comando stiamo semplicemente dicendo di dirottare tutti i pacchetti destinati alla rete 192.168.11.0 al gateway di indirizzo 192.168.10.1. Con il secondo comando facciamo la stessa cosa per la seconda rete e il suo gateway.Proviamo a pingare le due macchine per avere conferma del lavoro fatto. Possiamo attribuire ad ogni indirizzo un nome così da non doverli ricordare ogni volta. Modifichiamo il file /etc/hosts aggiugendo voci del tipo:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;xxx.xxx.xxx.xxx nome_host&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;dove la sequenza di x è l'indirizzo ip dell'host e nome_host è il suo nome. Possiamo richiamare così la macchina ricorrendo ad un nome ASCII piuttosto che al suo indirizzo IP. Le tabelle di route non vengono mantenute al riavvio della macchina. Ovviamo al problema modificando il file di script /etc/rc.d/rc.local aggiungendo alla fine di esso gli stessi comandi così come li abbiamo visti (ricordate la sintassi di bash), oppure creando un apposito file di script e collegandolo a rc.local mediante il comando "source " seguito dal pathname del nostro script. Adesso estendiamo la figura precedente collegando il gateway ad internet come mostrato sotto.&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352471080255590962" src="http://3.bp.blogspot.com/_Pti-0b5YBiE/SkfMFsEvkjI/AAAAAAAAAOE/ZkM3S5X0hOw/s400/topo3.jpg" style="display: block; height: 187px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Per raggiungere la configurazione desiderata basta poco. Aggiungiamo una terza scheda di rete (ad esempio eth3) al gateway collegata in NAT ed avviamo la macchina. Possiamo configurare manualmente la terza scheda di rete e per farlo dobbiamo consultare la guida di virtual box per sapere gli indirizzi di dns,gateway e ip della scheda. Otteniamo questi valori direttamente dalla nostra macchina eseguendo il comando&lt;/div&gt;&lt;br /&gt;dhcpcd eth3&lt;br /&gt;&lt;br /&gt;e attendiamo che termini. Per far sì che le altre due macchine possano collegarsi a internet diciamo loro di usare come gateway predefinito proprio il nostro gateway al centro della figura.Impartiamo il comando&lt;br /&gt;&lt;br /&gt;route add default gw 192.168.10.1&lt;br /&gt;&lt;br /&gt;per la macchina a destra e &lt;br /&gt;&lt;br /&gt;route add default gw 192.168.11.1 &lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;per quella a destra. Fatto ciò proviamo a pingare un server remoto.Possiamo salvare la nostra configurazione modificando il file /etc/rc.d/rc.inet1.conf . Se vogliamo ottenere il servizio dhcp all'avvio del sistema, modifichiamo la voce " Use DHCP " della relativa scheda di rete in questo modo:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;USE_DHCP[x]="yes"&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;dove x rappresenta il numero della scheda di rete. Per il gateway predefinito modifichiamo la voce&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;GATEWAY="xxx.xxx.xxx.xxx"&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;dove la sequenza di x rappresenta l'indirizzo ip. A volte potremmo desiderare di configurare un collegamento ad internet statico. La procedura è identica a quella vista fino ad ora, dobbiamo solo conoscere gli indirizzi corretti da assegnare al gateway e al dispositivo. Potete trovarli nel paragrafo 9.12 della guida di VirtualBox. Le tre tipologie che abbiamo appena visto rappresentano praticamente le basi per realizzare qualsiasi rete. Le prossime che vedremo saranno topologie un pò più complicate. Non spiegherò tutti i passi necessari a configurare le reti dato che li abbiamo già visti ma affronterò il "modus operandi" di affrontare il problema di una configurazione complessa. Concentriamoci sulla figura in basso.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352707957758864370" src="http://1.bp.blogspot.com/_Pti-0b5YBiE/Skijhxifq_I/AAAAAAAAAOM/Z0BpAbJ0HGo/s400/topo4.jpg" style="display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 350px;" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;In questo vi sono due gateway che connetto tra loro e ad internet 5 postazioni. L'approccio utilizzato fino ad ora non è più adatto a queste topologie. Innanzitutto perchè potremmo fare confusione facilmente, inoltre se la rete fosse reale e non virtuale dovremmo spostarci in continuazione tra le varie macchine distanti geograficamente, a volte, per chilometri. Noi dobbiamo ottimizzare la risorsa "fatica" e la risorsa "tempo". Procuriamoci dunque un foglio di carta e ricopiamo lo schema (o stampiamo la figura). Indichiamo tutti i dispositivi di rete affiancati dall'indirizzo ip che abbiamo scelto. Nel caso delle macchine virtuali indichiamo anche il nome della rete interna che abbiamo deciso evitando così di fare confusione. L'approccio migliore in questi casi è quello "top-down". Ricordiamo che dovremmo spostarci su ogni macchina al massimo due volte, una per la configurazione e un'altra, eventualmente, per il test finale. Iniziamo con la macchina collegata ad internet. Configuriamo gli indirizzi ip delle schede e l'accesso alla rete. Aggiungiamo le voci di route che permetteranno di raggiungere le tre macchine collegate al secondo gateway attraverso quest'ultimo. Ricordiamoci le modifiche al file rc.ip_forward. Adesso configuriamo le due macchine collegate al primo gateway, procedendo sempre prima con gli indirizzi di rete e poi con le voci di route per raggiungere le altre macchine collegate al secondo gateway e ad internet. Adesso tocca al secondo router. Sempre gli ip per prima, poi le voci di router per il collegamento ad internet e alle due macchine collegate al primo gateway. Infine i tre pc collegati al secondo gateway. Gli indirizzi ip per primo, il primo gateway e le due macchine a lui collegate,internet, e le rimanenti macchine al secondo gateway. Adesso, a ritroso, posizioniamoci sulle varie macchine per la fase di test. Ricordiamo di pingare tutte le altre macchine per l'assoluta certezza del successo dell'impresa. Ogni topologia di rete può richiedere un approccio diverso. Anche se dovremmo comunque dirigerci su ogni macchina potrebbe essere conveniente per fini logistici partire da alcune macchine piuttosto che da altre. La figura che segue prevede quattro gateway collegati tra loro, ciascuno di essi collegati con una propria macchina.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352717721055262674" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SkisaEpv99I/AAAAAAAAAOU/34Lrtb7P_mo/s400/topo5.jpg" style="display: block; height: 298px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;Dato l'alto numero di gateway, potremmo partire proprio da questi per configurare la rete, e poi successivamente configurare gli host. La figura in basso è un'altro esempio. Stavolta lascio scegliere a voi il punto da cui partire.&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352717779504398626" src="http://3.bp.blogspot.com/_Pti-0b5YBiE/SkisdeZHASI/AAAAAAAAAOc/SI5yM_rQ1Vg/s400/topo6.jpg" style="display: block; height: 284px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt; &lt;br /&gt;&lt;div align="justify"&gt;Potrebbe essere necessario dover collegare più schede di rete ad un host. L'interfaccia di virtual box permette di collegare fino a 4 dispositivi, gli altri dovremmo aggiungerli dalla console. Utilizziamo in sequenza i comandi&lt;/div&gt;vboxmanage modifyvm [nome_macchina] -nic[num_dispositivo] [tipo_dispositivo]&lt;br /&gt;&lt;div align="justify"&gt;I parametri sono racchiusi tra []. Il primo rappresenta il nome della macchina alla quale vogliamo aggiungere i dispositivi. Il secondo, [num_dispositivo] rappresenta il numero della scheda di rete ( praticamente da 5 in poi ), l'ultimo indica il tipo di rete, ad esempio "intnet" per la rete interna, "natnet" per la rete NAT ecc. Il secondo comando è:&lt;/div&gt;vboxmanage modifyvm [nome_macchina] -[tipo_dispositivo][num_dispositivo] [nome_rete]&lt;br /&gt;&lt;div align="justify"&gt;I primi tre parametri sono gli stessi del primo comando, l'ultimo invece rappresenta il nome da dare alla rete, ad esempio per una rete interna , il nome della lan interna. Il secondo e il terzo parametro NON devono essere separati da spazio, ad esempio se colleghiamo il quinto dispositivo di rete ad un rete interna chiamata lan5 nella macchina chiamata A scriveremo in questo modo i due comandi:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;vboxmanage modifyvm A -nic5 intnet&lt;/div&gt;&lt;div align="justify"&gt;vboxmanage modifyvm A -intnet5 lan5&lt;/div&gt;&lt;div align="justify"&gt;vboxmanage modifyvm &lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Chiariamo una cosa circa l'uso della fascia di indirizzi 192.168.0.0/16 usata negli esempi. Questa fascia di indirizzi viene utilizzata come fascia standard di classe C&amp;nbsp;per le reti private. Una rete privata è una rete non indirizzabile dall'esterno, quindi avente validità solo per l'interno (ovvero dietro il router) e pertanto non visibile dall'esterno.Naturalmente questo indica che nel mondo possono esistere tante reti private con le stesso indirizzo. Di fatto, quando si acquista un comune router ADSL l'indirizzo default dell'interfaccia interna del &amp;nbsp;dispositivo sarà 192.168.1.1/16. Il documento &lt;a href="http://tools.ietf.org/html/rfc1918"&gt;RFC 1918: Address Allocation for Private Internets&lt;/a&gt;&amp;nbsp;indica quali sono le fascie di indirizzi utilizzati per le reti private. Esse sono:&lt;/div&gt;&lt;br /&gt;da 10.0.0.0/8&amp;nbsp; a 10.255.255.255/8 di classe A&lt;br /&gt;da 172.16.0.0/12&amp;nbsp;a 172.31.255.255&amp;nbsp;di classe B&lt;br /&gt;&lt;br /&gt;da 192.168.0.0/16&amp;nbsp;a 192.168.255.255/16&amp;nbsp;di classe C&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Assegnare indirizzi ip e sottoreti&lt;/strong&gt; &lt;br /&gt;&lt;div align="justify"&gt;Fino ad ora abbiamo assegnato indirizzi ip in modo innaturale. Vediamo adesso come assegnare indirizzi ip e sottoreti quando un provider ci assegna una fascia di indirizzi. Supponiamo di ricevere l'indirizzo di classe B 142.154.0.0/16. Abbiamo a disposizione 2^(32-16)-2 indirizzi cioè 65534. L'azienda per cui lavoriamo ci chiede di realizzare inizialmente 3 sottoreti da 5000 ,5000 e 1000 indirizzi. Una rete da 5000 indirizzi richiede almeno 13 bit per indirizzare tutti gli host. In forma binaria cioè vuol dire&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;xxxxxxxx xxxxxxxx yyy-00000 00000000&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;dove la sequenza di x indicano i bit relativi all'indirizzo di rete , la sequenza di y quelli relativi al prefisso univoco di sottorete, gli zeri sono quelli dedicati agli hosts. In questo modo noi otteniamo 8 sottoreti da 2^13 hosts. Ad asempio il prefisso 111 possiamo usarlo per indirizzare una sottorete da 5000 host. Se traduciamo gli indirizzi in formato decimale otteniamo 142.154.224.0./19 .Gli indirizzi da assegnare agli hosts vanno dunque da 142.154.224.1 a 142.154.255.254. Il prefisso 110 lo usiamo per la seconda sottorete da 5000. In questo caso otteniamo l'indirizzo 142.154.192.0/19 cioè la fascia di indirizzi da 142.154.192.1 a 142.154.223.254 . Resta la sottorete da 1000 e la backbone. Prendiamo il prefisso 100 cioè la fascia di indirizzi da 142.154.128.1 a 142.154.159.254. Dividiamo in altre 8 sottoreti da 1024 hosts.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;xxxxxxxx xxxxxxxx 100-yyy-00 00000000&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Prendiamo il prefisso 111 cioè&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;xxxxxxxx xxxxxxxx 100111-00 00000000&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Alle sottorete da 1000 host va dunque l'indirizzo 142.154.156.0/21 cioè da 142.154.156.1 a 142.154.159.254 . Per la backbone e per espansioni future ci servono sottoreti da pochi numeri. Possiamo dividere ulteriormente la sottorete ad esempio in 32 sottoreti da 8 hosts. Ci servono dunque altri 5 bit per la sottorete ad esempio &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;xxxxxxxx xxxxxxxx 10000000 00000-000&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;cioè la fascia 142.154.128.0/29 ovvero da 142.154.128.1. a 142.154.128.7.&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/subnet_mask.jpg"&gt;Qui&lt;/a&gt; troverete lo schema della configurazione.&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//net_script.rar"&gt;Qui&lt;/a&gt; alcuni script per reti.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-909290347253418339?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/909290347253418339/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=909290347253418339' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/909290347253418339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/909290347253418339'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/06/configurazione-delle-reti.html' title='Configurazione delle Reti'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pti-0b5YBiE/SkiuzrcgAVI/AAAAAAAAAOk/TSvYfAFAAUw/s72-c/topo1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3566936220760153016</id><published>2009-06-23T19:35:00.001+02:00</published><updated>2009-06-23T19:39:25.153+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Confronti tra Notazioni e Alcune equazioni di ricorrenza</title><content type='html'>Equazioni di ricorrenza svolte:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/ricorrenze.zip"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Confronti tra Notazioni Asintotiche.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/confronti_Notazioni.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3566936220760153016?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3566936220760153016/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3566936220760153016' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3566936220760153016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3566936220760153016'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/06/confronti-tra-notazioni-e-alcune.html' title='Confronti tra Notazioni e Alcune equazioni di ricorrenza'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-276118569967645736</id><published>2009-06-15T22:10:00.015+02:00</published><updated>2009-06-24T22:13:32.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Installazione Slackware su Macchina Virutale</title><content type='html'>&lt;div align="justify"&gt;In questo post vedremo come installare una copia di Slackware su una macchina virutale che potremo utilizzare per effettuare le varie operazioni che vedremo in questo archivio senza intaccare il nostro sistema nativo. Per prima cosa dovremo procurarci una copia di slackware, in questo caso l'immagine dvd, e una copia di VirtualBox reperibile al sito &lt;a href="http://www.virtualbox.org/"&gt;http://www.virtualbox.org/&lt;/a&gt; ( in alternativa possiamo scegliere Virtual MachineWare o Microsoft Virtual PC ma VirtualBox è free). Installiamo il virtualizzatore e apriamo il programma. Selezioniamo la voce "Nuova" e clickiamo su "Avanti". Inseriamo il nome della macchina virtuale ad esempio "slack0", selezioniamo Linux e Linux 2.6 dalle due ComboBox sotto e proseguiamo. Dato che il sistema sarà privo di GUI 128 mega di ram saranno abbondantemente sufficienti, selezioniamo tale quantità nella schermata che ci si presenta e proseguiamo. Creiamo un nuovo disco fisso e passiamo avanti. Consci di quello che stiamo facendo proseguiamo ancora. Selezioniamo "Archiviazione a Dimensione Fissa" dal RadioButton. Se vogliamo spazio a volontà selezioniamo un giga di HD ma a noi ne serviranno molto meno, circa 250 MB. Completiamo la procedura e clickiamo su fine. Il riassunto ci informerà su quanto fatto. Proseguiamo e notiamo la nuova macchina virtuale nel pannello a sinistra. Selezioniamolo e clickiamo su "Impostazioni". Nella nuova finestra ,nel pannello a sinistra selezioniamo "Rete" e assicuriamoci che la prima scheda di rete sia abilitata e collegata in NAT. Selezioniamo poi CD/DVD-ROM, spuntiamo la CheckBox "Monta Lettore DVD", selezioniamo la RadioButton "File Immagine ISO" e clickiamo sul pulsante di esplorazione subito a destra. Clickiamo su "Aggiungi" e selezioniamo l'immagine iso di slackware che abbiamo scaricato. Clicchiamo su "Seleziona", poi su "OK". Clicchiamo su "Avvia" assicurandoci che la macchina 'slack0' sia selezionata. Ecco come si presenta all'avvio.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 250px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347655854446582610" border="0" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SjawqqFTm1I/AAAAAAAAANM/NWSP-Mh3__c/s400/imm.00.JPG" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;Premiamo invio e attendiamo il caricamento del kernel, quando ha finito scriviamo '1' e diamo invio in modo da poter scegliere la lingua della tastiera. Selezioniamo con le frecce 'qwerty/it.map' e diamo invio come in figura.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 222px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347656789609233218" border="0" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SjaxhF1dO0I/AAAAAAAAANU/hBepecfdjQI/s400/slackware1.jpg" /&gt;&lt;br /&gt;&lt;p&gt;Nella prossima schermata inseriamo '1' e diamo invio. Adessiamo scriviamo "root" e diamo invio. Impartiamo "cfdisk". Ecco come si presenta.&lt;/p&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 250px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347658556008904306" border="0" alt="" src="http://1.bp.blogspot.com/_Pti-0b5YBiE/SjazH6L9NnI/AAAAAAAAANc/-1QKmI28zsI/s400/untitled.JPG" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="justify"&gt;Usando le freccie destra e sinistra ci spostiamo su [New] e diamo invio. Selezioniamo [Primary] e nella schermata successiva inseriamo la dimensione della partizione di swap e diamo invio. Dato che è un sistema di prova ed è in macchina virtuale 20 mega sono più che sufficienti. A questo punto è già selezionata la voce [Beginning] e possiamo dare ancora invio. Ecco la nuova schermata.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 250px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347660177369204594" border="0" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/Sja0mSOYB3I/AAAAAAAAANk/eD8qmanpLsU/s400/untitled2.JPG" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Adesso impostiamo la partizione creata come SWAP.Usiamo ancora le frecce laterali per selzionare [TYPE] e diamo invio. Premiamo un tasto qualsiasi come dice la schermata e in quella successiva assicuriamoci che "Enter file system type" abbia valore 82 (altrimenti sciviamolo noi) e diamo invio. Adesso invece usiamo le frecce Su e Giù per spostarci nello spazio non partizionato e dopo usiamo le frecce laterali per spostarci di nuovo su [New] e diamo invio, selezioniamo [Primary] e diamo invio, e ancora invio per selezionare tutto lo spazio rimasto. Ancora usando le frecce laterali spostiamoci su [Write] e diamo invio. Digitiamo "yes" e diamo invio per scrivere la tabella delle partizioni. Quando ha finito spostiamo su [Quit] e diamo invio. Tornati al prompt impartiamo il comando "setup".Ecco cosa ci appare. Selezioniamo "ADDSWAP" e diamo invio.&lt;/p&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 222px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347662506616952498" border="0" alt="" src="http://4.bp.blogspot.com/_Pti-0b5YBiE/Sja2t3WUFrI/AAAAAAAAANs/99f54a3IYa4/s400/slackware5.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Il programma di installazione avrà già rilevato la partizione di swap, non ci resta che dare invio. Alla schermata successiva selezioniamo "NO" e diamo invio. Attendiamo la nuova schermata e diamo invio. Nella schermata successiva dovremmo selezionare la partizione di installazione. Il programma la avrà già rilevata, diamo invio. Ora selezioniamo "Format" e diamo invio. Selezioniamo "ext2" o "ext2" a voi la scelta e diamo invio. Attendiamo la nuova schermata e diamo ancora invio. Ora selezioniamo la voce numero 1 e diamo invio. Selezioniamo "auto" e ancora invio. Attendiamo che carichi l'iso. A noi interessa fare una installazione minimale, quindi nella schermata successiva utilizzando le frecce e la barra spaziatrice deselezioniamo tutte le voci tranne A,AP,N che sono le uniche categorie di pacchetti che ci interessano e diamo invio. Nella schermata successiva selezioniamo la voce "expert" e diamo invio. Adesso il programma ci mostrerà tutti i pacchetti contenuti nella categoria a. Diamo un'occhiata al file di testo scaricabile da questo post per sapere cosa selezionare e cosa no. Facciamo la stessa cosa anche con le categorie AP ed N. Selezionati i pacchetti attendiamo l'installazione. Ultimata l'operazione non ci resta che installare LILO e configurare le ultime cose. La schermata successiva all'installazione ci chiederà di creare un pendrive avviabile che a noi non serve quindi selezioniamo "skip" e andiamo avanti. Ora ci si presenta la schermata di installazione di LILO. Selezioniamo "simple" e diamo invio.Nella schermata successiva lasciamo tutto com'è e diamo invio.Stessa cosa per quella successiva e quella ancora dopo. Adesso selezioniamo "MBR" e diamo invio. La schermata successiva ci chiederà di installare il mouse. A noi non serve quindi diamo invio. Diamo invio anche a quella successiva. Adesso installiamo la rete. Selezioniamo "Yes" e diamo invio. Mettiamo come hostnome un nome di nostra fantasia ad esempio "slack0" e diamo invio. Scriviamo "slack0.org" nella successiva schermata e diamo invio. Ora selezioniamo "DHCP" e proseguiamo. Diamo invio alla schermata successiva e a quella dopo. Lasciamo l'autoavvio dei servizi così come è e proseguiamo. Diamo invio alla schermata successiva e a quella che segue selezioniamo "no". La lista che abbiamo davanti ci permette di selezionare l'ora locale. Selezioniamo quindi Europe/Rome e andiamo avanti. Ora impostiamo la nuova password di root se vogliamo a noi non interessa. Abbiamo finito. Confermiamo il termine dell'installazione e usciamo dal setup. Dalla barrà dei menù della macchina virtuale selezioniamo "Dispositivi" e poi "Smonta CD/DVD-ROM. Nel prompt impartiamo il comando "reboot" per riavviare. Al termine del riavvio ci ritroviamo nel bootloader LILO. Diamo invio per avviare Slackware. Terminato il caricamento possiamo autenticarci e iniziare ad usare Slackware. Una cosa che ci tornerà utile sarà clonare la nostra macchina. Infatti potremmo aver bisogno di una rete locale di macchine slackware collegate tra loro. Invece di effettuare altre installazioni, cloniamo quella che abbiamo già fatto. Sia che il virtualizzatore si trovi su un sistema Linux o Windows la procedura è pressocchè identica poichè utilizzeremo la console di VirtualBox. Il comando che utilizzeremo sarà: &lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;VBoxManage clonehd Nome_Disco_Origine.vdi Nome_Disco_Destinazione.vdi&lt;/em&gt; &lt;/p&gt;&lt;p align="justify"&gt;Nel caso precedente se il nome dell'hard disk virtuale che abbiamo creato è slack0 ci basta digitare:&lt;/p&gt;&lt;p align="justify"&gt;&lt;em&gt;VBoxManage slack0.vdi slack1.vdi&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;Per avere slack1 come copia esatta di slack0. A questo punto creiamo una nuova macchina virtuale come abbiamo visto in precedenza e selezioniamo l'hard disk virtuale che abbiamo creato. Ricordatevi inoltre di cambiare l'hostname delle varie macchine se non volete problemi con le reti.&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/pacchetti.zip"&gt;Download Elenco Pacchetti&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-276118569967645736?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/276118569967645736/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=276118569967645736' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/276118569967645736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/276118569967645736'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/06/installazione-slackware-su-macchina.html' title='Installazione Slackware su Macchina Virutale'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pti-0b5YBiE/SjawqqFTm1I/AAAAAAAAANM/NWSP-Mh3__c/s72-c/imm.00.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5079538609147670659</id><published>2009-05-04T21:17:00.008+02:00</published><updated>2009-07-31T15:25:07.676+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How to e bug'/><title type='text'>Ubuntu 9.04 primi problemi</title><content type='html'>&lt;div align="justify"&gt;Come ho già ribadito in altri post, di solito non mi occupo di bug di applicazioni e di TipsAndTricks ma lavorando prevalentemente con sistemi GNU-Linux mi sono trovato di fronte alcuni problemi relativi al nuovo upgrade di linux, tra i quali il mancato riconoscimento del controller di rete da parte di NetworkManager. Navigando in rete molti parlano di compilare driver, scaricare pacchetti o addirittura rimuovere NetworkManager. In realtà non si tratta di un problema di compatibilità con la scheda ma di un piccolo bug del programma. Infatti pare che dopo aver configurato la prima connessione pppoe il software si disattivi al primo riavvio. Per ovviare al problema basta digitare:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;sudo gedit '/etc/NetworkManager/nm-system-settings.conf' &lt;/em&gt;&lt;/div&gt;&lt;p align="justify"&gt;e sostituire nella voce "managed=false" , false con true e in seguito al riavvio riotterrete il controllo della scheda tramite NetworkManager. Se volete la connessione all'avvio del sistema rimuovete anche il plug-in ifupdown cancellando la parola "ifupdown". &lt;p align="justify"&gt;&lt;/p&gt;Piccola nota. Il bug sembra essere presente anche nella precedente versione di ubuntu. Lascio comunque il post così come è per annotare il problema.&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5079538609147670659?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5079538609147670659/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5079538609147670659' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5079538609147670659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5079538609147670659'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/05/ubuntu-904-primi-problemi.html' title='Ubuntu 9.04 primi problemi'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6281625857718246691</id><published>2009-05-01T11:56:00.004+02:00</published><updated>2009-05-01T14:28:10.446+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Confronti tra Equazioni Di Ricorrenza</title><content type='html'>Esempi di confronti tra equazioni di ricorrenza.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/confronti_ricorrenze.zip"&gt;Download 1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6281625857718246691?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6281625857718246691/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6281625857718246691' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6281625857718246691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6281625857718246691'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/05/confronti-tra-equazioni-di-ricorrenze.html' title='Confronti tra Equazioni Di Ricorrenza'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1030141271624293769</id><published>2009-05-01T11:48:00.018+02:00</published><updated>2011-10-28T10:46:54.777+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Risoluzione di Ricorrenze con Albero di Ricorsione</title><content type='html'>Esempi sulla risoluzione di equazioni di ricorrenza mediante albero di ricorsione.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/Metodo_AR.zip"&gt;Download 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/metodoAr2.zip"&gt;Download 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/ricorrenza_3.zip"&gt;Download 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il secondo archivio è stato modificato in data 08/05/2009 ore 16.04.&lt;br /&gt;Il terzo archivio è stato aggiunto in data 11/05/2009 ore 13.33&lt;br /&gt;Errata Corrige:&lt;br /&gt;Nel Download 2, nell'equazione 5T(n/3)+n^2 l'altezza dell'albero è log in base 3 di n.&lt;br /&gt;Nel Download 1, è stata sostituita la pagina 1 in data 04/06/2009 ore13.03&lt;br /&gt;Nel Download 1, sono state sostituite le pagine 8,9 in data 05/06/2009 ore 12.21.&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;"&gt;Nel Download 1 è stata sostituta la pagina 8. Modifica in data 02/09/10 ore 19.28&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-ansi-language: IT;"&gt;Nel Download 3, equazione 2T(n/2)+3T(n/3)+1 , il costo a livello i è 2^i (non 5) di conseguenza il risultato è O(n) ( non O(n^3)) , il resto della dimostrazione è esatto (errore di trascrizione). Inoltre nel disegno dell'albero sostituire n con 1 (poichè il costo di assemblamento è costante)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-ansi-language: IT;"&gt;Nel download 1, nel riquadro in rosso, c'era un errore di segno (un -2n al posto di 2n). L'errore è stato corretto il 28 ottobre 2011.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1030141271624293769?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1030141271624293769/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1030141271624293769' title='8 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1030141271624293769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1030141271624293769'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/05/risoluzione-di-ricorrenze-con-albero-di.html' title='Risoluzione di Ricorrenze con Albero di Ricorsione'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6652544459893078872</id><published>2009-03-22T17:42:00.008+01:00</published><updated>2009-03-23T22:25:18.710+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Gestione dei servizi di rete</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Demons di base per la gestione dei servizi&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Adesso ci occuperemo di come gestire i demoni per i servizi di rete. Il primo demone che analizzeremo sarà inetd. Questo demone ha il compito di avviare demoni client ogni qual volta questi hanno dei compiti da svolgere, e, una volta terminati, li chiude in modo del tutto trasparente. &lt;strong&gt;Inetd &lt;/strong&gt;rimane in ascolto delle porte di rete che normalmente sono gestite dai suoi demoni client e quando si verifica una connessione avvia il demone appropriato. Le impostazioni relative alle porte di rete su cui mettersi in ascolto si trovano nel file &lt;em&gt;inetd.conf&lt;/em&gt;. Un rigo di questo file ha una struttura del tipo:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;service type protocol wait user[.group] server cmdline&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;dove service rappresenta il servizio. L’associazione porta- servizio si trova sul file &lt;em&gt;/etc/services&lt;/em&gt;. Il campo type rappresenta il tipo di socket (stream o dgram), protocol il protocollo che deve essere presente nel file &lt;em&gt;/etc/protocols&lt;/em&gt;; il quarto campo che può assumere il valore wait o nowait. Se è impostato a wait inetd non genererà una nuova copia del demone ad ogni richiesta, se è impostato a nowait lo farà. Il campo user rappresenta l’utente ed eventualmente il gruppo sotto il quale avviare il demone. I campi rimanenti rappresentano i nomi qualificati del demone e i suoi argomenti di linea di comando. Il demone &lt;strong&gt;TCO&lt;/strong&gt; wrapper ha tra i suoi compiti quello di tenere traccia dei tentativi di connessione e di restringere l’accesso a seconda del servizio a cui si vuole accedere. Gli accessi ai servizi vengono impostati mediante i file&lt;em&gt; /etc/host.allow&lt;/em&gt; e &lt;em&gt;/etc/host.deny&lt;/em&gt; . Se nei file non ci sono corrispondenze viene consentito l’accesso. Una riga del file ha una struttura del tipo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;daemon_list : client_list [ : shell_command ]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;dove il primo campo rappresenta una lista di servizi ( si può impostare ALL per indicare tutti i servizi), il secondo campo rappresenta la lista dei client a cui il servizio è negato (nel file host.deny ) o consentito (nel file host.allow), l’ultimo campo rappresenta il comando da eseguire quando viene verificata la corrispondenza. Il campo client_list può essere specificato in diversi modi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;indirizzo_ipv4/netmask_ipv4&lt;/em&gt; per la rappresentazione classica&lt;br /&gt;&lt;em&gt;indirizzo_ipv4.&lt;/em&gt; per gli ip o domini che iniziano con il prefisso specificato&lt;br /&gt;&lt;em&gt;.indirizzo_ipv4&lt;/em&gt; per gli ip o domini che terminano con il suffisso specificato&lt;br /&gt;&lt;em&gt;ALL&lt;/em&gt; per indicare tutti gli ip&lt;br /&gt;&lt;em&gt;LOCAL&lt;/em&gt; per indicare gli indirizzi locali&lt;br /&gt;&lt;em&gt;PARANOID&lt;/em&gt; per indicare il nome che non corrisponde all'ip&lt;br /&gt;&lt;em&gt;KNOWN/UNKNOW&lt;/em&gt; per indicare un host con nome conosciuto o sconosciuto&lt;br /&gt;&lt;em&gt;EXCEPT&lt;/em&gt; utilizzato con un elenco di nomi per indicare gli host da escludere dalla condizione specificata&lt;br /&gt;&lt;br /&gt;Funzioni analoghe a TCP wrapper sono svolte da&lt;strong&gt; tcpd&lt;/strong&gt;. Questo demone si integra con inetd e funge da wrapper per tutti i servizi avviati da inetd. &lt;strong&gt;Xinetd&lt;/strong&gt; è stato di recente sostituito da inetd ma è ancora presente in molte distribuzioni. Il suo file di configurazione è &lt;em&gt;/etc/xinetd.conf&lt;/em&gt;, e contiene per ogni servizio una sezione del tipo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;service nomeservizio&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;{&lt;br /&gt;...&lt;br /&gt;attributo =+=-= valore&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Gli attributi sono &lt;em&gt;socket_type, protocol,wait, user, group, type, server, server_args&lt;/em&gt; con funzioni identiche a quelle viste per inetd. Si può inoltre specificare&lt;br /&gt;&lt;br /&gt;&lt;em&gt;id&lt;/em&gt; riferito da host.allow e host.deny per i servizi che appaiono in più sezioni per protocolli differenti.&lt;br /&gt;&lt;em&gt;disable&lt;/em&gt; per abilitare o disabilitare il servizio.&lt;br /&gt;&lt;em&gt;only_from, no_access&lt;/em&gt; per restringere o vietare l'accesso a determinati ip&lt;br /&gt;&lt;em&gt;access_time&lt;/em&gt; indica l’ orario in cui è consentito l'accesso.&lt;br /&gt;&lt;em&gt;log_type&lt;/em&gt; indica dove effettuare il log, su file o con syslog&lt;br /&gt;&lt;em&gt;log_on_success, log_on_failure&lt;/em&gt; indica le informazioni da includere nei log in caso si successo o fallimento. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Il demone &lt;strong&gt;portmap&lt;/strong&gt; si occupa,invece, della gestione dei servizi basati su RPC contenuti nel file &lt;em&gt;/etc/RPC&lt;/em&gt;. NFS è il demone che si occupa dell’esportazione dei file su computer remoti. Richiede portmap per il suo utilizzo, è efficace ed utilizzato in quasi tutti i sistemi Unix ma non prevede nessuna forma di autentificazione ( quindi si basa sul buon senso della progettazione della rete). Dal lato server, nfs richiede l’attivazione di alcuni demoni ma in molte distribuzioni ciò avviene in automatico. Questi demoni sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpc.mountd&lt;/em&gt; (gestione montaggio lato server)&lt;br /&gt;&lt;em&gt;rpc.nfsd&lt;/em&gt; (funzionalità userlevel, si agganciano al&lt;br /&gt;modulo del kernel).&lt;br /&gt;&lt;em&gt;rpc.lockd e rpc.statd&lt;/em&gt; (legati alla gestione dei lock)&lt;br /&gt;&lt;em&gt;rpc.rquotad&lt;/em&gt; (gestione quota su nfs)&lt;br /&gt;&lt;br /&gt;Il file di configurazione è &lt;em&gt;/etc/exports&lt;/em&gt; e contiene le informazioni sui file da esportare. La sua configurazione, molto intuitiva, è&lt;br /&gt;&lt;br /&gt;&lt;em&gt;cartella_di_partenza [nodo] [(opzioni)]...&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Alcune opzioni sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;ro&lt;/em&gt; (predefinita),&lt;br /&gt;&lt;em&gt;rw&lt;/em&gt; (modalità di accesso);&lt;br /&gt;&lt;em&gt;root_squash&lt;/em&gt;: (tutti gli accessi come root al file system condiviso vengono trasformati in accessi di nobody)&lt;br /&gt;&lt;em&gt;no_root_squash&lt;/em&gt; (funzione inversa a root_squash)&lt;br /&gt;&lt;br /&gt;Anche l’utilizzo è molto semplice, mediante il comando &lt;em&gt;exsportfs&lt;/em&gt; e i parametri&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-a&lt;/em&gt; per esportare tutto.&lt;br /&gt;&lt;em&gt;-u&lt;/em&gt; per disattivare l’esportazione delle cartelle indicate di seguito&lt;br /&gt;&lt;em&gt;-r&lt;/em&gt; per riesportare tutto.&lt;br /&gt;&lt;br /&gt;Il lato client richiede solamente che il kernel supporti il file system, e il montaggio avviene tramite il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$mount [opzioni] nodo_remoto:cartella_remota&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Opzioni particolari permettono di impostare timeout e dimensione dei pacchetti.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Demoni avanzati per la gestione dei servizi&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Il primo demone di cui ci occuperemo in questo paragrafo sarà &lt;strong&gt;sshd (Secure Shell Daemon).&lt;/strong&gt; In pratica è l’evoluzione del servizio telnet, si occupa di consentire l’accesso ad una shell remota, mediante la trasmissione di dati cifrati. I file di configurazione del client e del server si trovano in&lt;br /&gt;&lt;em&gt;/etc/ssh/&lt;/em&gt; (globali) ed in &lt;em&gt;$HOME/.ssh/&lt;/em&gt; . Le chiavi pubbliche per l’autentificazione con passphrase si devono aggiungere nel proprio file&lt;em&gt; ~/.ssh/authorized_keys&lt;/em&gt;. La chiave pubblica del server si aggiunge nel file &lt;em&gt;~/.ssh/known_hosts&lt;/em&gt;. Troveremo il file di configurazione di sshd in &lt;em&gt;/etc/ssh/sshd_config&lt;/em&gt;. Tra le tanti opzioni di configurazioni segnaliamo:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SyslogFacility/LogLevel&lt;/em&gt; per la configurazione dei log&lt;br /&gt;&lt;em&gt;Compression&lt;/em&gt; per abilitare o disabilitare la compressione dei dati trasmessi mediante gzip&lt;br /&gt;&lt;em&gt;PermitRootLogin&lt;/em&gt; per accedere al sistema come root&lt;br /&gt;&lt;em&gt;PasswordAuthentication e PubkeyAuthentication&lt;/em&gt; per abilitare/disabilitare l’autenticazione rispettivamente tramite password e tramite chiavi pubbliche (passphrase)&lt;br /&gt;&lt;em&gt;AllowUsers&lt;/em&gt; per riservare l'accesso esclusivamente agli utentispecificati. Possono essere utilizzati caratteri jolly (* e ?) e si può utilizzare anche la forma nomeutente@nomehost&lt;br /&gt;A&lt;em&gt;llowGroups&lt;/em&gt; come sopra per i gruppi.&lt;br /&gt;&lt;em&gt;DenyUsers e DenyGroups&lt;/em&gt; come sopra per negare l’accesso a utenti o gruppi.&lt;br /&gt;&lt;br /&gt;La configurazione del client si trova in &lt;em&gt;/etc/ssh/ssh_config&lt;/em&gt; e contiene molte opzioni come quelle già viste prima. Per la copia cifrata di file utilizzeremo il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$scp [opzioni] [[utente@]host:]origine [[utente@]host:]destinazione&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Tra le opzioni abbiamo a disposizione la copia ricorsiva con –r. Per gestire sessioni di lavoro remote utilizziamo il demone screen. Per la gestione delle sessioni utilizzeremo le combinazioni di tasti:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Ctrl-a n&lt;/em&gt;: per avviare una nuova sessione&lt;br /&gt;&lt;em&gt;Ctrl-a w:&lt;/em&gt; mostra la lista delle finestre attive&lt;br /&gt;&lt;em&gt;Ctrl-a Ctrl-a&lt;/em&gt;: passa alternativamente alla finestra precedente o successiva.&lt;br /&gt;&lt;em&gt;Ctrl-a SPAZIO&lt;/em&gt;: passa alla finestra successiva&lt;br /&gt;&lt;em&gt;Ctrl-a numero tra 1 e 9&lt;/em&gt;: passa alla finestra numero specificato&lt;br /&gt;&lt;em&gt;Ctrl-a d&lt;/em&gt; : stacca (detach) la finestra dalla sessione di terminale&lt;br /&gt;&lt;em&gt;Ctrl-a l&lt;/em&gt;: blocca tutte le sessioni di terminale&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0 Posta Elettronica&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In generale un sistema di mail consiste di quattro componenti distribuite:&lt;br /&gt;&lt;br /&gt;1) Un Mail User Agent (MUA) per leggere e comporre le mail&lt;br /&gt;2) Un Mail Transport Agent(MTA) per instradare le mail&lt;br /&gt;3) Un Delivery Agent per recapitare i messaggi&lt;br /&gt;4) Un Access Agent, opzionale, per connettere l’utente al deposito dei messaggi.&lt;br /&gt;&lt;br /&gt;Gli MTA più utilizzati sono sendmail , qmail e postfix. Troveremo il file di configurazione di postfix in &lt;em&gt;/etc/postfix/mail.cf&lt;/em&gt;. Le impostazioni sono del tipo nome=valore e abbiamo a disposizione numerosi campi quali: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;myhostname&lt;/em&gt; per il nome della macchina&lt;br /&gt;mydomain per il dominio della macchina&lt;br /&gt;&lt;em&gt;mynetworks&lt;/em&gt; per l'elenco delle reti a cui è connessa la macchina&lt;br /&gt;&lt;em&gt;myorigin&lt;/em&gt; per il dominio da utilizzare per la posta in uscita&lt;br /&gt;&lt;em&gt;mydestination&lt;/em&gt; per i domini per cui si accetta la posta in arrivo.&lt;br /&gt;&lt;em&gt;notify_classes&lt;/em&gt; per impostare l'elenco delle categorie di problemi che vanno&lt;br /&gt;segnalati alla casella del postmaster&lt;br /&gt;&lt;em&gt;alias_map&lt;/em&gt; e &lt;em&gt;alias_database&lt;/em&gt; per il percorso dei file di alias.Di solito gli alias si trovano in &lt;em&gt;/etc/aliases o /etc/postfix/alias&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;4.0 Apache&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Apache è attualmente il server web più diffuso al mondo, è multipiattaforma e prevede il caricamento di moduli per la gestione di funzioni aggiuntive. Vediamolo brevemente in generale. Reperiamo dal sito www.apache.org in quanto è free e open source.&lt;br /&gt;Il file di configurazione è &lt;em&gt;httpd.conf&lt;/em&gt; , ma è possibile aggiungere file di configurazione esterni mediante la direttiva Include, direttive opzionali mediante la sintassi (ricordiamo che per via dell'interprete html del blog sostituito i simboli &lt;&gt; con i simboli _ e _&lt;br /&gt;&lt;br /&gt;&lt;ifdefine&gt; _IfDefine nome condizione_&lt;br /&gt;.............&lt;br /&gt;_ /IfDefine_&lt;br /&gt;&lt;br /&gt;E direttive legati ai moduli aggiuntivi mediante&lt;br /&gt;&lt;br /&gt;&lt;ifmodule&gt;&lt;/ifdefine&gt; _ IfModule nomemodule _&lt;br /&gt;.............&lt;br /&gt;_  /IfDefine  _&lt;br /&gt;&lt;br /&gt;Alcune direttive di base sono elencate sotto:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;ServerType { standalone inetd }&lt;/em&gt; per avviare il server in modalità standalone o legato a inetd.&lt;br /&gt;&lt;em&gt;ServerName&lt;/em&gt; per impostare il nome del server risolvibile mediante DNS.&lt;br /&gt;&lt;em&gt;Port, Listen&lt;/em&gt; per rimanere in ascolto della porta primaria o di porte aggiuntive&lt;br /&gt;&lt;em&gt;User, Group&lt;/em&gt; per impostare utente e gruppo per i permessi dei quali gira apache&lt;br /&gt;&lt;em&gt;CustomLog, ErrorLog&lt;/em&gt; per settare i file di log per gli accessi e per gli errori&lt;br /&gt;&lt;em&gt;DocumentRoot&lt;/em&gt; per impostare la radice del sito&lt;br /&gt;&lt;em&gt;Alias&lt;/em&gt; per definire gli alias per le cartelle&lt;br /&gt;&lt;em&gt;ScriptAlias&lt;/em&gt; per definire gli alias per le cartelle contenenti Script CGI (ovvero script che generano pagine html da comandi passati via form.&lt;br /&gt;&lt;em&gt;LoadModule&lt;/em&gt; per caricare moduli aggiuntivi&lt;br /&gt;&lt;br /&gt;Le opzioni specifiche per una data cartella vengono indicate mediante la sintassi&lt;br /&gt;&lt;br /&gt;&lt;directory&gt;_   Directory nomedir _&lt;br /&gt;Opzioni....&lt;/div&gt;&lt;div align="justify"&gt;_  /Directory  _&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Tra le opzioni abbiamo:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;AllowOverride,Auth*&lt;/em&gt; per l’accesso.&lt;br /&gt;&lt;em&gt;Option&lt;/em&gt;: parametri (None: nessuno, All: tutti).&lt;br /&gt;&lt;em&gt;Indexes&lt;/em&gt;:per visualizzare il contenuto della cartella.&lt;br /&gt;&lt;em&gt;FollowSymLinks&lt;/em&gt;: segue i link simbolici.&lt;br /&gt;&lt;em&gt;SymLinksIfOwnerMatch:&lt;/em&gt; segue i link simbolici, se il proprietario coincide&lt;br /&gt;&lt;em&gt;ExecCGI:&lt;/em&gt; la cartella contiene script CGI che è possibile eseguire.&lt;br /&gt;&lt;em&gt;order&lt;/em&gt;: indica l'ordine con cui vengono considerate le direttive allow e deny.&lt;br /&gt;&lt;br /&gt;Si possono utilizzare gli operatori + e – per aggiungere o togliere le opzioni per i livelli superiori.&lt;br /&gt;Apache supporta il sistema di virual hosts per individuare ogni host con un indirizzo Ip differente o per identificare più siti con un IP. Gli host virtuali si definiscono mediante la sintassi&lt;br /&gt;&lt;br /&gt;&lt;virtualhost&gt;&lt;/virtualhost&gt;_   VirtualHost ip  _&lt;br /&gt;...&lt;br /&gt;_    /VirtualHost  _&lt;br /&gt;&lt;br /&gt;Dove il valore ip deve coincidere con quello specificato nel parametro precedentemente settato&lt;br /&gt;&lt;br /&gt;&lt;em&gt;NameVirtualHost ip&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Che indica l’indirizzo che rimane in ascolto delle richieste. Ricordiamoci che ogni host virtuale va configurato e ciò dipende dal tipo di versione Unix installata, solitamente mediante il comando &lt;em&gt;ifconfig.&lt;/em&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6652544459893078872?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6652544459893078872/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6652544459893078872' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6652544459893078872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6652544459893078872'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/gestione-dei-servizi-di-rete.html' title='Gestione dei servizi di rete'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1917843490045438907</id><published>2009-03-21T17:47:00.002+01:00</published><updated>2009-03-21T17:52:44.213+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Gestione dei moduli del kernel</title><content type='html'>&lt;div align="justify"&gt;Un kernel Unix tradizionalmente presenta una struttura monolitica. In questa struttura particolari componenti possono essere agganciati al kernel in runtime mediante chiamate di sistema. Questi componenti vengono chiamati &lt;strong&gt;moduli&lt;/strong&gt;. La presenza dei moduli semplifica la realizzazione di nuovi componenti e permette di caricare in memoria solo quello che è richiesto, anche se questa operazione ha i suoi costi. I moduli vengono gestiti medianti appositi tools: &lt;strong&gt;modutils &lt;/strong&gt;per i vecchi kernel e &lt;strong&gt;module-init-tools&lt;/strong&gt; a partire dai kernel 2.6.x. Essi sono situati nella directory&lt;em&gt; /lib/modules/_versione_del_kernel&lt;/em&gt; e sono in formato .o per i vecchi kernel e .ko per i nuovi. Per visionare i moduli presenti in memoria con i realtivi moduli dipendenti si impartisce il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$lsmod&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Oppure&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$modinfo [opzioni] modulo&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Per le informazioni su un modulo specifico.&lt;br /&gt;&lt;br /&gt;Per caricare un modulo in memoria si digita&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$insmod [opzioni] modulo [parametri]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Impostando l’opzione –f si può forzare il caricamento del modulo ignorando eventuali errori.&lt;br /&gt;Per rimuovere un modulo invece&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$rmmod [opzioni] modulo&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Anche qui vale l’opzione –f.&lt;br /&gt;Il file &lt;em&gt;modules.dep&lt;/em&gt; localizzato in &lt;em&gt;/lib/version/_nome_versione_&lt;/em&gt; , contiene le informazioni sulle dipendenze dei moduli. Il file può essere rigenerato con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$depmod  [opzioni]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$modprobe [opzioni] modulo [parametri]&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Permette di caricare moduli o rimuoverli se si imposta l’opzione –r, risolvendo le dipendenze. Il file di configurazione di questo comando è modero.conf situato in /etc. Alcune opzioni sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;options nome_modulo opzioni&lt;/em&gt; per aggiungere automaticamente le opzioni al modulo quando viene caricato&lt;br /&gt;&lt;br /&gt;&lt;em&gt;alias nome_alias nome modulo&lt;/em&gt; per dare un alias al modulo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;include nome_file&lt;/em&gt; per aggiungere file di configurazione esterno&lt;br /&gt;&lt;br /&gt;&lt;em&gt;install nome_modulo comando&lt;/em&gt; per eseguire un comando al caricamento del modulo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;remove nomemodulo comando&lt;/em&gt; si comporta come install per la rimozione del modulo.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Per compilare un kernel linux, si eseguono i passi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$make xconfig&lt;/em&gt; &lt;br /&gt;     &lt;br /&gt;Se si esegue in X Windows altrimenti&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$make menuconfig&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Si impartisce poi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$make&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;O&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$make install&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;E poi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$make modules_install&lt;/em&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1917843490045438907?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1917843490045438907/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1917843490045438907' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1917843490045438907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1917843490045438907'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/gestione-dei-moduli-del-kernel.html' title='Gestione dei moduli del kernel'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-657353027838044378</id><published>2009-03-21T17:44:00.001+01:00</published><updated>2009-03-21T17:52:44.214+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Scheduling dei Comandi</title><content type='html'>&lt;div align="justify"&gt;Per rendere efficiente un sistema è necessario automatizzare buona parte dei compiti che vengono eseguiti con una regolare frequenza.Tali operazioni possono essere effettuate dai &lt;strong&gt;daemons&lt;/strong&gt;. Di seguito vedremo alcuni demoni per l’esecuzione periodica dei comandi.&lt;br /&gt;Cron è un demone che consente di pianificare l’esecuzione di determinati programmi. La configurazione di questi programmi si trova nel file &lt;em&gt;/etc/crontab&lt;/em&gt;. Ogni utente può inoltre avere il proprio &lt;strong&gt;CRON&lt;/strong&gt; mediante il comando crontab che memorizza il file di configurazione nella directory &lt;em&gt;/var/spool/cron/crontabs&lt;/em&gt;. Questa possibilità può essere negata o consentita mediante la creazione di opportuni file in &lt;em&gt;cron.deny&lt;/em&gt; e &lt;em&gt;cron.allow&lt;/em&gt; nella directory &lt;em&gt;/etc/&lt;/em&gt;. il file crontab presenta la seguente struttura:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;minuto ora giorno mese giornosett utente comandi&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Per i cron dei singoli utenti non è presente la voce utente. I campi relativi al tempo di esecuzione sono valori numerici che rispettano la semantica del campo stesso. Si può inoltre specificare un intervallo con il simbolo – all’interno di due valori, un qualunque valore con il simbolo * o ancora una serie di valori separati da una virgola. Il campo utente rappresenta l’utente per il quale si vuole attivare il comando, e comando l’operazione da eseguire. Alcuni comandi utili sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;crontab -e&lt;/em&gt; modifica il proprio crontab&lt;br /&gt;&lt;em&gt;crontab -l&lt;/em&gt; visualizza il proprio crontab&lt;br /&gt;&lt;em&gt;crontab -r&lt;/em&gt; rimuove il proprio crontab&lt;br /&gt;&lt;br /&gt;Un demone simile a cron è &lt;strong&gt;anacron&lt;/strong&gt;, la cui frequenza di aggiornamento va specifica in giorni, e quindi assume che la macchina non resti sempre accesa. Il demone &lt;strong&gt;at&lt;/strong&gt; esegue, invece, singoli comandi ad orari specifici presi da una coda di comandi. Come per cron è possibile avere demoni at personalizzati mediante la creazione di opportuni file &lt;em&gt;at.deny&lt;/em&gt; e &lt;em&gt;at.allow&lt;/em&gt; in &lt;em&gt;/etc/&lt;/em&gt;. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-657353027838044378?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/657353027838044378/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=657353027838044378' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/657353027838044378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/657353027838044378'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/scheduling-dei-comandi.html' title='Scheduling dei Comandi'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5833305119491386928</id><published>2009-03-21T15:16:00.000+01:00</published><updated>2009-03-21T15:17:56.195+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>File di Log</title><content type='html'>&lt;div align="justify"&gt;I file di log hanno il compito di tenere traccia di errori e di particolari azioni compiute da alcune applicazioni. Contengono molte informazioni utile al fine di diagnosticare problemi e capire il comportamento delle applicazioni. &lt;strong&gt;Syslog&lt;/strong&gt; è un demone che si occupa di gestire i log di sistema. Le distribuzioni Linux più recenti includono&lt;strong&gt; sysklogd&lt;/strong&gt; che permette il log dei messaggi del kernel. In particolare vi è un file che permette di configurare le azioni da intraprendere in base all’evento di log ricevuto.Si tratta di syslog.conf. Ogni riga di questo file contiene due voci: una relativa al selettore e una relativa all’azione. La sintassi base di selettore è&lt;br /&gt;&lt;br /&gt;facility.livello&lt;br /&gt;&lt;br /&gt;facility indica la categoria di applicazione che ha inviato il log, ad esempio&lt;br /&gt;&lt;br /&gt;– kern: kernel&lt;br /&gt;– user: generici processi utente&lt;br /&gt;– mail: server di posta e programmi accessori&lt;br /&gt;– daemon: demoni di sistema&lt;br /&gt;– auth: comandi relativi alla sicurezza&lt;br /&gt;– local0, ..., local7: messaggi locali.&lt;br /&gt;– ............&lt;br /&gt;– * indica qualsiasi tipo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Livello indica invece la gravità dell’azione. In ordine decrescente abbiamo&lt;br /&gt;&lt;br /&gt;– emerg&lt;br /&gt;– aler&lt;br /&gt;– crit&lt;br /&gt;– err&lt;br /&gt;– warning&lt;br /&gt;– notice&lt;br /&gt;– info&lt;br /&gt;– debug&lt;br /&gt;-*&lt;br /&gt;&lt;br /&gt;Le versioni più recenti introducono per i livelli i caratteri = e ! per rendere più flessibili  i livelli.Inoltre sono ammessi più livelli separati da ; o ,.&lt;br /&gt;&lt;br /&gt;Azione può,invece, assumere i valori&lt;br /&gt;&lt;br /&gt;filename (percorso assoluto, anche un device)&lt;br /&gt;@hostname, @ipaddress: verso il demone syslog della macchina specificata.&lt;br /&gt;utente1 [, utente2, ...]: scrive un messaggio nella console degli utenti specificati&lt;br /&gt;*: scrive un messaggio su tutti i terminali degli utenti connessi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Per evitare che i file di log proliferino in modo incontrollato, il demone logrotate  archivia e comprime i vecchi file di log in base ad un timer indicato. Questa e altre impostazioni sono archiviate in &lt;em&gt;/etc/logrotate.conf&lt;/em&gt; . Questo file e tutti i file con le impostazioni relative ai programmi sono contenuti nella directory &lt;em&gt;/etc/logrotate.d&lt;/em&gt; . Alcune opzioni sono:&lt;br /&gt;&lt;br /&gt;Intervallo di rotazione: daily,weekly,monthly,&lt;br /&gt;Size: limite di grandezza di un log oltre il quale scatta la rotazione.&lt;br /&gt;postrotate/endscript: script da eseguire dopo la rotazione.&lt;br /&gt;prerotate/endscript: script da eseguire prima della rotazione.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5833305119491386928?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5833305119491386928/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5833305119491386928' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5833305119491386928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5833305119491386928'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/file-di-log.html' title='File di Log'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-294116057376015484</id><published>2009-03-21T13:47:00.007+01:00</published><updated>2010-02-19T22:45:30.228+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Script Unix</title><content type='html'>&lt;div align="justify"&gt;Alla base della programmazione Unix vi è una filosofia per la quale tutto è realizzato mediante la composizione di programmi semplici, ciascuno specializzato per una particolare funzione. Tale filosofia prende il nome di KISS (Keep it simple stupid!). In questo post vedremo come realizzare dei semplici script. Il primo elemento con cui prederemo confidenza è la variabile. Una variabile si ottiene senza dichiarazione mediante il comando:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;nome_variabile=valore&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;e se ne ottiene l’accesso mediante $&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$nome_variabile.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Si può stampare a schermo il valore mediante:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;echo $nome_variabile&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;o per maggiore chiarezza si può scrivere nella forma&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;echo &amp;amp;{nome_variabile}&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Alcune variabili &lt;strong&gt;(PATH,HOME,PS1)&lt;/strong&gt; hanno valore fondamentale per il sistema e si possono utilizzare mediante il comando set. Per permettere ad una variabile di essere utilizzata da altri programmi avviati dalla stessa shell, essa va esportata con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;export nome_variabile&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Alcuni lunghi comandi possono essere richiamati memorizzandoli come alias. Ciò può essere ottenuto con una semplice dichiarazione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;alias nome_alias=comando&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Se vogliamo rimuovere un’alias scriviamo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;unalias nome_alias&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;oppure&lt;br /&gt;&lt;br /&gt;&lt;em&gt;unalias –a&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;per rimuovere tutti gli alias. Alcuni caratteri hanno un preciso valore per la shell e sono detti metacaratteri; rimane comunque possibile privare il carattere del suo senso di metacarattere. Con il metacarattere&lt;br /&gt;&lt;br /&gt;&lt;em&gt;\&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Seguito da un carattere, quest’ultimo perde il suo valore. Se invece racchiudiamo tra apici una sequenza di caratteri questi mantengono il loro significato letterale ad eccezione di $,’,/ ?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;‘ ’&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;` (apice inverso)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;seguito da un comando, questo verrà sostituito dal suo output. In uno script i commenti vanno inseriti dopo un&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Il primo rigo di un programma contiene un commento speciale chiamato bang path ed indica il nome del programma ed i suoi parametri. La shell mette a disposizione una serie di parametri predefiniti preceduti da $ Ad esempio:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$n&lt;/em&gt; : l’n-esimo parametro passato linea di comando. Se sono più di uno vanno racchiusi tra { }&lt;br /&gt;&lt;em&gt;$0&lt;/em&gt;: il nome dello script.&lt;br /&gt;&lt;em&gt;$*&lt;/em&gt; : se è utilizzato all'interno di apici doppi,indica un'unica parola contenente tutti i parametripassati a linea di comando, separati dal contenuto del primo carattere della variabile d'ambiente IFS. IFS normalmente contiene &lt;sp&gt;&lt;ht&gt;&lt;lf&gt;.&lt;br /&gt;&lt;em&gt;$@&lt;/em&gt; : comportamento simile a quello di $* m a differenza di quest'ultimo, se utilizzato all'interno di apici doppi, rappresenta una lista di parole, una per ogni parametro.&lt;br /&gt;&lt;em&gt;shift num&lt;/em&gt;: trasla i parametri da [$#-num+1, $#] in [$1, $#-num].&lt;br /&gt;$#: indica il numero dei parametri.&lt;br /&gt;&lt;br /&gt;Per la selezione utilizzeremo il costrutto&lt;br /&gt;&lt;br /&gt;&lt;em&gt;if condizione&lt;br /&gt;then comandi&lt;br /&gt;[&lt;br /&gt;elif condizione2&lt;br /&gt;then comandi&lt;br /&gt;]&lt;br /&gt;else comandi&lt;br /&gt;fi&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Le condizioni possono essere comandi o serie di comandi legati da operatori logici che restituiscono 0 o 1. Se il valore restituito è 0 la condizione è vera altrimenti è falsa. Gli operatori logici sono &amp;amp;&amp;amp;,,&amp;amp;. In alcuni casi può essere utili ricorrere al dispositivo speciale /dev/null per sopprire l’output di un programma. Le espressioni aritmetiche possono essere eseguite mediante il comando let e i tradizionali operatori,eventualmente racchiuse tra (). È possibile, inoltre, utilizzare espressioni condizionali racchiudendole tra [] o utilizzando il comando test. Si possono usare i tradizionali operatori (==,!=,&lt;,&gt;) e altri quali&lt;br /&gt;&lt;br /&gt;z stringa: controlla se stringa è vuota.&lt;br /&gt;&lt;em&gt;e file&lt;/em&gt;: controlla se file è vuoto.&lt;br /&gt;&lt;em&gt;d file&lt;/em&gt;: se file esiste ed è una directory.&lt;br /&gt;&lt;em&gt;file1 –nt file2&lt;/em&gt;: se file1 è stato modificato dopo file2.&lt;br /&gt;……&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il ciclo for presenta una doppia sintassi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;for variabile [in lista]&lt;br /&gt;do&lt;br /&gt;comandi&lt;br /&gt;done&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e&lt;br /&gt;&lt;br /&gt;&lt;em&gt;for ((expr1; expr2; expr3))&lt;br /&gt;do&lt;br /&gt;comandi&lt;br /&gt;done&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;In modo analogo i comandi while :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;while listacomandirestituiscevero&lt;br /&gt;do&lt;br /&gt;comandi&lt;br /&gt;done&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e untill:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;until listacomandirestituiscefalso&lt;br /&gt;do&lt;br /&gt;comandi&lt;br /&gt;done&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;É possibile utilizzare anche il costrutto switch case mediante:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;case parola in&lt;br /&gt;[modello [ modello]... )&lt;br /&gt;lista_di_comandi ;; ]&lt;br /&gt;...&lt;br /&gt;[*) lista_di_comandi ;; ]&lt;br /&gt;esac&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;dove modello rappresenta un pattern. Le subroutine vengono definite con la sintassi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;[function] nomefunzione()&lt;br /&gt;{&lt;br /&gt;corpofunzione&lt;br /&gt;}&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;E in questo caso le variabili $1,$2… tranne $0 si riferiscono ai parametri della funzione. Per le varaibili locali si usa la direttiva local. Gli input da tastiera vengono letti mediante il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;read [opzioni] [nomevar1 nomevar2 ...]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dove opzioni può assumere valori come:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-s&lt;/em&gt; per silent mode, come nelle password&lt;br /&gt;&lt;em&gt;-n num&lt;/em&gt; per la lettura di num valori.&lt;br /&gt;&lt;br /&gt;Semplici menù interattivi sono impiegati mediante&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;select nomescelta [in lista]&lt;br /&gt;do&lt;br /&gt;comandi&lt;br /&gt;done&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Se “in lista” non è specificato, vengono utilizzati i parametri posizionali ($1, $2, ..). Altri utili comandi sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;sort [opzioni] [file...]&lt;/em&gt; per l’ordinamento sul testo in input&lt;br /&gt;&lt;em&gt;find [percorso...] [espressione]&lt;/em&gt; ricerca file ed esegue comandi in corrispondenza di essi.&lt;br /&gt;&lt;em&gt;grep [opzioni] modello [file...]&lt;/em&gt; per la ricerca di sottostringhe.&lt;br /&gt;&lt;em&gt;sed [opzioni] [programma_di_elaborazione] [file...]&lt;/em&gt; per modificare al volo il testo ricevuto in input.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;L’espressione regolare è un sistema di regole che permette di definire pattern di ricerca, ad esempio per cercare determinate occorrenze di caratteri in una stringa. Vedremo brevemente buona parte di queste regole. I caratteri che utilizzeremo per definire i pattern sono:&lt;br /&gt;&lt;br /&gt;. per indicare un singolo carattere.&lt;br /&gt;^ per indicare l’inizio di una riga.&lt;br /&gt;\ per neutralizzare il metacarattere che lo segue.&lt;br /&gt;$ per indicare la fine di una riga.&lt;br /&gt;[] per indicare qualsiasi carattere racchiuso tra parentesi quadre. Con un trattino tra due caratteri si indica uno specifico intervallo.&lt;br /&gt;[^] per indicare qualsiasi carattere esclusi quelli indicati tra paratesi quadre.&lt;br /&gt;Due coppie di queste parentesi indicano una qualunque coppia tra un carattere di una coppia di parentesi e l’altra: ad esempio [ab][cd] vuol dire ac, ad, bc e bd. Stessa cosa per [^].&lt;br /&gt;&lt;br /&gt;Per indicare il numero di occorrenze di un carattere utilizzeremo:&lt;br /&gt;&lt;br /&gt;? per 0 o 1 occorrenza&lt;br /&gt;+ per una o più volte.&lt;br /&gt;* zero o più volte&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-294116057376015484?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/294116057376015484/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=294116057376015484' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/294116057376015484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/294116057376015484'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/script-unix.html' title='Script Unix'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4025414835604760929</id><published>2009-03-21T11:37:00.006+01:00</published><updated>2009-03-21T11:43:31.418+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Gestione file GNU/Linux</title><content type='html'>&lt;div align="justify"&gt;In questo post vedremo come utilizzare i comandi per la gestione dei file. Il primo comando da analizzare sarà&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$ls [opzione] [nome]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Impostando l’opzione –l ,esso fornirà in output informazioni sul file quali nome,tipo, permessi,  quantità di collegamenti fisici, nome dell'utente proprietario, nome del gruppo, dimensione in byte, e data di modifica. Tali informazioni saranno rappresentate utilizzando per il tipo i caratteri:&lt;br /&gt;&lt;br /&gt;d: indica una directory.&lt;br /&gt;-: indica un file.&lt;br /&gt;b: dispositivo a blocchi.&lt;br /&gt;s: socket.&lt;br /&gt;p: pipe.&lt;br /&gt;l: link simbolico.&lt;br /&gt;&lt;br /&gt;Per i permessi:&lt;br /&gt;&lt;br /&gt;r:  lettura.&lt;br /&gt;w: scrittura.&lt;br /&gt;x: esecuzione.&lt;br /&gt;X: si comporta come x, ma interviene sulle directory e solo sui file che hanno già un permesso di esecuzione per un utente qualunque.&lt;br /&gt;s: si applica solo i file eseguibili e le directory. Attiva il bit SUID o SGID a seconda se si agisce sull’utente, sul gruppo o su entrambi.&lt;br /&gt;t: riguarda solo i file eseguibili e le directory. Attiva il bit Sticky. &lt;br /&gt;u: attribuisce le stesse modalità dei permessi che ha già l'utente proprietario di quel file. &lt;br /&gt;g: attribuisce le stesse modalità dei permessi che ha già il gruppo proprietario di quel file. &lt;br /&gt;o:attribuisce le stesse modalità dei permessi che hanno già gli altri utenti per quel file. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Per le categorie di utenti:&lt;br /&gt;&lt;br /&gt;u: proprietario.&lt;br /&gt;g: gruppo.&lt;br /&gt;o: altro.&lt;br /&gt;a: tutti gli utenti.&lt;br /&gt;&lt;br /&gt;In alternativa a ls è possibile usare stat per avere informazioni sui file in output formattato.&lt;br /&gt;I caratteri di permessi possono essere considerati dei bit ( 4 per r, 2 per w e 1 per x), ed i permessi per ogni categoria di utenti come l’OR tra i bit relativi. Il comando chmod supporta entrambe le modalità. Esso va utilizzato con la sintassi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$chmod [opzioni] modalità file&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Vediamo come esprimere la modalità:&lt;br /&gt;&lt;br /&gt;-La combinazione di lettere u,g,o,a esprime la categoria di utenti.&lt;br /&gt;-I segni +,-,= indicano il tipo di modifica sui cambiamenti e in particolare:&lt;br /&gt;   +: le modalità dei permessi indicati sono aggiunti a quelli precedenti.&lt;br /&gt;   -: le modalità dei permessi indicati sono tolti a quelli precedenti.&lt;br /&gt;   =: le modalità dei permessi vengono impostati esattamente come indicati.&lt;br /&gt;-Il gruppo finale di lettere r, w, x, X, s, t, u, g, o indica i permessi su cui agire.&lt;br /&gt;&lt;br /&gt;Il comando $umask [modalità] permette di impostare i permessi predefiniti per i file, ovvero i permessi impostati alla creazione del file stesso dal programma che lo ha generato. Solitamente la modalità va inserita in codifica ottale.&lt;br /&gt;L’utente e il gruppo di appartenenza può essere modificato mediante i comandi&lt;em&gt; chown&lt;/em&gt; e &lt;em&gt;chgrp.&lt;/em&gt; La sintassi è&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$chown [opzioni] nuovo_utente file &lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Oppure&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$chown [opzioni] nuovo_utente nuovo_gruppo  file&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;per cambiare anche il gruppo. Per chgrp la sintassi è&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$chgrp [opzioni] nuovo_gruppo file&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Vediamo alcuni comandi per operare con i file:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$cp [opzioni] file_sorgente file_destinazione&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Copia  un file dalla sorgente alla destinazione. Si possono utilizzare le opzioni –r per la copia ricorsiva e –a per la copia ricorsiva conservando i permessi.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$mv [opzioni] file_sorgente file_destinazione&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Sposta un file se la destinazione è una directory altrimenti rinomina.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$rm file&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Cancella un file.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$mkdir  directory&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Crea una directory&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$rmdir directory&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Elimina una directory vuota.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$ln [opzioni] target link_name&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Tenta di creare un link fisico a target (target deve trovarsi nella stessa partizione). Con l’opzione –s crea un link simbolico.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$gzip [opzioni] nome_file&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&amp;amp;gunzip [opzioni] nome_file&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Rispettivamente comprimono e decomprimono un file alla volta sostituendo il file originale.&lt;br /&gt;Analogamente a questi comandi è possibile utilizzare bizip2 e bunzip2 che sfruttano un algoritmo differente.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$tar [operazione] [opzione] file&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Tar (tape archiver) è nato per gestire ( e lo fa tutt’ora) nastri di backup. In GNU permette di richiamare al volo gzip/gunzip o bizip2/gunzip2 con i parametri imposti –z e –j.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$zip [opzioni] file.zip  [file…..]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Comprime in un archivio file.zip i file specificati.Come opzione è possibile utilizzare un intero tra   -1 e -9 per indicare il tasso di compressione (come in gzip e bzip)  o –r per la compressione ricorsiva. Per la decompressione si utilizza il comando unzip.&lt;br /&gt;&lt;br /&gt;Vediamo adesso come gestire partizioni.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$mount [-o opzioni] [-t tipo] device punto_di_montaggio&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Senza parametri mostra i file system montati. Se supportato dal kernel è possibile specificare un’immagine di file system tramite l’opzione loop.Il parametro [tipo] indica il tipo di file system. Il dispositivo può essere smontato mediante il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$unmount punto_di_ montaggio&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Il comando&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$df [-h]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Mostra l’occupazione del file system. Tutte le informazioni statiche del file system sono contenute nel file &lt;em&gt;/etc/fstab/&lt;/em&gt;. I file system attualmente montati si trovano invece nel file&lt;em&gt; /etc/mtab&lt;/em&gt;.Tali file pososno essere modificate per impostare le quote se supportate dal file system. Alcune opzioni importanti sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-noauto:&lt;/em&gt; disattiva il mounting automatico all’avvio del sistema.&lt;br /&gt;&lt;em&gt;-user:&lt;/em&gt; il file system relativo può essere montato dagli utenti senza però ulteriori modifiche.&lt;br /&gt;&lt;br /&gt;Un controllo di accesso più dettagliato rispetto a quello standard è rappresentato da &lt;strong&gt;ACL (Access Control List).&lt;/strong&gt; Tale sistema può essere attivato aggiungendo l’opzione acl nella relativa voce nel file fstab. Vediamo alcuni comandi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$setfacl -m u:[utente]:permessi file1 [file2 ...]&lt;/em&gt;  assegna i permessi ad utente&lt;br /&gt;&lt;em&gt;$setfacl -m g:[gruppo]:permessi file1 [file2 ...]&lt;/em&gt; assegna i permessi a gruppo&lt;br /&gt;&lt;em&gt;$setfacl -m o:permessi file1 [file2 ...]&lt;/em&gt; assegna i permessi agli altri&lt;br /&gt;&lt;em&gt;$setfacl -m m:permessi file1 [file2 ...]&lt;/em&gt; imposta la umask predefinita&lt;br /&gt;&lt;em&gt;$setfacl -x u:[utente] file1 [file2...]&lt;/em&gt; rimuove utente dall'acl&lt;br /&gt;&lt;em&gt;$setfacl -x g:[gruppo] file1 [file2...]&lt;/em&gt; rimuove gruppo dall'acl&lt;br /&gt;&lt;em&gt;$setfacl -b file1 [file2 ...]&lt;/em&gt; ripristina l'acl predefinita&lt;br /&gt;&lt;em&gt;$setfacl --restore=nomefile&lt;/em&gt; ripristina le acl salvate in nomefile, generate tramite getfacl –R. L’opzione –R indica l’applicazione ricorsiva.&lt;br /&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4025414835604760929?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4025414835604760929/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4025414835604760929' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4025414835604760929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4025414835604760929'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/gestione-file-gnulinux.html' title='Gestione file GNU/Linux'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5347177451685042950</id><published>2009-03-19T16:44:00.005+01:00</published><updated>2009-03-19T16:51:54.324+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Gestione degli Utenti in GNU/Linux</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0  Introduzione&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Le operazioni di gestione degli user accounts  sono di vitale importanza per un amministratore di sistema. In questo post vedremo come effettuare le operazioni fondamentali per la gestione degli utenti GNU/Linux. Il file &lt;em&gt;/etc/passwd&lt;/em&gt; è un elenco mantenuto dal sistema per il riconoscimento degli utenti, ed è utilizzato per  verificarne le credenziali.Ciascuna linea del file rappresenta un utente specifico ed è composto da 7 campi:&lt;br /&gt;&lt;br /&gt;-          username&lt;br /&gt;-          password crittografata&lt;br /&gt;-          numero UID&lt;br /&gt;-          numero di GID&lt;br /&gt;-          informazioni GECOS&lt;br /&gt;-          home directory&lt;br /&gt;-          shell di login&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il nome utente rappresenta il nome con cui l’utente effettua il login, solitamente non più lungo di 8 caratteri e deve individuare univocamente l’utente. Il campo password permette l’accesso al solo utente proprietario dell’account. Il numero UID è composto da un intero a 32 bit ed individua univocamente un account utente. Il GID è un numero ID identificativo di un gruppo utenti ed è espresso con un intero a 16 o 32 bit. Il campo GECOS memorizza una serie di informazioni personali quali nome,cognome e numero di telefono. Tutti gli utenti avranno una quota disco posizionata nella relativa directory individuata dal campo home directory. Infine il campo shell rappresenta l’interprete di comandi per ciascun utente. Il file &lt;em&gt;/etc/shadow/&lt;/em&gt; mantiene le informazioni relative alle scadenze delle password degli utenti. La scadenza della password permette di disabilitare  l’accesso di un utente che non ha cambiato la sua password per un numero definito a priori di giorni..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0  Operazioni con gli utenti&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Vediamo le operazioni di base per gestire utenti e gruppi. La prima operazione da apprendere è sicuramente l’aggiunta di un utente. Il comando che ci permette di farlo è &lt;em&gt;useradd&lt;/em&gt; che può utilizzare tutti i parametri presenti nel file &lt;em&gt;/etc/passwd&lt;/em&gt;. Per i parametri omessi verranno utilizzati valori di default. L’opzione &lt;em&gt;–m&lt;/em&gt; permette di specificare la home directory dell’utente. È possibile utilizzare un frontend per la creazione degli utenti con &lt;em&gt;adduser.&lt;/em&gt; Per la modifica e la rimozione degli utenti utilizziamo i comandi &lt;em&gt;usermod &lt;/em&gt;e &lt;em&gt;userdel.&lt;/em&gt; Quest’ultimo può utilizzare il parametro &lt;em&gt;–r&lt;/em&gt; per eliminare tutti i file associati all’utente. I campi di &lt;em&gt;/etc/shadow/&lt;/em&gt; possono essere modificati con il comando &lt;em&gt;chage&lt;/em&gt;. La password può essere modificata con il comando &lt;em&gt;passwd&lt;/em&gt;, il quale chiederà l’inserimento della password due volte per avere conferma. I parametri &lt;em&gt;–l&lt;/em&gt; e &lt;em&gt;–u&lt;/em&gt; del comando &lt;em&gt;passwd&lt;/em&gt; permettono di bloccare e sbloccare l’account.Il parametro &lt;em&gt;–S&lt;/em&gt;, invece, visualizza lo stato dell’account. Il messaggio di benvenuto dell’utente si trova nel file &lt;em&gt;/etc/motd&lt;/em&gt;. I gruppi si gestiscono con comandi equivalenti a &lt;em&gt;useradd&lt;/em&gt;: &lt;em&gt;groupadd&lt;/em&gt; per l’aggiunta, &lt;em&gt;addgroup&lt;/em&gt; è, invece, il frontend interattivo, &lt;em&gt;groupmod&lt;/em&gt; e &lt;em&gt;groupdel&lt;/em&gt; per la modifica e l’eliminazione del gruppo. La  quota disco può essere gestita in due modi. Il primo prevede un limite logico, superabile temporaneamente, ma che blocca l’account se superato per troppo tempo (&lt;strong&gt;tempo di grazia o grace time&lt;/strong&gt;); il secondo impone un limite fisico invalicabile. Si possono impostare anche limiti per gli i-node. Abbiamo a disposizione i comandi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$edquota nome_utente&lt;/em&gt;  per impostare una quota per l’utente specificato.&lt;br /&gt;&lt;em&gt;$edquota –p utente_modello nome_utente&lt;/em&gt; per impostare la quota dell’utente specificato mediante modello.&lt;br /&gt;&lt;em&gt;$edquota –t&lt;/em&gt; per modificare il tempo di grazia per dimensioni e i-node. Per cambiare utente si può utilizzare il comando:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$su [opzioni] [-] [username [argomenti]]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Senza parametri avvia  il processo per diventare superutente mediante l’inserimento di una password. Se si specifica il parametro &lt;em&gt;[-]&lt;/em&gt;, avvia una shell di login (leggere sotto),&lt;em&gt;[argomenti]&lt;/em&gt; specifica i comandi da passare alla nuova shell&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0  Shell di Linux&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La shell, contentua nel file &lt;em&gt;/bin/bash&lt;/em&gt; prevede due modalità di funzionamento:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;-non interattiva&lt;/strong&gt;: quando viene richiamata con un nome di file come parametro, la shell lo esegue come script&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;-interattiva&lt;/strong&gt;: viene richiamata direttamente e presenta il prompt all’utente. Essa prevede due modalità:&lt;br /&gt;   &lt;br /&gt;   &lt;strong&gt;-shell di login&lt;/strong&gt;: invocata quando si conclude la fase di accesso al sistema, esegue al suo avvio i  comandi contenuti  nei file&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;    &lt;em&gt;/etc/profile&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;   /etc/profile/.bash_profile&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;  /etc/profile/.bash_login&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;  /etc/profile/.profile&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt; e alla sua uscita i comandi contenuti in &lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;/etc/profile/.bashlogout.&lt;br /&gt;&lt;br /&gt;   -&lt;strong&gt;shell non di login&lt;/strong&gt;: esegue i comandi contenuti in  &lt;em&gt;/etc/bash.bashrc&lt;/em&gt; e &lt;em&gt;/etc/.bashrc&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.0  Il comando Sudo&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Il comando sudo permette di eseguire comandi con i permessi di un altro utente. Esso richiede come argomento una linea di comando. Le persone autorizzate all’uso di sudo e i comandi che questi possono eseguire su ciascun host sono contenuti nel file &lt;em&gt;/etc/sudoers&lt;/em&gt;. Se sudo viene eseguito correttamente ed i permessi sono validi, verrà richiesto l’inserimento della password. Le operazioni effettuate con questo comando vengono memorizzate in un file di log chiamato syslog o in un altro file scelto dall’amministratore. Rinviamo ad altri post l’uso del comando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5.0  PAM (Pluggable Authentication Module)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;PAM è una struttura utilizzata per la modifica in base al contesto della politica di autentificazione. I moduli sono contenuti nei file &lt;em&gt;/lib/security/pam_*.so.&lt;/em&gt; mentre la configurazione per ogni servizio nei file  &lt;em&gt;/etc/pam.d/nomeservizio .&lt;/em&gt; Come per sudo rinviamo l’uso di PAM ad post successivi.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5347177451685042950?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5347177451685042950/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5347177451685042950' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5347177451685042950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5347177451685042950'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/gestione-degli-utenti-in-gnulinux.html' title='Gestione degli Utenti in GNU/Linux'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4978476847874850089</id><published>2009-03-18T18:08:00.004+01:00</published><updated>2009-03-18T18:19:32.916+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Gestione del software GNU/Linux</title><content type='html'>&lt;div align="justify"&gt;In Unix sono stati sviluppati diversi sistemi per la distribuzione del software in forma binaria o sorgente. Di norma i programmi sono distribuiti sotto forma di pacchetti. I pacchetti vengono mantenuti in un archivio binario da un apposito software, generalmente preinstallato in molte distribuzioni, uno dei quali è &lt;strong&gt;RPM ( RPM Package Manager).&lt;/strong&gt; In questo caso i pacchetti sono archiviati in formato cpio e per gestirli basta ricorrere ai seguenti comandi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpm –i [opzioni] nome_pacchetto.rpm&lt;/em&gt; per l’installazione del pacchetto.&lt;br /&gt;&lt;em&gt;rpm –u [opzioni] nome_pacchetto.rpm&lt;/em&gt; per l’aggiornamento.&lt;br /&gt;&lt;em&gt;rpm –e [opzioni] nome_pacchetto.rpm&lt;/em&gt; per la rimozione.&lt;br /&gt;&lt;br /&gt;Alcune opzioni sono date da&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-v&lt;/em&gt; e &lt;em&gt;–h&lt;/em&gt; per una migliore visualizzazione dell’output.&lt;br /&gt;&lt;em&gt;--replacefiles&lt;/em&gt; per evitare la verifica di sovrascrittura dei files.&lt;br /&gt;&lt;em&gt;--nodeps&lt;/em&gt; per evitare la verifica delle dipendenze.&lt;br /&gt;&lt;br /&gt;L’installazione fallisce se le dipendenze non sono soddisfatte salvo quando si specifica &lt;em&gt;–nodeps&lt;/em&gt;. Adesso vediamo alcuni comandi per verificare i pacchetti.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpm –V [opzioni] nomepkginstallato&lt;/em&gt; verifica lo stato del pacchetto installato(dimensione, file, permessi ecc).&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpm –Vf nomefile&lt;/em&gt; verifica il pacchetto che contiene il file specificato.&lt;br /&gt;&lt;em&gt;rpm –Vp nome pacchetto.rpm&lt;/em&gt; confronta il pacchetto specificato con quello installato.&lt;br /&gt;&lt;em&gt;rpm –Va&lt;/em&gt; verifica tutti i pacchetti installati.&lt;br /&gt;&lt;br /&gt;Per interrogare i pacchetti possiamo utilizzare i comandi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpm -qpi [opzioni] nome_pacchetto.rpm&lt;/em&gt; per interrogare il pacchetto non installato.&lt;br /&gt;&lt;em&gt;rpm -qpl [opzioni] nome_pacchetto.rpm&lt;/em&gt; visualizza i file del pacchetto non installato.&lt;br /&gt;&lt;br /&gt;Per i pacchetti installati invece&lt;br /&gt;&lt;br /&gt;&lt;em&gt;rpm -qi [opzioni] nome_pacchetto&lt;/em&gt; visualizza informazioni relative al pacchetto.&lt;br /&gt;&lt;em&gt;rpm -ql [opzioni] nome_pacchetto&lt;/em&gt; visualizza i file del pacchetto.&lt;br /&gt;&lt;em&gt;rpm -qf nomefile&lt;/em&gt; visualizza i file del pacchetto che contiene il file specificato.&lt;br /&gt;&lt;em&gt;rpm -qa&lt;/em&gt; visualizza tutti i pacchetti installati&lt;br /&gt;&lt;br /&gt;Il sistema di gestione dei pacchetti &lt;strong&gt;dpkg &lt;/strong&gt;è nato per la distribuzione Debian ed è in grado di gestire i virtual packages. In pratica i pacchetti definiscono un campo Provides nelle informazioni e sono in formato ar. Per utilizzare i pacchetti si ricorre ai comandi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;dpkg -i [altreopzioni] nome_pacchetto.deb&lt;/em&gt; per l’installazione&lt;br /&gt;&lt;em&gt;dpkg -r [altreopzioni] nome_pacchetto&lt;/em&gt; per la rimozione lasciando intatti i file di configurazione.&lt;br /&gt;&lt;em&gt;dpkg -p [altreopzioni] nome_pacchetto&lt;/em&gt; per la rimozione con i relativi file di configurazione.&lt;br /&gt;&lt;br /&gt;Queste operazioni falliscono se le dipendenze non sono soddisfatte almeno ché non si specifichi l’opzione &lt;em&gt;--force-all&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;L’interrogazione dei pacchetti non installati avviene mediante i comandi :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;dpkg -I [opzioni] nomepacchetto.deb&lt;/em&gt; per visualizzare le informazioni sul pacchetto.&lt;br /&gt;&lt;em&gt;dpkg -c [opzioni] nomepacchetto.deb&lt;/em&gt; visualizza ifile del pacchetto.&lt;br /&gt;&lt;em&gt;dpkg -x [opzioni] nomepacchetto.deb&lt;/em&gt; estrae i file del pacchetto.&lt;br /&gt;&lt;br /&gt;Per quelli installati si abbiamo a disposizione i comandi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;dpkg -s [opzioni] nome pacchetto&lt;/em&gt; per visualizzare le informazioni sul pacchetto&lt;br /&gt;&lt;em&gt;dpkg -L [opzioni] nomepacchetto&lt;/em&gt; visualizza i file del pacchetto&lt;br /&gt;&lt;em&gt;dpkg -S nomefile&lt;/em&gt; visualizza il nome del pacchetto che contiene il file specificato.&lt;br /&gt;dpkg -l visualizza tutti i pacchetti installati.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un'altro sistema di gestione dei pacchetti, tipico delle distribuzioni slackware, è &lt;strong&gt;TGZ&lt;/strong&gt;. Il sistema prevede una gestione minimale o addirittura assente della gestione delle dipendenze. I comandi per l'installazione, l'upgrade e la rimozione dei pacchetti sono in ordine&lt;br /&gt;&lt;br /&gt;&lt;em&gt;installpkg&lt;br /&gt;upgradepkg&lt;br /&gt;removepkg&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Per la creazione di pacchetti rpm e deb è possibile specificare procedure da eseguire in diverse fasi, e precisamente prima dell'installazione, dopo l'installazione, prima o dopo la rimozione. Per i pacchetti tgz sono definiti solo script per le fase di pre-installazione e post-install.Questa procedura potrebbe comportare l'insorgere di alcuni problematiche quali la ricerca di pacchetti che risolvono le dipendenze o l'incompatibilità dei pacchetti tra le diverse distribuzioni. Per risolvere questi problemi solitamente si ricorre a sistemi dei gestione avanzata dei pacchetti (sistemi di secondo livello). Per i pacchetti dpkg e rpm si può ricorrere a APT (Advanced Package Tool). I comandi di apt sono:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;apt-get install nomepacchetto&lt;/em&gt; per installare il pacchetto&lt;br /&gt;&lt;em&gt;apt-get update&lt;/em&gt; per aggiornare le informazioni sui pacchetti&lt;br /&gt;&lt;em&gt;apt-get upgrade&lt;/em&gt; per aggiornare i pacchetti alla versione più recentesenza installazioni o rimozioni&lt;br /&gt;&lt;em&gt;apt-get dist-upgrade&lt;/em&gt; per aggiorna il sistema alla versione più recente.&lt;br /&gt;&lt;em&gt;apt-get [--purge] remove nomepacchetto&lt;/em&gt; per rimuovere il pacchetto incluse le dipendenze. Se specificato &lt;em&gt;--purge&lt;/em&gt;, rimuove anche i file di configurazione&lt;br /&gt;&lt;br /&gt;Altre opzioni per apt-get install sono&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-u&lt;/em&gt; : mostra tutte le operazioni che sta per effettuare e chiede come comportarsi.&lt;br /&gt;&lt;em&gt;-s&lt;/em&gt; : simula l'operazione senza effettuarla.&lt;br /&gt;&lt;em&gt;--download-only:&lt;/em&gt; scarica i pacchetti, senza installare.&lt;br /&gt;&lt;em&gt;-f:&lt;/em&gt; tenta di risolvere i problemi di dipendenza.&lt;br /&gt;&lt;br /&gt;Un'altro Sistema di gestione dei pacchetti di secondo livello è &lt;strong&gt;YUM (Yellowdog Updater Modified)&lt;/strong&gt;, integrato in fedora con comandi simili ad apt:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-yum install nomepacchetto&lt;br /&gt;-yum upgrade nomepacchetto&lt;br /&gt;-yum remove nomepacchetto&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Per le distribuzioni Mandriva (ex Mandrake) abbiamo a disposizione &lt;strong&gt;URPM&lt;/strong&gt; con comandi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-urpmi nomepacchetto&lt;br /&gt;-urpme nomepacchetto&lt;br /&gt;-urpmq nomepacchetto&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;APT e YUM mantengono informazioni sui pacchetti che possiamo richiamare rispettivamente con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;– apt-cache search informazione&lt;br /&gt;– yum search informazione&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;oppure&lt;br /&gt;&lt;br /&gt;&lt;em&gt;– apt-cache showshowpkg nomepacchetto&lt;br /&gt;– yum info nomepacchetto&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;per ricevere tutte le informazioni di un pacchetto.Gentoo premette di utilizzare pacchetti precompilati o di ricompilare i sorgenti risolvendo le dipendenze mediante uno script in gradi di scaricare, decomprimere, compilare ed installare il pacchetto in modo automatico. I sorgenti sono distribuiti in archivi, e la loro gestione è stata semplificata nel tempo mediante l'introduzione di autotools che riducono le operazioni a tre semplici comandi&lt;br /&gt;&lt;br /&gt;&lt;em&gt;./configure [opzioni]&lt;br /&gt;make&lt;br /&gt;make install&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4978476847874850089?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4978476847874850089/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4978476847874850089' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4978476847874850089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4978476847874850089'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/gestione-del-software-gnulinux.html' title='Gestione del software GNU/Linux'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6451260077638816729</id><published>2009-03-17T19:36:00.002+01:00</published><updated>2009-03-17T19:40:40.050+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>J</title><content type='html'>&lt;strong&gt;Job: &lt;/strong&gt;Insieme di processi avviati mediante un unico comando di shell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6451260077638816729?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6451260077638816729/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6451260077638816729' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6451260077638816729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6451260077638816729'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/j.html' title='J'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7463696053913205105</id><published>2009-03-17T19:24:00.000+01:00</published><updated>2009-03-17T19:25:56.298+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Processi in Unix</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Introduzione&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Un programma singolo nel momento in cui viene eseguito si chiama processo. In Unix la nascita di un processo può avvenire mediante la richiesta di un altro processo. Il processo radice che da vita a tutti gli altri, come visto in post precedenti, è init. Il kernel mantiene una tabella dei processi e rende disponibili i suoi dati mediante un file system virtuale situato nella directory /proc/, all’interno della quale vi sono tante altre sottodirectory quanti sono i processi e hanno lo stesso numero del processo che identificano. Ogni sottodirectory contiene dei file relativi al processo in esecuzione.La morte di un processo provoca il così detto scarico di memoria o core dump. In pratica si crea un file contenente l’immagine del processo interrotto. Tale file permette di diagnosticare eventuale problemi che hanno provocato la terminazione del processo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Gestione dei Processi&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Vediamo alcuni comandi per gestire e lavorare con i processi. Il controllo dello stato dei processi può avvenire mediante i tre comandi:&lt;br /&gt;&lt;br /&gt;$ ps  : mostra un elenco dei processi e delle loro caratteristiche.&lt;br /&gt;$ pstree : mostra l’albero delle dipendenze dei processi.&lt;br /&gt;$ top: mostra in un terminale in tempo reale lo stato dei processi.&lt;br /&gt;$ htop: come top ma consente l’uso di comandi interattivi.&lt;br /&gt;&lt;br /&gt;I comandi possono ovviamente essere seguiti da opzioni. Con il comando&lt;br /&gt;&lt;br /&gt;$pidof [name]&lt;br /&gt;&lt;br /&gt;Si fornisce il PID del processo avente il nome che viene fornito.Con il comando&lt;br /&gt;&lt;br /&gt;$fuser [file] &lt;br /&gt;&lt;br /&gt;Si ottiene l’elenco dei processi che stanno utilizzando quel file.Il file aperti sono invece mostrabili con il comando&lt;br /&gt;&lt;br /&gt;$lsof&lt;br /&gt;&lt;br /&gt;Alcuni SIGNALS possono essere inviati mediante la pressione di combinazione di tasti:&lt;br /&gt;&lt;br /&gt;Ctrl+c per il signal &lt;strong&gt;SIGINT&lt;/strong&gt;, Ctrl+z per &lt;strong&gt;SIGTSTP&lt;/strong&gt;, Ctrl+\ per &lt;strong&gt;SIGQUIT&lt;/strong&gt;. Queste combinazioni possono essere modificate attraverso il programma $stty. In generale si possono inviare signals mediante&lt;br /&gt;&lt;br /&gt;$kill [opzione/SIGNALS] [PID]&lt;br /&gt;&lt;br /&gt;Adesso vediamo come gestire JOBS mediante la shell Bash. Ricordiamo che un JOB è un insieme di processi avviati da un unico comando di shell. Un JOB viene avviato in background aggiungendo a fine comando il carattere &amp;amp;. La shell restituisce il numero del JOB e il PID del processo terminale generato da questo job. L’elenco dei jobs può essere fornito mediante il comando&lt;br /&gt;&lt;br /&gt;$jobs [opzione] [job]&lt;br /&gt;Per portare in foreground ( in pimo piano) un job in background si invia il comando:&lt;br /&gt;&lt;br /&gt;$fg [job]&lt;br /&gt;&lt;br /&gt;Se non si specifica nessun job si intende il job attuale. Per riportarlo in background si usa invece&lt;br /&gt;&lt;br /&gt;$bg [job].&lt;br /&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7463696053913205105?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7463696053913205105/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7463696053913205105' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7463696053913205105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7463696053913205105'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/processi-in-unix.html' title='Processi in Unix'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4859713182631945537</id><published>2009-03-17T19:21:00.002+01:00</published><updated>2009-03-17T19:23:48.224+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Bootstrapping di Unix</title><content type='html'>&lt;div align="justify"&gt;Si chiama bootstrapping la fase di accensione di un computer. Il termine deriva dall’espressione gergale da “to pull itself up by its own bootstraps”, letteralmente tirarsi su da solo dale cinghie dei propri stivali. La maggior parte dei sistemi Unix prevede due modalità di avvio: automatica e manuale. Nella prima il sistema compie il tutto senza ausilio dell’utente, nella seconda, ad una certa fase del caricamento, il controllo passa all’utente. In questa fase il sistema si trova in modalità monoutente (single user-mode), in cui la maggior parte dei processi di sistema non sono in esecuzione e altri utenti non possono accedere alla macchina. Analizziamo le diversi fasi di boot:&lt;br /&gt;&lt;br /&gt;1 All’accensione della macchina, il controllo passa al codice contenuto nel chip ROM chiamato &lt;strong&gt;BIOS&lt;/strong&gt; (Basic I/O System), che avvia una fase di inizializzazione della macchina e di test delle periferiche e dei componenti chiamata &lt;strong&gt;POST&lt;/strong&gt; ( Power on self-test). Una lista definibile dall’utente contiene una lista di dispositivi da cui il BIOS avvia il caricamento del sistema.&lt;br /&gt;&lt;br /&gt;2 Il primo settore del disco rigido (512 byte) viene chiamato &lt;strong&gt;MBR&lt;/strong&gt; (Master Boot Record), e contiene le informazioni per la seconda fase di caricamento. A seconda del sistema installato è possibile scegliere anche quale sistema avviare attraverso un bootloader. &lt;strong&gt;LILO e GRUB&lt;/strong&gt; sono due esempi di bootloader.&lt;br /&gt;&lt;br /&gt;3 Il bootloader carica in memoria l’immagine del kernel del sistema operativo selezionato, se specificato, carica in memoria il file di initrd e cede il controllo al kernel. L’uso di initrd, evita di appesantire la dimensione del sistema o permette l’utilizzo di risorse esterne.&lt;br /&gt;&lt;br /&gt;4 In questa fase il kernel richiama tutti i processi base, incluso init. Init ha il compito di creare tutti gli altri processi ed ha sempre PID 1. Questa fase può differire a seconda del sistema. Si differenziano due famiglie: &lt;strong&gt;BSD&lt;/strong&gt; e &lt;strong&gt;SysV&lt;/strong&gt;. In SysV, init definisce 7 livelli d’esecuzione (runlevel), ognuno dei quali definisce un insieme di servizi che dovrebbero essere eseguiti dal sistema. Il file /etc/inittab contiene le operazioni da fare per ciascun runlevel. In BSD non esiste l’idea di runlevel ma un unico script contenuto in /etc chiamato rc che avvia tutti gli altri script in un ordine prestabilito contenuti nella stessa directory.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4859713182631945537?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4859713182631945537/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4859713182631945537' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4859713182631945537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4859713182631945537'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/bootstrapping-di-unix.html' title='Bootstrapping di Unix'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6090160302069905091</id><published>2009-03-17T19:18:00.001+01:00</published><updated>2009-03-17T19:21:12.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>File System di Unix</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Introduzione&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In Unix il file system è rappresentato come una grande gerarchia che ha inizio con / (“root”) e prosegue con un numero arbitrario di sottodirectory. L’elenco ordinato di sottodirectory, a partire dalla root fino a quella presa in considerazione viene chiamato pathname, e permette di localizzare un file particolare. Un pathname può essere assoluto o relativo. Un pathname relativo viene interpretato tenendo conto, come punto di partenza della directory corrente. Per motivi di chiarezza tendo a distinguere i termini file, filename, path e pathname. Il file è un’insieme di dati binari che individuano un particolare elemento comprensibile dalla macchina. Tale insieme è caratterizzato da un nome che lo individua univocamente chiamato filename. Per poter raggiungere il file è necessario seguire un path; il pathname lo abbiamo definito in precedenza. Il file system può espandersi nella sua gerarchia a piacere in profondità ma ogni elemento del pathname non può superare i 255 caratteri, e l’intero pathname non può superare i 1023 caratteri. In presenza di pathname più lunghi è necessario posizionarsi in directory intermedie e procedere fino alla destinazione finale. Analizziamo alcuni path standard:&lt;br /&gt;&lt;br /&gt;/bin: contiene i comandi fondamentali per il funzionamento di base del sistema. Non contiene sottodirectory.&lt;br /&gt;&lt;br /&gt;/sbin:  contiene comandi utili per l’amministrazione del sistema e il suo avvio. La divisione da /binè dovuta motivi di logistica.&lt;br /&gt;&lt;br /&gt;/lib: contiene le librerie dinamiche del sistema e l’esecuzione dei programmi contenuti in /bin e          /sbin. I moduli del kernel caricabili a run-time sono contenuti nella sub directory modules.&lt;br /&gt;&lt;br /&gt;/boot: contiene i dati necessari per la fase di avvio del sistema.&lt;br /&gt;&lt;br /&gt;/dev: contiene i file dei dispositivi.&lt;br /&gt;&lt;br /&gt;/etc:contienei file di configurazione del sistema quali profili e password. La sottodirectory /X11     contiene i file di configurazione del sistema grafico.&lt;br /&gt;&lt;br /&gt;/home: contiene le directory personali degli utenti, ad eccezione di quella dell’amministratore che è contenuta nella directory /root.&lt;br /&gt;&lt;br /&gt;/mnt: utilizzata per montare i file system temporanei, ad esempio di altri sistemi operativi.&lt;br /&gt;&lt;br /&gt;/media: contiene i dispositivi removibili.&lt;br /&gt;&lt;br /&gt;/opt: utilizzata per i pacchetti software aggiuntivi.&lt;br /&gt;&lt;br /&gt;/proc e /sys: tipiche di linux, contengono informazioni relative allo stato del sistema (cpu,moduli,processi..)&lt;br /&gt;&lt;br /&gt;/tmp: contiene i dati temporanei richiesti da alcune applicazioni.&lt;br /&gt;&lt;br /&gt;/usr: rappresenta una sorta di immagine della directory / .&lt;br /&gt;&lt;br /&gt;/var: contiene le informazioni variabili, come file di log, directory di spool ecc.&lt;br /&gt;Il kernel linux supporta numerosi formati di file system quali ext3,reiserfs,xfs,jfs.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Partizioni&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Individuiamo tre tipi di partizioni: &lt;strong&gt;logiche&lt;/strong&gt;, &lt;strong&gt;primarie&lt;/strong&gt; ed &lt;strong&gt;estese&lt;/strong&gt;. Le prime due contengono direttamente dati, la terza funge da contenitore di partizioni logiche. Sono presenti al massimo quattro partizioni tra primarie e logiche indicate con i numeri da 1 a 4, per un numero maggiore di partizioni è necessario definire ulteriori partizioni estese con all’interno le partizioni logiche la cui numerazione segue quella precedente. Una sola partizione primaria può avere la proprietà di “bootable”. Suddividere il file system in parizione multiple semplifica la fase di gestione, backup e controllo dello stesso.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0 I dischi&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;I dischi IDE sono identificati con hda per il disco primary master, hdb per il disco primary slave, hdc per il disco secondary master e hdd per il disco secondary slave. Se consideriamo il primo disco, le sue partizione primarie/estese saranno identificate da hda1, hda2 ecc. La numerazione delle partizione logiche partirà comuque da 5.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6090160302069905091?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6090160302069905091/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6090160302069905091' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6090160302069905091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6090160302069905091'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/03/file-system-di-unix.html' title='File System di Unix'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-53799451590589451</id><published>2009-02-28T21:42:00.005+01:00</published><updated>2009-02-28T22:13:56.585+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basi di Dati'/><title type='text'>Esempi di Algebra relazionale</title><content type='html'>Esempi di query in algebra relazionale con alcune equivalenti in SQL&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/al_relazionale01.zip"&gt;1) Primo Esempio&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-53799451590589451?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/53799451590589451/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=53799451590589451' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/53799451590589451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/53799451590589451'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/02/algebra-relazionale.html' title='Esempi di Algebra relazionale'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1515152528566049056</id><published>2009-02-22T22:46:00.005+01:00</published><updated>2009-02-26T08:35:26.861+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Esempi di Programmazione Distribuita in JAVA e C</title><content type='html'>&lt;div&gt;Alcuni esempi per esplorare gli strumenti per realizzare programmi distribuiti in C e in JAVA. La parte relativa a C include esempi di thread.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/socket_thread_c.zip"&gt;esempi in C&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/getfile.php?file_path=http://www.fileden.com/files/2008/5/25/1929484/socket_java.zip"&gt;esempi in JAVA&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1515152528566049056?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1515152528566049056/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1515152528566049056' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1515152528566049056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1515152528566049056'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/02/esempi-di-programmazione-distribuita-in.html' title='Esempi di Programmazione Distribuita in JAVA e C'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3968494150787749637</id><published>2009-02-20T12:44:00.001+01:00</published><updated>2009-02-20T12:50:09.920+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Equazioni di ricorrenza con metodo di sostituzione</title><content type='html'>Alcune equazioni di ricorrenza risolte con il metodo di sostituzione.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/metodo_sostituzione.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3968494150787749637?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3968494150787749637/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3968494150787749637' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3968494150787749637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3968494150787749637'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/02/equazioni-di-ricorrenza-con-metodo-di.html' title='Equazioni di ricorrenza con metodo di sostituzione'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2608496619455212010</id><published>2009-02-16T15:16:00.009+01:00</published><updated>2009-03-01T11:29:29.278+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How to e bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Il compilatore GCC e le nuove libc-dev</title><content type='html'>&lt;div align="justify"&gt;Solitamente non mi occupto di HOW TO, ma in queste circostanze sono stato costretto a farlo.&lt;br /&gt;Le nuove librerie di linux (linux-libcdev 2-6-27-11.27) hanno messo a dura prova la pazienza dei programmatori C, la mia in primis. Dopo numerosi tentativi di far eseguire un programma c basato sul parsing di messaggi tra un server e un client, e dopo un'approfondita ricerca sono emersi, a parte le informazioni, non adeguatamente diffuse, contenute nel seguente &lt;a href="http://www.docmirror.net/it/linux/howto/misc/GCC-HOWTO/GCC-HOWTO-4.html"&gt;link&lt;/a&gt; i seguenti problemi:&lt;br /&gt;&lt;br /&gt;1) non è possibile passare alla function gethostbyname una stringa che non sia stata già definita come array di caratteri. Ad esempio non è possibile scrivere gethostbyname("120.0.0.1") ma si deve scrivere: char []stringa="120.0.0.1"; ........ gethostbyname(stringa);&lt;br /&gt;&lt;br /&gt;2) la chiamata accept manda in sospensione il programma in quanto non restituisce il valore -1 al termine delle richieste di accettazione.&lt;br /&gt;&lt;br /&gt;3) la chiamata a read manda in sospensione il programma e il consiglio fornito dal link precedente non funziona.Si consiglia di leggere il contenuto del buffer e reinizializzarlo a buffer vuoto. La condizione di buffer vuoto non verrà modificata quando la read avrà cessato la lettura dello stream. Tale condizione può essere sfruttata per terminare il ciclo while.&lt;br /&gt;&lt;br /&gt;Se emergeranno altri problemi li segnalerò.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2608496619455212010?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2608496619455212010/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2608496619455212010' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2608496619455212010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2608496619455212010'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/02/il-compilatore-gcc-e-le-nuove-librerie.html' title='Il compilatore GCC e le nuove libc-dev'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3667741388918563351</id><published>2009-01-31T14:18:00.005+01:00</published><updated>2009-02-02T22:56:32.091+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>I Java Servlet (Note Introduttive)</title><content type='html'>&lt;div align="justify"&gt;Un servlet è un oggetto java caricato dinamicamente dal server su richiesta di un client. Sono in grado di gestire richieste multiple e si trovano supportati oggi da una moltitudine di web server. Così come le servlet per i server, per i client sono disponibili le applet. I servlet si basano sul sistema di comunicazione request-response tipico di HTTP, consentendo di generare contenuti dinamici come ad esempio pagine XHTML personalizzate, log-in sicuri, gestione di database con salvataggio della sessione utente e così via. Le classi e le interfaccie sono rese disponibili dai package javax.servlet e javax.servlet.http .La principale astrazione è l'interfaccia servlet. La maggior parte dei metodi da implementare ricevono due tipi di oggetti: una ServletRequest o una ServletResponse. La prima incapsula le informazioni dal cliente al server e consente di accedere ai valori passati dal client, al tipo di protocollo usato, all'indirizzo del client e all'input stream, mentre la seconda dal server al cliente e consente di impostare la risposta e accedere all'output stream. Per entrambe le classi esistono le sottoclassi con metodi specifici per il protocollo http: HTTPServletRequest e HTTPServletResponse. Solitamente tutti i metodi devono essere thread-safe, cioè in grado di gestire thread in modo sicuro ma è tuttavia possibile gestire le richieste una alla volta implementando l'interfaccia SingleThreadMode. Le servlet derivate dalle classi HTTPServlet devono realizzare ulteriori metodi per la gestione delle richieste tipiche di HTTP quali HTTP GET, HEAD,POST,PUT e DELETE. Rimandiamo a successivi post le specifiche sui metodi da utilizzare.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3667741388918563351?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3667741388918563351/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3667741388918563351' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3667741388918563351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3667741388918563351'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/01/i-java-servlet-note-introduttive.html' title='I Java Servlet (Note Introduttive)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5108847947865708291</id><published>2009-01-29T21:36:00.006+01:00</published><updated>2011-01-13T18:28:12.581+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>R</title><content type='html'>&lt;div align="justify"&gt;&lt;b&gt;Resilienza:&lt;/b&gt; capacità da parte di un sistema o infrastruttura di rispondere con elasticità alla variazione di carico applicativo.&lt;/div&gt;&lt;div align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;RIA(Rich Internet Application)&lt;/b&gt;: web application che possiedono le caratteristiche e le funzionalità tipiche di applicazioni desktop. Sono esempi di piattaforme RIA Microsoft Silverligth e AdobeFlex. Le applicazioni RIA sono alla base del cloud computing.&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;b&gt;RMI(Remote Method Invocation):&lt;/b&gt; Invocazione di metodi remoti. Sistema software orientato agli oggetti che permette ad un host di invocare un metodo su un host remoto come se il metodo si trovasse sulla macchina locale. E' un sistema simile al RPC(vedi) per i linguaggi orientati agli oggetti.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;b&gt;RPC (Remote Procedure Call):&lt;/b&gt; Chiamata a procedura remota. Sistema sofware il cui scopo è quello di permettere ad un host di eseguire una procedura in un host remoto come se la procedura si trovasse nella macchina locale, nascondendo quanto più possibile i meccanismi che permettono tale operazione.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5108847947865708291?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5108847947865708291/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5108847947865708291' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5108847947865708291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5108847947865708291'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/01/r.html' title='R'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6845694075767860349</id><published>2009-01-29T21:33:00.004+01:00</published><updated>2009-02-02T22:43:42.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Remote Method Invocation (RMI) in breve</title><content type='html'>&lt;div align="justify"&gt;Un'applicazione RMI è un applicazione distribuita orientata agli oggetti. Solitamente consta di un server che crea oggetti remoti, ne rende accessibili i riferimenti e attende di servire un client che ne invochi i metodi, e di un client che ottiene riferimenti a tali oggetti remoti e ne invoca i metodi. In questo caso parleremo di oggetti e metodi remoti. I componenti di applicazioni RMI possono rivestire simultaneamente i ruoli di client o server perciò le definizioni precedenti vanno applicate a seconda dei ruoli rivestiti nel momento considerato. Così come abbiamo visto nei sistemi RPC anche nel RMI i meccanismi di invocazione remota sono resi trasparanti da un servizio di astrazione fornita dagli oggetti remoti. Il servizio &lt;strong&gt;rmiregistry, &lt;/strong&gt;consente ad un client di ottenere riferimenti ad oggetti remoti.Esso costituisce un server dei nomi per gli oggetti, individuati da un nome rappresentato in stringa. Un server può registrarvi un oggetto associandolo al suo nome (object binding), il client può invocarne i metodi ricevendo il riferimento in cambio del nome. Inizialmente è il servizio rmiregistry a fornire il primo riferimento remoto, dopo il client può ottenerne altri chiamando metodi di oggetti remoti che forniranno riferimenti ad altri oggetti remoti. I riferimenti infatti possono essere utilizzati come parametri di metodi remoti. Una classe non remota MyClass può trasferire il suo bytecode dal client al server e viceversa attraverso il sistema RMI, anche attraverso il protocollo http e web server. Nel caso da client a server il trasferimento può aver luogo se un oggetto non remoto figura come parametro di un metodo remoto invocato dal client; nell'altro caso se l'oggetto è restituito da un metodo remoto eseguito sul server. Gli oggetti vengono passati con il loro vero tipo e ciò garantisce assoluta trasparenza, semplicità e dinamicità. Come una qualuque applicazione Java un'applicazione RMI è costituita da interfacce e classi che implementano tali interfacce. Un'oggetto è remoto se la sua classe implementa l'interfaccia java.rmi.remote. E' importante ricordare che gli oggetti remoti e il bytecode si trovano sulla macchina server e non vengono copiati sul client ma esso realizzerà un client stub che rappresenta l'implementazione locale dell'interfaccia implementata realmente nel server, fa da ponte alle chiamate agli oggetti remoti e provvede al marshalling/unmarshalling dei parametri attuali /risultati. I passi da seguire per realizzare un'applicazione RMI sono solitamente i seguenti: si progetta e si realizza il client, il server, l'interfaccia remota e la sua implementazione; si compilano i sorgenti; si genera con &lt;strong&gt;rmic&lt;/strong&gt; le classi client stub; si distribuiscono i bytecode (cliente,interfaccia remota e stub nel client, il server,lo stub, l'interfaccia e la sua implementazione nel server); si esegue l'applicazione sia dal lato client che dal lato server.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6845694075767860349?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6845694075767860349/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6845694075767860349' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6845694075767860349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6845694075767860349'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/01/remote-method-invocation-rmi-in-breve.html' title='Remote Method Invocation (RMI) in breve'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8065082448746005454</id><published>2009-01-07T11:05:00.003+01:00</published><updated>2009-02-19T23:44:35.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Socket in JAVA</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0    Indirizzi IP&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La classe InetAddress viene utilizzata per rappresentare gli indirizzi IP delle macchine. Il metodo statico&lt;br /&gt;&lt;br /&gt;    &lt;em&gt;static InetAddress getByName(String hostname)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;restituisce un’istanza  di InetAddress rappresentante l’host specificato. Per ottenere l’indirizzo di default dell’host locale si passa come parametro null. Il metodo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;    public static InetAddress getByAddress(byte[] addr)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;restituisce un’istanza di InetAddress rappresentante l’indirizzo IP dell’host locale. Con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;   public static InetAddress[] getAllByName(String hostname)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;si ottiene un array contenente istanze di InetAddress utili nel caso di più indirizzi IP associate ad un hostname. Il metodo statico&lt;br /&gt;&lt;br /&gt;&lt;em&gt; public static InetAddress getLocalHost()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;restituisce un InetAddress per la macchina locale. Se la macchina non è registrata o è protetta da firewall l’indirizzo è quello di loopback. Loopback è un meccanismo di test che cattura i messaggi inviati all’host locale e li rispedisce al mittente. Tutti questi metodi possono sollevare l’eccezione  UnknowHostException se non sono in grado di risolvere l’indirizzo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0    UDP in JAVA&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In java in pacchetti UDP sono rappresentati mediante la classe DatagramPacket. Dal lato client, è sufficiente richiamare il costruttore&lt;br /&gt;&lt;br /&gt;&lt;em&gt;       public DatagramPacket(byte buf[], int length,InetAddress address, int port)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Dove buf, rappresenta il messaggio, lenght i suoi primi length byte, address l’indirizzo IP e port il numero di porta.&lt;br /&gt;&lt;br /&gt;Dal lato server,useremo il costruttore&lt;br /&gt;&lt;br /&gt;&lt;em&gt;       public DatagramPacket(byte buf[], int length)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;La classe DatagramPacket ci mette a disposizione metodi quali:&lt;br /&gt;&lt;br /&gt;      &lt;em&gt;InetAddress getAddress()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Restituisce l’indirizzo IP della macchina che ha mandato o ricevuto il pacchetto.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;       void setAddress(InetAddress addr)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;setta l’indirizzo IP della macchina.&lt;br /&gt;&lt;br /&gt;     &lt;em&gt; int getPort()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;restituisce il numero di porta della macchina remota.&lt;br /&gt;&lt;br /&gt;      &lt;em&gt;void setPort(int iport)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;setta il numero di porta.&lt;br /&gt;&lt;br /&gt;      &lt;em&gt;byte[] getData()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;restituisce i dati del pacchetto.&lt;br /&gt;&lt;br /&gt;    &lt;em&gt;  void setData(byte[] buf)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;setta i dati del pacchetto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0    Socket Multicast&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;È possibile mandare un pacchetto a più host con una sola invocazione di metodo. La libreria java.net mette a disposizione la classe MulticastSocket a tale scopo. Chi riceve i pacchetti multicast oltre a conoscere la socket  del server deve conoscere l’indirizzo del gruppo al quale viene inviato il pacchetto. Per creare una socket multicast si seguono i passaggi:&lt;br /&gt;&lt;br /&gt;1.  Creazione di un indirizzo di gruppo con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;InetAddress gruppo = InetAddress.getByName(ind)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;2.  Creazione di una socket per il multicast con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;MulticastSocket msocket = new MulticastSocket(porta)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;3.  Connessione della socket al gruppo con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;msocket.joinGroup(gruppo)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Tutti i processi che eseguono una joinGroup() possono ricevere i pacchetti invocando una&lt;br /&gt;&lt;br /&gt;&lt;em&gt;    msocket.receive(packet);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e possono abbandonare il gruppo con una chiamata a&lt;br /&gt;&lt;br /&gt;   &lt;em&gt;msocket.leaveGroup(gruppo)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Il processo server può inviare pacchetti multicast seguono le operazioni&lt;br /&gt;&lt;br /&gt;1) Creazione del gruppo con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;InetAddress group = InetAddress.getByName(ind);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;2) Creazione della socket con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;MulticastSocket msocket = new MulticastSocket(porta);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;3) Partecipazione al gruppo con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;msocket.joinGroup(group);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;4)creazione del pacchetto con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;DatagramPacket packet =DatagramUtility.buildPacket(group, porta, linea);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;5)Invio del pacchetto&lt;br /&gt;&lt;br /&gt;&lt;em&gt;msocket.send(packet);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I metodi della classe MulticastSocket sono così riassunti:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;joinGroup(InetAddress addr) throws IOException&lt;br /&gt;leaveGroup(InetAddress addr) throws IOException&lt;br /&gt;send(DatagramPacket p)&lt;br /&gt;setTimeToLive(int tlive) throws IOException&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;setta il tempo di vita per i pacchetti multicast mandati sulla socket(tlive deve essere compreso tra 0 e 255)&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int getTimeToLive() throws IOException&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;restituisce il tempo di vita.&lt;br /&gt;&lt;br /&gt;Trovere l'implementazione della classe DatagramUtility in questo blog, nella sezione SoftPedia&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.0    Stream Socket&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Server e client instaurano un tipo di connessione che prevede due flussi di dati, uno per l’input e uno per l’output. Le API sono distente per il client e per il server: nel primo caso è la classe Socket, nel secondo ServerSocket. Una connessione è individuata da 4 elementi: indirizzo IP e porta,sia per il server che per il client. Per instaurare una connessione il client esegue l’istruzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;   Socket socket = new Socket(addr, PORT);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;La connessione va terminata direttamente per non impiegare inutilmente risorse di sistema attraverso close(). Il client può ricevere flussi di dati con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;   InputStreamReader isr = new InputStreamReader(socket.getInputStream());&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;che permette di convertire un flusso di byte in caratteri.Per migliorare l’efficienza si può ricorrere ad un buffer&lt;br /&gt;&lt;br /&gt; &lt;em&gt;BufferedReader in = new BufferedReader(isr);&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Per leggere una striga dallo stream si usa:&lt;br /&gt;&lt;br /&gt; &lt;em&gt;String s = in.readLine()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Il client può creare uno stream di output verso il server in modo analogo allo stream di input:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;OutputStreamWriter osw = new&lt;br /&gt;OutputStreamWriter(socket.getOutputStream());&lt;br /&gt;BufferedWriter bw = new BufferedWriter(osw);&lt;br /&gt;PrintWriter out = new PrintWriter(bw, true);&lt;br /&gt;out.println(s)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Quando ha terminato bisogna chiudere gli stream e la socket:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;out.close();&lt;br /&gt;in.close();&lt;br /&gt;socket.close();&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Il server invece deve creare un’istanza di SocketServer con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;      ServerSocket serverSocket = new ServerSocket(PORT);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e rimanere in attesa di connesione con&lt;br /&gt;&lt;br /&gt;     &lt;em&gt;Socket clientSocket = serverSocket.accept()&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;     setSoTimeout(t)&lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;/em&gt;&lt;div align="justify"&gt;&lt;br /&gt;si può ritardare una accept() per t millisecondi. Con una accep() si restituisce un oggetto di tipo Socket che permette al server di usare gli stream che il client ha stabilito. I metodi sono gli stessi visti prima.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8065082448746005454?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8065082448746005454/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8065082448746005454' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8065082448746005454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8065082448746005454'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/01/socket-in-java.html' title='Socket in JAVA'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8716135673558711977</id><published>2009-01-06T16:45:00.007+01:00</published><updated>2009-02-02T22:50:36.023+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Principi di RPC (Remote Procedure Call)</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;Funzionamento di una RPC (Remote Procedure Call)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La maggior parte dei sistemi distribuiti si basano sullo scambio di messaggi ma spesso le procedure send e receive non consentono la dovuta trasparenza che si desira. Nel 1984 Nelson e Birrel introdussero un nuovo modo di gestire la comunicazione che prevede la possibilità dai parte dei programmi di chiamare procedure su altre macchine. Tale metodo prese il nome di &lt;strong&gt;Chiamata a Procedura Remota (RPC)&lt;/strong&gt;. L’idea alla base delle RPC prevede di rendere una chiamata a procedura remota quanto più simile ad una chiamata locale. Quando una di queste chiamate viene effettuata, la procedura client richiama una procedura detta &lt;strong&gt;client stub&lt;/strong&gt;, la quale costruisce un messaggio, richiama il sistema operativo locale che invia il messaggio al &lt;strong&gt;server stub&lt;/strong&gt;. Il server stub ha il compito di spacchettare i parametri contenuti del messaggio, richiama il server che elabora il risultato, lo impacchetta in un nuovo messaggio e richiama il  sistema operativo che ha il compito di inviare il messaggio al SO del client. A questo punto non resta che accettare il messaggio e inviarlo al client stub che spacchetta il messaggio e lo restituisce al client. La fase di realizzazione del messaggio contenente i parametri è piuttosto elaborata e viene chiamata marshaling dei parametri. I problemi si possono verificare quando le macchine client e server sono differenti per architettura, come nel caso delle macchine little indian e big indian, oppure quando si utilizzano codifiche differenti. Un'altro problema si verifica quando è necessario passare un puntatore. Il passaggio dei parametri referenza in realtà nelle RPC viene sostituito da meccanismi di copia/ripristino. Ad esempio l'invio di un puntatore ad un array comporta l'invio dell'intero array al server e la conversione del valore numerico del puntatore con il dato puntato. Questo meccanismo, di contro, non può essere applicato a strutture dati arbitrarie come grafi. Alcuni sistemi ad esempio affrontato il problema inviando il puntatore al server stub che richiede l'invio dei dati referenziati al client. Un &lt;strong&gt;IDL,&lt;/strong&gt; (Interface Definition Language) serve a definire il nome,la versione e il prototipo o signature di un servizio RPC. Mediante tali informazioni contentute nel file di definizione di un servizio RPC, il compilatore d'interfaccia (interface compiler), ad esempio l' rpcgen di Sun RPC, è in grado di generare due moduli, il primo detto &lt;strong&gt;client stub&lt;/strong&gt;, quando il client invoca la funzione remota ( in concreto invoca la funzione dello stub che permette di nascondere il meccanismo di chiamata remota), il secondo detto &lt;strong&gt;server stub&lt;/strong&gt; o &lt;strong&gt;skeleton,&lt;/strong&gt; che invoca la funzione corrispondente a quella chiamata dal client (mediante la request ricevuta dal client stub). Vengono generate inoltre le dichiarazioni dei tipi e delle procedure traducendole dall' IDL solitamente in un header file. Alcuni IDL permettono di scrivere server e client in linguaggi differenti. Il sistema RPC è fornito di tecniche di controllo di errori di comunicazione. E' in grado di rispedire le richieste finchè non ottiene risposta ( request retry), riconosce quelle duplicate ( duplicate request filtering). Vediamo i passi da seguire ( in linea generica e non specifica) al fine di realizzare un'applicazione client-server. Il primo passo è sicuramente quello di generare il file IDL e compilarlo. Generati il client stub, il server stub e l'header file si utilizza la direttiva #include per inserire l'header nel codice del client e del server. Bisogna poi scrivere il codice del client e del server e linkarli. Una volta generato il codice binario è possibile avviarli per rendere disponibile l'applicazione.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8716135673558711977?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8716135673558711977/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8716135673558711977' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8716135673558711977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8716135673558711977'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2009/01/principi-di-rpc.html' title='Principi di RPC (Remote Procedure Call)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1591340963764280997</id><published>2008-11-17T22:35:00.005+01:00</published><updated>2009-01-27T10:37:24.522+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Libreria Linux-Thread ( Prima parte)</title><content type='html'>&lt;div align="justify"&gt;A differenza dei processi, i threads non hanno necessità di uno spazio di indirizzamento privato, ma uno spazio in comune che utilizzano per la comunicazione (scambio di dati). Riassumiamo alcune delle differenze principali tra processo e thread. La creazione di un thread è generalmente più rapida di qulla di un processo, in quanto utilizza lo stesso spazio di indirizzamento del suo processo genitore. Di conseguenza risulta più rapido anche il tempo di terminazione e lo switch tra più threads. Più rapido sarà invece il tempo di comunicazione. La libreria che analizzeremo di seguito è quasi del tutto conforme agli standard Posix per i thread. Ove ciò non sarà così verrà specificato. La libreria Linux-Thread segue un modello chiamato 1-to-1, in cui ogni thread è in realtà un processo nel kernel. Per ulteriori informazioni sui processi in unix rimandiamo ai post dell’archivio Sistemi Operativi. Vediamo subito come creare e gestire thread.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.0 Creare Thread&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Per creare un thread, dopo aver importato la libreria pthread.h, si può ricorrere alla funzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int pthread_create( pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *),void * arg );&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;dove &lt;em&gt;thread&lt;/em&gt; è l’identificatore del thread creato, &lt;em&gt;attr &lt;/em&gt;è il puntatore agli attributi del thread, &lt;em&gt;start_routine&lt;/em&gt; è un puntatore alla funzione che il thread eseguirà, &lt;em&gt;arg&lt;/em&gt; è l’argomento da passare a tale funzione. Se la funzione restituisce un valore diverso da zero, allora se il valore restituito coincide con &lt;em&gt;EAGAIN&lt;/em&gt; vuol dire che non ci sono risorse disponibili da allocare per il nuovo thread o che si è raggiunto il numero massimo di thread creati. Per uscire dal thread basta ritornare dalla funzione start_routine oppure chiamando pthread exit().&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Attributi dei thread&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Vediamo gli attributi dei thread. Per inizializzare gli attributi da passare come argomento al thread utilizzeremo&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int pthread_attr_init(pthread_attr_t *attr);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;e li distruggeremo con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;pthread attr destroy(&amp;amp;a);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Gli attributi sono elencati di seguito:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;• detachstate&lt;br /&gt;• schedpolicy&lt;br /&gt;• schedparam&lt;br /&gt;• inheritsched&lt;br /&gt;• scope &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;l’int detachstate può assumere i valori PTHREAD_CREATE_ JOINABLE (default) o&lt;br /&gt;PTHREAD_ CREATE_ DETACHED. In questo caso se il thread t è joinable, un altro thread può con pthread join(t,...), sincronizzarsi sulla terminazione di t ed ottenerne l’ exit code.Le risorse di t vengono recuperate solo quando viene eseguito un pthread join(t,...) e non alla sua terminazione.&lt;br /&gt;L’int schedpolicy può assumere invece i valori SCHED_OTHER per lo scheduling standard di Linux, SCHED_FIFO se si desidera che un thread in testa alla lista di scheduling giri fino al completamento, al blocco per I/O o alla rinuncia oppure per preemption da parte di un processo di maggior priorità, SCHED_RR per lo scheduling realtime o round-robin. Per quanto riguarda la struct sched_param schedparam ,i suoi membri codificano i parametri della scheduling policy. L’int inheritsched vale PTHREAD_EXPLICIT_SCHED o PTHREAD_ IMPLICIT_ SCHED se le policy e parametri di scheduling sono rispettivamente definiti dai relativi attributi (default) o ereditati dal thread padre. L’ int scope definisce l’ambito della contesa per lo scheduling e vale PTHREAD_ SCOPE_SYSTEM (default) o PTHREAD_ SCOPE_PROCESS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.0 Operazioni con i Thread&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;Esaminiamo alcune function per operare con i thread:&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;-pthread_t pthread_self(void);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;permette di restituire il thread corrente.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: italic;" align="justify"&gt;void pthread_exit(void *retval);&lt;/p&gt;   &lt;p style="margin-bottom: 0cm;" align="justify"&gt;permette di uscire dal thread corrente. Non restituisce nessun valore ma permette ad altri thread di accedere a retval attraverso la chiamata pthread_join();&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;int pthread_join(pthread_t th,void **thread_return);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;rende il thread detached. Se lo è già restituisce errore EINVAL.&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;int pthread_join(pthread_t th,void **thread_return);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;sospende il thread a favore di th finchè questo non viene eliminato o termina la sua esecuzione. Se thread_return è diverso da NULL,nela locazione a cui punta andrà  il (void * val) restituito dal thread th, con   pthread exit(val)    oppure   PTHREAD_CANCELED se th viene cancellato.                                  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;   &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;int pthread_cancel(pthread_t cth);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;Invia una richiesta di cancellazione a cth che può ignorare onorare a seconda se il suo stato lo permette. La cancellazione ha effetto immediato se il canceltype di cth è PTHREAD_CANCEL _ASYNCHRONOUS, o rimandato al prossimo check point di cancellazione se il canceltype                                                      è PTHREAD_CANCEL_DEFERRED. Lo stato e il tipo di cancellazione va settato con le function&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: italic;" align="justify"&gt;int pthread_setcancelstate(int state,int *oldstate);&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic;" align="justify"&gt;o&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;int pthread_setcanceltype(int type,int *oldtype);&lt;/p&gt;    &lt;p style="margin-bottom: 0cm;" align="justify"&gt;dove oldtype può essere nullo se non si vuole memorizzare il checkpoint precedente.&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-weight: bold;"&gt;4.0 Mutex&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;In C è possibile implementare mutex. Una variabile x può essere protetta da mutex con la  chiamata&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; font-style: italic;" align="justify"&gt;int x;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;e  gli accessi regolati  con&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; font-style: italic;" align="justify"&gt;pthread_mutex_lock(&amp;amp;mut);&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;pthread_mutex_unlock(&amp;amp;mut);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;   &lt;p style="margin-bottom: 0cm;" align="justify"&gt;Le operazioni di lock e unlock sono sempre relative alla viariabile x precedentemente creata. Si possono realizzare mutex con l'istruzione&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;int pthread_mutex_init(pthread_mutex_t *mutex,  const pthread_mutexattr_t *mutexattr);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;mutexattr può essere nullo, se si vogliono gli attributi di default. L'unico attributo supportato da LinuxThread è il mutex kind che può valere&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;PTHREAD_MUTEX_FAST_NP   per il tipo fast,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;PTHREAD_MUTEX_RECURSIVE_NP  per il tipo recursive,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;PTHREAD_MUTEX_ERRORCHECK_  NP per il tipo error checking.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;   &lt;p style="margin-bottom: 0cm;" align="justify"&gt;Il suffisso NP indica che non sono estensioni portabili in POSIX. Gli effetti di bloccaggio  su un mutex gìa bloccato variano secondo il tipo di mutex. Se il mutex è di tipo fast, la chiamata viene sospesa finchè non si sblocca causando un deadlock; se invece è di tipo error checking, restituisce un errore EDEADLK; se invece è tipo recursive, verrà memorizzate il numero di volte che il thread chiamante ha chiamato il lock, e sbloccherà il mutex solo quando il numero di volte che è stato sbloccato coincide con il numero di volte che è stato bloccato. Esiste anche una chiamata&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-style: italic;"&gt;int pthread_mutex_trylock(pthread_mutex_t *mutex);&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p style="margin-bottom: 0cm;" align="justify"&gt;che non blocca il thread chiamante se il mutex è già bloccato da un'altro thread. Una situazione simile a quella vista prima si verifica se si tenta lo sbloccaggio di un mutex. Se il mutex è di tipo fast, viene sbloccato; se il mutex è di tipo error checking controlla che il thread chiamante sia lo stesso che lo ha bloccato, restituendo un errore in caso negativo e lasciando invariato il mutex; se è di tipo recursive decrementa il contatore del numero di volte che è stato chiamato lo sbloccaggio, sbloccando il mutex se il suo valore dovesse essere 0.Un mutex può essere distrutto con la chiamata&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-style: italic;"&gt;int pthread_mutex_destroy(pthread_mutex_t *mutex);&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1591340963764280997?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1591340963764280997/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1591340963764280997' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1591340963764280997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1591340963764280997'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/11/linux-thread-la-libreria-che.html' title='Libreria Linux-Thread ( Prima parte)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3310828234310482406</id><published>2008-10-31T09:13:00.007+01:00</published><updated>2010-03-05T17:32:47.162+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Modelli di Processo Personali e a Team</title><content type='html'>Il miglior processo di sviluppo è, sicuramente, quello che più si adatta alle persone che stanno sviluppando, quello che può essere meglio adattato ai bisogni, alle esperienze, alle conoscenze del team di sviluppo. Ogni ingegnere dovrebbe essere in grado di elavorare un processo alla luce di tali considerazioni.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div align="justify"&gt;&lt;strong&gt;1.0 Processo di Sviluppo Personale ( Personal Software Process)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Risale ad Humphrey (1997) e pone l'accento sulla valutazione personale di ogni singolo componente del team sul prodotto e sulla sua qualità, rendendolo responsabile della sua pianificazione e incaricandolo di controllarne la qualità in ogni sua singola parte. Il modello PSP prevede le seguente fasi:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;-Pianificazione&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-Progettazione ad alto livello.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-Revisione della progetto ad alto livello.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-Sviluppo.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-Revisione del Codice.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-Post-Mortem o Rilancio.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Ciascuna fase segue delle linee guida definita da uno Script o guida al lavoro. L'evoluzione PSP porta alla stesura di un log in diverse versioni (PSP 0, PSP 0.1, PSP 1.0,PSP 1.1 .... , PSP 3.0 ) che prevede il tempo impiegato, i difetti emersi e la verifica del lavoro compiuto.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;2.0 Processo di Sviluppo a Team (Team Software Process)&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;I concetti di PSP posso essere estesi ad un altro processo, il processo TSP. Si basa sulla costruzione di team auto-diretti che pianificano e monitorizzano il proprio lavoro, su team-leader che sappiano motivare e sostenere i propri collaboratori, portando ad un miglioramento della qualità e della quantità produttiva della squadra. E' un modello che si estende sia ai piccoli che ai grandi team. Affinchè il modello sia valido sono necessari alcuni prerequisiti:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;- I membri hanno i requisiti necessari.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;- L'obbiettivo è ben definito, reale e comune a tutti i membri.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-I membri sono disciplinati nel loro lavoro.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;-I membri sono motivati e collaborativi tra loro.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;- Il modello organizzativo del team è simile al modello Closed. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;E' fondamentale la comunicazione tra i membri del team. Essi devono essere aggiornati constantemente sullo stato del progetto attraverso meeting e report settimanali per essere sempre a conoscenza sul progresso del team. Anche i clienti vanno aggiornati mediante report periodici. I membri del team devono fidarsi tra loro e le loro competenze devono essere appropriate al problema da risolvere. La comunicazione e l'interazione devono evirare tutte le "tossine" che creano problemi, ritardano il progetto o ne degradano la qualità. Lo scopo del leader è quello di motivare e guidare il team, mantenere la disciplina al progetto, gestire i problemi e le questioni sollevate dal team.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;3.0 Da PSP a TSP&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Prima che i membri possano partecipare al team devono essere allenati nel modello PSP. La costruzione del team è un processo che dura 4 giorni e viene detto &lt;strong&gt;lancio del team.&lt;/strong&gt; Poichè il modello TSP è un modello che segue una strategia di sviluppo iterativa ed evolvente il lancio del team avviene ciclicamente in moda tale che ogni lancio possa essere programmato in base ai risultati e all'esperienza ottenuta nel lancio precedente. Segue uno schema riassuntivo della formazione del team secondo Humphrey.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 343px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5263239257668254930" border="0" alt="" src="http://1.bp.blogspot.com/_Pti-0b5YBiE/SQrIOBE0_NI/AAAAAAAAAMc/2q5lLsuseWk/s400/Immagine.jpg" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align="justify"&gt;Sotto la tabella riassuntiva dei quattro giorni della costruzione del team. I criteri iniziali prevedono la convocazione dei membri del team, dei rappresentati gestionali e del marketing e l'elezione di un coach per condurre il processo stesso.&lt;/p&gt;&lt;p align="justify"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 169px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5263243076883973266" border="0" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SQrLsUw0BJI/AAAAAAAAAMk/zBLPbpW6X9U/s400/Immagine.jpg" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3310828234310482406?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3310828234310482406/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3310828234310482406' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3310828234310482406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3310828234310482406'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/modelli-di-processo-personali-e-team.html' title='Modelli di Processo Personali e a Team'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pti-0b5YBiE/SQrIOBE0_NI/AAAAAAAAAMc/2q5lLsuseWk/s72-c/Immagine.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2483909701019319150</id><published>2008-10-24T18:20:00.008+02:00</published><updated>2008-10-28T20:36:31.760+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Tipologie e Modelli organizzativi dei Team</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Pti-0b5YBiE/SQH3DbNy4JI/AAAAAAAAAMM/YKTM-7jOyWg/s1600-h/Immagine.jpg"&gt;&lt;/a&gt;&lt;div align="justify"&gt;&lt;strong&gt;1.0 Tipologie di Team&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Nonostante il team sia una organizzazione complessa e profonda in quanto composta da uomini è possibile individuare tre modelli principali. Essi sono soltanto dei punti di riferimento, poiché un vero team può essere una fusione di tali modelli o una continua alternazione degli stessi.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;· Democratica Decentralizzata&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;È la tipologia di team più dinamica. Non presenta mai un leader fisso ma solo capo-gruppi temporanei. Si fonda sulla comunicazione diretta e orizzontale trai membri e le decisioni vengono proposte, accettate o bocciate dall’intera comunità&lt;br /&gt;&lt;br /&gt;&lt;em&gt;· Controllata Decentralizzata&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Presenta un leader fisso che vigila su sottogruppi organizzati nel modello Democratico Decentralizzato.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;· Controllato Centralizzato&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si fonda sulla gerarchia indiscutibile del gruppo. Costante è la presenza di un leader le cui decisioni non vengono mai messe in discussione.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Paradigmi di Organizzazione&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Anche il modo di rapportarsi con l’esterno e con l’interno può essere individuato da precisi modelli. Si ricorda che anche in questo caso nei team reali non esistono modelli precisi ma tale divisione permette di analizzare meglio la vita di gruppo di una squadra.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;· Random&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In antitesi con closed, è il tipo di organizzazione adatto alla ricerca e allo sviluppo. Si fonda sull’innovazione, sull’indipendenza e sull’abilità individuale dei membri del gruppo.&lt;br /&gt;&lt;em&gt;&lt;br /&gt;· Closed&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In antitesi con Random, si fonda su regole e norme precise e ben definiti, sul filtraggio delle informazioni e sulla fedeltà dei membri del gruppo. Non ammette iniziative personali né forme di concorrenza tra i vari membri.&lt;br /&gt;&lt;em&gt;&lt;br /&gt;· Synchronized&lt;/em&gt; (o di Constantine)&lt;br /&gt;&lt;br /&gt;In antitesi con Open, prevede la totale assenza di interazione tra i membri del gruppo ai quali vanno consegnate le parti da svolgere e consegnare.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;· Open&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;In antitesi con Synchonized, si fonda sulla cooperazione, sulla condivisione di mezzi e informazioni con i membri del gruppo e con l’esterno.&lt;br /&gt;&lt;br /&gt;È possibile schematizzare le caratteristiche salienti dei paradigmi di Organizzazione nel seguente link &lt;a href="http://www.fileden.com/files/2008/5/25/1929484/Paradigma.pdf"&gt;Download &lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Le componenti fondamentali dello sviluppo del software vengono chiamate 4P:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Persone:&lt;/em&gt; tutti i membri coinvolti direttamente o indirettamente nello sviluppo di un prodotto.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Prodotto:&lt;/em&gt; il frutto del lavoro di tutte le persone coinvolte nello sviluppo.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Processo&lt;/em&gt;: l'insieme di tutte le attività strutturali, dei lavori di ingegneria e quant'altro garantisca il prodotto finale.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Progetto:&lt;/em&gt; il lavoro richiesto per realizzare il prodotto.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0 Stakeholders&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Gli stakeholders rappresentano tutte le persone coinvolte direttamente o indirettamente nel processo di sviluppo del software. Si possono classificare in:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Senior Manager:&lt;/em&gt; rappresenta il contesto aziendale ed influenza in maniera significativa la realizzazione del software.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Project Manager: &lt;/em&gt;pianifica,coordina e motiva il personale tecnico coinvolto nel progetto.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Tecnici:&lt;/em&gt; coloro che implementano il software.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Clienti:&lt;/em&gt; commissionano e specificano i requisiti del software.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Utenti finali: &lt;/em&gt;sono i destinatari e gli utilizzatori del software e possono coincidere con i clienti.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.0 Modello MOI&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Il modello MOI rappresenta la caratteristiche che un leader deve avere. Esse sono la &lt;strong&gt;motivazione&lt;/strong&gt;, ovvero la capacità di incoraggiare e guidare i tecnici, l'&lt;strong&gt;organizzazione&lt;/strong&gt;, cioè la capacità di elaborare le idee e finalizzarle per completare il prodotto finale, l'&lt;strong&gt;innovazione&lt;/strong&gt;, ovvero la capacità di creare e di essere creativi anche quando bisogna muoversi entro limiti ben definiti.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Al fine di garantire un prodotto soddisfacente vanno tenute in considerazioni diverse variabili come la difficoltà del prodotto da realizzare, la dimensione dello stesso, la durata del team, ovvero il tempo per cui si può disporre del personale, la modularità del problema da affrontare, la qualità e l'affidabilità del prodotto da consegnare, la rigidità dei tempi di consegna e il grado di comunicazione tra il personale richiesto. Inoltre vanno tenuti in considerazione elementi quali l'attività frenetica, il dispendio di energie, la frustrazione legata a fattori di inconcludenza, l'attrito,la scarsa definizione dei ruoli del personale e la frammentazione del processo software. Tutti questi fattori possono portare al fallimento e sono stati definiti &lt;strong&gt;fattori di tossicità.&lt;/strong&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2483909701019319150?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2483909701019319150/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2483909701019319150' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2483909701019319150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2483909701019319150'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/tipologie-e-modelli-organizzativi-dei.html' title='Tipologie e Modelli organizzativi dei Team'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2849645984271332781</id><published>2008-10-24T17:50:00.001+02:00</published><updated>2008-10-24T17:52:08.992+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Introduzione alla documentazione per lo sviluppo di un software</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Documentazione&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;La documentazione di un software consente alla direzione di controllare e pianificare lo sviluppo del progetto e di analizzare a posteriori tutto ciò che è stato fatto o non fatto al fine di migliorare e ottimizzare sia l’organizzazione che il processo di produzione del software. Si producono due tipi di documenti, quelli inerenti il management del progetto e la documentazione vera e propria.&lt;br /&gt;&lt;br /&gt;· Management del progetto&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;-Organigramma&lt;br /&gt;-Diario di progetto&lt;br /&gt;-Verbale&lt;br /&gt;-Piano di progetto&lt;br /&gt;-Norme di progetto&lt;br /&gt;-Offerta&lt;br /&gt;-Piano di gestione della qualità.&lt;br /&gt;&lt;br /&gt;· Documentazione del progetto&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;-Analisi del Dominio&lt;br /&gt;-Analisi dei Requisiti&lt;br /&gt;- Specifica architetturale&lt;br /&gt;-Specifica di dettaglio&lt;br /&gt;-Piano delle prove&lt;br /&gt;- Risultati delle prove&lt;br /&gt;-Manuale d’uso&lt;br /&gt;&lt;br /&gt;L’organigramma redatto dal project manager prima dell’inizio di qualsiasi attività da parte del team. Contiene le informazioni riguardati la ripartizione dei ruoli, le competenze, le conoscenze e i ruoli di ciascun membro del team. Il diario di progetto contiene tutti i movimenti, in entrata e in uscita, di tutti i prodotti o i documenti dell’archivio. Il verbale è un documento non versionato che tiene traccia degli argomenti trattati durante le varie riunioni del team. Il piano di progetto è un documento versionato redatto dal project manager per stimare risorse presenti e future, costi e tempi necessari allo sviluppo del prodotto. Le norme di progetto racchiudono invece le norme stabilite a inizio progetto entro cui si svolgono le attività del progetto. L’offerta è un documento non versionato che il project manager redige e consegna al committente che comprende descrizione, costi e tempi di consegna del prodotto. Il piano di gestione della qualità è un documento non versionato che si occupa delle politiche e degli obbiettivi della qualità. L’analisi del dominio è un documento versionato che analizza gli ambienti in cui opera il software. L’analisi dei requisiti è un documento versionato che si occupa degli obbiettivi e degli scopi del prodotto. L’architettura del software viene analizzata nel documento chiamato Specifica architetturale. Esso è affiancato dalla specifica di dettaglio che analizza i componenti individuati dalla specifica architetturale. Le prove ed i test sul prodotto sono individuati rispettivamente dai documenti Piano delle prove e Risultati delle prove. Infine, il manuale d’uso, in forma cartacea o help on-line è un documento previsto per gli utilizzatori del prodotto che analizza le azioni da eseguire al fine di utilizzare al meglio il software.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2849645984271332781?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2849645984271332781/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2849645984271332781' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2849645984271332781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2849645984271332781'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/documentazione-per-lo-sviluppo-di-un.html' title='Introduzione alla documentazione per lo sviluppo di un software'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3756265955877626300</id><published>2008-10-17T18:03:00.007+02:00</published><updated>2008-11-03T19:18:51.737+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Programmazione in C con socket (parte I)</title><content type='html'>&lt;strong&gt;1.0 Creare una socket&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In questo post vedremo come scrivere programmi in C che utilizzano socket.&lt;br /&gt;&lt;br /&gt;Affinché due socket possano comunicare è necessario che appartengono allo stesso dominio.&lt;br /&gt;Esistono tre particolari domini:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;PF_UNIX , dominio locale;&lt;br /&gt;PF_INET, dominio internet;&lt;br /&gt;PF_IPX, dominio IPX Novell;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Inoltre devono anche rispettare la medesima semantica:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SOCK_STREAM, orientata alla connessione;&lt;br /&gt;SOCK_DGRAM, non orientati alla connessione;&lt;br /&gt;SOCK_RDM, reliable datagram;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ogni dominio ha un suo set ammesso di protocolli quali tcp,udp,ip,iso-tp4 ecc.&lt;br /&gt;L’istruzione per creare una socket è&lt;br /&gt;&lt;br /&gt;&lt;em&gt;s = socket(...);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;a breve vedremo quali sono i parametri formali.&lt;br /&gt;Per assegnare un indirizzo ad un socket scriveremo:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;bind(s,&amp;amp;myAddr,addrLen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;invece l’istruzione seguente permette di stabilire il numero di socket di cui restare in ascolto.&lt;br /&gt;pendingQSize è il numero di socket.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;listen(s,pendingQSize);&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Con la seguente istruzione si è in grado di ascoltare la socket:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;s1 = accept(s,...);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Le istruzioni viste prima permettono di lavorare con le socket dal lato server. Con una discreta simmetria è possibile farlo anche dal lato client.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;t = socket(...);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Da questo momento sarà possibile connettersi con l’istruzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;connect(t,&amp;amp;servrAddr,addrLen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Entrambi i lati prevedono la chiusura della connessione con&lt;br /&gt;&lt;em&gt;&lt;br /&gt;close();&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Affinché la connessione venga stabilita gli indirizzi indicati da servrAddr e myAddr devono necessariamente coincidere. Per l’apertura di una socket è necessario importare le relative librerie&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#include &lt; sys / types.h  &gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;L’istruzione di creazione della socket vista prima può adesso essere utilizzata&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int socket(int domain, int type, int protocol);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;L’int restituito è -1 se è sorto qualche errore.&lt;br /&gt;domain è uno dei domini visti prima, type il tipo di sematica,e protocol il protocollo da utilizzare, di default è 0.&lt;br /&gt;Le socket vengono create bloccanti di default ma questa opzione può essere modificata con l’istruzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;fcntl(s,F_SETFL,O NONBLOCK);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Il descrittore di socket ha solo valore locale. Legarla ad un indirizzo permette di renderla pubblica.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#include &lt; sys / types.h  &gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;&lt;br /&gt;int bind(int sockfd, struct sockaddr *my_addr,int addrlen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Anche qui il valore restituito è -1 se qualcosa è andato storto. Altri valori messi sono indicati dalle costanti:&lt;br /&gt;&lt;br /&gt;EBADF, quando sockfd non è un descrittore valido.&lt;br /&gt;ENOTSOCK, sockfd è un descrittore di file e non di socket.&lt;br /&gt;EINVAL, la socket è già stata assegnata ad un indirizzo.&lt;br /&gt;EACCESS, l’indirizzo è protetto e l’utente non ha i relativi permessi.&lt;br /&gt;&lt;br /&gt;Come è possibile notare l’indirizzo è un puntatore. Sarà dunque necessario implementare una struct per l’indirizzo secondo il suo dominio.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;struct sockaddr&lt;br /&gt;{&lt;br /&gt;sa_family_t sa_family;&lt;br /&gt;char sa_data[14];&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Nel caso del dominio PF_UNIX la struct diventa&lt;br /&gt;&lt;em&gt;&lt;br /&gt;#define UNIX_PATH_MAX 108&lt;br /&gt;struct sockaddr_un&lt;br /&gt;{&lt;br /&gt;sa_family_t sun_family;&lt;br /&gt;char sun_path[UNIX_PATH_MAX];&lt;br /&gt;};&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Nel caso del dominio PF_INET la struct diventa&lt;br /&gt;&lt;br /&gt;&lt;em&gt;struct sockaddr_in {&lt;br /&gt;sa_family_t sin_family; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;u_int16_t sin_port;&lt;br /&gt;struct in_addr sin_addr;&lt;br /&gt;};&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;struct in_addr {&lt;br /&gt;u_int32_t s_addr; // IPv4 address in network byte order&lt;br /&gt;};&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Affinché l’argomento int sockfd della chiamata bind sia compatibile con la specializzazione della struct sockaddr è necessario fare il cast di tipo con l’istruzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;bind(sd, (struct sockaddr * ) &amp;amp;thisAddr, alen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;2.0 Connessione di una socket&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Per connettere una socket ad un’altra socket remota si ricorre alla function connect&lt;br /&gt;&lt;br /&gt;#include &lt; sys / types.h  &gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;una socket sockfd di tipo SOCKET_STREAM in generale può essere oggetto di una connessione una sola volta.La function restituisce 0 di esito positivo o un int corrispondente a&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EBADF&lt;/strong&gt;, se il descrittore di socket è errato.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ENOTSOCK&lt;/strong&gt;, se il descrittore non è associato ad una socket&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EISCONN&lt;/strong&gt;, se la socket è già connessa&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ECONNREFUSED,&lt;/strong&gt; se il server rifiuta la connessione.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ETIMEDOUT&lt;/strong&gt;, se la connessione va in timeout&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ENETUNREACH,&lt;/strong&gt; se la rete non è disponibile&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EADDRINUSE&lt;/strong&gt;, se l’indirizzo è già in uso.&lt;br /&gt;&lt;br /&gt;Il lato server dovrà rimanere in ascolto della connessione con &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;#include # &lt;&gt;&lt;br /&gt;int listen(int s, int backlog);&lt;br /&gt;&lt;br /&gt;se la socket è di tipo SOCK_STREAM o SOCK_SQPACKET. L’ int backlog indica la lunghezza massima della coda delle richieste di connessione. Se la coda è piena il lato client riceverà l’errore ECONNREFUSED. Se il protocollo dello strato inferiore ammette ritrasmissione la coda piena viene ignorata. Come nel lato client la funzione restituisce 0 in caso di esito positivo oppure&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EBADF&lt;/strong&gt;, se il descrittore non è valido&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ENOTSOCK&lt;/strong&gt; , come argomento non è stata passata una socket.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EOPNOTSUPP&lt;/strong&gt;, la socket non è del tipo supportato.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una socket di tipo SOCK_STREAM può accettare la connessione con&lt;br /&gt;&lt;br /&gt;#include &lt; sys / types.h  &gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;int accept(int s, struct sockaddr *addr, int *addrlen);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La function non fa altro che estrarre la richiesta di connessione dalla coda e creare e restituire una nuova socket con le proprietà di s collegata alla relativa socket remota. Se non vi sono richieste pendenti la funzione blocca la socket se questa è di tipo bloccante altrimenti restituisce errore. Qui addr è un parametro risultato il cui formato dipende dal dominio mentre addrlen deve valere il numero di byte allocati per addr.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0 Lettura e scrittura.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Le operazioni di lettura e scrittura sono mostrate rispettivamente:&lt;br /&gt;&lt;br /&gt;Lettura:&lt;br /&gt;&lt;br /&gt;s = socket(PF_INET,SOCK_STREAM,0);&lt;br /&gt;bind(s,&amp;amp;myAddr,sizeof(myAddr));&lt;br /&gt;listen(s,maxQSize);&lt;br /&gt;s1 = accept(s,&amp;amp;clntaddr,&amp;amp;addrL);&lt;br /&gt;...&lt;br /&gt;read(s1,inMsg,sizeof(inMsg));&lt;br /&gt;&lt;br /&gt;Scrittura&lt;br /&gt;&lt;br /&gt;t = socket(PF_INET,SOCK_STREAM,0);&lt;br /&gt;connect(t,&amp;amp;servrAddr,sizeof(servrAddr));&lt;br /&gt;...&lt;br /&gt;write(t,outMsg,sizeof(outMsg))&lt;br /&gt;&lt;br /&gt;Oltre alla funzione di chiusura close() vista prima è possibile effettuare la chiusura selettiva con&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;int shutdown(int s, int how);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dove how può assumere i seguenti valori:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;0&lt;/strong&gt;, per disabilitare ulteriori ricezioni&lt;br /&gt;&lt;strong&gt;1&lt;/strong&gt;,per disabilitare ulteriori invii&lt;br /&gt;&lt;strong&gt;2&lt;/strong&gt;, per disabilitare ulteriori invii e ricezioni&lt;br /&gt;&lt;br /&gt;Con&lt;br /&gt;&lt;br /&gt;&lt;em&gt;read(s,buf,cnt)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;è possibile leggere fino a cnt byte e restituisce 0 in caso di esito positivo altrimenti -1. In caso di lettura in mancanza di dati da una socket non bloccante verrà restituito un errore. In caso di socket bloccante se la connessione è aperta verrà bloccata ma se la connessione è chiusa può causare errore o leggere 0 byte. Scrivere su socket non più connesse restituisce errore se non viene adeguatamente gestito. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;4.0 Socket senza connessione&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Per scambiare dati tra socket abbiamo a disposizione due gruppi di chiamate di sistema. Il primo è costituito da sendto(…) e recvfrom(…), il secondo da send(…) e recv(…). Il secondo gruppo di chiamate di sistema prevede che le socket locali siano già connesse. Una volta creata la connessione con il tipo di socket relativo e associata quest’ultima ad un indirizzo locale è possibile inviare dati con :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&gt;#include &lt; sys / types.h  &gt;&lt;br /&gt;#include &lt; sys / socket.h   &gt;&lt;br /&gt;int send(int s, const void *msg, int len,&lt;br /&gt;unsigned int flags);&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;o al posto di send:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int sendto(int s, const void *msg, int len,&lt;br /&gt;unsigned int flags,&lt;br /&gt;const struct sockaddr *to, int tolen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dove i primi tre parametri e flags è una costante tra&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#define MSG_OOB 0x1 //si stanno inviando dati fuori-banda&lt;br /&gt;#define MSG_DONTROUTE 0x4 // non controlla tabelle di routing&lt;br /&gt;#define MSG_DONTWAIT 0x40 //invio non bloccante&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;altre costanti non verranno prese in considerazione. Gli ultimi due parametri si riferiscono alla struct relativa all’indirizzo di protocollo e alla sua lunghezza in byte. La lunghezza del messaggio puntato da *msg dipende dal protocollo sottostante. Il valore restituito sarà il numero di byte inviati o -1 in caso di errore. Per ricevere dati utilizzeremo invece:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int recv(int s, void *buf, int len, unsigned int flags);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;oppure&lt;br /&gt;&lt;br /&gt;&lt;em&gt;int recvfrom(int s, void *buf, int len, unsigned int flags,&lt;br /&gt;struct sockaddr *from, int *fromlen);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I parametri omonimi a quelli visti con send e sendto hanno lo stesso significato. Gli ultimi due parametri di recvfrom sono puntatori alla struct dell’indirizzo del mittente e alla sua lunghezza. Anche qui il valore restituito è il numero di byte letti o in caso di errore -1.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3756265955877626300?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3756265955877626300/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3756265955877626300' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3756265955877626300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3756265955877626300'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/1.html' title='Programmazione in C con socket (parte I)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1716150228539336291</id><published>2008-10-15T15:29:00.002+02:00</published><updated>2010-03-05T17:42:23.714+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Introduzione allo Sviluppo di Software</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Introduzione&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Nello sviluppo di un software, il team è costituito da diverse persone che svolgono diversi ruoli. Il &lt;strong&gt;leader&lt;/strong&gt;, ha il ruolo di coordinare l’intero sviluppo del software, determinare i fattori tecnici e organizzativi, strutturare la soluzione del problema, motivare gli altri membri del team ecc. Vi sono i &lt;strong&gt;programmatori&lt;/strong&gt; che hanno il compito di realizzare l’implementazione, &lt;strong&gt;gli analisti&lt;/strong&gt; che si occupano della verifica e della convalida del software e così via. Il numero e il tipo di membri dipendono dal progetto che si vuole realizzare e dalle risorse economiche e professionali che si ha a disposizione.&lt;br /&gt;Un progetto in ambito software gode di alcune proprietà: è un impresa svolta da più persone, che ha una durata limitata di tempo, una certa quantità di risorse a disposizione e deve essere pianificat0 e controllato costantemente al fine di garantire un buon risultato. Un progetto software è unico, ovvero affronta un problema che non era mai stato affrontato prima, temporaneo ,ovvero ha una durata limitata di tempo, ed può essere affrontato con modalità e tecniche differenti.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.0 Tipi di progetti&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;I progetti possono essere racchiusi in tre principali tronconi:&lt;br /&gt;&lt;br /&gt;Progetti nati dalla modifica di software già esistente.&lt;br /&gt;Progetti nati dallo sviluppo di un software da zero.&lt;br /&gt;Progetti nati dallo sviluppo di un software a partire da componenti da riutilizzare&lt;br /&gt;&lt;br /&gt;Al fine di garantire il risultato lo sviluppo di un progetto viene affrontato mediante un&lt;strong&gt; processo software&lt;/strong&gt;. Un processo software è l’insieme di operazioni che porta alla creazione alla produzione di programmi, documenti e dati come conseguenza dell’ingegneria del software definite dal processo stesso.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.0 Processo software&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La struttura di un processo software prevede due unità principali:&lt;br /&gt;&lt;br /&gt;Attività Strutturali&lt;br /&gt;&lt;br /&gt;Attività Ombrello&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le attività strutturali sono determinate da&lt;br /&gt;&lt;br /&gt;Comunicazioni&lt;br /&gt;Pianificazione&lt;br /&gt;Modellazione&lt;br /&gt;Costruzione&lt;br /&gt;Dispiegamento&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le Attività ombrello sono invece determinate da&lt;br /&gt;&lt;br /&gt;Controllo del progetto e sviluppo del software&lt;br /&gt;Gestione dei rischi&lt;br /&gt;Valutazione della qualità del prodotto ottenuto&lt;br /&gt;Revisioni tecnico formali&lt;br /&gt;Misura&lt;br /&gt;Gestione del riuso&lt;br /&gt;&lt;br /&gt;Vedremo in dettaglio ciascuna attività.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.0 Modello Prescrittivo&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Definisce un insieme di attività, azioni e compiti necessari al fine di ingegnerizzare il prodotto. Ciascun modello definisce anche un flusso di lavoro, ovvero il modo in cui gli elementi sono relazionati e godono di pregi e difetti. Alcuni esempi di modelli prescrittivi sono il modello a cascata, il modello a processo incrementale, il modello Extreme Programming ecc. Ciascuno di essi si adatta ( o non si adatta) a un tipo specifico di progetto o di team. &lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;br /&gt;&lt;em&gt;Modello a Cascata &lt;/em&gt;: detto anche ciclo di vita classico o modello sequenziale, si basa su un approccio sistematico e sequenzale. Si adatta bene quando i requisiti di un problema sono abbastanza noti, o si prevede uno sviluppo lineare. Le modifiche sono problematiche, difficilmente si conoscono e si possono esplicitare tutti i requisiti. Un programma funzionante si ottiene solitamente verso la fine dello sviluppo. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello a processi incrementali&lt;/em&gt;: si adatta bene se i requisiti iniziali sono chiari ed il progetto è molto ampio, se si preferisce fornire da subito delle funzionalità basi che vanno poi raffinate successivamente. La sequenza degli incrementi può anche essere pianificata ad hoc.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello Rapid Application Development&lt;/em&gt;: come suggerisce il nome, viene impiegato se si vuole concludere rapidamente un progetto.E' una sorta di evoluzione del modello a cascata e si adatta bene ai progetti modulari, in cui i moduli sono ben definibili e confinati.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello a Processo Evolutivo&lt;/em&gt;: adatto ai progetti in cui i requisiti variano spesso, i dettagli devono ancora essere definiti, le scadenze non sono rigide.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello a Spirale&lt;/em&gt;: si basa su prototipi e su un approccio ciclico crescendo in maniera incrementale&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;il grado di definizione e implementazione del sistema. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello a processo Unificato&lt;/em&gt;: si basa sui casi d'uso, è iterativo ed incrementale.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span &gt;&lt;em&gt;&lt;br /&gt;Modello a processo Agile&lt;/em&gt;: è guidato dalle descrizioni fatte dai clienti, sviluppa in maniera iterativa, consegna frequenti incrementi software e si adatta bene ai cambiamenti. Deve essere adattato ai bisogni del team che solitamente si autoregolano.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1716150228539336291?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1716150228539336291/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1716150228539336291' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1716150228539336291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1716150228539336291'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/introduzione-allo-sviluppo-di-software.html' title='Introduzione allo Sviluppo di Software'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-377348914974885684</id><published>2008-10-14T19:43:00.003+02:00</published><updated>2008-10-21T19:29:45.838+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Calcolo Scientifico'/><title type='text'>Introduzione a MathLab</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;1.0 Operazioni di base&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Matlab è un linguaggio di programmazione e un ambiente di lavoro grafico per il calcolo scientifico con routines e functions altamente avanzate. È possibile effettuare operazioni di calcolo di base semplicemente scrivendole come in una tradizionale calcolatrice. Ad esempio:&lt;br /&gt;&lt;br /&gt;&gt;&gt; 2 + 3&lt;br /&gt;&lt;br /&gt;Si otterrà in output il relativo risultato. Se vogliamo che il risultato non venga stampato su schermo facciamo seguire l’espressione da un ;&lt;br /&gt;&lt;br /&gt;&gt;&gt; 2 + 3 ;&lt;br /&gt;&lt;br /&gt;Normalmente Matlab stampa solo le prime 4 cifre decimale ma è anche possibile cambiare tale opzione:&lt;br /&gt;&lt;br /&gt;&gt;&gt; format long&lt;br /&gt;&lt;br /&gt;ad esempio per il formato long. Per altri formati è possibile ricorrere all’help con il comando&lt;br /&gt;&lt;br /&gt;&gt;&gt;help&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Per avere informazioni su una particolare function si utilizza il comando&lt;br /&gt;&lt;br /&gt;&gt;&gt;lookfor parola_chiave&lt;br /&gt;&lt;br /&gt;Dove parola_chiave è la nostra chiave di ricerca.&lt;br /&gt;Come in un qualsiasi linguaggio di programmazione si possono definire variabili:&lt;br /&gt;&lt;br /&gt;&gt;&gt;a= 2&lt;br /&gt;&lt;br /&gt;Per definire la variabile a. Alcune variabili sono à predefinite quali “pi” per P greco ecc.&lt;br /&gt;Un vettore si può definire in diversi modi:&lt;br /&gt;&lt;br /&gt;&gt;&gt; A= [ 1 2 3 4 5 6 ]&lt;br /&gt;&lt;br /&gt;Per un vettore riga&lt;br /&gt;&lt;br /&gt;&gt;&gt; A=[ 1; 2; 3; 3; 5 ]&lt;br /&gt;&lt;br /&gt;Per un vettore colonna&lt;br /&gt;&lt;br /&gt;&gt;&gt; A=[ 1; 2; 3; 3; 5 ]’&lt;br /&gt;&lt;br /&gt;Per la trasposta di A.&lt;br /&gt;&lt;br /&gt;&gt;&gt; A=[ 1 2 3;2 5 6; 5 7 9]&lt;br /&gt;&lt;br /&gt;Per stampare la matrice&lt;br /&gt;&lt;br /&gt;A =&lt;br /&gt;&lt;br /&gt;1 2 3&lt;br /&gt;2 5 6&lt;br /&gt;5 7 9&lt;br /&gt;&lt;br /&gt;Oppure si possono usare alcune functions come&lt;br /&gt;&lt;br /&gt;&gt;&gt;A=zeros(2)&lt;br /&gt;&lt;br /&gt;Per una matrice 2x2 nulla.&lt;br /&gt;&lt;br /&gt;&gt;&gt;A=ones(2)&lt;br /&gt;&lt;br /&gt;Per una matrice 2x2 di 1.&lt;br /&gt;&lt;br /&gt;&gt;&gt;A=rand(2)&lt;br /&gt;&lt;br /&gt;Per una matrice 2x2 di valori casuali.&lt;br /&gt;&lt;br /&gt;Il carattere : serve per indicare un ciclo. Ad esempio il comando&lt;br /&gt;&lt;br /&gt;&gt;&gt; A= 1:5&lt;br /&gt;&lt;br /&gt;Stampa il vettore [ 1 2 3 4 5].&lt;br /&gt;&lt;br /&gt;Le operazioni algebriche sulle matrice o sui vettori vengono eseguiti automaticamente dai relativi operatori:&lt;br /&gt;&lt;br /&gt;&gt;&gt; A+B&lt;br /&gt;&lt;br /&gt;Ad esempio stampa la somma delle matrici A e B e così via.&lt;br /&gt;&lt;br /&gt;Altri operatori sono&lt;br /&gt;&lt;br /&gt;/ divisione&lt;br /&gt;* moltiplicazione di matrici&lt;br /&gt;.* moltiplicazione di componenti&lt;br /&gt;^ potenza&lt;br /&gt;&lt;br /&gt;Gli operatori relazioni sono&lt;br /&gt;&lt;br /&gt;= uguale&lt;br /&gt;~= diverso&lt;br /&gt;&gt; maggiore&lt;br /&gt;&gt;= maggiore uguale&lt;br /&gt;Ecc. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Gli operatori logici sono:&lt;br /&gt;&lt;br /&gt;&amp;amp; and&lt;br /&gt;or&lt;br /&gt;~ not&lt;br /&gt;&lt;br /&gt;Tutti gli operatori visti sono validi anche per le matrici.&lt;br /&gt;&lt;br /&gt;Alcune functions utili per le matrici sono&lt;br /&gt;&lt;br /&gt;&gt;&gt;diag(A)&lt;br /&gt;&lt;br /&gt;Per stampare la sua diagonale.&lt;br /&gt;&lt;br /&gt;&gt;&gt;sum(A)&lt;br /&gt;&lt;br /&gt;Per stampare il vettore somma di A.&lt;br /&gt;&lt;br /&gt;&gt;&gt;fliplr(A)&lt;br /&gt;&lt;br /&gt;Per la matrice speculare di A.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Come in un qualunque altro linguaggio è possibile utilizzare costrutti di selezione della forma&lt;br /&gt; &lt;br /&gt;&lt;em&gt;if espressione&lt;br /&gt;istruzione1&lt;br /&gt;istruzione2&lt;br /&gt;…&lt;br /&gt;end&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;oppure della forma&lt;br /&gt;&lt;br /&gt;&lt;em&gt;if espressione&lt;br /&gt;istruzione1&lt;br /&gt;elseif espressione&lt;br /&gt;istruzione2&lt;br /&gt;end&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Se l’espressione richiede il confronto tra stringhe esse devono anche essere della stessa lunghezza.&lt;br /&gt;Ad esempio si può scrivere&lt;br /&gt;&lt;br /&gt;&lt;em&gt;If (x== ‘ciao ’)&lt;br /&gt;display(‘ciao)&lt;br /&gt;elseif(x== ‘salve’)&lt;br /&gt;dislay(‘buongiorno’)&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Come vedete, alla stringa ‘ciao’ è stato aggiunto un carattere al fine di avere la stessa lunghezza di ‘salve’. Come in tutti i comuni linguaggi è possibile utilizzare cicli iterativi della forma&lt;br /&gt;&lt;br /&gt;&lt;em&gt;for(variabile=espressione)&lt;br /&gt;  istruzione1&lt;br /&gt;  istruzione2&lt;br /&gt;  ….&lt;br /&gt;end&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Ad esempio se vogliamo calcolare la somma dei primi 50 numeri scriviamo&lt;br /&gt;&lt;br /&gt;&lt;em&gt; s=0;&lt;br /&gt; for i=1:50&lt;br /&gt;   s=s+i;&lt;br /&gt;end&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Anche Mathlab ammette cicli annidati. Simmetricamente, si può utilizzare il costrutto while&lt;br /&gt;&lt;em&gt;&lt;br /&gt;while( variabile=espressione)&lt;br /&gt;  istruzione1&lt;br /&gt;  istruzione2&lt;br /&gt;   …..&lt;br /&gt;end&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I programmi scritti in Mathlab hanno estensione .m . Si dividono in due categorie:&lt;br /&gt;&lt;br /&gt;-gli script-file che non ricevono e non restituiscono valori ma operano sulle variabili del workspace&lt;br /&gt;&lt;br /&gt;- i function-file che ricevono e restituiscono valori  e le cui variabili non modificano le variabili del workspace.&lt;br /&gt;&lt;br /&gt;I commenti sono preceduti dal carattere ‘%’. Le prime righe di commento diventano parte dell’help on-line.Una function si definisce con l’istruzione:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;function [out1,out2..]= nome_funzione(in1,in2,in3)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;in cui out1,out2 sono gli output e in1,in2 gli input.Il file va salvato con il nome nome_funzione.m . È possibile utilizzare meno parametri attuali rispetto ai parametri formali definiti dalla function.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-377348914974885684?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/377348914974885684/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=377348914974885684' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/377348914974885684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/377348914974885684'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/introduzione-mathlab.html' title='Introduzione a MathLab'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8620169368718890587</id><published>2008-10-13T19:49:00.003+02:00</published><updated>2008-10-13T21:56:07.603+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemi Distribuiti'/><title type='text'>Introduzione ai Sistemi Distribuiti</title><content type='html'>&lt;div align="justify"&gt;Per sistema distribuito si intende una collezione di computer indipendenti che appare agli utenti come un singolo sistema coerente dal quale ricevere un servizio. Agli utenti è del tutto celata la tipologia di sistema,il numero di sistemi coinvolti,la modalità in cui sono interconnessi, le loro prestazioni e così via. L’obbiettivo principale di un sistema distribuito è rendere l’accesso alle risorse remote facile ed efficiente. Nel far ciò il sistema deve rispettare tre principi fondamentali: &lt;strong&gt;trasparenza, apertura &lt;/strong&gt;e &lt;strong&gt;scalabilità,&lt;/strong&gt; ovvero deve nascondere il meccanismo che sta dietro all’accesso alle risorse richieste dall’utente, deve rispettare tutte le regole di standard e poter offrire i servizi richiesti nel modo migliore in base,ad esempio, al tipo di servizio o al tipo di utenza. Esistono differenti tipi di architetture distribuite. Nel modello client-server, un lato chiamato server offre servizi al lato opposto detto client che li ha richiesti. Nel modello decentralizzato vi sono una serie di pari chiamati peers che richiedono e offrono servizi tra loro. Questi due modelli possono essere combinati in un modello detto ibrido. Al fine di supportare computer e reti eterogenei continuando a mantenere le proprietà viste prime i sistemi distribuiti sono spesso organizzati come uno strato di software logicamente posizionato tra gli utenti e le loro applicazioni e il sistema operativo. In questo caso si parla di &lt;strong&gt;middleware&lt;/strong&gt;. Tutti i sistemi odierni, al fine di offrire servizi remoti ricorrono alle &lt;strong&gt;socket.&lt;/strong&gt; Una socket è dal punto di vista logico un punto di ingresso o di uscita verso cui incanalare dati al fine di trasmetterli in rete. I sistemi devono creare e collegare dinamicamente le socket prima di utilizzarle. Un programmatore utilizza una socket come un oggetto su cui operare uno stream di dati; in questo modo ne viene celato il meccanismo di trasmissione ( vedi archivio Reti di Calcolatori). &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8620169368718890587?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8620169368718890587/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8620169368718890587' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8620169368718890587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8620169368718890587'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/10/introduzione-ai-sistemi-distribuiti.html' title='Introduzione ai Sistemi Distribuiti'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5888044751360920035</id><published>2008-09-28T18:04:00.002+02:00</published><updated>2008-09-29T18:07:45.787+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Tavola Riassuntiva della Complessità Asintotica dei Principali Algoritmi Noti</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/Riassunto%20Complessita.zip"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Errata Corrige: nel 4 rigo la voce MergeSort va sostituita con QuickSort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5888044751360920035?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5888044751360920035/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5888044751360920035' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5888044751360920035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5888044751360920035'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/tavola-riassuntiva-della-complessit.html' title='Tavola Riassuntiva della Complessità Asintotica dei Principali Algoritmi Noti'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1792278884068796595</id><published>2008-09-17T22:12:00.000+02:00</published><updated>2008-09-18T13:29:39.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Ingegneria del software'/><title type='text'>Esempi Problem Solving in Java</title><content type='html'>Esempi pratici sulla tecnica di problem solving in java.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/solving_java.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1792278884068796595?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1792278884068796595/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1792278884068796595' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1792278884068796595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1792278884068796595'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/esempi-problem-solving-in-java.html' title='Esempi Problem Solving in Java'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6928300789395282248</id><published>2008-09-16T22:13:00.003+02:00</published><updated>2008-09-16T22:21:26.415+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Procedure e Metodi in Java</title><content type='html'>&lt;div align="justify"&gt;Raccolta di metodi e procedure in java per la risoluzione di problemi di natura differente. Gli esempi vogliono essere una forma di allenamento alla risoluzione di problemi mediante il linguaggio Java. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/metodi.rar"&gt;Download&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6928300789395282248?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6928300789395282248/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6928300789395282248' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6928300789395282248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6928300789395282248'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/procedure-e-metodi-in-java.html' title='Procedure e Metodi in Java'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7375182694970535519</id><published>2008-09-15T21:25:00.030+02:00</published><updated>2010-12-07T11:59:22.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Esempi di Calcolo della Complessità Asintotica</title><content type='html'>Esempi pratici sul calcolo della complessità asintotica suddivisi in diverse parti:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/Analisi_complessita01.zip"&gt;Parte 1;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//analisi_complessita02.zip"&gt;Parte 2;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//analisi_complessita03.zip"&gt;Parte 3;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//analisi_complessita04.zip"&gt;Parte 4;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/esempio_complessita_3.zip"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//analisi_complessita05.zip"&gt;Parte 5;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//esempio_complessita_06.zip"&gt;Parte 6;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484//analisi_complessita07.zip"&gt;Parte 7;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Errata Corrige: Parte 5. Nel primo caso del teorema master la soluzione è compresa tra 1 e 3 (cambiare il 4 con il 3).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7375182694970535519?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7375182694970535519/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7375182694970535519' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7375182694970535519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7375182694970535519'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/esempi-di-calcolo-dellanalisi-della.html' title='Esempi di Calcolo della Complessità Asintotica'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8650533934751912167</id><published>2008-09-13T21:47:00.002+02:00</published><updated>2008-09-13T21:51:19.621+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Alberi Splay e Alberi AVL</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/alberi%20splay-AVL.zip "&gt;Appunti in formato jpg sugli alberi AVL e sugli alberi Splay&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8650533934751912167?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8650533934751912167/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8650533934751912167' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8650533934751912167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8650533934751912167'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/alberi-splay-e-alberi-avl.html' title='Alberi Splay e Alberi AVL'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3023792096719001253</id><published>2008-09-12T22:05:00.008+02:00</published><updated>2009-10-26T10:38:20.372+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>A</title><content type='html'>&lt;div align="justify"&gt;&lt;div align="justify"&gt;&lt;strong&gt;Accessibilità: &lt;/strong&gt;ramo della scienza nota come "Interazione Uomo-Macchina" , che si pone l'obbiettivo di migliorare la fruizione di contenuti da parte di qualsiasi utente che ne vuole usufruire.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Albero AVL(Adelson-Velski-Landis):&lt;/strong&gt; Particolare albero binario di ricerca in cui per ogni nodo l'altezza del sottoalbero sinistro e quello destro differiscono al più di 1 ed entrambi i sottoalberi sono a loro volta alberi AVL.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;strong&gt;Albero Rosso-Nero (Albero RB):&lt;/strong&gt; Particolare albero di ricerca binario in cui i nodi assumono due colori, rosso e nero ,mantenendo valide 5 proprietà: La radice è nera; tutte le foglie sono nere; tutti i nodi sono o rossi o neri, qualsiasi percorso da un nodo interno ad una foglia contiene lo stesso numero di nodi neri; se un nodo è rosso entrambi i suoi figli sono neri.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;Albero Splay&lt;/strong&gt;: particolare tipo di albero di ricerca binario i cui elementi sono ordinati per frequenza di accesso dall'alto verso il basso.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Algebra Relazionale&lt;/span&gt;: Insieme degli operatori,operandi e operazioni che permettono di rappresentare dal punto di vista logico le query di un database.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Applet&lt;/strong&gt;: Nell'ambito delle tecnoligie Java per il web, un'applet è un oggetto per l'utilizzo di elementi dinamici che può essere integrato in una pagina web.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3023792096719001253?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3023792096719001253/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3023792096719001253' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3023792096719001253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3023792096719001253'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/blog-post.html' title='A'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5374650036329742427</id><published>2008-09-12T21:53:00.002+02:00</published><updated>2008-09-12T22:03:01.910+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Operazioni su Alberi Rosso Neri</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/operazioni%20alberi%20RB.zip"&gt;Operazioni elementari su alberi RB con esempi pratici in formato jpg &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5374650036329742427?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5374650036329742427/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5374650036329742427' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5374650036329742427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5374650036329742427'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/09/operazioni-su-alberi-rosso-neri.html' title='Operazioni su Alberi Rosso Neri'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-302582793260381146</id><published>2008-08-23T21:57:00.001+02:00</published><updated>2008-08-23T21:58:07.570+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Introduzione ai grafi</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/grafi.zip"&gt;Appunti introduttivi sui grafi in formato jpg.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-302582793260381146?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/302582793260381146/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=302582793260381146' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/302582793260381146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/302582793260381146'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/introduzione-ai-grafi.html' title='Introduzione ai grafi'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7621750525227248569</id><published>2008-08-22T22:17:00.001+02:00</published><updated>2008-08-22T22:24:12.333+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Strutture dati elementari</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/strutture%20dati%20elementari.zip"&gt;Presentazione delle strutture dati pile,code,stack e alberi binari di ricerca,alberi rosso-neri,alberi di intervalli in formato jpg su fileden&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7621750525227248569?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7621750525227248569/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7621750525227248569' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7621750525227248569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7621750525227248569'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/strutture-dati-elementari.html' title='Strutture dati elementari'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2079037852112025880</id><published>2008-08-20T22:00:00.002+02:00</published><updated>2008-08-20T22:20:44.820+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Ordinamento e Statistiche d'Ordine</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/ordinamento%20e%20stat%20d_ordine.zip"&gt;Post su ordinamento e statistiche d'ordine in formato jpg uppato su fileden.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2079037852112025880?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2079037852112025880/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2079037852112025880' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2079037852112025880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2079037852112025880'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/ordinamento-e-statistiche-dordine.html' title='Ordinamento e Statistiche d&apos;Ordine'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8884510087643291090</id><published>2008-08-16T21:33:00.003+02:00</published><updated>2008-08-20T20:49:39.309+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>H</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;Heap binario:&lt;/strong&gt; struttura dati costituita da un array il cui comportamento dei suoi elementi corrispondi ad un albero binario. Esistono due tipi di heap binario: il max-heap, il cui albero rappresentato è un  albero binario ordinato in ordine decrescente e min-heap, il cui albero è in ordine crescente.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8884510087643291090?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8884510087643291090/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8884510087643291090' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8884510087643291090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8884510087643291090'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/h.html' title='H'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-641841985005974766</id><published>2008-08-15T12:03:00.003+02:00</published><updated>2008-08-15T16:20:40.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Ricorrenze</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/ricorrenze.rar "&gt;Appunti su Ricorrenze,metodo di sostituzione,metodo degli alberi di ricorrenze e metodo master con dimostrazione del teorema.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-641841985005974766?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/641841985005974766/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=641841985005974766' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/641841985005974766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/641841985005974766'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/ricorrenze.html' title='Ricorrenze'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6115742457500343149</id><published>2008-08-13T00:18:00.002+02:00</published><updated>2008-08-13T12:21:33.432+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Crescita di funzioni</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/crescita%20di%20funzioni.rar "&gt;Post sulla crescita di funzioni&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6115742457500343149?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6115742457500343149/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6115742457500343149' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6115742457500343149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6115742457500343149'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/crescita-di-funzioni.html' title='Crescita di funzioni'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-3292812920701169307</id><published>2008-08-11T22:24:00.001+02:00</published><updated>2008-08-13T00:18:48.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Divide et impera</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/divide_et_impera.zip "&gt;Post su Divide et impera con analisi di merge sort in upload su fileeden&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-3292812920701169307?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/3292812920701169307/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=3292812920701169307' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3292812920701169307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/3292812920701169307'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/divide-et-impera.html' title='Divide et impera'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6478637136554642902</id><published>2008-08-08T16:04:00.006+02:00</published><updated>2008-08-10T17:06:52.223+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Insertion Sort</title><content type='html'>&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/insertion_sort.rar"&gt;Prima parte del post su insertion sort pubblicato in formato immagine su fileEden&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/insertion_sort%202.rar "&gt;Seconda parte del post dedicato a insertion sort&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6478637136554642902?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6478637136554642902/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6478637136554642902' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6478637136554642902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6478637136554642902'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/insertion-sort.html' title='Insertion Sort'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-5269218391155926250</id><published>2008-08-08T16:01:00.003+02:00</published><updated>2008-08-08T16:13:33.035+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fuori Categoria'/><title type='text'>Una breve nota</title><content type='html'>Gentili lettori, &lt;br /&gt;per motivi legati all'implementazione dell'editor html di blogspot, molte delle notazioni utilizzate nei post non possono essere visualizzate correttamente, perciò mi vedrò costretto a pubblicare appunti scritti a mano. Cercherò di utilizzare una caligrafia quanto più chiara possibile e, rinnovando le mie scuse, colgo l'occasione per salutare tutti i miei lettori.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-5269218391155926250?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/5269218391155926250/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=5269218391155926250' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5269218391155926250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/5269218391155926250'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/una-breve-nota.html' title='Una breve nota'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8272138831268392097</id><published>2008-08-02T16:18:00.007+02:00</published><updated>2008-08-02T20:37:29.724+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmi'/><title type='text'>Introduzione agli algoritmi</title><content type='html'>&lt;div align="justify"&gt;Il termine algoritmo può essere definito come una procedura di calcolo ben definita che prendi un valore o un insieme di valore come &lt;strong&gt;input &lt;/strong&gt;e genera un valore o un insieme di valori come &lt;strong&gt;output&lt;/strong&gt;. Un algoritmo è dunque una sequenza di passi computazionali che trasforma l’input in output. Possiamo considerare un algoritmo come uno strumento per risolvere un problema computazionale ben definito. Per esempio si supponga di dover ordinare una sequenza di n elementi in ordine crescente o decrescente. Il problema dell'ordinamento può formalmente essere definito nel modo seguente:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;Input: una sequenza di n numeri (a1,a2,…..an )&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Outuput: una permutazione (a1’,a2’,…..an‘) tale che (a1'&lt; a2' &lt; .... &lt; an'). &lt;br /&gt;      &lt;br /&gt;La sequenza di input viene detta &lt;strong&gt;istanza&lt;/strong&gt; del problema di ordinamento. L’istanza del problema è l’input che soddisfa tutti i vincoli imposti dalla definizione del problema richiesto per calcolare una soluzione del problema. Un algoritmo è &lt;strong&gt;corretto&lt;/strong&gt; se per ogni istanza di input termina con l’output corretto. In questo caso l’algoritmo risolve il problema computazionale dato. Gli algoritmi devono essere efficienti, ovvero devono utilizzare il minor numero di risorse possibile in termini di tempo e di spazio. Anche se ci occuperemo principalmente di soli algoritmi corretti, un algoritmo non corretto può essere utilizzato ugualmente se il suo margine di errore è nei limiti di tolleranza. Ci occuperemo in altre occasioni degli algoritmi non corretti.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8272138831268392097?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8272138831268392097/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8272138831268392097' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8272138831268392097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8272138831268392097'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/08/introduzione.html' title='Introduzione agli algoritmi'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4027952690624968069</id><published>2008-07-20T15:51:00.003+02:00</published><updated>2008-07-20T16:00:47.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerPedia'/><title type='text'>0-9</title><content type='html'>&lt;strong&gt;4B/5B ( Codifica)&lt;/strong&gt;: codifica che consiste in output di 5 bit a partire da 4 bit. Le codeword non utilizzate per i dati vengono impiegate con la funzione di controllo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;8B/6T (Codifica):&lt;/strong&gt; codifica che consiste in output di 6 trit a partire da 8 bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4027952690624968069?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4027952690624968069/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4027952690624968069' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4027952690624968069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4027952690624968069'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/07/0-9.html' title='0-9'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-2506243428742878007</id><published>2008-07-07T21:41:00.010+02:00</published><updated>2008-12-13T06:25:33.978+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reti di Calcolatori'/><title type='text'>Il protocollo HDLC (High-Level Data Link Control)</title><content type='html'>&lt;div align="justify"&gt;Il protocollo HDL nasce da un protocollo usato in principio nell'ambiente dei mainframe IBM, chiamato SDLC, che dopo alcune modifiche divenne starndard ANSI con il nome ADCCP. Analogamente SDLC divenne standard ISO con il nome HDLC. Tutti questi protocolli si assomigliano per la maggior parte delle loro caratteristiche ma differiscono in alcuni punti. Utilizzano frame di 6 campi, uno &lt;em&gt;Address&lt;/em&gt;, che indica l'indirizzo del terminale,uno &lt;em&gt;Control&lt;/em&gt; che vedremo più avanti, uno &lt;em&gt;Data&lt;/em&gt; che contiene il carico utile e può avere lunghezza variabile, il campo &lt;em&gt;Chechsum&lt;/em&gt; per la codifica a controllo d'errore a ridondanza ciclica (CRC), il tutto delimitato dalla sequenza 01111110. I frame possono essere di tre tipi: &lt;strong&gt;informazione&lt;/strong&gt;, &lt;strong&gt;supervisione&lt;/strong&gt; e &lt;strong&gt;senza numero. &lt;/strong&gt;Il campo &lt;em&gt;Control&lt;/em&gt; differisce per ogni tipo di frame.Questo campo contiene i seguenti sotto-campi: il campo &lt;em&gt;Seq&lt;/em&gt; indica il numero di sequenza e si possono avere fino a 7 frame in attesa di ack. Il campo &lt;em&gt;Next &lt;/em&gt;è usato per il piggyback dell'ack ovvero nel trasporto dell'ack dell'ultimo frame ricevuto (in verità questi protocolli usano il piggybacking per l'ack del successivo frame non ancora ricevuto e non dell'ultimo frame ricevuto). Il campo &lt;em&gt;P/F&lt;/em&gt; è usato quando un computer vuole interrogare un gruppo di terminali. Se usato come &lt;em&gt;Poll&lt;/em&gt; invita il terminale a mandare dati. Tutti i frame inviati dal computer avranno questo bit impostato a P mentre l'ultimo lo imposterà a F. Il bit &lt;em&gt;P/F&lt;/em&gt; è usato a volte per forzare l'altra macchina a inviare immediatamente un frame supervisione. In alcuni casi questo campo è usato in connessione con i frame senza numero. I frame supervisione si distinguono dal frame informazione in quanto usano il campo &lt;em&gt;Type&lt;/em&gt; al posto del campo &lt;em&gt;Seq&lt;/em&gt;. Se Type è di tipo 0 il frame è un frame di acknoledgement (ufficialmente chiamato RECEIVE READY); se è di tipo 1 è un frame di anacknoledgment (chiamato REJECT); se è di tipo 2 (RECEIVE NOT READY) è usato per ricevere gli ack di tutti i frame fino a ,ma non incluso, quello indicato da Next. Il terzo tipo è chiamato SELECTIVE REJECT e chiede esclusivamente la trasmissione del frame specificato. Il terzo tipo è presente solo nei protocolli HDLC e ADCCP. La terza e ultima classe di frame è il tipo senza numero. Può essere impiegato per informazioni di controllo o per trasportare solo dati per conto di servizi senza connessione e non affidabili. Per indicare il tipo di frame sono presenti 5 bit ma non sono usate tutte le 32 combinazioni. Ad esempio tutti i protocolli usano il tipo DISC, che permette di annunciare che si sta andando fuori linea e si può tornare operativi con il comando SNRM. SNRM purtroppo è asincronico in quanto legato alle vecchie comunicazioni che venivano fatte da terminali stupidi che colloquiavano con l'elaboratore centrale. Per rendere il protocollo più appropriato furono introdotti i comandi SABME e SNRME per ovviare al problema. Un ulteriore tipo è chiamato FRMR ed è impiegato per indicare l'arrivo di un frame con il checksum corretto ma con una semantica impossibile. Esiste anche uno speciale frame di controllo chiamato UA che contiene acknolegment. Oltre all'UA ve ne sono altri adibiti ad esempio ad operazioni di inizializzazione, interrogazione, di rapporto sullo stato e di informazioni. Questi frame non passano al livello di rete ma sono solamente per lo strato data link. Ecco una sintesi che riassume il contenuto dei frame. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5220381961069362930" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SHKFvB1lfvI/AAAAAAAAAIo/LxE1LqNfymE/s400/Immagine.jpg" border="0" /&gt; &lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-2506243428742878007?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/2506243428742878007/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=2506243428742878007' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2506243428742878007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/2506243428742878007'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/07/il-protocollo-hdlc-high-level-data-link.html' title='Il protocollo HDLC (High-Level Data Link Control)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pti-0b5YBiE/SHKFvB1lfvI/AAAAAAAAAIo/LxE1LqNfymE/s72-c/Immagine.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-1969446950127014085</id><published>2008-07-06T22:08:00.007+02:00</published><updated>2008-07-13T10:54:47.831+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reti di Calcolatori'/><title type='text'>Il Protocollo PPP(Point to Point Protocol)</title><content type='html'>&lt;div align="justify"&gt;Il protocollo PPP (Point to Point Protocol) è il protocollo a livello datalink più utilizzato oggi soprattutto nel dialogo tra privati e ISP. Soffermiamoci un attimo sui requisiti stabiliti da IETF per il suo progetto.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Framing dei Pacchetti&lt;/strong&gt;:il protocollo deve essere in grado di frammentare i pacchetti in moda da consentire al ricevente l'individuamento dell'inizio e della fine di ogni pacchetto a livello link e di rete.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Trasparenza&lt;/strong&gt;: Il protocollo non deve porre alcuna restrizione ai dati che appaiono a livello di rete.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Protocolli Multipli del livello di Rete&lt;/strong&gt;:&lt;strong&gt; &lt;/strong&gt;deve supportare i vari protocolli a livello di rete e multiplexare diversi protocolli del livello di rete su una connessione punto a punto.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Tipi di Link multipli:&lt;/strong&gt; il protocollo deve supportare una vasta tipologia di collegamenti quali seriali, paralleli,sincroni,asincroni,a bassa o alta velocità.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Rilevazione degli errori:&lt;/strong&gt; il ricevente deve essere in grado di rilevare errori nei pacchetti.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Disponibilità della connessione&lt;/strong&gt;: il protocollo deve rilevare la presenza di eventuali guasti a livello di link e segnararli.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Negoziazione degli indirizzi di rete: &lt;/strong&gt;PPP deve essere in grado di ottenere e configurare gli indirizzi di rete.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Semplicità: &lt;/strong&gt;la parola d'ordine per un protocollo punto a punto è semplicità.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Controllo di flusso:&lt;/strong&gt; il protocollo deve essere di gestire il traffico di pacchetti in base al tasso nominale del sottostante livello fisico.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Sequenza:&lt;/strong&gt; i pacchetti non devono essere necessariamente trasferiti al ricevente nello stesso ordine in cui sono spediti dal trasmittente.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Collegamento multipunto:&lt;/strong&gt; PPP può operare solo su collegamenti punto a punto.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Analizziamo le caratteristiche salienti di questo protocollo. Ecco come PPP frammenta i dati:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Flag&lt;/strong&gt;: Ogni pacchetto PPP inizia e termina con la sequenza 01111110.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Indirizzo:&lt;/strong&gt; L'unico valore di questo campo è 11111111.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Controllo:&lt;/strong&gt; L'unico valore di questo campo è 00000011. Questi due campi hanno valori fissi in quanto ulteriori valori potrebbero essere stabiliti più avanti se richiesto.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Protocollo:&lt;/strong&gt; Questo campo indica al ricevente quale è il protocollo del livello superiore a cui appartengono i dati incapsulati.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Informazioni:&lt;/strong&gt;Questo campo include il pacchetto trasmesso dal livello superiore. La sua lunghezza solitamente è 1500 byte ma può essere variata quando si configurara per la prima volta un pacchetto.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;CheckSum:&lt;/strong&gt; PPP prevede un sistema di codifica a rilevazione di errori a ridondanza ciclica CRC a due o quattro byte.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;Per il framing dei dati PPP ricorre al &lt;strong&gt;byte stuffing&lt;/strong&gt; in accordo al principio di trasparenza visto prima. In pratica quando si presenta una sequenza di dati simile all'intestazione, PPP premette un byte di controllo per indicare che si tratta di un dato reale. Il ricevente provvederà a rimuovere il byte di controllo e a ricostruire la sequenza originale. Vediamo adesso come si configura un collegamento PPP. I due peer prima di trasmettere dati eseguono una sorta di handshake a tre vie. Nel momento in cui si verifica un evento come la rilevazione della portante o l'intervento dell'amministratore di rete, PPP entra nello stato di configurazione del collegamento. Un lato del collegamento invia un pacchetto configure-request LCP, in cui &lt;strong&gt;LCP&lt;/strong&gt; è l'omonimo protocollo di controllo del collegamento (Link Control Protocol). L'altro lato può accettare tutte le opzioni con un pacchetto configure-ack, rifituarle con un pacchetto configure-nack o potrebbe non identificarle e quindi non accettarle con un pacchetto configure-reject. Le opzioni di configurazione prevedono la dimensione massima del pacchetto, la specifica di un protocollo di identificazione e un'opzione per l'omissione dei campi indirizzo e controllo dei pacchetti. Se sopra PPP c'è IP è possibile configurare i moduli di IP utilizzando il protocollo di controllo IP &lt;strong&gt;IPCP. &lt;/strong&gt;I dati IPCP vengono inseriti in un pacchetto PPP in modo analogo a quello in cui sono inseriti i dati LCP. A questo punto i due estremi del collegamento possono iniziare lo scambio di dati. Il collegamento PPP rimane configurato finchè un'estremità invia un pacchetto LCP di richiesta chiusura e ottiene un pacchetto LCP di riscontro. A questo punto il collegamento entra nello stato di inattività.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-1969446950127014085?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/1969446950127014085/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=1969446950127014085' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1969446950127014085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/1969446950127014085'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/07/il-protocollo-ppppoint-to-point.html' title='Il Protocollo PPP(Point to Point Protocol)'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-4192139267517216344</id><published>2008-07-02T15:30:00.006+02:00</published><updated>2008-07-02T16:57:31.021+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reti di Calcolatori'/><title type='text'>Modelli di Riferimento</title><content type='html'>&lt;div align="justify"&gt;Le reti presentano sempre una struttura complessa e profonda. Essa è organizzata come una pila o un insieme di livelli ciascuno dei quali costituisce uno strumento per offrire determinati servizi al livello superiore, schermandoli dall'implementazione. Le regole e le convezioni utilizzate a questo scopo sono note come &lt;strong&gt;protocolli&lt;/strong&gt;. E' utile fare una distinzione tra protocollo e servizio. Un servizio è un insieme di primitive (operazioni) che uno strato offre ad uno strato superiore. Un protocollo è un insieme di regole che controllano il significato ed il formato dei pacchetti o dei messaggi scambiati tra le entità pari all'interno di uno strato (cioè i rispettivi livelli). Ogni architettura di rete presenta una sua pila di protocolli,un certo numero di strati con un certo numero di protocolli e servizi per ognuno di essi. I due esempi più importanti sono il modello OSI e il modello TCP/IP. Il modello OSI presenta 7 strati: lo strato fisico che si occupa della trasmissione dei bit grezzi sul canale di comunicazione, lo strato data-link che consiste nel rilevare gli errori di trasmisisone, lo strato di rete che controlla il funzionamento della subnet, lo strato trasporto che si occupa di frammentare e assicurare allo strato di rete tutti i pacchetti dello strato superiore in ordine corretto, lo strato sessione che si occupa di stabilire da due utenti su computer diversi una sessione, lo strato presentazione che si occupa della sintassi e delle semantica dell'informazione trasmessa, e lo strato applicazione che comprende i protocolli comunemente richiesti dagli utenti per le applicazioni. Il modello TCP/IP comprende 5 strati, lo strato fisico,data-link,rete,trasporto, applicazione che svolgono grosso modo le analoghe funzioni del modello OSI. Sostanzialmente il modello OSI nacque per lo più per offrire un modello di riferimento a cui le implementazioni sussessive avrebbero dovuto puntare, in quanto fu concepito prima ancora dei protocolli corrispondenti e ciò lo rende generico e di scarsa applicazione. Il modello TCP/IP invece nacque dopo la realizzazione dei suoi protocolli ai quali fu "incastrato" il modello OSI. Per questo motivo il modello TCP/IP presenta strati in cui servizi e protocolli spesso sono difficilmente distinguibili ed è poco adatto a descrivere architetture differenti da TCP/IP stesso. Per tutto il corso dei posts di questo archivio utilizzeremo il modello TCP/IP. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-4192139267517216344?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/4192139267517216344/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=4192139267517216344' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4192139267517216344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/4192139267517216344'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/07/modelli-di-riferimento.html' title='Modelli di Riferimento'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-8522873275432553418</id><published>2008-06-26T15:32:00.014+02:00</published><updated>2008-12-13T06:25:34.547+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amministrazione dei Sistemi Open Source'/><title type='text'>Fondamenti di UNIX</title><content type='html'>&lt;div align="justify"&gt;Fino agli anni ’60 il teatro dell’informatica era dominato da enormi mainframe dal valore commerciale di milioni di dollari, muniti di SO poco efficienti e di dimensioni elevate. Alla fine degli anni ’60 il mercato dei minicomputer cominciò prepotentemente a farsi largo per via delle moderate prestazioni e dei costi contenuti. In questo contesto si inserisce un piccolo sistema operativo ideato da Khen Thompson e scritto inizialmente in assembler e poi in C. Unix è distribuito in diverse versioni e in versione standard chiamata POSIX. La versione di cui ci occuperemo è Linux. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Comandi di Base&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Questo post vuole solo essere una guida ai comandi basilari del sistema Unix, ovvero ai comandi per il login, di operazione con i file e le directory ed i fondamenti di creazione di shell scripts. Affronteremo i concetti avanzati in post successivi.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;La prima operazione di cui ci occuperemo sarà il Login. Inseriremo dunque la nostra user-id e la password. A questo punto la shell, un programma con il compito di ricevere i nostri comandi, è in attesa e vedremo il prompt. Alcune combinazioni di tasti possono avere effetti sul programma in esecuzione o sulla shell. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Ctrl-C interrompe l’esecuzione di un programma;&lt;br /&gt;Ctrl-S blocca su schermo l’output;&lt;br /&gt;Ctrl-Q riprende su schermo l’output; &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Possiamo cambiare la nostra password tramite il comando $passwd e seguire le istruzioni su schermo. Notate che il simbolo $ indica che segue un comando da inserire in shell e sarà il simbolo che utlizzeremo da questo momento in poi. Per terminare la nostra sessione utilizzeremo uno tra i comandi &lt;strong&gt;$exit&lt;/strong&gt; o &lt;strong&gt;$logout&lt;/strong&gt;. Unix vede i file come una sequenza di byte e distingue tra maiuscole e minuscole (case sensitive). Se ad esempio vogliamo aggiungere una stringa al nostro file di nome appunti la stringa “oggi lezione” digiteremo&lt;strong&gt; $echo oggi lezione &gt; appunti&lt;/strong&gt;. Se vogliamo stampare su schermo il contenuto di appunti scriveremo &lt;strong&gt;$cat appunti&lt;/strong&gt;. Il comando cat interpreta i byte come caratteri. Le directory servono per racchiudere file o altre directory. Ogni utente ha una home directory. Tutte le directory sono contenute in una directory chiamata root e che viene indicata con &lt;strong&gt;/&lt;/strong&gt;. Per accedere ad una directory dovremmo attraversare il suo path.Unix distingue un pathname assoluto,che localizza una directory a partire dalla root e un pathname relativo che localizza un directory a partire dalla posizione corrente. Se vogliamo spostarci nella cartella Documenti contenuta in MarioRossi che si trova nella root scriveremo: &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;$cd MarioRossi/Documenti&lt;/strong&gt; &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Il comando &lt;strong&gt;$cd&lt;/strong&gt; senza parametri ci riporta alla home directory. Se vogliamo la lista di file contenuta nella cartella documenti ci sposteremo al suo interno e scriveremo $ls. $ls ammette anche parametri quali&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;-a elenca anche i file&lt;br /&gt;-s elenca in ordine crescente&lt;br /&gt;-t elenca a partire dal più recente&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;e così via.&lt;br /&gt;Se vogliamo vedere la struttura gerarchica della directory corrente utilizzeremo $ls con il paramentro –R come nell’esempio:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;$lis –R&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Possiamo usare i caratteri jolly ‘?’ per indicare un qualsiasi carattere e ‘*’ per indicare un numero imprecisato di caratteri. Ad esempio se vogliamo mostrare tutti i file che iniziano per doc scriveremo:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;&amp;amp;ls doc*&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Il carattere . e il carattere .. indicano rispettivamente la directory corrente e la directory genitore.&lt;br /&gt;Il comando &lt;strong&gt;$mhdir&lt;/strong&gt; &lt;strong&gt;nome_directory&lt;/strong&gt; crea una nuova directory mentre il comando &lt;strong&gt;$rmdir nome_directory&lt;/strong&gt; cancella la directory se questa è vuota. Il comando &lt;strong&gt;$cp file1 file2 d&lt;/strong&gt; copia e sovrascrive se presenti i file file1 e file2 nella directory d. Invece &lt;strong&gt;$cp file1 file2&lt;/strong&gt; crea una copia di file1 con il nome file2.Si può anche usare il parametro –r per copiare un directory con tutte le sottodirectory. Con il comando &lt;strong&gt;$mv f1 f2 dir&lt;/strong&gt; si spostano i file f1 e f2 all’interno di dir e si sovrascrivono se già presenti oppure con il comando &lt;strong&gt;$mv f1 f2&lt;/strong&gt; si può rinominare il file f1 in f2. Ecco le combinazioni dei comandi mv e cp:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5218711309653741378" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 424px; CURSOR: hand; HEIGHT: 78px; TEXT-ALIGN: center" height="98" alt="" src="http://1.bp.blogspot.com/_Pti-0b5YBiE/SGyWSUU5j0I/AAAAAAAAAIA/Nm1je9BbyD0/s400/Immagine.jpg" width="640" border="0" /&gt; &lt;p align="left"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218711314039642194" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 432px; CURSOR: hand; HEIGHT: 86px; TEXT-ALIGN: center" height="113" alt="" src="http://2.bp.blogspot.com/_Pti-0b5YBiE/SGyWSkqlGFI/AAAAAAAAAII/1xZSVtSwg7c/s400/Immagine2.jpg" width="470" border="0" /&gt;&lt;img id="BLOGGER_PHOTO_ID_5218711315490504306" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 441px; CURSOR: hand; HEIGHT: 98px; TEXT-ALIGN: center" height="123" alt="" src="http://4.bp.blogspot.com/_Pti-0b5YBiE/SGyWSqEffnI/AAAAAAAAAIQ/ViTUMn4NIMU/s400/Immagine3.jpg" width="480" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;img 1.0 Il comando $mv e $cp.&lt;/strong&gt; &lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;I file e le directory possono essere eliminati con il comando &lt;strong&gt;$ rm&lt;/strong&gt; al quale può essere associato il parametro –r per rimuovere eventuali sub directory.L’output di un comando si può ridirigere su un file tramite l’aggiunta del parametro &lt;strong&gt;&gt; f&lt;/strong&gt; alla fine del comando. L’output si può anche appendere ad un file tramite il parametro &lt;strong&gt;&gt;&gt;F&lt;/strong&gt;. Allo stesso modo si può leggere un comando da un file tramite il parametro &lt;&gt;.Questi parametri possono anche essere combinati. Vi sono casi in cui l’output di un processo diventa input di un altro processo. In questi casi si crea una successione di comandi detta pipeline. L’operatore di pipeline è si pone al centro tra due comandi come nell’esempio:&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;$ ls -R grep ra wc –1&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In questo caso però l’unico output che si ottiene è quello dell’ultimo commando. Gli output degli altri comandi si possono comunque scrivere su file interponendo tee nome_file dopo il comando come nell’esempio:&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;$ ls -C tee g wc –w&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;I comandi si possono anche comporre utilizzando &lt;strong&gt;;&lt;/strong&gt; e ponendolo al centro di essi. Si ricorda che l’operatore ha precedenza su &lt;strong&gt;;&lt;/strong&gt; e quindi vanno usate le parentesi per stabilire la priorità tra gli operatori proprio come in aritmetica. Alla fine di un comando si può inserire il terminatore &lt;strong&gt;&amp;amp;&lt;/strong&gt; se si vuole che questo proceda in background e il prompt sia pronto prima che esso finisca. Unix ammette anche comandi per il controllo diretto dei processi:&lt;/p&gt;&lt;p align="justify"&gt;exec cmd: termina il processo corrente per avviare cmd;&lt;br /&gt;kill process-id: termina il processo process-id;&lt;br /&gt;nice comando: abbassa la priorità di esecuzione di comando;&lt;br /&gt;ps: mostra i processi associati al terminale da cui è invocato, mostrando per ogni processo il suo process-id e il comando in esecuzione;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;I caratteri di jolly visti in precedenza ed altri caratteri hanno significato speciale per la shell (sono chiamati metacaratteri). Se si vuole che uno di questi caratteri perdi il suo significato speciale la stringa che lo include va inserita all’interno di apici.In questo modo il comando &lt;strong&gt;$ ls ‘a*’&lt;/strong&gt; ad esempio stamperà a schermo il contenuto di a*. Si può anteporre anche &lt;strong&gt;/&lt;/strong&gt; prima del metacarattere. Se utilizziamo spesso comandi troppo lunghi o pipeline possiamo scriverli su un file di testo f e renderlo eseguibile con&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;$chmod +x f&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Ora f sarà un comando equivalente al comando scritto sull’omonimo file. Se si chiede di eseguire un file di testo, la shell genera un processo che a sua volta esegue una copia della shell detta subshell.Questa copia esegue i comandi contenuti del file di testo che viene chiamato script di shell. Supponiamo di voler abbreviare il comando &lt;strong&gt;$chmod +x f&lt;/strong&gt; visto prima creando uno script. Scriveremo allora:&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;strong&gt;$ echo ‘chmod +x $1’ &gt;cx&lt;br /&gt;$ chmod +x cx&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Se si invoca cx con un argomento la subshell sostituirà $1 con l’argomento. Se vogliamo indicare un numero imprecisato di parametri utilizzeremo $*. Tali parametri non possono essere modificati da un programma di shell. Una shell può anche definire variabili tramite una stringa e assegnargli un valore tramite l’operatore = con un semplice comando.&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;$ aff=/home/user1/affari&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;È un esempio di definizione di variabile.D’ora in poi $aff si può usare al posto del suo valore. Le variabili sono private alla shell che le ha definite ma posso essere esportate.In Unix ogni file ha un descrittore chiamato i-node (consultare post dedicato ai file-system).Per localizzare i file bisogna dunque accedere al suoi i-node. Ogni directory è un file che contiene un “elemento” si 16 byte per ogni file che contiene, dei quali 16 sono per il nome semplice del file e 2 per il numero di i-node (i-number) che permette di accedere all’i-node. Un file può avere due nomi e avranno lo stesso i-node in modo da garantire un collegamento al file.Il comando da utilizzare è &lt;strong&gt;$ln sorgente destinazione&lt;/strong&gt;.Questa strategia viene chiamata linking oridinario.Una alternativa viene chiamata linking simbolico, fondato su un nuovo tipo di file (link) il cui nome memorizzato permette di accedere all’i-node del file a cui si collega. Il comando per creare un link simbolico è &lt;strong&gt;$ln –s sorgente destinazione&lt;/strong&gt;. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-8522873275432553418?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/8522873275432553418/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=8522873275432553418' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8522873275432553418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/8522873275432553418'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/06/fondamenti-di-unix.html' title='Fondamenti di UNIX'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pti-0b5YBiE/SGyWSUU5j0I/AAAAAAAAAIA/Nm1je9BbyD0/s72-c/Immagine.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-7343504869327664726</id><published>2008-06-19T22:36:00.003+02:00</published><updated>2008-09-16T22:24:55.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><category scheme='http://www.blogger.com/atom/ns#' term='Softpedia'/><title type='text'>C, strutture dati</title><content type='html'>Strutture dati quali lista, lista ordinata,coda,coda circolare,stack implementate in C.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fileden.com/files/2008/5/25/1929484/SD.rar"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-7343504869327664726?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/7343504869327664726/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=7343504869327664726' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7343504869327664726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/7343504869327664726'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/06/c-strutture-dati.html' title='C, strutture dati'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825917476334036418.post-6036503494098897549</id><published>2008-06-11T22:57:00.008+02:00</published><updated>2008-06-19T20:21:26.239+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmazione'/><title type='text'>Fondamenti del Linguaggio C Terza Parte</title><content type='html'>&lt;div align="justify"&gt;C supporta soltanto alcune funzioni di base per operare con i file. Non ammette il concetto di record né di chiave di ricerca e consente di operare solamente su file costituiti da sequenze lineari di byte. La prima cosa da fare per lavorare sui file è aprire il file richiesto attraverso&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#include &lt;&gt;&lt;br /&gt;main()&lt;br /&gt;{&lt;br /&gt;FILE *un_file;&lt;br /&gt;fp= fopen( “nome_file”, operazione);&lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;*un_file&lt;/span&gt; è il puntatore che ci permetterà di accedere al nostro file, &lt;span style="color:#ff0000;"&gt;nome_file&lt;/span&gt; è il nome del file sul quale stiamo lavorando, mentre operazione assume uno dei seguenti valori:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;“r”: sola lettura. Sarà l’unica operazione effettuabile sul file e restituisce null se il file non esiste.&lt;br /&gt;“w”: sola scrittura.Ammette questa unica operazione. Se il file non esiste verrà creato, se esiste sarà annullato il suo contenuto e ricreato.&lt;br /&gt;“r+” :lettura e scrittura. Se il file non esiste ritorna null.&lt;br /&gt;“w+”: scrittura e lettura.Se il file non esiste verrà creato altrimenti verrà annullato e ricreato.&lt;br /&gt;“a”:append. Sarà possibile solo scrivere dati alla fine del file. Se non esiste il file verrà creato.&lt;br /&gt;“a+”: lettura e append. Sarà possibile solo leggere e aggiungere dati a fine file. Se il file non esiste sarà creato altrimenti i dati verranno aggiunti a fine file.&lt;br /&gt;&lt;br /&gt;La funzione per leggere byte da un file è: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;fread( buf, dimensione,elementi, fp)&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;dove &lt;span style="color:#ff0000;"&gt;buf&lt;/span&gt; è il vettore dove devono essere trasferite le informazioni lette dal file, &lt;span style="color:#ff0000;"&gt;dimensione &lt;/span&gt;rappresenta la dimensione in byte di un elemento del vettore, &lt;span style="color:#ff0000;"&gt;elementi&lt;/span&gt; indica il numero di elementi del vettore e&lt;span style="color:#ff0000;"&gt; fp&lt;/span&gt; è il puntatore al file da leggere. Questa funzione ritorna il numero di elementi letti dal file che può non coincidere con il numero di elementi del vettore &lt;span style="color:#ff0000;"&gt;buf&lt;/span&gt; se il file è vuoto o contiene un numero di elementi a lui inferiore. Se restituisce un numero negativo vi è qualche errore. Quando viene fatta una lettura il puntatore si sposta all’ultimo elemento letto e quando termina il file ritorna all’inizio. La funzione per scrivere su un file è analoga ad fread ed è&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;fwrite( buf, dimensione,elementi, fp)&lt;/em&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;ed i parametri hanno lo stesso significato di quelli visti per la lettura ma con l’utilizzo per la scrittura. Una volta termine tutte le operazioni sul file questo va chiuso con l’istruzione &lt;span style="color:#ff0000;"&gt;fclose(fp);&lt;/span&gt; dove &lt;span style="color:#ff0000;"&gt;fp&lt;/span&gt; è il puntatore al file. È possibile anche muovere il puntatore per mezzo della funzione &lt;span style="color:#ff0000;"&gt;fseek(fp,n,mode);&lt;/span&gt; dove &lt;span style="color:#ff0000;"&gt;fp &lt;/span&gt;è il puntaotre al file, &lt;span style="color:#ff0000;"&gt;n&lt;/span&gt; indica di quanti byte il puntatore va spostato e se è negativo indica lo spostamento all’indietro, &lt;span style="color:#ff0000;"&gt;mode&lt;/span&gt; invece può assumere tre valori: Se vale 0 il puntatore comincia a spostarsi dall’inizio del file, 1 dalla posizione corrente e 2 dalla fine del file. &lt;span style="color:#ff0000;"&gt;fseek&lt;/span&gt; ritorna un numero negativo se qualcosa non è andato per il verso giusto altrimenti un numero maggiore o uguale a 0. La funzione &lt;span style="color:#ff0000;"&gt;ftell(fp);&lt;/span&gt; prende come parametro il puntatore al file e restituisce la posizione attuale del puntatore. C presenta anche due funzioni per la lettura e la scrittura formattata. Per la scrittura si utilizza &lt;span style="color:#ff0000;"&gt;fprintf (fp, formato, i);&lt;/span&gt; dove &lt;span style="color:#ff0000;"&gt;fp&lt;/span&gt; è il puntatore al file, &lt;span style="color:#ff0000;"&gt;formato&lt;/span&gt; è il formato da utilizzare ed &lt;span style="color:#ff0000;"&gt;i &lt;/span&gt;il valore da scrivere. In modo analogo si utilizza per la lettura &lt;span style="color:#ff0000;"&gt;fscanf(fp,formato,&amp;amp;i);&lt;/span&gt; . C permette anche di leggere una sequenza di caratteri fino al momento in cui si incontra il carattere &lt;span style="color:#ff0000;"&gt;‘\n’&lt;/span&gt;. Per la lettura si utilizza la funzione &lt;span style="color:#ff0000;"&gt;fgets( buf,n,fp);&lt;/span&gt; dove &lt;span style="color:#ff0000;"&gt;buf&lt;/span&gt; rappresenta il vettore in cui la riga deve essere trasferita, &lt;span style="color:#ff0000;"&gt;n&lt;/span&gt; la sua dimensione ed &lt;span style="color:#ff0000;"&gt;fp&lt;/span&gt; il puntatore al file. Se l’operazione va a buon fine ritorna l’indirizzo di &lt;span style="color:#ff0000;"&gt;buf&lt;/span&gt; altrimenti ritorna null. La funzione &lt;span style="color:#ff0000;"&gt;fputs(buf,fp);&lt;/span&gt; scrive una riga in un file. &lt;span style="color:#ff0000;"&gt;buf&lt;/span&gt; ed &lt;span style="color:#ff0000;"&gt;fp&lt;/span&gt; hanno lo stesso significato dei corrispondenti nella funzione &lt;span style="color:#ff0000;"&gt;fgets&lt;/span&gt;. La funzione &lt;span style="color:#ff0000;"&gt;fgetc(fp);&lt;/span&gt; legge un singolo carattere da file mentre &lt;span style="color:#ff0000;"&gt;fputc(c,fp);&lt;/span&gt; scrive su file il carattere &lt;span style="color:#ff0000;"&gt;c&lt;/span&gt;. Se vogliamo sapere se il puntatore si trova a fine file possiamo ricorrere alla funzione &lt;span style="color:#ff0000;"&gt;feof(fp);&lt;/span&gt; che ritorna 1 in caso affermativo e 0 in caso negativo. Molte di queste operazioni che abbiamo visto lavorano in modalità buffer, ovvero non scrivono dati direttamente su disco ma temporaneamente in memoria centrale. Se vogliamo scaricare dalla memoria tutto il buffer possiamo utilizzare la funzione &lt;span style="color:#ff0000;"&gt;fflush(fp,);&lt;/span&gt; mentre se vogliamo disabilitare il buffer utilizziamo &lt;span style="color:#ff0000;"&gt;setbuf(fp,null);&lt;/span&gt; .&lt;/div&gt;&lt;div align="justify"&gt;Per scrivere software in grado di controllare dispositivi fisici è necessario disporre di operatori sui singoli bit. C dispone di questi operatori chiamati &lt;strong&gt;bitwise&lt;/strong&gt; e sono:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&amp; AND bit a bit&lt;br /&gt;OR bit a bit&lt;br /&gt;^ OR esclusivo&lt;br /&gt;&lt;&lt;  Shif a destra&lt;br /&gt;~ complemento a 1&lt;br /&gt; &lt;div align="justify"&gt;&lt;br /&gt;Gli operatori bitwise lavorano esclusivamente su char e interi. I tipi fondamentali in C possono essere convertiti in altri tipi per rendere conformi i tipi di due operandi se questi non sono omogenei. Esistono due tipi di conversioni: &lt;strong&gt;implicite &lt;/strong&gt;ed &lt;strong&gt;esplicite &lt;/strong&gt;o meglio detto “&lt;strong&gt;cast&lt;/strong&gt;”. Lo schema di conversione utilizzato è chiamato &lt;strong&gt;conversione aritmetica normale&lt;/strong&gt; e viene descritto dalle seguenti regole:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;1) Char,short int -&gt;int&lt;br /&gt;2) Float-&gt; double&lt;br /&gt;3) Char-&gt;int,short int,long int, double&lt;br /&gt;4) Int-&gt; char, short int, long int. La conversion ad un intero più corto provoca il troncamento dei bit più significativi.&lt;br /&gt;5) Short int, long int -&gt;int .Come nel punto 4.&lt;br /&gt;&lt;br /&gt;La conversione esplicita può essere richiamata per mezzo della sintassi &lt;em&gt;(nomeTipo) espressione&lt;/em&gt;. Oltre ai tipi fondamentali è possibile ricorrere a tipi derivati definiti dall’utente come visto in precedente. Un tipo di dato derivato in C è &lt;strong&gt;union&lt;/strong&gt; e definisce una un’insieme di membri che in memoria hanno uno stesso indirizzo e vanno a occupare le medesime locazioni di memoria. Per definire una union si utilizza la sintassi&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;union nomeUnion{ tipoMembro nomeMembro1;&lt;br /&gt;….&lt;br /&gt;tipoMembro nomeMembro2; };&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Analizziamo adesso le strutture dati in C. Una &lt;strong&gt;lista lineare&lt;/strong&gt; è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ogni elemento contiene una informazione e un puntatore all’elemento successivo; il primo lo indicheremo con &lt;span style="color:#ff0000;"&gt;inf&lt;/span&gt;, il secondo con &lt;span style="color:#ff0000;"&gt;pun&lt;/span&gt;. Con &lt;span style="color:#ff0000;"&gt;punLista&lt;/span&gt; indicheremo il puntatore al primo elemento della lista. L’ultimo elemento della lista, ovviamente, punterà a &lt;span style="color:#ff0000;"&gt;NULL&lt;/span&gt;. inf può essere di tipo qualsiasi ma in questo esempio lo considereremo un intero. Per gestire la lista dovremmo essere in grado di effettuare tre operazioni: creazione della lista, inserimento e visita. La creazione della lista deve ritornare al main il puntatore al primo elemento. Tale funzione &lt;span style="color:#ff0000;"&gt;creaLista()&lt;/span&gt; deve comprendere la dichiarazione di un puntatore p alla testa della lista e di &lt;span style="color:#ff0000;"&gt;paus&lt;/span&gt;, puntatore ausiliario che useremo per creare elementi successivi al primo senza perdere il puntatore iniziale alla lista. Utilizzeremo le funzione malloc e sizeof per allocare dinamicamente la memoria occupata da un elemento. Malloc verrà poi trasformato in un puntatore per puntare allo spazio allocato. La visita può essere implementata come una stampa su schermo di tutti gli elementi presenti in lista. Nell’archivio Softpedia è possibile scaricare un’implementazione sì fatta della lista. Una pila (o &lt;strong&gt;stack&lt;/strong&gt;) è una struttura dati in cui è possibile inserire e prelevare elementi esclusivamente da un estremo. Le uniche operazioni effettuabili sono &lt;strong&gt;push&lt;/strong&gt; (inserimento) e &lt;strong&gt;pop&lt;/strong&gt; (prelievo con eliminazione dell’elemento) e si compiono alla cima dello stack. Questo genere di strutture dati viene chiamato &lt;strong&gt;LIFO&lt;/strong&gt; (Last in, First out). Altre operazioni effettuabili sulla pila sono stabilire se è piena o vuota e stamparne il contenuto. Nella categoria softpedia è possibile leggere il codice relativo a questa struttura dati.&lt;strong&gt;Una coda&lt;/strong&gt;, è una struttura dati simile alla lista in cui è possibile inserire elementi sia all’inizio , sia alla fine. Possiede, dunque, due puntatori uno alla coda, uno alla testa. Una variante di questa struttura,chiamata &lt;strong&gt;coda circolare&lt;/strong&gt; ha la testa come elemento successivo alla coda,e la coda come elemento precedente alla testa. Ricordiamo inoltre che l’inserimento degli elementi in queste strutture dati può avvenire in ordine. Troverete le implementazioni di queste strutture dati nell’archivio citato in precedenza.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825917476334036418-6036503494098897549?l=computerscienceeco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://computerscienceeco.blogspot.com/feeds/6036503494098897549/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825917476334036418&amp;postID=6036503494098897549' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6036503494098897549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825917476334036418/posts/default/6036503494098897549'/><link rel='alternate' type='text/html' href='http://computerscienceeco.blogspot.com/2008/06/fondamenti-del-linguaggio-c-terza-parte.html' title='Fondamenti del Linguaggio C Terza Parte'/><author><name>Daniele Santamaria</name><uri>http://www.blogger.com/profile/13549948329090042136</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
