In tutti i manuali di introduzione alla programmazione si trova sempre l'esempio della stampa del messaggio: Hello World!
Troppo semplice e del tutto
inadatto allo spirito romantico dei programmatori. Ma si sa, i manuali
sono spesso scritti da americani che sono notoriamente molto pragmatici.
Come italiano mi sono sentito in obbligo di colmare questa lacuna! Ecco quindi
questo breve documento che riporta un'introduzione ad alcuni dei piu' comuni
e diffusi linguaggi di programmazione: tutti quelli che mi e' capitato di utilizzare.
Ma con una fondamentale differenza, anziche' scrivere "Hello World!",
per rendere piu' romantico l'approccio alla programmazione,
con tutti i linguaggi verra' utilizzato il seguente esempio:
L'esempio ha anche una ragione tecnica... o forse sopratutto quella? Infatti ripetere per tre volte lo stesso messaggio consente di presentare anche le istruzioni per il controllo dei cicli e le variabili. Chi l'ha detto che gli italiani sono solo romantici!?
Ma parlare solo di
linguaggi sarebbe stato troppo limitativo. Infatti e' necessario comprendere
non solo un linguaggio di programmazione ma anche l'ambiente e l'architettura
su cui opera. Quindi nel seguito sono presentati alcuni esempi suddivisi
appunto tra
linguaggi,
ambienti
ed architetture.
La distinzione non e' rigida ed i collegamenti sono molti, cosi' si puo'
leggere questo documento saltellando con un GOTO o in modo strutturato.
In dettaglio...
linguaggi (
C,
C++,
Objective-C,
C#,
Go,
Perl,
PHP,
BASIC,
Pascal,
PL/0,
Cobol,
ABAP,
Fortran,
Ada,
Logo,
KPL / Phrogram,
Scratch,
AppInventor,
Prolog,
Java,
ObjectScript,
LSL,
SQL,
PL/SQL,
PL/pgSQL,
DB2 SQL PL,
MySQL Stored Program,
PQL,
Postscript,
LaTeX,
Visual Basic,
Python,
Jython,
Assembler,
1011.1010.1100.1.0,
PDF,
QR,
Lua,
... ),
ambienti (
sh (Bourne shell),
ksh (Korn shell),
csh (C shell),
bash (Bourne Again shell),
awk,
MS-DOS,
WSH,
AppleScript,
sh (speaking on MAC),
REXX,
CISCO-IOS,
FireWall-1 Inspect,
... )
ed architetture (
ISAM,
MySQL API/C,
Oracle Pro*C,
JDBC,
MongoDB,
Pentaho/Kettle,
socket - Client,
socket - Server,
socket - Client (PL/SQL),
HTML,
XML,
SGML,
XHTML,
CGI,
LAMP,
LAPO,
LAPP,
T9,
WAP,
Android SDK,
Zlango,
Applet Java,
RMI,
Java Script,
VB Script,
Servlet,
JSP,
EJB,
Portlet (JSR 168),
ASP,
Cartridge PL-SQL,
External Procedure Oracle,
Cache'/SOAP,
PHP/SOAP,
Curses,
X-Windows (Xlib),
motif,
Tkinter,
GTK,
Grinder,
COM/ActiveX,
UML,
... ).
Si tratta solo di pochi esempi, rispetto a quanto disponibile attualmente,
poiche' ho riportato solo i linguaggi, gli ambienti e le architetture che
ho avuto la fortuna (o sfortuna) di utilizzare...
I linguaggi non hanno eta': alcuni sono molto vecchi ( Ikebana, 1011.1010.1100.1.0, Assembler, Fortran, ...), altri sono adatti ai piu' giovani ( T9, Logo, Phrogram, Scratch, AppInventor, ...), altri sono giovani perche' appena inventati ( Go, ...), ma tutti sono sempre vivissimi purche' ci sia qualcuno che abbia abbastanza fantasia da utilizzarli! E la fantasia, nel disegno dei linguaggi di programmazione e nelle architetture, non ha limiti! Comunque se volete un consiglio ditelo con i fiori!
Un linguaggio di programmazione e' ...
non ho voglia di raccontarlo adesso. Voglio solo ricordare che si possono suddividere
secondo differenti categorie gnoseologiche per le caratteristiche intrinsiche primarie e secondarie.
Ad esempio per Generazione: Prima: linguaggio macchina
(1011.1010.1100.1.0);
Seconda: assemblati
(Assembler x86);
Terza: General Pourpose (eg. C);
Quarta: Linguaggi speciali (eg. SQL);
Quinta (?!?)
e Retromarcia (!!!) ...
Sintassi: Imperativi (eg. C);
Funzionali
(eg. logo, LISP); Logici (eg. Prolog).
Tipologia: Compilati (eg. C);
Interpretati (eg. Bourne shell);
A meta' strada... (eg. Java).
Attributi: strutturati (eg. C);
ad oggetti (eg. Java); concorrenti; a gasolio
(?!?); enorme (!!!); ...
Sufficientemente aristotelico? In ogni caso di stupidaggini per questo capitolo
ne ho gia' scritte abbastanza... passiamo alle cose serie.
L'idea e' questa: con un linguaggio di programmazione si scrive un testo che qualcuno, generalmente un computer, deve comprendere ed eseguire. Ed il nostro platonico programma deve ripetere per tre volte "Ti amo!".
I linguaggi su cui ho preparato un esempio sono: linguaggio C, C++, Objective-C, C#, Go, Perl, PHP, BASIC, Pascal, PL/0, Cobol, ABAP, Fortran, Ada, logo, KPL / Phrogram, Scratch, AppInventor, Prolog, Java, ObjectScript, LSL, SQL, PL/SQL, PL/pgSQL, DB2 SQL PL, MySQL Stored Program, PQL, Postscript, LaTeX, Visual Basic, Python, Jython, Assembler, 1011.1010.1100.1.0, PDF, QR, Lua, ...
Il C e' un linguaggio General Purpose (cioe'
va bene per farci di tutto, ma detto cosi' fa piu' bello) di terza generazione.
Con il linguaggio C si possono scrivere, e sono stati scritti, i programmi piu'
svariati: sistemi operativi, software di comunicazione, librerie grafiche, applicazioni
gestionali, videogiochi, ...
Il C e' un linguaggio compilato particolarmente efficiente. Il linguaggio, di
per se', e' piuttosto semplice. Sono pero' moltissime le librerie di funzioni
disponibili ed utilizzabili nei vari ambienti. Una buona produttivita' si raggiunge
quindi quando si conoscono bene le librerie dell'ambiente in cui si programma
(eg. system call Unix, Motif, MFC o simili).
Programmare in C non e' semplice poiche' richiede attenzione nella gestione
delle allocazioni di memoria, nell'utilizzo dei puntatori, ...
Tuttavia il linguaggio C e' praticamente il migliore per produrre software di
base e la quasi totalita' dei sistemi operativi hanno un'ampia parte scritta in C.
/* Progamma di esempio in linguaggio C */
#include <stdio.h>
main()
{
int i;
for (i=0; i<3; i++)
printf("Ti amo!\n");
}
|
Per compilare il programma di esempio
va scritto in un file (eg. Dimmelo.c) quindi lanciato il compilatore con il
comando cc Dimmelo.c -o Dimmelo che produce il programma eseguibile Dimmelo.
Un programma di grandi dimensioni e' spesso formato da alcuni file contenenti dichiarazioni
(file .h) incluse nei vari file di programma (file .c) che vengono poi compilati e "linkati"
assieme.
Le funzioni vengono spesso raccolte in librerie (file .a, .so).
Tutto qui? No: funzioni, variabili, librerie, programmazione strutturata, C++, Objective-C, C#, Go, ... Riferimenti: Compilazione in Unix: concetti base, ...
Il C++ nasce dal linguaggio C
per migliorarne la portabilita' e la mantenibilita' dei programmi.
La caratteristica fondamentale del C++ e' la programmazione Object Oriented
coniugata con un linguaggio semplice e molto efficiente: il C da cui deriva
(anche se non ne viene mantenuta la compatibilita').
Con il C++ vengono scritti tutti i programmi in cui la velocita' di esecuzione
e' importante.
Il C++ introduce il concetto di namespace e permette la definizione
di class con parti public: e private:.
// Programma di esempio in C++
#include <iostream>
using namespace std;
int main ()
{
int i;
for (i=0; i<3; i++)
cout << "Ti amo!";
return 0;
}
|
Per compilare il programma di esempio
va scritto in un file Dimmelo.C (da notare la C maiuscola) e quindi lanciato il compilatore con il
comando g++ Dimmelo.C -o Dimmelo che produce il programma eseguibile Dimmelo.
Nel tempo il linguaggio C++ si e' evoluto e sono disponibili diversi compilatori ed IDE con tante
piccole differenze e molte funzionalita' in piu'... ma i concetti di base non sono cambiati!
Tutto qui? No: programmazione ad oggetti, linguaggio C, Objective-C, C#, ...
L'Objective-C e' un'evoluzione object oriented del linguaggio C
che utilizza il paradigma dello scambio di messaggi come in Smalltalk.
A differenza del C++, l'Objective-C mantiene la compatibilita' completa con
il C cui vengono aggiunte semplicemente alcune direttive (eg. @interface,
@implementation) e lo scambio di messaggi con
[oggetto metodo: parametro].
L'Objective-C e' riflessivo, non ha un garbage collector e non ha una libreria standard
che e' generalmente esterna (eg. Cocoa)... ma forse queste indicazioni sono
un po' troppo sottili.
Meglio un esempio, un poco piu' lungo in questo caso perche' utilizzeremo
una classe, anche perche' altrimenti il codice sarebbe identico a quello del linguaggio C!
// Dimmelo.h
#import <objc/Object.h>
@interface Dimmelo : Object {
// variabili d'istanza
}
// metodi
- (void)dimmelo;
@end
// Dimmelo.m
#import "Dimmelo.h"
@implementation Dimmelo
- (void)dimmelo
{
int i;
for (i=0;i<3;i++)
printf("Ti amo!\n");
}
@end
// main.m
#import "Dimmelo.h"
int main (int argc, const char * argv[]) {
Dimmelo *azione = [[Dimmelo alloc] init];
[azione dimmelo];
return 0;
}
|
Lanciato il compilatore con il comando
gcc -x objective-c main.m Dimmelo.m -lobjc -o dimmelo
si produce il programma eseguibile dimmelo.
Nel tempo l'Objective-C si e' evoluto. Nella versione 2 possono essere dichiarate le
variabili d'istanza come @property (implementate con @synthesize) ed e' stato introdotto
un garbage collector. L'Objective-C 2.0 e' il linguaggio con cui sono state realizzate
le API Cocoa, base della programmazione su Mac OS 1.5 ed iOS (eg. iPhone, iPad).
Tutto qui? No:
programmazione ad oggetti,
linguaggio C,
C++,
C#,
...
Il C# e' un linguaggio
ad oggetti per sviluppare applicazioni .NET.
Come ricorda il nome ha una sintassi molto vicina a quella del linguaggio C,
ma contiene i costrutti e le caratteristiche dei linguaggi ad oggetti come Java
(eg. class, using, public).
La specifica del linguaggio e' molto ridotta,
pero' la definizione del CLI (Common Language Infrastructure) fornisce un insieme molto
ampio di classi e funzionalita' ed e' standard.
Per compilare il programma di esempio
va scritto in un file dimmelo.cs e quindi lanciato il compilatore con il
comando csc /nologo /out:dimmelo.exe dimmelo.cs che produce il programma eseguibile dimmelo.exe.
Tutto qui? No:
programmazione ad oggetti,
linguaggio C,
C++,
...
Il linguaggio Go e' molto recente (2009) ma le sue radici sono lontane ed arrivano direttamente dal linguaggio C.
Go e' un linguaggio Open Source con un forte contributo da parte di Google.
Il programma dimmelo.go va compilato con 6g e quindi linkato con 6l.
Il risultato sara' il file binario eseguibile 6.out.
Tutto qui? No:
linguaggio C,
...
Il Perl e' un potente linguaggio utilizzato
principalmente per la preparazione di script di amministrazione e di gestione.
Il Perl e' molto utilizzato anche per la realizzazione di programmi CGI e LAMP;
ha quindi conosciuto una forte diffusione con il web.
Una volta scritto il programma nel file
dimmelo.pl per eseguirlo e' sufficiente il comando perl dimmelo.pl.
Tutto qui? No:
CGI,
LAMP,
GTK,
subroutine, variabili, package, programmazione strutturata, ...
Il linguaggio PHP
(PHP: Hypertext Preprocessor) e' un
linguaggio di scripting o, meglio, un linguaggio per Server Side
Script. Viene quindi tipicamente eseguito su un web server e consente
la scrittura di pagine web dinamiche con pochissimo codice.
Il PHP e' nato come un insieme routine Perl per la rappresentazione
di dati su web anche se poi si e' evoluto come linguaggio a
se stante.
Dal punto di vista dell'esecuzione il web server si occupa
di attivare l'interprete che invia su standard ouput il risultato
dell'elaborazione (in modo simile a come avviene per un CGI).
Nell'esempio viene
ripetuto un semplice ciclo while...
Tutto qui? No:
Perl,
LAMP,
LAPO,
LAPP,
CGI,
...
Il BASIC e' un semplice linguaggio
di programmazione che deve la sua grande diffusione, oltre che alla
semplicita', alla notevole diffusione di minicomputer.
E' infatti nato come linguaggio di programmazione per Personal Computer
ed Home Computer.
Generalmente i programmi in BASIC vengono scritti lavorando
nell'interprete. Quindi e' sufficiente dare il comando RUN
per eseguire il programma contenuto in memoria.
Tutto qui? No:
Visual Basic,
VB Script,
...
Il Pascal e' un serio e
rigoroso linguaggio di programmazione. E' molto utilizzato,
oltre che per la programmazione, anche per ragioni didattiche.
Infatti e' un linguaggio che consente una programmazione strutturata
e presenta la maggioranza dei costrutti dei linguaggi di programmazione.
Poiche' si tratta di un linguaggio
compilato il primo comando da utilizzare e' quello del compilatore:
pas dimmelo.pas. E' quindi possibile eseguire il programma.
Tutto qui? No:
PL/0,
...
Il PL/0 e' semplice
linguaggio di programmazione ideato e pubblicato con il
suo compilatore da Wirth
(il creatore del Pascal) per ragioni didattiche.
E' un linguaggio che consente una programmazione strutturata
e presenta i piu' tipici costrutti dei linguaggi di programmazione.
La versione utilizzata e' quella del PL/0E poiche'
quella iniziale non dispone di stringhe ma solo di numeri interi!
Tutto qui? No:
Pascal,
...
Il Cobol e' un linguaggio di terza genrazione
indicato soprattutto per applicazioni gestionali.
Il programma di esempio va scritto in
un file (eg. DIMMELO.COB) quindi lanciato il compilatore con il comando
cob dimmelo.cbl che produce il compilato intermedio dimmelo.int. Per
eseguirlo si deve lanciare l'RTS (run time support) con cobrun dimmelo.int.
L'esempio e' in ambiente Unix utilizzando il compilatore Microfocus che e' uno
dei piu' diffusi. Ma il programma cambia poco anche se utilizzato su altri ambienti.
Tutto qui? No, ma
per adesso basta cosi'!
L'ABAP
(Advanced Business Application Programming) e' un 4GL
per lo sviluppo di applicazioni SAP (uno dei piu' diffusi ERP).
Il codice ABAP e' mantenuto nel database SAP in forma sorgente e compilata.
I programmi vengono eseguiti da un runtime nell'application layer.
Per il lancio dei programmi si utilizza la transazione SA38.
Tutto qui? No, ma
per adesso basta cosi'!
Il linguaggio Fortran e' vecchiotto
(in effetti e' il piu' vecchio linguaggio di terzo livello)
ma ha avuto una notevole diffusione e' ancora utilizzato.
Il suo uso piu' comune e' per programmi di calcolo per i quali i suoi
datatype e l'ottimizzazione del compilatore lo rendono molto efficace.
E' un linguaggio abbastanza semplice, compilato, ... che dire di piu':
meglio un esempio!
Basta dare in pasto il programma
ad un compilatore ed e' tutto fatto!
Tutto qui? Temo di si
...
Il linguaggio ADA e' un linguaggio
serio!
Fortemente tipato, con una gestione completa delle eccezioni,
compilato ed efficiente e' utilizzato in ambienti che hanno
forti requisiti di sicurezza e seguono standard precisi
(eg. in ambito militare ed areonautico).
Nell'esempio viene
presentato un esempio semplice ma che contiene gia' una gestione
delle eccezioni... Naturalmente per eseguirlo e' necessario
eseguirne la compilazione.
Tutto qui? Per il monento si:
...
Il linguaggio logo
e' un linguaggio funzionale (quindi simile
al LISP) interpretato che utilizza l'ideogramma di una tartaruga per
rappresentare le azioni sul video.
E' stato sviluppato per l'insegnamento della programmazione
ai piu' piccoli che imparano cosi' la logica facendo
correre la tartaruga sullo schermo (sempre meglio che parlarci assieme
come e' capitato piu' volte ad Achille).
Il linguaggio logo e'
particolarmente potente se si utilizza il lambda-calcolo...
Nel primo esempio viene
utilizzato un semplice costrutto di repeat.
La potenza del linguaggio e' nella semplicita' della sintassi
e nella definizione ed uso delle funzioni.
Tutto qui? Direi di si
...
Il linguaggio KPL e' molto recente,
tuttavia ha gia' riscosso molto interesse e sono parecchi gli utilizzatori.
Si tratta di un linguaggio di programmazione didattico pensato per
i piu' giovani. KPL ha una sintassi
rigorosa e la nuova versione fornisce
un IDE semplice ma completo (non c'e' paragone con un
Eclipse o un Visual Studio, ma l'editor guidato, il debug ed il
browser delle classi sono ottimi).
La presenza, come esempi di programmazione di giochi in 2D e 3D
con una semplice, ma efficace, gestione dei suoni e delle immagini,
lo rende molto accattivante.
Si tratta di un linguaggio ad oggetti, interpretato,
disponibile solo in ambiente WinX,
con una libreria di classi che consente la gestione di immagini e
suoni abbastanza completa ma semplice da utilizzare.
Nell'esempio viene riportata la
solita frase... E' utilizzato printline() poiche' il print() non va a capo.
La sintassi richiede la chiusura degli statement (For...Next, If...End If)
che un programmatore esperto puo' trovare noiosa ma rende piu' chiaro il
programma per chi deve imparare.
L'IDE indenta automaticamente ogni istruzione rendendo leggibili i programmi.
Tutto qui? No:
Logo,
Iniziare a programmare con Phrogram,
Note alla versione italiana di Phrogram,
...
Scratch e' un ambiente di programmazione
ad oggetti adatto ai piu' giovani ma, ad essere onesto, mi diverto anch'io!
La programmazione si effettua costruendo blocchi di istruzioni con il
Drag&Drop. Gli script cosi' costruiti gestiscono gli eventi che
animano gli sprite (le immagini) e lo sfondo.
L'ambiente e' molto compresibile, graficamente accattivante
e sono disponibili moltissime lingue. Ma ecco il nostro esempio
(anche in italiano):
Per eseguire il programma basta un click sulla bandiera verde
dell'interfaccia grafica.
La licenza di utilizzo di Scratch e' libera ed e' stato
sviluppato dall'MIT con diverse collaborazioni e sponsor.
Tutto qui? No:
AppInventor,
Logo,
KPL / Phrogram,
...
Google AppInventor
e' un ambiente di programmazione
per lo sviluppo di applicazioni per i telefoni che supportano
Android.
A differenza dell'Android SDK, che richiede un buona capacita' di programmazione in
Java, AppInventor e' molto semplice da programmare
anche per i meno esperti.
La programmazione si effettua costruendo blocchi di istruzioni con il
Drag&Drop come con Scratch.
Sono disponibili come oggetti, e facilmente programmabili,
i tipici dispositivi di un moderno telefonino come il GPS,
l'accellerometro, la bussola, la videocamera, ...
oltre ai normali comandi per gestire le chiamate, la rubrica, le email,
il browsing su Internet, ...
L'ambiente di sviluppo viene acceduto da browser e l'editor dei
blocchi di programma e' un'applicazione java.
Il programma viene automaticamente scaricato sul cellulare connesso
via USB al PC (basta abilitare "Unknown sources" nelle opzioni
del cellulare).
I programmi possono anche essere scaricati come file .apk.
AppInventor e' attualmente disponibile in versione Beta (da Luglio 2010).
Tutto qui? No:
Scratch,
Java,
Android SDK,
Presentazione AppInventor,
...
Il Prolog e' un linguaggio
che utilizza la logica dei predicati.
Un programma e' costituito da una serie di fatti e di regole.
L'esecuzione di un programma e' una dimostrazione basata
sulle regole presenti.
Un programma Prolog non si esegue...
ad un programma Prolog si fanno delle domande!
Nel nostro esempio basta chiedere: ?- dimmelo e lui rispondera'!
Tutto qui? No:
...
Il linguaggio Java, nonostante la recente
introduzione, ha subito ricevuto un'attenzione ed un utilizzo fortissimi. Il
linguaggio Java e' universale nel senso che i programmi java precompilati (file
.class) vengono eseguiti indifferentemente, e con gli stessi identici risultati,
su qualsiasi piattaforma HW/SW che
ospiti la Java Virtual Machine (JVM).
Il programma dell'esempio va scritto
su un file (eg. Dimmelo.java), compilato con javac Dimmelo.java. Il compilatore
genera un file in formato bytecode (con il suffisso .class) che puo'
essere eseguito con java Dimmelo (naturalmente se e' stato
definito in modo corretto il CLASSPATH).
Tutto qui? No: classi/oggetti/metodi/proprieta',
bytecode, architetture distribuite, applet, servlet, beans, JDBC, classi fondamentali,
RMI, ...
Quanto e' bello programmare
con quei strani strumenti grafici che vedono tutto come un
oggetto, riconoscono automaticamente le sue proprieta'
e fanno credere nelle magnifiche sorti progressive!
In Java il mattone fondamentale per rendere possibile questa
magia sono i Bean. Un Java Bean e' un oggetto che
pubblica la sua interfaccia e permette il suo utilizzo
in modo semplice da parte di un IDE.
Chiaro? Forse no. Ma un Bean e' come un pisello:
se non sai cos'e', e' piu' facile da vedere che da spiegare!
Nell'esempio viene definito
un semplice Bean che, naturalmente, deve essere richiamato da un'applicazione
con:
Tutto qui? No:
Java,
EJB (Enterprise Java Bean),
...
Cache' e' uno
strumento RAD che unisce un DB relazionale con un profondo
utilizzo dell'object oriented e dei servizi su web.
Si tratta a tutti gli effetti di una base dati multidimensionale
i cui contenuti possono essere visti nativamente come oggetti
oppure come tabelle.
Il suo linguaggio di programmazione nativo e' l'ObjectScript
che supporta tutti i costrutti tipici dei linguaggi ad oggetti.
Era anche possibile utilizzare il
BASIC o
Java
indicando la proprieta' [language = basic] al metodo.
Tutto qui? No:
SOAP,
...
LSL e' l'acronimo di Linden Scripting Language.
Con questo linguaggio sono scritti tutti gli scripts in Second Life.
La sua sinatassi e' simile a quella Java o C.
Gli scripts in Second Life sono set di istruzioni posizionabili
all'interno di qualsiasi oggetto
o in qualsiasi accessorio indossato dagli Avatars.
Vengono scritti con un editor apposito.
Nell'esempio toccando
l'oggetto si ottiene la nostra romantica frase ripetuta per tre volte.
Tutto qui? Certo,
non ho una seconda vita
...
Il linguaggio SQL (Structured Query Language)
e' nato come linguaggio di interrogazione per basi dati relazionali. In realta'
il suo utilizzo non e' solo per l'interrogazione ma consente la completa gestione
delle basi dati relazionali.
Nell'esempio viene creata una tabella,
viene popolata con i dati voluti che infine vengono estratti con una selezione.
Per eseguire i comandi SQL si deve utilizzare un interprete SQL o inserirli
in un programma (scritto in C, in Cobol, in Visual Basic, ...). Nel caso di
richiamo dall'interprete SQL di Oracle (che si chiama SQL*Plus) e' sufficiente
creare un file "dimmelo.sql" e, una volta connessi alla base dati, lanciarlo
con il comando "start dimmelo".
Tutto qui? No: join,
outer join, self join, select annidate, transazioni, integrita' referenziale,
Two Phase Commit, ... Riferimenti: Introduzione
ai database relazionali ed ad Oracle, Corso
linguaggio SQL, ...
Il linguaggio PL/SQL (Procedural Language
SQL) e' un'estensione dell'SQL disponibile con l'RDBMS Oracle. Il PL/SQL contiene
una serie di estensioni "procedurali" all'SQL che lo rendono adatto alla programmazione.
E' quindi utilizzato per la definizione di trigger e di stored procedures.
Il blocco unnamed PL/SQL dell'esempio
puo' essere eseguito collegandosi in SQL*Plus. Nell'esempio viene utilizzato
un package (DBMS_OUTPUT) che consente di stampare la stringa voluta.
Nell'esempio precedente
e' stato utilizzato un blocco PL/SQL anonimo. In amore e' giusto dichiararsi,
e cosi' si puo' fare anche in PL/SQL. I due esempi seguenti dichiarano una stored
procedure ed un package. Entrambe gli oggetti sono inseriti nella base dati
Oracle e possono essere utilizzati a richiesta.
Ora che gli oggetti sono stati creati sulla base dati
e' possibile richiamarli da sqlplus con un execute dimmi3 oppure execute
dimmi.dimmi3 (non dimenticate di abilitare l'output con SET SERVEROUT ON
per riuscire a vedere qualcosa...).
Tutto qui? No: trigger, exceptions,
SQL,
... Riferimenti: Corso linguaggio SQL, ...
Il linguaggio PL/pgSQL
e' un'estensione dell'SQL disponibile con PostgreSQL. Il PL/pgSQL contiene
una serie di estensioni "procedurali" all'SQL che lo rendono adatto alla programmazione.
E' utilizzato per la definizione di funzioni e di trigger. A differenza
di altri linguaggi procedurali sui Database (eg. PL/SQL) non consente la creazione di stored procedures
che pero' possono essere implementate come
funzioni il cui valore di ritorno non viene considerato (RETURNS void).
Per eseguire la funzione bisogna collegarsi a PostgreSQL con il comando psql
e richiamarla con SELECT * from dimmi3();
Tutto qui? No:
SQL,
PL/SQL,
LAPP,
... Riferimenti:
PostgreSQL,
Qualcosa in piu' su PostgreSQL 9.0, ...
Il linguaggio procedurale di DB2 (SQL PL) e' molto completo
ed aderente allo standard SQL:2003.
Con l'Inline SQL PL, un sottoinsieme dell'SQL PL che non consente istruzioni dinamiche (eg. PREPARE)
o la gestione delle transazioni (eg. COMMIT),
vengono create funzioni e trigger.
Con db2 -td@ -fdimmi.sql la stored procedure viene creata (naturalmente deve esistere
una tabella messaggio con un campo testo).
Tutto qui? No:
SQL,
... Riferimenti: DB2, ...
Il linguaggio SQL fornito da MySQL e' stato
esteso, dalla versione 5.0, per consentire la scrittura di Stored Program.
Gli Stored Program sono: Stored Routine (Procedure o Function), Trigger ed Event.
Basta collegarsi su MySQL con il comando mysql e lanciare lo script con CALL dimmi3();
Facile, vero?
Tutto qui? No:
SQL,
PL/SQL,
PL/pgSQL,
... Riferimenti: MySQL, ...
Paglo Query Language (PQL) e' un nuovo linguaggio che
consente di ricercare informazioni sull'indice di ricerca
di Paglo.
Dal punto di vista sintattico PQL e' molto simile all'SQL:
la differenza principale e' che il PQL utilizza la base dati
di Paglo che e' organizzata ad albero.
Nell'esempio vengono
inseriti, e poi selezionati, tre allarmi con il nostro messaggio.
Tutto qui? No:
SQL,
...
Il linguaggio Postscript generalmente non
viene utilizzato sui un computer bensi' su una stampante! Si tratta a tutti
gli effetti di un vero e proprio linguaggio di programmazione con tutte le normali
caratteristiche di tali linguaggi: variabili, funzioni, cicli, ...
Per far eseguire il programma riportato
e' necessario inviare il file su una stampante. L'invio deve essere diretto
(altrimenti viene stampato il testo del programma e non il suo risultato). Un
altro modo di osservare il risultato e' quello di utilizzare un programma di
visualizzazione dei file Postscript...
Tutto qui? Direi
di sì...
LaTeX non e' un linguaggio di programmazione
ma di pubblishing.
Il testo viene scritto in questo modo dall'autore ed e' indipendente
dalla modalita' di stampa e dalle scelte grafiche che possono
essere fatte sucessivamente. Per convertire il testo in stampa
vengono poi utilizzati programmi specifici (eg. TeX).
Tutto qui?
No: HTML, ...
Il Visual Basic (VB)
e' un'evoluzione del
BASIC.
Rispetto al BASIC originale ha perso il numero di linea...
ma acquisito la gestione della grafica e costrutti object-oriented.
Per eseguire un programma? Dipende! Da che dipende? Dipende...
da cosa ne abbiamo fatto del nostro codice. Infatti in VB si
possono generare eseguibili (normali .EXE a parte la necessita'
di qualche DLL di supporto), oppure oggetti COM, oppure DLL, ...
Naturalmente, visto che l'origine e' quella, e' anche possibile
eseguirlo in modo interattivo premendo il pulsante "Run" sull'interfaccia
grafica.
Tutto qui? Direi
di sì...
Il Python
e' un linguaggio di programmazione recente
ma nonostante questo gia' molto diffuso,
soprattutto per la realizzazione di script e programmi
con interfaccia grafica su Linux.
Come eseguire un programma Python.
Semplice! Dopo averlo salvato come dimmelo.py basta eseguirlo
con il comando python dimmelo.py.
Tutto qui? Direi
di no... date un'occhiata almeno a
GTK,
Tkinter,
Jython,
LAMP.
Veramente
il linguaggio Assembler avrebbe dovuto essere inserito
come primo... ma poiche' non e' molto comune utilizzarlo
direttamente, ho preferito ricordarlo solo adesso.
Cosi' come non penso di inserire un programma in linguaggio macchina...
(ma posso sempre cambiare idea;).
L'assemblatore su Unix e' as e viene tipicamente richiamato dal
compilatore che ha generato il codice (eg cc). Ma naturalmente si puo'
scrivere tutto in Assembler partendo da zero!
Tutto qui? Direi
di no... date un'occhiata almeno a
il Linguaggio C.
Alla fine non ho restito...
ecco anche un esempio in linguaggio macchina!
Quanto riportato sopra e' solo il compilato, in realta' deve essere
ancora linkato con le librerie e caricato sul sistema (con ld su Unix).
Qualche volta capita di agire direttamente sul codice...
magari anche quello del sistema operativo!
Non e' poi cosi' difficile potrebbe sembrare a prima vista: non c'e' bisogno
capire tutto, basta trovare cosa cambiare...
buon divertimento con i
debugger o con gli editor esadecimali!
Tutto qui? Direi
di no... date un'occhiata almeno a
Assembler,
il linguaggio C,
comandi Unix poco noti: adb.
Il PDF non e' un linguaggio ma
un formato. L'ho riportato lo stesso perche' e' molto diffuso per
la produzione di documenti di alta qualita' e perche' il numero
di librerie, programmi, ambienti che lo trattano e' molto elevato.
Beh il formato e' binario!
Tutto qui? Si:
...
QR non e' un linguaggio di programmazione ma un codice.
QR utilizza una matrice bidimensionale progettata per una
veloce lettura da parte di dispositivi automatici.
QR consente di rappresentare numeri, stringhe di caratteri,
URL, numeri, ... con diversi livelli di correzione d'errore (da L con il 7% a H con il 30%),
codifiche (eg. numeri, stringhe alfanumeriche, ...), dimensioni (curiosamente chiamate versioni:
dalla versione 1 21x21 alla versione 40 177x177).
Anche se inizialmente progettato per l'industria automobilistica il QR
si e' rapidamente diffuso in molti altri ambiti.
Un utilizzo molto comune e' per codificare URL riconosciuti automaticamente
da programmi su dispositivi Mobile. Infatti sui cellulari, anche se dotati
di tastiera, l'introduzione dei caratteri necessari a raggiungere un sito
internet e' sempre difficoltosa. Invece, con un'opportuna applicazione,
basta utilizzare la fotocamera per riconoscere immediatamente il codice
e raggiungere il sito voluto.
Lua e' un linguaggio di programmazione embedded di tipo procedurale.
Poiche' e' un linguaggio embedded non c'e' nessun main ma
opera solo all'interno di un altro programma.
Lua e' fornito come libreria C da linkare con l'applicazione ospite.
Nell'esempio viene eseguita
la nostra simpatica stampa tre volte... pero' poteva anche
spostare tre volte un braccio di
un robot, assegnare tre crediti in un video gioco
o bloccare tre pacchetti su un'interfaccia di rete!
Ma tutto questo puo' funzionare solo all'interno di un
altro programma.
Ecco una semplice applicazione che richiama l'interprete Lua:
Tutto qui? No:
linguaggio C, MySQL Proxy,
decine e decine di giochi, Snort, NMAP,
...
Quando si lavora su un sistema, sia
per sviluppare programmi che per utilizzarli, si dispone sempre di un ambiente.
Questi ambienti possono essere molto semplici oppure consentire loro stessi
una sorta di programmazione. In alcuni casi, poiche' l'ambiente rappresenta
il "guscio" con cui si muove l'utente, vengono chiamati shell.
Gli ambienti su cui
ho preparato un esempio sono:
sh (Bourne shell),
ksh (Korn shell),
csh (C shell),
bash (Bourne Again shell),
awk,
MS-DOS,
WSH,
AppleScript,
sh (speaking on MAC),
REXX,
CISCO-IOS,
FireWall-1 INSPECT, ...
Una shell e' un'interprete di comandi che
legge i comandi impartiti dall'utente sulla tastiera e li esegue sul sistema
operativo. La Bourne shell e' una delle shell disponibili sui sistemi Unix.
Tra tutte e' la piu' semplice e la piu' utilizzata per la creazione di script
(che diventano a volte veri e propri programmi).
Certo sarebbe stato piu' semplice scrivere
semplicemente tre echo ma sicuramente meno divertente... Tutto qui? No: alias,
variabili, caratteri "Jolly", background/foreground, ... Riferimenti: ...
La Korn shell e' un interprete di comandi Unix.
Si tratta di un'evoluzione della Bourne shell. Vi sono tuttavia diverse estensioni.
Oltre ad alcune estensioni sintattiche la Korn shell offre maggiori possibilita'
di editing dei comandi e nella gestione dei job (comandi sottomessi al sistema).
L'esempio utilizzato con la Bourne shell non
darebbe errore sintattico, ma andrebbe in loop. Invece l'esempio riportato in
precedenza per la Bourne shell funziona correttamente anche con la Korn shell.
Tutto qui? No: history, gestione dei job,
programmazione, ... Riferimenti: ...
Anche la csh e' una shell Unix.
Poiche' la sua sintassi e' differente da quella della Bourne shell (e piu' vicina
a quella del linguaggio C) mi e' parso opportuno riportarne un esempio...
La c-shell offre,
analogamente alla Korn shell, diverse possibilita' di editing dei comandi, history,
... funzioni molto comode per gli utenti interattivi.
Tutto qui? No: history, gestione dei job,
programmazione, ... Riferimenti: ...
La bash e' ancora un'altra shell! Tutto qui?
No: Shell features, ...
L'awk e' uno strano linguaggio che consente
di analizzare e gestire file di testo. E' molto utilizzato per convertire file
di testo e/o effettuare calcoli e conteggi sui valori contenuti in un file.
L'awk e' distribuito, come tantissimi altri programmi di utilita', su tutte
le distribuzioni standard di Unix.
In realta' il "programma" in awk e'
quello tra apici, il resto e' solo il richiamo da una shell... (NdA il BEGIN
non serviva, e neanche l'END in verita' ma cosi' il programma e' diventato un
poco piu' lungo).
Tutto qui? No! ...
Veramente l'MS-DOS vorrebbe essere un sistema
operativo e non un linguaggio... Il suo interprete di comandi e' il COMMAND.COM.
Si tratta di una shell limitata ma che consente comunque di scrivere e lanciare
file di comandi.
Il primo comando evita che venga riportato
a video il comando eseguito. Deve essere notato che la shell del MS-DOS e' piuttosto
povera e quindi non e' stato possibile utilizzare cicli, variabili, ... almeno
nell'esempio specifico.
Per eseguire il "programma"
i comandi debbono essere inseriti in un file (ad esempio DIMMELO.BAT, il suffisso
e' obbligatorio ed e' una abbreviazione di BATCH). Quindi va lanciato semplicemente
scrivendo "DIMMELO".
Tutto qui? Praticamente
si! Riferimenti: ...
WSH sta per Windows Scripting Host ed e' il
nuovo ambiente di scripting di Microsoft. Sostituisce i vecchi file .BAT
e' indipendente dal linguaggio ed e' molto piu' potente.
E' sufficiente scrivere il programma
in un file dal nome dimmelo.vbs e' questo e' immediatamente utilizzabile
(il suffisso VBS e' registrato).
La potenza dell'ambiente e' notevole...
nell'esempio seguente il programma parla!
Tutto qui? No: Windows
Scripting Host ...
L'AppleScript e' un linguaggio con una sintassi molto
vicina all'inglese che consente di inviare comandi al sistema ed alle applicazioni Mac.
Ogni elemento trattabile e' un oggetto e le applicazioni Cocoa sono molto ricche di
funzionalita' richiamabili da AppleScript. I comandi sono indirizzati alle applicazioni
con una sintassi molto vicina alla lingua inglese:
tell application "Finder" to ....
L'utility AppleScript Editor permette di scrivere o registrare
gli script che possono essere salvati come file .scrpt o come applicazioni .app
La potenza dell'ambiente e' notevole...
nell'esempio seguente il programma parla!
Tutto qui? Per ora si, poi si vedra'...
Un programma in Bourne shell gira
su un qualsiasi Unix. Quindi anche su Mac OS X! Ecco quindi di usare
nuovamente un TTS (Text To Speach).
Nulla di particolare... solo un ciclo for ed
programma di TTS utilizzabile da linea di comando.
Tutto qui? No:
ci sono molti altri esempi di TTS come Windows Script, Apple Script,...
REXX (REstructured eXtended eXecutor) e' un linguaggio interpretato sviluppato
da IBM ma di cui ora esistono diversi interpreti, anche di pubblico dominio.
Inizialmente nato come linguaggio di scripting per gli ambienti IBM Mainframe
e' stato sucessivamente portato su diverse piattaforme (eg. palmari)
ed ha una buona diffusione.
REXX ha una sintassi semplice e facilmente comprensibile, il che consente
un apprendimento rapido ed una veloce realizzazione di script e programmi.
Il "commento" iniziale e' importante.
Consente al TSO di lanciare l'interprete corretto!
Tutto qui? Beh, si!
L'IOS e' il sistema operativo proprietario della Cisco.
Ma la Cisco non fa i router? Certo! Infatti e' il sistema operativo
di router, di switching-hub, ... insomma di strane apparecchiature che
servono per collegare tra loro reti di computer.
L'interprete dei comandi dell'IOS
e' l'EXEC. Chiaramente non e' molto potente... Nell'esempio
l'abbiamo semplicemente utilizzato per definire il prompt che
presenta il nostro messaggio.
Per effettuare questa programmazione
(ma sarebbe piu' corretto chiamarla configurazione) e' necessario
collegarsi all'apparecchiatura, entrare in modalita' privilegiata
con il comando di enable (naturalmente bisogna conoscere la
password), entrare in modalita' di configurazione da terminale con
il comando conf t, introdurre i comandi dell'esempio
e terminare con Ctrl-Z.
Tutto qui? No:
... ma per adesso puo' bastare!
L'INSPECT e' il linguaggio di scripting del firewall FireWall-1
prodotto da CheckPoint.
Sapete tutti cos'e' un firewall vero? Beh, ve lo dico lo stesso!
Un firewall viene posto tra due o piu' reti per controllare tutti
i messaggi che circolano proteggendo i sistemi da accessi
non desiderati.
Un firewall viene programmato mediante semplici regole che definiscono
quali servizi di rete sono abilitati ed a quali utenti/sistemi/reti.
Con l'INSPECT vengono creati degli INSPECTION SCRIPT
per la programmazione delle regole del firewall.
Ogni regola e' composta da un'azione (eg. accettare un messaggio)
che viene eseguita se le condizioni della regola sono soddisfatte
(eg. viene richiesto un servizio TCP e l'indirizzo sorgente
e' uno specifico indirizzo). Una regola puo' essere controllata
con un logging specifico.
Nel nostro caso abbiamo utilizzato un trucco. Abbiamo creato
un formato di log specifico ed al passaggio di ogni pacchetto
riportiamo il nostro messaggio.
E' raro dover programmare in INSPECT... ma mai dire mai!
In ogni caso gli script vengono compilati dal compilatore
di FireWall-1 e quindi eseguiti dal modulo runtime.
Tutto qui? No:
... ma per adesso puo' bastare!
Non e' solo importante scrivere un programma,
ma questo deve poter comunicare con altri programmi, con il sistema, con gli
utenti, ... Questi aspetti vengono tenuti in conto nell'architettura. Da sempre
i sistemi informativi hanno utilizzato architetture complesse ed implementate
su piu' livelli. Si e' sempre parlato di sistemi a cipolla, di applicazioni
a due/tre/quattro/X livelli, di strati, di API, ... Tuttavia ultimamente, con
la forte crescita tecnologica delle telecomunicazioni e di Internet, questo
aspetto ha assunto un'importanza ancora maggiore.
Non e' raro "smarrirsi"
e non capire dove viene realizzata una certa funzione. Forse e' un servlet sul
Web Server oppure puo' essere un trigger sul DB server, una business logic implementata
nell'application server, essere eseguita sul browser, ...
Relativamente alle
architetture presentiamo quelle apparentemente piu' tradizionali per l'accesso alle basi dati (
ISAM,
MySQL API/C,
Oracle Pro*C,
Oracle Pro*Cobol,
JDBC,
MongoDB,
Pentaho/Kettle,
...),
alcune grafiche e quindi graziose (
Curses,
X-Windows,
motif,
Tkinter,
GTK,
...),
quelle piu' recenti e simpatiche su Internet (
socket - Client,
socket - Server,
socket - Client (PL-SQL),
HTML,
XML,
SGML,
XHTML,
CGI,
LAMP,
LAPO,
LAPP,
Applet Java,
RMI,
Java Script,
VB Script,
Servlet,
JSP,
EJB,
Portlet (JSR 168),
ASP,
Cache'/SOAP,
PHP/SOAP,
COM/ActiveX,
...),
per il mondo @&. Mobile, che per me e' un bel ODI ET AMO (
T9,
WAP,
Android SDK,
Zlango,
...),
quelle un poco particolari (
Cartridge PL-SQL,
External Procedure Oracle,
UML,
Grinder,
...),
...
L'ISAM (Indexed Sequential Access
Method) e' un metodo di accesso ai dati che ne permette la memorizzazione
e la ricerca efficienti.
L'esempio e' in C e richiede
quindi una compilazione con cc dimmelo.c -lisam -lm.
Tutto qui? No:
linguaggio C,
SQL,
...
Per accedere ad una base dati
sono disponibili diversi programmi ed interfacce. Una delle piu'
comuni e piu' utilizzate, soprattutto quando le prestazioni sono
l'esigenza principale, e' quella di un API (Application Program
Interface) verso un linguaggio procedurale compilabile. Cosa meglio
del linguaggio C? Beh, qualcuno risponderebbe il Cobol ma avrebbe torto!
Si tratta di un semplice programma
C che inserisce tre righe in una tabella della base dati. Per compilare il programma
basta utilizzare il semplice comando
cc -o dimmelo -I/usr/include/mysql -mcpu=i486 -fno-strength-reduce dimmelo.c
-L/usr/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lc -lnss_files -lnss_dns
-lresolv -lc -lnss_files -lnss_dns -lresolv
Sembra difficile... ma sono solo un po' di librerie
(e poi con mysql_config
si ottiene l'elenco completo dei parametri da utilizzare).
Quanto a MySQL e' il puo' diffuso DB relazionale
Free Software,
ma sarebbe un lungo discorso...
Tutto qui? No:
SQL,
Pro*C,
MySQL,
...
L'RDBMS Oracle, come MySQL,
fornisce un'interfaccia API per
i programmatori: le OCI (Oracle Call Interface).
Tuttavia l'utilizzo di API funzionale per interfacciarsi
ad una base dati presenta alcune difficolta'.
E' necessario trattare con il linguaggio di programmazione
tutti i tipi di dati, le conversioni, ...
per utilizzare in modo corretto l'SQL riconosciuto dall'RDBMS.
Una modalita' piu' semplice per i programmatori
e' quella di utilizzare un linguaggio
procedurale "arricchito" che consenta
di utilizzare liberamente gli Statement SQL nel codice.
Quindi una fase di precompilazione trasformera' il codice in sorgente
C (o Cobol, ...) compilabile con le solite modalita'.
Il Pro*C e' il precompilatore fornito da Oracle
(il piu' noto e diffuso DB relazionale
commerciale) per utilizzare l'SQL in programmi C.
A parte la modalita' di compilazione l'architettura e' quella di
un semplice Client/Server...
L'utilizzo dei cursori, delle
Host variables, conversioni, ... e' piu' semplice con il Pro*C.
Per compilare basta costruirsi un bel makefile (partendo dagli esempi,
altrimenti non c'e' speranza!) ed il gioco e' fatto!
Tutto qui? No:
SQL,
...
Lo so, non ho mai scritto un programma Cobol per Oracle...
Non so il perche', ma per qualche strana ragione chi scriveva in Cobol
non era in grado di compilare i propri programmi su Unix e con Oracle.
Cosi' intervenivo io che, conoscendo il C e le regole di base della
compilazione e del link dei programmi, riuscivo a mettere insieme
librerie, runtime e programmi in un eseguibile finale.
Tutto qui? No:
SQL, Pro*C,
...
JDBC e' un API
per interfacciare i database da applicazioni Java.
Nell'esempio viene realizzato in Java
il semplice esempio gia' visto in
SQL.
Tutto qui? No:
Java,
SQL,
OCI,
...
MongoDB e' un database non-SQL.
La memorizzazione e presentazione dei dati sono strutturate come documenti (in formato JSON) e non sotto
forma di tabelle come avviene nelle basi dati relazionali.
Si tratta di una base dati che supporta in modo nativo l'indicizzazione,
le query dinamiche (fin qui tutto normale),
la replicazione automatica, l'High Availability, lo Sharding,
la gestione dei dati non strutturati (e questo invece e' sicuramente diverso dal solito), ...
La prima cosa da notare nell'esempio
e' che e' supportato il
linguaggio Java Script dall'interfaccia client. La seconda... che non viene creata la struttura
di una tabella: infatti tutti i dati sono documenti, quindi non c'e' bisogno di definire nulla!
Nell'esempio vengono inseriti tre documenti contenenti una frase e che vengono quindi selezionati.
Tutto qui? No: non-SQL,
Cloud Computing, teorema di CAP, ... Riferimenti: SQL, Java Script, ...
Pentaho e' la piu' diffusa piattaforma Open Source di Business Intelligence.
Detto in altre parole, e' l'ambiente gratuito piu' utilizzato per analizzare i dati.
I componenti di Pentaho sono molteplici ma per questo esempio ci interessiamo solo alla parte di ETL
(Extraction, Transformation and Loading) che e' rappresentata dal prodotto Kettle.
Kettle permette di estrarre dati da una base dati, modificarli e quindi caricarli su una
seconda base dati. Gli ETL sono uno degli strumenti piu' importanti per realizzare
un Data Warehouse.
I passi sono tre. Nel primo passo e' definita una stringa: "Ti amo!" come campo Field1.
Il secondo passo legge la stringa e la moltiplica per tre con un semplice script:
Il terzo passo definisce il nome del file di output, se questo deve essere sovrascritto, ...
Per eseguire la trasformazione e' possibile premere il bottone "Esegui" in Spoon.
Lo script viene salvato in formato XML (con il suffisso .ktl), compilato ed eseguito.
E' anche possibile lanciare i file .ktl da linea di comando con Pan oppure eseguirli in remoto
oppure schedularli oppure ... ma diventa troppo lungo da raccontare!
La maggioranza delle trasformazioni Kettle possono essere realizzate senza alcuna programmazione
ma soltanto scegliendo tra le molte opzioni possibili dei vari oggetti.
Ecco come si puo' semplificare lo script indicando nello step di Input un valore (la stringa "Ti amo!")
ed il numero di record (3) ed in quello di output il corretto formato:
Tutto qui? Si, per il momento ...
Riferimenti: SQL, Java Script, ...
Curses e' un insieme
di librerie che consentono la programmazione grafica
con terminali a carattere.
Le librerie sono indipendenti dal tipo di teminale,
dai caratteri grafici utilizzati, ... e
possono quindi essere utilizzate per ogni dispositivo.
Le librerie sono in linguaggio C e disponibili,
soprattutto, per il sistema operativo Unix.
La maggior parte degli ambienti grafici a carattere
su Unix e' realizzata con Curses (eg. vi).
Per compilare
il file dimmelo.c dell'esempio basta lanciare il comando
cc dimmelo.c -o dimmelo -lcurses.
Per sviluppare
un'applicazione che utilizzi Xlib e' sufficiente creare un programma
in C che richiami le corrette librerie grafiche...
Tutto qui? No:
linguaggio C, ... Riferimenti:
Per sviluppare
un'applicazione che utilizzi i widget motif e' sufficiente creare un programma
in C che richiami le corrette librerie grafiche...
Tutto qui? No:
linguaggio C, ... Riferimenti:
Tkinter e' l'interfaccia
Python a TK.
TK e' un ambiente grafico completo (eg. widget, ...)
spesso associato al linguaggio di scripting TCL.
Il Python offre un'interfaccia nativa a TK: tkinter.
Nell'esempio viene
creata un'applicazione grafica contenente un bottone con il
testo "Dimmelo" che, quando viene premuto, visualizza il nostro
simpatico messaggio.
Tutto qui? No:
Python,
GTK,
...
GTK
e' un toolkit per la realizzazione di interfacce grafiche.
E' stato disegnato fin dall'inizio per supportare linguaggi di
programmazione differenti ed e' quindi utilizzabile sia in C
(che resta il mio linguaggio preferito ma debbo ammettere sia un
po' ostico per alcuni e comunque a basso livello) che in altri
semplici e diffusi linguaggi quali il Python o il Perl.
Tra i programmi piu' noti realizzati in GTK vi sono lo Gnome
(un'interfaccia grafica per Linux) ed il GIMP (un editor per
le immagini).
GTK e' costituito da tre librerie di base:
Ma tutto questo, per chi programma semplici interfacce, non ha
molta importanza... basta sapere che per creare un bottone
con la scritta "pippo" basta richiamare gtk.Button("pippo")!
Certo piu' semplice
della programmazione su X!
Tutto qui? No:
Perl, Python,
... Riferimenti:
Il TCP e' oramai il protocollo
di rete piu' diffuso
ed offre un'interfaccia di programmazione per
costruire programmi di rete chiamata socket library.
Con tale interfaccia sono costruiti la maggioranza dei servizi e delle
applicazioni di rete. L'architettura prevede programmi Client che richiedono
servizi e programmi Server che li forniscono.
Nell'esempio viene presentato
un esempio semplicissimo di un programma client che invia una stringa di caratteri
e che riceve una risposta.
Tutto qui? No:
socket (Server),
HTML,
Dialoghi Platonici,
...
La parte Server e' un poco piu' complicata... ma riusciremo comunque nel nostro
romantico scopo!
Il server deve creare un socket, mettersi in ascolto su una porta e rispondere
a tutte le richieste di servizio.
Nell'esempio viene presentato
un esempio semplicissimo. Il server riceve una richiesta, invia la risposta e
chiude la connessione.
Tutto chiaro?
Se avete capito questi ultimi due esempi avete capito
come funziona il 95% del mondo informatico di oggi!
Tutto qui? No:
socket Client,
socket Client (PL/SQL),
HTML,
Dialoghi Platonici,
...
Il PL/SQL e' il linguaggio procedurale dell'RDBMS Oracle...
quindi piu' adatto a creare stored procedures e trigger ma
come molti altri linguaggi ed ambienti fornisce un'interfaccia
socket.
In effetti sarebbe stato banale presentare un esempio in C!
Nell'esempio viene presentato un semplice client che utilizza
la socket interface.
Quando si lavora in rete non contano i linguaggi di programmazione,
gli ambienti, ... l'unica cosa che conta e' il protocollo utilizzato
ovvero le domande e le risposte che vengono scambiate.
Tutto qui? No:
PL/SQL,
...
Il linguaggio HTML non e' un linguaggio
di programmazione. Si tratta infatti di un semplice linguaggio di formattazione
dei testi. Ho voluto riportarlo ugualmente poiche' con Internet la sua diffusione
e' fortissima.
Scrivere in HTML
e' molto semplice. Infatti si scrive esattamente quello che si vuole leggere!
Il testo viene "arricchito" con dei TAG che indicano che una determinata
parte ha un trattamento particolare. Viene sempre posto un tag all'inizio ed
uno alla fine del testo interessato.
Per rendere questo documento visibile
su Internet con il suo romantico contenuto e' sufficiente scaricarlo su una
directory di un Web Server e sara' cosi' visibile su tutto Internet (che e'
assai piu' grande del mondo conosciuto). Il nome del file dovra' avere il suffisso
corretto: ad esempio Dimmelo.html.
Come funziona? Semplice!
Tutto qui? No: ...
Riferimenti: ...
Il linguaggio XML
e' nato come evoluzione dell'HTML. L'HTML infatti aveva
avuto un enorme successo ma possedeva anche alcuni limiti
che il consorzio W3C ha voluto superare definendo un
nuovo linguaggio: l'XML.
Dal punto di vista tecnico l'XML e' una particolare
implementazione dell'SGML, ma dal punto di vista pratico e'
piu' semplice spiegarlo per le sue differenze con l'HTML.
Aggiornamento!
La definizione precisa del linguaggio lo rende molto
facilmente trattabile da parte di programmi e la sua
estendibilita' lo rende adatto a rappresentare dati.
Creato un file dimmelo.xml con il contenuto XML dell'esempio
si puo' pubblicare come un qualsiasi altro file .HTML.
Tutto qui? No:
html,
xhtml,
SOAP (Cache'),
SOAP (PHP),
...
L'HTML e' un subset di un piu' ampio standard ISO chiamato SGML
(Standard Generalized Markup Language).
L'utilizzo dell'SGML e' piu' ampio poiche' consente
di definire i contenuti non la forma di visualizzazione.
Quest'ultima puo' essere scelta di volta in volta e puo'
essere adatta alla stampa di un libro, alla presentazione
su un browser, alla realizzazione di un CD-ROM, ...
SGML consente la definizione di DTD (document type definitions)
contenenti TAG e l'HTML e' uno specifico DTD.
Una particolarita'? Tra i TAG ve ne e' uno che consente di definire
il collegamento ad un altro documento (HyperLink).
Una cosa semplice ma che ha fatto crescere
il Web ed Intenet in modo esponenziale e senza il quale ne lo standard ISO
SGML ne questo documento esisterebbero!
Tutto qui? No:
HTML,
XML,
XHTML,
...
Il linguaggio XHTML
e' l'evoluzione dell'HTML. Si tratta di un documento XML
e' quindi presente l'indicazione del DTD (Document Type
Definitions) ed utilizza i TAG
con il formato tipico dell'XML.
L'XHTML ha molte estensioni rispetto all'HTML pero'...
e' chiaramente piu' complesso!
Pubblicare un documento XHTML e' analogo a pubblicare un
HTML. Le uniche avvertenze, per avere una rappresentazione
perfetta del file, sono che e' necessario utilizzare un
browser recente ed il DTD deve essere accessibile!
Il CGI (Common Gateway Interface) non
e' affatto un linguaggio. E' uno standard su come si debbono comportare le applicazioni
per poter essere ospitate su un Web Server. Con un programma realizzato seguendo
lo standard CGI e' possibile rendere "attive" le pagine altrimenti statiche
realizzate con l'HTML. Un programma CGI puo' essere realizzato con diversi linguaggi.
Nel seguito utilizzeremo la Bourne shell semplicemente perche'
e' semplice!
Per poter essere
un'applicazione pubblicabile come CGI un programma deve scrivere in output un
paio di semplici righe e quindi una pagina HTML corretta. Non vi sono altri
particolari requisiti (ovviamente per ottenere i dati da inserire nella pagina
HTML il programma puo' accedere a basi dati, fare elaborazioni, ...).
La prima riga non e' un commento ma
serve ad indicare al sistema (unix) che si tratta di un programma shell; allo
stesso modo le due echo sucessive sono necessarie per dichiarare il tipo di
documento trasmesso al browser. E' importante notare che l'applicazione CGI
viene eseguita sul web server. Verso il browser arrivano pagine HTML "normali".
Con le applicazioni CGI e' anche possibile "leggere" i dati inseriti dall'utente,
ma questo e' un altro discorso...
Come funziona? Semplice!
Tutto qui? No: ...
Riferimenti: ...
LAMP e' un acronimo che
indica un insieme di linguaggi o, forse meglio,
un'architettura (LAMP: Linux Apache MySQL Perl/PHP/Python).
Con LAMP si intende una piattaforma completa che consente di sviluppare
applicazioni robuste ed efficenti utilizzando solo
software libero.
Come in tutti gli altri esempi di codice il programma e' molto
semplice. Ma quanto e' completo questo programma? Se si dovesse avere una completa
gestione degli errori e dell'interfaccia quanto sarebbe piu'
complicato? Non molto piu' complesso, come si puo' vedere nell'esempio che segue:
L'esempio e' un poco piu'
lungo di altri poiche' contiene la gestione completa degli errori...
In ogni caso il tratto di codice necessario per collegarsi al
DB e presentare i dati come pagina HTML su web e' effettivamente semplice.
Realizzare applicazioni con il LAMP e' economico ed efficiente.
Tutto qui? No:
SQL,
PHP,
Perl,
Python,
HTML,
...
LAPO e' un acronimo che mi sono inventato io!
Come chiamare un'architettura che consente di accedere all'RDBMS Oracle
(Linux Apache Oracle Perl/Php) se non LAPO?
Il publishing e' banale: come con il LAMP basta porre il file in una directory
del web server come con una semplice pagina HTML.
Tutto qui? No:
SQL,
PHP,
Perl,
HTML,
...
Come il vero e sicuramente romantico Lapo possa dire "Ti amo!"... beh al momento non ci e' dato di saperlo!
L'abbiamo nominato ed eccolo anche lui!
Rispetto all'architettura LAMP utilizziamo il database Open PostgreSQL
(Linux Apache PostgreSQL Perl/Php/Python).
Il publishing e' banale: basta porre il file .php in una directory
del web server come con una semplice pagina HTML.
Tutto qui? No:
SQL,
PHP,
Perl,
HTML,
...
Il linguaggio T9
ha una ragione molto semplice: scrivere velocemente
messaggi testuali con una tastiera numerica.
Per esempio scrivere un SMS con la tastiera di un cellulare.
Ogni tasto corrispondono a piu' lettere (eg 2 abc)
ed una pressione ripetuta dello stesso tasto e' vengono
passate in sucessione. Questo pero' vuol dire che ogni volta che
si vuole la lettera C e' necessario premere il tasto 2 tre volte.
No comment!
Tutto qui? No:
WAP,
...
WAP sta per Wireless Application Protocol
ed e' una collezione di standard di recente introduzione applicabili alla telefonica
cellulare. Adottando tale standard un telefono cellulare evoluto puo' mostrare
(sul suo limitato display) un testo interattivo e navigabile come un testo HTML
su Internet. In realta' il testo non e' in HTML ma in WML, ma e' un nome meno
conosciuto e si assomigliano molto...
Lo standard WAP ricorda molto da vicino gli analoghi protocolli e standard dell'ambiente
Internet. Scrivere in WML e'
molto semplice. Infatti si scrive esattamente quello che si vuole leggere! Il
testo viene "arricchito" con dei TAG che indicano che una determinata
parte ha un trattamento particolare. Viene sempre posto un tag all'inizio ed
uno alla fine del testo interessato. Per tale motivo la serie di pagine (card)
che compongono un deck viene scaricata in un solo passo ed il dialogo
tra proxy server e terminale WAP avviene in forma compressa.
Per rendere questo documento visibile
su Internet con il suo romantico contenuto e' sufficiente scaricarlo su una
directory di un Web Server, disporre di un proxy server WAP e sara' cosi' visibile
su tutti i cellulari (WAP) del mondo.
Come funziona? Semplice!
Tutto qui? No: ...
Riferimenti: ...
Android SDK e' l'ambiente che consente di sviluppare applicazioni per cellulari Android.
Realizzato il programma va compilato ed impacchettato il tutto in un file di pacchetto .apk
Ora la nostra applicazione e' pronta!
Cosa ne facciamo? Possiamo provarla con l'emulatore (lentissimo), installarla sul nostro
cellulare (con adb install) oppure pubblicarla sull'App Market e sperare di diventare milionari
con le vendite!
Tutto qui? No!
Sono molto importanti gli ambienti di sviluppo che risultano concorrenti di Android come:
Xcode (per applicazioni COCOA su iPhone, iPad e iPod con iOS),
QT Developer (per Nokia Symbian e Maemo),
Microsoft Mobile,
...
Caratteristiche HW, modelli di cellulari, sistemi operativi, App Market, architetture applicative, ...
sono tutte diverse ma il mercato potenziale dei prossimi anni e' enorme e quindi
le innovazioni sono continue su tutti i fronti!
Il linguaggio Zlango
e' un recentissimo linguaggio ad ideogrammi ideato per la comunicazione
con i cellulari o con qualsiasi altro mezzo di comunicazione
che permetta lo scambio di immagini.
La struttura del linguaggio
e' molto semplice, quasi banale: si tratta di circa 200
icone organizzate per categorie...
In realta' l'aspetto piu' interessante e' che il linguaggio
e' estensibile e crescera' a seconda dell'utilizzo degli utenti.
Nell'esempio viene
riportato il nostro classico esempio. Facile vero?
Tutto qui? No:
T9,
...
Il linguaggio Java consente di produrre particolari
programmi detti Applet, che possono essere scaricati da Internet ed eseguiti
all'interno dei piu' comuni "navigatori" o browser (eg. Netscape o Internet
Explorer)
Per ospitare tale programma su web e' necessario
includerlo in una pagina HTML come quella che segue:
La compilazione e' analoga a quella
di un programma Java. Per la pubblicazione sul web server
dell'Applet e della pagina HTML ospite le indicazioni sono invece analoghe a
quelle relative all'HTML.
Come funziona? Semplice!
Tutto qui? No: security
sandbox, bytecode, architetture distribuite, servlet, classi fondamentali, RMI,
... Riferimenti: Ditelo con... Java, Developing
Custom and Standard Interfaces to Oracle RDBMS in Java, Using
Java Standard Interfaces to Oracle, ...
L'RMI introduce una flessibilita' notevole nel disegno delle
applicazioni distribuite con Java.
CORBA e' un ORB (object request broker)
ovvero un software che consente il richiamo remoto di oggetti
in rete e ne fornisce l'infrastruttura (serialization, naming, ...).
CORBA utilizza l'IDL (Interface Description Language)
per descrivere le strutture dei dati.
L'implementazione e' quindi costituita da una parte server:
E da una parte client:
Basta utilizzare il
package dell'implementazione RMI-IIOP (javax.rmi.CORBA)
e tutto funziona correttamente.
Tutto qui? No:
ci sarebbe qualche dettaglio in piu' sull'rmic, l'rmiregistry,
le socket factory, l'utilizzo con firewall, la sandbox, ...
ma ve li risparmio. Piuttosto vedete:
java,
EJB,
socket interface,
...
Il linguaggio Java consente anche
di produrre particolari
programmi detti Servlet, che vengono eseguiti sul sistema che ospita
il web server ed il cui output e' una pagina HTML visibile con
tutti i "navigatori" o browser (eg. Netscape o Internet
Explorer)
Dal punto di vista di programmazione si tratta di realizzare
un programma Java che estenda la classe HttpServlet.
Tipicamente vengono sviluppati uno o piu' metodi (eg. doGet, doPost,
in modo da effettuare l'override dei metodi forniti dalla classe).
La compilazione e' analoga a quella
di un programma Java.
Per ospitare tale programma su web e' necessario
configurare correttamente il Java Web Server che lo ospita.
La configurazione dipende dal prodotto utilizzato, viene spesso
effettuata mediante pagine web di amministrazione o
agendo su file di configurazione (spesso in formato XML).
Ad esempio su JWS la configurazione si effettua su
http://server/admin/servlet.html
indicando il nome IloveYou e la classe IloveYouServlet.
Il servlet sara' cosi pubblicato su
http://server/servlet/IloveYou.
Come funziona? Semplice!
Tutto qui? No:
java, bytecode, architetture distribuite, servlet, classi fondamentali, RMI,
... Riferimenti: Ditelo con... Java,
Ditelo con... JSP,
...
Le Java Server Pages (JSP) sono state
introdotte come un estensione delle API Servlet 2.1 ma e' piu'
facile presentarle come partendo dall'HTML.
Dal punto di vista tecnico l'implementazione delle pagine JSP e'
molto efficiente.
La prima volta che viene richiamata la pagina JSP viene trasformata
in un servlet, questo viene compilato e
viene attivato un thread sull'Application
Server. Sucessivi richiami utilizzeranno il thread, se ancora attivo, o il
servlet corrispondente.
Le pagine vengono realizzate con un normale editor HTML (personalmente uso il vi,
ma dipende dai gusti ;-) e pubblicate ponendole su directory specifiche del web/app server.
Tutto qui! Sara' il server che si occupa automaticamente di compilare le pagine quando
necessario.
Tutto qui? No:
HTML,
servlet,
java,
...
Java Script e' un linguaggio di scripting
che viene interpretato dal browser e consente di "programmare" una pagina HTML.
Con Java Script e' possibile animare le pagine HTML, effettuare controlli e
validazioni di dati, ...
Non vi sono differenze le pubblicare
su Web pagine che contengono Java Script rispetto a pagine HTML statiche.
Come funziona? Semplice!
Tutto qui? No: innanzi
tutto va notata la grande differenza rispetto al linguaggio
java, ad un applet,
ad una JSP, ...
Si tratta di cose completamente differenti, anche se i termini (e
la sintassi) si assomigliano! Riferimenti:
HTML,
java,
JSP,
...
Visual Basic Script (VBS) e' un linguaggio
di scripting che viene interpretato dal browser, dai mailer e da diverse altre
applicazioni Microsoft e consente creare script che lanciano funzioni e macro
sui diversi ambienti MS. Con VBS e' possibile animare le pagine HTML, effettuare
controlli e validazioni di dati, inviare email, lanciare macro su MS-Word/Excel/...,
... Censurato Questa pagina e'
stata censurata poiche' un buontempone ha scritto in VB Script un simpatico
worm dal titolo "I love You!" (forse aveva letto questo articolo??). Ma si e'
confuso! Anziche' ripetere il messaggio 3 volte lo ha ripetuto su tutti i mailer
Internet bloccando quasi la Rete per una giornata...
Come funziona?
Semplice! Tutto qui? No:
... Riferimenti: ...
Gli Enterprise Java Bean (EJB) consentono di costruire architetture
applicative distribuite complesse ed affidabili.
Un EJB e' un componente riutilizzabile, portabile e gestito lato server.
L'EJB Container si occupa della gestione della sicurezza,
delle transazioni, dei pool di connessione alle basi dati...
e contiene tutti gli EJB istanziati.
Le applicazioni che richiamano gli EJB invece si occupano della
presentazione dei dati.
Con tale chiara separazione dei ruoli la costruzione di applicazioni
distribuite complesse risulta semplificata.
Infatti il programmatore si concentra nel realizzare la logica
dell'applicazione senza occuparsi degli altri elementi al contorno
che vengono forniti in modo automatico dal container.
La definizione dell'interfaccia utilizza @Remote per indicare
un'interfaccia remota.
La classe bean implementa la logica di business.
L'annotazione
@Stateless indica che si tratta di un Stateless Bean.
Ecco come l'applicazione richiama l'Enterprise Java Bean.
La modalita' di deploy e' molto importante. In
modo simile ai servlet, gli EJB vengono distribuiti su file .EAR
e debbono essere posti su un EJB Container.
Tutto qui? No:
Java,
Java Bean,
RMI,
...
L'idea di base dei Portlet e' quella di realizzare applicazioni web
che possono essere presentate all'interno di una piu' ampia
pagina personale (un Web Portal).
E' come il Portale fosse una pagina di giornale, personalizzabile
per ogni utente, ed i Portlet i singoli articoli.
Dal punto di vista tecnico un Portlet e' come un Servlet che, anziche'
presentare un'intera pagina HTML, ne prepara una porzione.
La parte esterna sara' infatti gestita dal Portale stesso.
Dal punto di vista di autenticazione, profilazione, ...
un Portlet deve richiamare i servizi offerti dal Portale cosi' come non
puo' effettuare ridirezioni per non modificare il layout
complessivo della pagina. In caso d'errore dovra' semplicemente
segnalare il problema al Portale.
Nell'esempio che segue utilizzamo Java+JSP poiche' e' quella
tipicamente piu' utilizzata.
Il codice Java di implementazione del Portlet e':
I tratti di codice sono piuttosto semplici.
Il deploy e' invece piu' complesso e richiede la compilazione di
diversi file di configurazione (tipicamente .xml).
Lo strano nome JSR-168 e' dovuto al fatto che le API sono state sviluppate
con il Java Community Process da parte di un'ampia serie di contributi
(tra i principali: Apache, BEA, IBM, Oracle, SUN, ...).
Tutto qui? No:
Servlet,
JSP,
...
L'ASP (Active Server Pages) consente
di programmare pagine HTML dinamiche. Le pagine create possono eseguire elaborazioni
si sul browser (come avviene con Java Script) che sul web server (come avviene
con l'interfaccia CGI), effettuare controlli, leggere dati da DBs, ... Il codice
ASP e' interpretato dal Web Server ed il risultato e' una pagina HTML "arricchita"
con le informazioni ottenute.
Anche l'ASP utilizza
un'estensione del linguaggio HTML ed e' quindi richiamato con opportuni TAG.
Le funzioni supportate non sono molte, ma ASP e' possibile richiamare funzioni
scritte in Java Script ed in VB Script e' cosi' possibile fare di tutto.
Nel prossimo esempio l'ASP viene utilizzato
per richiamare uno script in Java Script. L'aspetto interessante e' che il codice
Java Script viene eseguito sul server quindi nulla di questo traspare alla pagina
HTML finale inviata al browser (che quindi riporta sempre lo stesso romantico
risultato).
Alcuni web server consentono di sviluppare
applicazioni in ambienti ed architetture particolari. L'OWS (Oracle Web Server)
utilizzando il Cartridge PL-SQL permette di generare pagine HTML programmando
in PL-SQL.
Tutto qui? No:
PL-SQL, SQL, HTML, ... Riferimenti: Oracle Web Server, ...
L'RDBMS Oracle puo' essere,
gia' molto completo come funzionalita', puo' essere arricchito con
funzioni esterne. Tali funzioni vengono compilate in una libreria
che, opportunamente dichiarata, puo' essere richiamata da Oracle
con i normali statement SQL.
La difficolta' non e' nella programmazione ma nei diversi passaggi
di configurazione da effettuare... quindi, per questo esempio,
procederemo per fasi.
Il programma va compilato ed inserito in una libreria dinamica.
Per farlo (su Linux) i comandi sono:
gcc -fPIC -g -c dimmelo.c e quindi
gcc -shared -o dimmelo.so dimmelo.o -lc.
Il richiamo delle procedure esterne
avviene mediante il TNS. Vanno quindi configurati
il listener.ora:
e tnsnames.ora:
All'interno di Oracle la libreria esterna va dichiatata con:
Ora si puo' creare una procedura con:
Finalmente si puo' richiamare la procedura!
Per farlo utilizziamo un blocco PL-SQL anonimo:
Facile vero?
Tutto qui? No:
C,
SQL,
PL-SQL,
...
SOAP e' un protocollo molto pulito!
SOAP (Simple Object Access Protocol) e' un protocollo
basato sull'HTTP (HyperText Transfer Protocol)
tra applicazioni
che utilizzano l'XML
(eXtented Markup Language)
per inviare richieste e risposte.
Qualche notizia in piu'...
L'esempio che segue e' stato realizzato con Cache'. Cache' e' uno
strumento RAD che unisce un DB relazionale con un profondo
utilizzo dell'object oriented e dei servizi su web.
Con questo strumento vengono create delle pagine CSP (Cache' Server
Pages) realizzate con un linguaggio object oriented con un accesso
diretto ai dati. Tramite un semplice wizard e' possibile creare
Web Service SOAP.
A questo punto il sevizio puo' essere richiamato con
http://localhost:1972/csp/samples/Parole.Dimmelo.cls, con
http://localhost:1972/csp/samples/Parole.Dimmelo.cls?wsdl
se ne ottiene la descrizione
e con
http://localhost:1972/csp/samples/Parole.Dimmelo.cls?soap_method=Test
l'esecuzione.
Tutto qui? No:
HTML,
XML,
SOAP (PHP),
... Riferimenti:
Tutta la storia del SOAP ve la siete gia' letta nel
paragrafo precedente...
quindi ve la risparmio!
Nell'esempio viene utilizzata la libreria nusoap che fornisce i metodi
per registrare i servizi SOAP e per richiamarli.
Tutta la complessita' del protocollo, l'XML, i messaggi, ...
vengono gestiti dalla libreria nel modo previsto dagli standard.
Il servizio puo' essere richiamato in modo molto semplice
da un SOAP Client (dimmi.php):
Anche il client e' molto semplice... utilizzando le opportune librerie
deve sono richiamare il metodo desiderato passando i parametri corretti,
gestirne gli eventuali errori (non riportati nell'esempio) ed ottenere
il risultato.
Compilazione, installazione, configurazione, tuning?
Tutto qui? No:
SOAP,
HTML,
XML,
PHP,
...
Jython
e' l'implementazione Java di Python.
Grinder e' un tool molto potente... ma in questo caso,
lanciando java net.grinder.Grinder, nel
log si trovera' qualcosa di romantico!
Tutto qui? No:
Java,
Python,
Grinder,
... Riferimenti:
Il COM (Component Object Model) e' un'architettura
introdotta da Microsoft per lo sviluppo di applicazioni ad oggetti
e distribuite (nella sua evoluzione).
COM e' spesso indicata anche con il nome ActiveX che,
in realta', indica un componente
specifico dell'architettura COM.
Sui dettagli dell'architettura e la sua storia (OLE, COM, DCOM, COM+)... no comment!
Ma l'utilizzo, anche se non sempre semplice, e' molto produttivo.
Nell'esempio viene richiamato un semplice
servizio che parla da uno script Python.
La pronucia e' piuttosto pittoresca...
Tutto qui? No:
python, DCOM, COM+, MTS, MSMQ, OLE, OCX,
...
L'UML (Unified Modeling Language) e' un linguaggio
per la modellizzazione degli oggetti e
la definzione di specifiche.
L'UML nella sua totalita' e' molto complesso e completo e molti,
come il sottoscritto,
ne conoscono discretamente solo alcune parti
ma utilizzano comunque la notazione grafica.
Per chi ha qualche interesse in piu'...
Le parti principali di un modello di un sistema sono 3:
Questi modelli vengono rappresentati mediante diagrammi. Ve ne sono 13 (per lo standard UML 2.0)
raggruppati come segue:
Ma abbiamo parlato troppo, torniamo all'argomento principale!
Nell'esempio e' rappresentato un "flowchart" del nostro classico esempio.
In realta' l'Activity Diagram utilizzato puo' rappresentare molti piu'
elementi di un flowchart. La semantica del diagramma e' infatti quella
delle reti di Petri ed e' possibile rappresentare attori e ruoli...
Ma per ora basta cosi!
Se davvero dovete dire "Ti amo" allora ditelo
con i fiori!
E se temete di confondervi con le parole alla
consegna del mazzo... beh scrivete un bigliettino!
Per le regole
di compilazione di un ikebana si rimanda alla documentazione tecnica
specifica!
Le vie dell'informatica sono infinite (come
il nastro della macchina di Turing). Ed allora perche' non citare anche gli
altri...
Se pensate che io sia l'unico matto che scrive di queste cose...
vi sbagliate! Nel tempo sono molte le cose simili
che ho trovato pubblicate su web.
Testo: Hello World... ditelo coi fiori
Ditelo con ... il C#
// Programma di esempio in C#
using System;
public class Dimmelo
{
public static void Main()
{
int i;
for (i=0; i<3; i++)
Console.WriteLine("Ti amo!");
}
}
Ditelo con ... Go
E' un linguaggio compilato, semplice, efficiente e con un'ampia libreria (packages per essere precisi) proprio come il C.
La gestione dei tipi e' statica e non
raccoglie tutti i paradigmi dei linguaggi ad oggetti ma permette una costruzione
modulare e flessibile dei programmi. Come molti linguaggi ad oggetti possiede un garbage collector.
Come in molti linguaggi interpretati
la sua sintassi e' semplificata (eg. non si usa il ;, dichiara automaticamente le variabili, ...).
Il Go implementa la concorrenza in modo molto efficiente per sfruttare al meglio i processori
multicore e le architetture distribuite.
Insomma i progettisti di Go hanno cercato di raccogliere il meglio di tutto
sviluppando un nuovo linguaggio... vedremo!
/* Progamma di esempio in Go */
package main
import "fmt"
func main() {
for i:= 0; i< 3; i++ {
fmt.Println("Ti amo!")
}
}
In realta' il nome del compilatore/linker dipende dalla piattaforma,
e' gia' disponibile il classico gccgo, sono disponibili ambienti web per il test dei programmi, ...
ma e' in forte evoluzione quindi non e' il caso di scendere in dettagli.
Ditelo con ... il Perl
Il Perl e' un linguaggio interpretato dalla sintassi piuttosto semplice che,
rispetto ad altri linguaggi di script ed alle shell, dispone
di un insieme molto ampio di librerie. Tra le diverse librerie: gestione file,
gestione della mail, accesso a DB, servizi di rete, interfaccia CGI, ...
# Progamma di esempio in linguaggio Perl
for ($i=0; $i<3; $i++)
{
printf "Ti amo!\n";
}
Ditelo con ... PHP
<?php
# Esempio in PHP
while ($i<3) {
echo "Ti amo!\n";
$i++;
}
?>
Ditelo con ... il BASIC
Il BASIC non richiede la dichiarazione delle variabili,
ha comandi molto semplici e vicini alla lingua inglese,
contiene costrutti, magari non eleganti, ma certamente utili
per una programmazione veloce (eg. il famigerato GOTO).
Il BASIC e' un liguaggio imperativo, non strutturato, interattivo
ed interpretato.
Del BASIC esistono ora molti dialetti con notevoli estensioni.
Tra i piu' recenti ed utilizzati sono il
Visual Basic ed il
VB Script.
Rispetto al BASIC originale hanno perso il numero di linea
("10", "20", ...) ma hanno mantenuto la semplicita' di programmazione
ed acquisito qualche costrutto object oriented.
10 REM Programma di esempio in BASIC
20 FOR I=1 TO 3
30 PRINT "Ti amo!"
40 NEXT I
Ditelo con ... il Pascal
Il Pascal e' un linguaggio di terza generazione compilato.
{ Programma di esempio in Pascal }
program dimmelo (input, output);
var i: integer;
begin
for i:=1 to 3
writeln('Ti amo!');
end.
Ditelo con ... il PL/0
Il PL/0 e' un linguaggio di terza generazione compilato.
PROGRAM Dimmelo;
VAR i : LONGINT;
BEGIN
i = 1;
REPEAT
WRITELN('Ti amo!');
inc(i);
UNTIL i>3;
END.
Ditelo con ... il linguaggio Cobol
Il Cobol e' un liguaggio compilato particolarmente noioso. Da sempre qualcuno
ne predice l'imminente scomparsa ma in realta' e' uno dei linguaggi piu' diffusi
ed utilizzati su tutti gli ambienti (e non solo su Mainframe).
* @(#)dimmelo.cbl 1.0
* Programma di esempio DIMMELO.COB
$SET ANS85 MF
IDENTIFICATION DIVISION.
PROGRAM-ID. DIMMELO.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.
SPECIAL-NAMES.
CONSOLE IS CRT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(2) COMP.
PROCEDURE DIVISION.
DISPLAY SPACE UPON CRT
PERFORM 3 TIMES
DISPLAY "Ti amo"
END-PERFORM
STOP RUN.
Ditelo con ... ABAP
L'ABAP e' un linguaggio piuttosto facile ma non e' comunque
rivolto all'utente finale.
Nel tempo ha avuto un'evoluzione fino all'attuale versione
che ha una serie di costrutti Object Oriented.
L'accesso ai dati e' eseguito in Open SQL in modo
trasparente rispetto alla base dati effettivamente utilizzata
(eg. Oracle, DB2).
* Dimmelo in ABAP
REPORT DIMMELO.
DATA count TYPE I.
count = 0.
WHILE count LT 3.
WRITE 'Ti amo!'.
count = count + 1.
ENDWHILE.
Ditelo con ... il Fortran
* Dimmelo.f
PROGRAM ILOVE
IMPLICIT NONE
INTEGER TOTAL
CHARACTER*10 MESSAGE
C * Note: some f77 compilers make my crazy! *
MESSAGE = 'Ti amo!'
TOTAL = 0
2000 CONTINUE
PRINT 3000, MESSAGE
3000 FORMAT (/, ' ', A)
TOTAL = TOTAL + 1
IF (TOTAL .EQ. 3) GO TO 4000
GOTO 2000
4000 CONTINUE
END
Ditelo con ... l'ADA
-- meo's ILOVEYOU Ada Program
with
text_io;
use
text_io;
procedure ILOVEYOU is
MESSAGE : CHAR(1..14);
TOTAL : INTEGER;
begin
MESSAGE := "Ti amo! ";
TOTAL := 0;
loop
put_line(MESSAGE);
TOTAL := TOTAL + 1;
if TOTAL = 3 then
exit;
end if;
end loop;
exception
when others =>
put_line("Errore sconosciuto!");
new_line(4);
end ILOVEYOU;
Ditelo con ... logo
Del logo sono disponibili molteplici ottime versioni GPL
anche se quelle con librerie grafiche, un'ampia documentazione ed un adeguato supporto,
sono generalmente a pagamento.
La sintassi cambia spesso un poco (in particolare per le versioni
nazionalizzate) ma la portabilita' non e' certo un problema per
un linguaggio didattico.
# Script di esempio in logo
repeat 3 [ print [Ti amo!] ]
# Script con l-calcolo
to dimmelo :volte
if :volte>0 [ dimmelo :volte - 1 ]
print [Ti amo!]
end
dimmelo 3
Ditelo con ... KPL / Phrogram
La versione iniziale di KPL (Kid's Programming Language) si e' evoluta
in Phrogram che e' disponibile, nella versione base, come Freeware.
Con la versione a pagamento di Phrogram e' possibile generare eseguibili .EXE,
ovviamente per gli ambienti WinX
(NdE la politica di distribuzione e' cambiata e Phrogram e' ora disponibile solo
a pagamento, anche se ad un prezzo molto basso).
Program Dimmelo
//Programma di esempio in KPL/Phrogram
Method Main()
Define i As Integer
For i=1 To 3
printline("Ti amo!")
Next
End Method
End Program
Ditelo con ... Scratch
Scratch rende semplice la
pubblicazione e condivisione dei programmi su web che viene effettuata
con pochi click del mouse.
Ditelo con ... AppInventor for Android
Ditelo con ... il Prolog
La sintassi del linguaggio e' molto semplice ed e' basata sulla
regola. La regola e' costituita da una lista di antecenti
e da un conseguente. Se la lista degli antecedenti e' vera allora
anche il conseguente e' vero. Se non ci sono antecedenti allora
la regola e' sempre vera ed e' detta fatto.
Il Prolog e' generalmente interpretato.
Data la sua natura logica il Prolog e' utilizzato nella
costruzione di sistemi esperti o di sistemi basati sulla conoscenza.
% Programma di esempio in Prolog
dimmelo:-dimmi(3).
dimmi(0).
dimmi(X):-
writeln('Ti amo!'),
Y is X - 1,
dimmi(Y).
Ditelo con ... Java
Si tratta di un linguaggio ad oggetti, compilato (su un bytecode che viene interpretato
dalla JVM per essere piu' precisi) adatto a costruire applicazioni (come nel
seguente esempio) o programmi scaricati da Internet ed eseguiti da un browser
(applet come in un esempio sucessivo).
La programmazione in Java richiede una definizione rigorosa delle interfacce e
delle eccezioni "costringendo" a scrivere programmi ben portabili e robusti ma... un poco complessi.
/**
Esempio di programma in linguaggio Java
*/
public class Dimmelo
{
public static void main( String[] args )
{
int i;
for (i=0; i<3; i++)
System.out.println("Ti amo!");
}
}
Riferimenti:
Applet Java,
JDBC,
Sette architetture in cerca d'autore,
Developing Custom and Standard Interfaces to Oracle RDBMS in Java,
Using Java Standard Interfaces to Oracle, ...
Ditelo con ... Java Bean
La definizione e' semplice:
un Java Bean e' una classe pubblica che implementa l'interfaccia
Serializable con un costruttore senza argomenti.
Un Java Bean puo'
anche esportare proprieta', eventi, metodi ed una
classe BeanInfo ma non e' necessario.
L'aspetto notevole dei Java Bean e' che vengono riconosciuti
con tutte le loro proprieta'
dagli ambienti di sviluppo (eg. un IDE) rendendone semplice
l'utilizzo.
Ecco l'esempio:
public class DimmiBean implements java.io.Serializable {
private String phrase;
public DimmiBean() {
phrase="Ti amo!";
}
public setPhrase(value) {
phrase=value;
}
public getPhrase() {
return (this.phrase);
}
public String dimmelo() { return (this.phrase); }
}
DimmiBean frase = new DimmiBean();
System.out.println(frase.dimmelo());
Ditelo con ... Cache' ObjectScript
L'ambiente di sviluppo utilizzato da Cache' e' Studio
un potente IDE che consente la realizzazione di applicazioni
in tempi molto rapidi.
/// Esempio di Classe in Cache'
Class Parole.Dimmelo
{
ClassMethod Test() As %String
{
set frase=""
for i=1:1:3
{
set frase= frase _ "Ti Amo! "
}
Write frase
}
}
Ditelo con ... LSL
Una particolarita' di LSL e' il forte utilizzo degli stati e degli eventi.
Ogni script ha sempre almeno uno stato: quello di Default.
Gli eventi non sono definiti ma sono predefiniti dall'LSL.
Il Touch_start(), esegue il codice al suo interno quando
l'oggetto che contiene lo script viene toccato.
// Script di esempio in LSL
default
{
touch_start(integer total_number)
{
integer i = 0;
for(; i<3; ++i)
llSay(0,"Ti amo!");
}
}
Ditelo con ... SQL
Il linguaggio e' definito di quarta generazione. Non si tratta quindi di un
linguaggio procedurale ed e' di semplice utilizzo.
Il linguaggio SQL e' molto diffuso e ne esistono diversi dialetti forniti
dai diversi database relazionali (eg. Oracle, PostgreSQL, MySQL, DB2, SQL Server, SQLite, ...).
Tuttavia le istruzioni di base del DDL (data definition language) e DML (data manipulation language)
sono comuni e sono state ben standardizzate.
REM Script di esempio in SQL
CREATE TABLE dimmelo (testo char(20));
INSERT INTO dimmelo(testo) VALUES('Ti Amo!');
INSERT INTO dimmelo(testo) VALUES('Ti Amo!');
INSERT INTO dimmelo(testo) VALUES('Ti Amo!');
COMMIT;
SELECT testo
FROM dimmelo;
Mutatis mutandis lo script vale per tutte le basi dati relazionali.
In effetti vi e' uno standard ANSI sull'SQL rispettato praticamente da tutti i produttori (per le funzionalita' core).
Ad esempio: Oracle, PostgreSQL, MySQL, DB2, Informix, SQL Server, Sybase, SQLite, Firebird, ...
La versione piu' recente dello standard e' SQL:2008.
Ditelo con ... PL/SQL
E' un linguaggio procedurale il cui codice viene compilato e viene memorizzato
sulla base dati stessa. Il PL/SQL e' stato introdotto da Oracle da molto tempo,
e' molto efficiente e dispone di un numero molto elevato di package di sistema.
REM Script di esempio in PL/SQL lanciato da SQL*Plus
set serverout on
declare
i number;
begin
for i in 1..3 loop
DBMS_OUTPUT.PUT_LINE( 'Ti amo!');
end loop;
end;
/
REM Stored procedure e package
create procedure dimmi3 is
begin
declare
i number;
begin
for i in 1..3 loop
DBMS_OUTPUT.PUT_LINE( 'Ti amo!');
end loop;
end;
end dimmi3;
/
create package dimmi is
procedure dimmi3 ;
end dimmi;
/
create package body dimmi is
procedure dimmi3 is
begin
declare
i number;
begin
for i in 1..3 loop
DBMS_OUTPUT.PUT_LINE( 'Ti amo!');
end loop;
end;
end dimmi3;
end dimmi;
/
Ditelo con ... PL/pgSQL
E' un linguaggio procedurale il cui codice viene compilato e viene memorizzato
sulla base dati stessa.
/* Stored Function realizzata in PL/pgSQL */
CREATE OR REPLACE FUNCTION dimmi3() RETURNS void AS $$
DECLARE i integer;
BEGIN
FOR i IN 1..3 LOOP
RAISE NOTICE 'Ti amo!';
END LOOP;
END;
$$ LANGUAGE plpgsql;
Ditelo con ... DB2 SQL PL
CREATE PROCEDURE dimmi3()
LANGUAGE SQL
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 3 DO
insert into messaggio values ('Ti amo!');
SET i = i + 1;
END WHILE;
END
@
Ditelo con ... MySQL SP
MySQL SP e' un linguaggio procedurale il cui codice viene memorizzato
sulla base dati stessa. La sintassi e' compliant SQL:2003 (eg. DB2).
/* Stored Procedure realizzata con MySQL */
DROP PROCEDURE IF EXISTS dimmi3;
DELIMITER '/';
CREATE PROCEDURE dimmi3()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 3 DO
select 'Ti amo!';
SET i = i + 1;
END WHILE;
END/
DELIMITER ';'/
Ditelo con ... PQL
Paglo e' un nuovo strumento per la raccolta automatica
e la ricerca semplificata di informazioni sulla propria
rete e sui sui servizi presenti.
Distribuito con un licenza Open ha caratterische che
lo rendono molto interessante per il futuro.
-- Script di esempio in PQL
INSERT INTO / values {
apps => {
com => {
paglo => {
alerts => {
alert => {
index => 'ev1',
parent => 'Master',
indexed => 0,
title => 'Messaggio',
description => 'Ti amo!',
}
alert => {
index => 'ev2',
parent => 'Master',
indexed => 0,
title => 'Messaggio',
description => 'Ti amo!',
}
alert => {
index => 'ev3',
parent => 'Master',
indexed => 0,
title => 'Messaggio',
description => 'Ti amo!',
}
}
}
}
}
}
SELECT *
FROM /apps/com/paglo/alerts
WHERE alert/title = 'Messaggio'
Nell'uso piu' tipico vengono inseriti nell'albero della base dati
computer, periferiche, interfacce di rete... ma certo e' piu'
romantico cosi!
Ditelo con ... il Postscript
E' un linguaggio intepretato ed e' molto efficiente per rappresentare con poche
"istruzioni" font, disegni e grafici che, trasmessi in forma grafica come bitmap,
sarebbero altrimenti di elevate dimensioni.
%!PS-Adobe-2.0 EPSF-2.0
%%A4: 21 3 588 788
%%Title:
%%CreationDate: 11:59 PM December 24, 2000
%%Pages: 1 +1
%%EndComments
% Esempio stampa testo
% Autore: Alessandro Ghiselli
%%Page: MainPage
% Definizione Variabili
/Var_amo (...Ti amo!) def
/Var_amo2 (Ti amo!) def
% Selezione font e scala
/Times-Roman findfont
20 scalefont
setfont
% Prima fase
newpath
gsave
740 20 780 {
100 exch moveto
gsave
Var_amo2 show
grestore
} for
grestore
closepath
% Seconda fase
newpath
0 45 360 {
300 600 moveto
gsave
rotate
Var_amo show
grestore
} for
closepath
showpage
Ditelo con ... LaTeX
LaTeX e' un ambiente per la preparazione di testi da stampare di alta qualita'.
E' lo standard di fatto per i documenti di tipo tecnico e scientifico
ed e' adatto anche a documentazione di grandi dimensioni e complessa
(eg. formule matematiche, documenti tecnici, ...).
L'idea di base di LaTeX e' quella di rendere indipendenti
i contenuti del documento
dai formati che verranno utilizzati nella stampa.
Un esempio e':
\documentclass{article}
\title{Ditelo con LaTeX}
\author{Meo Bogliolo}
\begin{document}
\maketitle
Ti amo!
Ti amo!
Ti amo!
\end{document}
Ditelo con ... il Visual Basic
Un programma VB e' event-driven ovvero guidato da eventi.
Per esempio l'introdurre un testo in un campo oppure il
premere un bottone.
L'ambiente di sviluppo con cui si opera (Visual Studio)
e' molto completo e contiente un editor per le maschere video,
il debugger e diversi wizard che aiutano il programmatore nei
compiti piu' complessi.
Nel nostro esempio basta creare una form (nome di default Form1)
introdurre un bottone (nome di default Command1) e su questo
scrivere il nostro codice in modo che venga eseguito quando
il bottone viene premuto.
Private Sub Command1_Click()
For i = 1 To 3
Print "Ti amo!"
Next i
End Sub
Ditelo con ... Python
Python e' un linguaggio di programmazione interpretato, interattivo,
object-oriented che combina una notevole potenza con un sintassi
molto chiara ed intuitiva.
Ad esempio non sono necessarie parentesi per racchiudere blocchi
di statement ma si usa l'indentazione. Il risultato e' che i
programmi sembrano quasi "meta script" molto semplici e leggibili.
Gli interpreti Python sono disponibili su molteplici
piattaforme e rendono cos' facilmente portabili i programmi
scritti con tale linguaggio.
# Programma di esempio in python
for i in range(3):
print "Ti amo!"
Ditelo con ... l'Assembler
L'Assembler e' un linguaggio molto vicino al processore.
Ogni istruzione dell'Assembler corrisponde ad una istruzione
riconosciuta dal processore. Percio' vi e' un Assembler per
ogni tipologia di processore. Processori CISC hanno centinaia di
istruzioni specializzate mentre i RISC hanno tipicamente un set ridotto (ma
guadagnano poi con le pipeline, le cache ed il numero maggiore di
istruzioni eseguite per clock).
1 .file "dimmelo.c"
2 .version "01.01"
3 gcc2_compiled.:
4 .section .rodata
5 .LC0:
6 0000 54692061 .string "Ti amo!\n"
6 6D6F210A
6 00
7 .text
8 .align 4
9 .globl main
10 .type main,@function
11 main:
12 0000 55 pushl %ebp
13 0001 89E5 movl %esp, %ebp
14 0003 83EC08 subl $8, %esp
15 0006 90 nop
16 0007 C745FC00 movl $0, -4(%ebp)
16 000000
17 000e 89F6 .p2align 2
18 .L3:
19 0010 837DFC02 cmpl $2, -4(%ebp)
20 0014 7E02 jle .L6
21 0016 EB18 jmp .L4
22 .p2align 2
23 .L6:
24 0018 83EC0C subl $12, %esp
25 001b 68000000 pushl $.LC0
25 00
26 0020 E8FCFFFF call printf
26 FF
27 0025 83C410 addl $16, %esp
28 0028 8D45FC leal -4(%ebp), %eax
29 002b FF00 incl (%eax)
30 002d EBE1 jmp .L3
31 002f 90 .p2align 2
32 .L4:
33 0030 C9 leave
34 0031 C3 ret
35 .Lfe1:
36 .size main,.Lfe1-main
37 0032 89F6 .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.2 2.96-129.7.2)"
Ditelo con ... un 1011.1010.1100.1.0
Questo linguaggio e' compreso direttamente dal processore e, con
qualche difficolta', anche dagli umani che programmano firmware,
virus o qualche altro utile oggetto...
Trattandosi del linguaggio compreso direttamente dal processore e' differente per ogni
architettura di processore (CISC, RISC), per la dimensione delle istruzioni (8, 16, 32, 64),
per modello...
0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 001 \0 003 \0 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 020 001 \0 \0 \0 \0 \0 \0 4 \0 \0 \0 \0 \0 ( \0
0000060 \v \0 \b \0 U 211 203 \b 220 E \0 \0
0000100 \0 \0 211 203 } 002 ~ 002 030 203 \f h
0000120 \0 \0 \0 \0 203 020 215 E
0000140 \0 220 211 \b \0 \0 \0 \0 \0 \0 \0
0000160 001 \0 \0 \0 0 1 . 0 1 \0 \0 \0 T i a
0000200 m o ! \n \0 \0 G C C : ( G N U )
0000220 2 . 9 6 2 0 0 0 0 7 3 1 (
0000240 R e d H a t L i n u x 7 .
0000260 2 2 . 9 6 - 1 2 9 . 7 . 2 ) \0
0000300 \0 . s y m t a b \0 . s t r t a b
0000320 \0 . s h s t r t a b \0 . t e x t
0000340 \0 . r e l . t e x t \0 . d a t a
0000360 \0 . b s s \0 . n o t e \0 . r o d
0000400 a t a \0 . c o m m e n t \0 \0 \0 \0
0000420 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0000460 \0 \0 \0 \0 \0 \0 \0 \0 033 \0 \0 \0 001 \0 \0 \0
0000500 006 \0 \0 \0 \0 \0 \0 \0 4 \0 \0 \0 4 \0 \0 \0
0000520 \0 \0 \0 \0 \0 \0 \0 \0 004 \0 \0 \0 \0 \0 \0 \0
0000540 ! \0 \0 \0 \t \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000560 230 003 \0 \0 020 \0 \0 \0 \t \0 \0 \0 001 \0 \0 \0
0000600 004 \0 \0 \0 \b \0 \0 \0 + \0 \0 \0 001 \0 \0 \0
0000620 003 \0 \0 \0 \0 \0 \0 \0 h \0 \0 \0 \0 \0 \0 \0
0000640 \0 \0 \0 \0 \0 \0 \0 \0 004 \0 \0 \0 \0 \0 \0 \0
0000660 1 \0 \0 \0 \b \0 \0 \0 003 \0 \0 \0 \0 \0 \0 \0
0000700 h \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000720 004 \0 \0 \0 \0 \0 \0 \0 6 \0 \0 \0 \a \0 \0 \0
0000740 \0 \0 \0 \0 \0 \0 \0 \0 h \0 \0 \0 024 \0 \0 \0
0000760 \0 \0 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0
0001000 < \0 \0 \0 001 \0 \0 \0 002 \0 \0 \0 \0 \0 \0 \0
0001020 | \0 \0 \0 \t \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001040 001 \0 \0 \0 \0 \0 \0 \0 D \0 \0 \0 001 \0 \0 \0
0001060 \0 \0 \0 \0 \0 \0 \0 \0 205 \0 \0 \0 ; \0 \0 \0
0001100 \0 \0 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0
0001120 021 \0 \0 \0 003 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001140 \0 \0 \0 M \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001160 001 \0 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 002 \0 \0 \0
0001200 \0 \0 \0 \0 \0 \0 \0 \0 002 \0 \0 \0 \0 \0
0001220 \n \0 \0 \0 \t \0 \0 \0 004 \0 \0 \0 020 \0 \0 \0
0001240 \t \0 \0 \0 003 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001260 x 003 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001300 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001320 \0 \0 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0
0001340 \0 \0 \0 \0 004 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001360 \0 \0 \0 \0 003 \0 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001400 \0 \0 \0 \0 003 \0 003 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001420 \0 \0 \0 \0 003 \0 004 \0 005 \0 \0 \0 \0 \0 \0 \0
0001440 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001460 \0 \0 \0 \0 003 \0 006 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001500 \0 \0 \0 \0 003 \0 005 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001520 \0 \0 \0 \0 003 \0 \a \0 024 \0 \0 \0 \0 \0 \0 \0
0001540 2 \0 \0 \0 022 \0 001 \0 031 \0 \0 \0 \0 \0 \0 \0
0001560 \0 \0 \0 \0 020 \0 \0 \0 \0 p . c \0 g c c
0001600 2 _ c o m p i l e d . \0 m a i n
0001620 \0 p r i n t f \0 034 \0 \0 \0 001 006 \0 \0
0001640 ! \0 \0 \0 002 \n \0 \0
Ditelo con ... PDF
%PDF-1.4
%äüöß
2 0 obj
<< /Length 3 0 R
/Filter /FlateDecode
>>
stream
xŻ
@E[[lf ,)(X,>B0U:3o)^WӪ|y
Ditelo con ... QR
Anche se e' solo un codice nulla gli impedisce di esprimersi in modo romantico!
Ecco il solito esempio...
Tutto qui? Si!
Ditelo con ... Lua
L'applicazione ospite puo' leggere e scrivere le variabili Lua,
puo' eseguire del codice, puo' registrare funzioni C da far eseguire
a Lua...
Le possibilita' sono molteplici. La libreria e' di piccole dimensioni
e la licenza con cui e' distribuita e' molto aperta.
Il linguaggio Lua e' quindi sfruttato in ambienti software
complessi (che consentono una programmazione da parte degli utenti)
ma anche su appliance e console per giochi.
i = 0
while i < 3 do
print("Ti amo!")
i = i+1
end
#include
Ambienti
Ditelo con ... sh (Bourne shell)
La Bourne shell utilizza naturalmente un interprete ed il linguaggio non e'
complesso anche se vi sono alcune particolarita' con caratteri quali gli apici,
gli asterischi, il trattamento delle variabili, ...
# Esempio in Bourne shell
i=0
while [ $i -lt 3 ]
do
echo "Ti Amo!"
i=`expr $i + 1`
done
Un'evoluzione della Bourne shell e' la Korn shell. Da punto di vista della programmazione
degli script non vi sono particolari differenze. Ma non anticipiamo...
Ditelo con ... ksh (Korn shell)
Il linguaggio della Korn shell e' molto vicino a quella della Bourne shell.
# Esempio in korn shell
i=0
while ( test i -lt 3 )
do
echo "Ti Amo!"
i=`expr $i + 1`
done
Un altro esempio...
# Esempio in korn shell
integer i=0
while (( i < 3 ))
do
echo "Ti Amo!"
i=i+1
done
Ditelo con ... csh (C shell)
# Esempio in C-shell
set i=0
while ( $i < 3 )
set i=`expr $i + 1`
echo "Ti amo!"
end
Ditelo con ... bash (Bourne Again)
In realta' non c'e' piu' molto da dire sulle shell Unix, ma non volevo dimenticare
la bash che e' quella piu' utilizzata su Linux e
quindi diffusissima. Caratteristiche principali? Facile (eg. funzionano
i tasti con le frecce ed i colori!) e potente (sintassi Bourne Shell + Korn Shell).
L'esempio di programmazione ve lo risparmio: e' uguale ai precedenti.
Ditelo con ... awk
Si tratta di un linguaggio interpretato con una sintassi che prevede una sequenza
di pattern ed azioni. Quando il pattern viene riconosciuto nell'input
l'azione viene eseguita.
echo | awk 'BEGIN{}{for(i=0;i<2;i++) printf("Ti amo!")}END{printf("Ti amo!\n")}'
Ditelo con ... MS-DOS
@echo off
echo Ti amo!
echo Ti amo!
echo Ti amo!
Ditelo con ... wsh
Possono essere utilizzati piu' linguaggi. Tra tutti quello piu' comunemente
utilizzato e' VBScript (ma sono anche utilizzabili Java
Script e, tramite moduli di terze parti, Perl, Phyton).
WSH fornisce una serie di oggetti e di metodi per interagire con il sistema...
for i=1 to 3
wscript.echo "Ti amo!"
next
Dim strText
'Dimmelo
strText = "Ti amo!"
Set Sapi = Wscript.CreateObject("SAPI.SpVoice")
for i=1 to 3
Sapi.speak strText
next
Ditelo con ... AppleScript
Sono disponibili variabili, istruzioni condizionali, loop, ...
Il linguaggio e' interpretato e viene salvato in formato precompilato.
-- Dimmelo!
set message to ""
repeat 3 times
set message to message & "Ti amo!
"
end repeat
display dialog message buttons "OK" default button "OK"
# Dimmelo con parole tue!
repeat 3 times
say "Ti amo!"
end repeat
Ditelo con ... sh (ancora? su Mac OS X)
# Esempio in Bourne shell
for i in 1 2 3
do
say -v vicki Ti amo\!
done
Ditelo con ... REXX
REXX e' considerato il precursore di
diversi liguaggi di scripting come il Tcl e Python
ed e' in continua evoluzione (eg. ooRexx: Open Object REXX),
/* REXX */
DO I=1 TO 3
SAY 'TI AMO !'
END
EXIT
Ditelo con ... l'IOS
A questi sistemi, benche' siano molto complessi e potenti, non
servono shell sofisticate ed ambienti di programmazione.
Quindi le possibilita' di utilizzare l'IOS per scrivere un
programmino sono piuttosto limitate.
Ma non dobbiamo farci limitare: l'amore puo' ogni cosa!?
In qualche maniera manderemo il nostro messaggio.
banner exec #
Ti amo!
Ti amo!
Ti amo! #
Ditelo con ... INSPECT
Con l'INSPECT si possono programmare le regole del firewall per
realizzare controlli particolarmente complessi e sofisticati.
Si tratta di un linguaggio potente, con una sintassi
molto simile a quella del C o del C++.
Ma certo non adatto ad inviare messaggi:
infatti il suo compito e' quello di bloccarli!
#include "fwui_head.def
memo=format{
<"src", ipaddr, src>
<"text", string, "Ti amo!">
};
accept // Action
( tcp ), // Service
( ip_src = 194.243.246.69 ), // Source
LOG (memo, LOG_NOALERT, 69 ); // Track
Architetture
Ditelo con ... l'ISAM
Nell'antico mondo Mainframe l'ISAM e' una delle strutture dati
supportate dal sistema mentre su altri ambienti e' invece disponibile
come libreria.
In questo ultimo caso i programmi vengono realizzati richiamando l'API (Application Program Interface)
e vengono poi linkati con la relativa libreria.
Spesso l'ISAM e' sfruttato da un RDBMS
(eg. C-ISAM per Informix, MyISAM per MySQL) per la memorizzazione dei
dati e non viene "visto" da utenti e programmatori che utilizzano
linguaggi di piu' alto livello come l'SQL...
Pero' c'e' sempre qualcuno che lavora nel sottosuolo, come il sottoscritto,
a cui puo' capitare di vederlo!
#include
L'ISAM e' una libreria molto efficiente ma di basso livello...
non solo mancano metodi di ricerca complessi come le join,
al programmatore tocca anche l'onere di mettere i campi nelle posizioni
corrette del record scrivendoli byte per byte!
Sono passati piu' di vent'anni ed i metodi di accesso per chiave
sono tornati di attualita'. Molti database non-SQL utilizzano
metodi di accesso simili!
Ditelo con ... C/API MySQL
Come architettura e' molto semplice: l'applicazione in C richiede
i servizi verso il DB Server passando gli statement SQL attraverso
le chiamate a funzione dell'API. Queste operano in rete
su un protocollo propritario Client/Server, per avere la massima flessibilita',
oppure richiamano
funzioni linkate nello stesso programma per ottenere il massimo della velocita' di accesso
ai dati.
/* dimmelo.c n MySQL API */
#include
Ditelo con ... il Pro*C
/* Dimmelo.pc Esempio in Pro*C */
#include
Ditelo con ... il Pro*Cobol
Ma ne ho compilati veramente tanti!
In realta' non sempre si trattava di un eseguibile, ma spesso di un runtime (il famigerato rtsora)
in grado di lanciare i programmi precompilati... comunque funzionava!
Ditelo con ... JDBC
/**
Esempio di programma in linguaggio Java
con accesso ad un DB tramite JDBC
*/
import java.sql.*;
public class Dimmelo
{
public static void main( String[] args ) throws SQLException
{
int i;
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl",
"SCOTT",
"TIGER" );
Statement stmt = conn.createStatement();
for (i=0; i<3; i++)
stmt.executeUpdate( "INSERT INTO dimmelo(testo) VALUES('Ti Amo!')" );
stmt.executeUpdate( "COMMIT" );
}
}
Naturalmente non e' possibile descrivere le molte possibilita'
offerte dal JDBC: prepared statement, cursori, scrollable cursor, ...
Ma sono tutti come uno se li puo' aspettare!
Ditelo con ... MongoDB
Non sapete cosa vuol dire?
Ve le dico io: una cosa molto moderna ed alla moda!
Si tratta di poter distribuire quantita' enormi di dati anche non strutturati su sistemi diversi.
Ma vediamo il solito esempio:
for(i=0; i<3; i++)
{ db.dimmelo.save({ frase: "Ti amo!" }) };
db.dimmelo.find();
Con MongoDB e' necessario utilizzare una modalita' di "basso livello" per la gestione dei dati (leggi/scrivi: find/save)
e non sono presenti i costrutti di Join che debbono essere realizzati dal programmatore
(come avvine nell'ISAM).
In compenso si trovano meccanismi evoluti per la ricerca di dati da documenti con strutture variabili.
E' quindi relativamente facile utilizzare criteri di ricerca complessi nella find().
E' infine presente una gestione automatica della replicazione e dello sharding della base dati:
funzionalita' ideali per un'installazione in cloud.
Insomma si e' dovuti tornare indietro su qualcosa per poter andare avanti in un'altra direzione.
Ditelo con ... Kettle (Suite ETL di Pentaho)
La programmazione di uno script di ETL di Kettle avviene tipicamente con Spoon
che offre una semplice e potente interfaccia grafica. Ecco come appare il nostro script:

//Dimmelo (Java Script)
var msg='';
var i=0;
for (i=0; i<3; i++) msg=msg+Field1+'\n';

Ditelo con ... Curses
Naturalmente ora, con ambienti grafici a pixel
(eg. X Windows, MS-Windows, Java AWT e Swing, ...)
la grafica a carattere e' passata un po' di moda,
ma noi vecchi siamo nostalgici!
/* Dimmelo in Curses
v. 0.1 (14 02 1999) by mail@meo.bogliolo.name
*/
#define ROWS 24
#define COLS 80
main() {
int i;
initscr();
for(i=0; i<3; i++) {
move(rand()%ROWS, rand()%COLS);
addstr("Ti amo!");
refresh();
sleep(1);
}
endwin();
}
Ditelo con ... X-Windows
/*
* iLoveYouX.c
*
*/
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include
cc -o dimmelo dimmelo.c -lX11
Ora, dopo avere settato la variabile d'ambiente DISPLAY=hostname:0,
basta lanciare il programma con dimmelo.
Ditelo con ... motif
#include <Xm/Xm.h>
#include <Xm/Label.h>
XtAppContext context;
XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;
Widget toplevel, label[3];
main(argc,argv)
int argc;
char *argv[];
{
Arg al[10];
int i;
/* create the toplevel shell */
toplevel = XtAppInitialize(&context,"",NULL,0, &argc,argv,NULL,NULL,0);
/* create label widgets */
i=0;
for (i=0; i++; i<3)
{
XtSetArg(al[i],XmNlabelString, XmStringCreateLtoR("Ti amo!", char_set));
label[i++]=XmCreateLabel(toplevel,"label",al,i);
XtManageChild(label[i-1]);
}
XtRealizeWidget(toplevel);
XtAppMainLoop(context);
}
cc -o dimmelo dimmelo.c -lXm -lXt -lX11
Ora, dopo avere settato la variabile d'ambiente DISPLAY=hostname:0,
basta lanciare il programma con dimmelo.
Ditelo con ... Tkinter
from Tkinter import *
def dimmelo():
for i in range(3):
print "Ti amo!"
root = Tk()
root.bottone = Button()
root.bottone["text"]="Dimmelo"
root.bottone["command"]=dimmelo
root.bottone.pack()
root.mainloop()
Facile vero?
Ditelo con ... GTK
GTK offre un insieme di widget molto completo ed e' quindi
adatto sia a semplici singole applicazioni che alla realizzazione
di ambienti grafici completi.
""" Programma di esempio GTK+ in Python """
import gtk
def dimmi(*args):
for i in range(3):
print "Ti amo!"
window.destroy()
def destroy(*args):
window.hide()
gtk.main_quit()
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", destroy)
window.set_border_width(30)
button = gtk.Button("Dimmelo!")
button.connect("clicked", dimmi)
window.add(button)
button.show()
window.show_all()
gtk.main()
# Programma di esempio GTK in Perl
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
$window = Gtk2::Window->new('toplevel');
$window->set_title("Dimmelo!");
$window->set_border_width(30);
my $button = Gtk2::Button->new('Dimmelo');
$button->signal_connect('clicked' =>
sub {
for ($i=0; $i<3; $i++) {
printf "Ti amo!\n";
} ;
Gtk2->main_quit; });
$window->add($button);
$button->show;
$window->show_all();
Gtk2->main;
0;
Nell'esempio, visto che si tratta di un programma Python
bastera' eseguire python dimmelo.py.
Ditelo con ... i socket (client)
Le opzioni ed i protocolli disponibili sono innumerevoli (in effetti e' sbagliato
parlare di Client TCP, si tratta solo di un caso particolare) ma l'esempio che segue,
realizzato con il potente linguaggio Python, e' la base di moltissimi programmi di rete.
# Client TCP in Python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("meotec.da.ru",80))
s.send("GET /\n")
print(s.recv(1000))
Avete capito di che si tratta? Un browser (Internet Explorer, Mozzilla, Netscape, ...)
fa esattamente quello che e' presentato nell'esempio!
Poca differenza ci sarebbe comunque con un client FTP, un gestore di posta, il SIP
(simpatico protocollo VoIP), ...
ma in questo caso la richiesta non sarebbe stata GET e bisognava cambiare la porta (80 e' il
default per i servizi web)!
Ditelo con ... i socket (Server)
Anche in questo caso le opzioni sono innumerevoli:
possono essere utilizzati piu' thread per rispondere a richieste in parallelo,
possono essere utilizzate richieste non sospensive,
si puo' rimanere in ascolto su piu' porte e servizi, ...
# Server TCP in Python
import socket
sSer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sSer.bind((socket.gethostname(), 80))
sSer.listen(5)
while 1:
(sCli, addr) = sSer.accept()
sCli.recv(1000)
sCli.send('')
for i in range(3):
sCli.send('Ti amo!')
sCli.send('')
sCli.close()
Avete capito di che si tratta? Un web server (eg. Apache, IIS, ...) fa esattamente questo!
Poca differenza, mutatis mutandis, ci sarebbe comunque con altri servizi (eg. FTP, POP-3, ...)
Ditelo con ... i socket (client) PL/SQL
DECLARE
c utl_tcp.connection;
ret_val pls_integer;
BEGIN
c := utl_tcp.open_connection(remote_host => 'meotec.da.ru',
remote_port => 80,
charset => 'US7ASCII');
ret_val := utl_tcp.write_line(c, 'GET / HTTP/1.0');
ret_val := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL; -- end of input
END;
utl_tcp.close_connection(c);
END;
E' spesso piu' facile far parlare due linguaggi in rete che
linkarli assieme sulla stessa macchina... a volte e' cosi'
anche con le persone!
Ditelo con ... l'HTML
<html>
<head>
<! Esempio in HTML>
<title>Ditelo con ... HTML</title>
</head>
<body>
<p>Ti amo!
<p>Ti amo!
<p><b>Ti amo!</b>
</body>
</html>
Il file in HTML viene ospitato sul Web Server. Quando un browser, indicando
il corretto URL (l'indirizzo in pratica)
richiede il file, il web server
lo invia attraverso la rete con il protocollo HTTP.
Ricevuto il file il browser si occupa della corretta
visualizzazione.
Ditelo con ... XML
Sintatticamente si tratta di poche cose. Anche l'XML utilizza
TAG delimitati con < e >.
I tag sono sempre in minuscolo e le variabili vanno sempre
racchiuse tra doppi apici.
I tag debbono sempre essere
chiusi e, si tratta di un tag singolo la chiusura e' \>
Non sono concessi errori sintattici...
Le differenze sono quindi poche!
Ma la novita' fondamentale e' che l'XML consente di
estendere il linguaggio a piacere creando nuovi TAG.
Con il DTD (Document Type Definitions) si possono creare nuove
tipologie di documenti estendendo il linguaggio a piacere.
Pubblicando un DTD si rende tale rappresentazione disponibile
a chiunque ed e' cosi' possibile lo scambio di informazioni
strutturate.
Oltre ai DTD si stanno diffondendo gli XML Schema Definition
o XSD che risultano molto piu' flessibili nella definizione
dei documenti da parte di un'applicazione.
<?xml version="1.0" encoding="ISO-8859-1"?>
<
Documento XML di esempio
Autore: meo
-->
<DOCTYPE messaggio [
<ELEMENT messaggio (frase*)>
<ELEMENT frase (#PCDATA)>
]>
<messaggio>
<frase>Ti amo!</frase>
<frase>Ti amo!</frase>
<frase>Ti amo!</frase>
</messaggio>
Il file puo' essere letto da un browser ma anche, in modo
semplice, da un'applicazione come avviene nelle architetture
SOA.
Ditelo con ... SGML
Ditelo con ... XHTML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title />
<meta name="generator" content="StarOffice/OpenOffice.org XSLT (http://xml.openoffice.org/sx2ml)" />
<meta name="author" content="meo bogliolo" /><meta name="created" content="2006-02-17T17:17:17" /><base href="." />
<style type="text/css">
@page { size: 20.999cm 29.699cm; margin-top: 2cm; margin-bottom: 2cm; margin-left: 2cm; margin-right: 2cm }
table { border-collapse:collapse; border-spacing:0; empty-cells:show }
td, th { vertical-align:top; }
h1, h2, h3, h4, h5, h6 { clear:both }
ol, ul { padding:0; }
* { margin:0; }
*.Caption { font-family:'Times New Roman'; font-size:12pt; margin-top:0.212cm; margin-bottom:0.212cm; font-style:italic; }
*.Heading { font-family:Arial; font-size:14pt; margin-top:0.423cm; margin-bottom:0.212cm; }
*.Index { font-family:'Times New Roman'; font-size:12pt; }
*.List { font-family:'Times New Roman'; font-size:12pt; margin-top:0cm; margin-bottom:0.212cm; }
*.Standard { font-family:'Times New Roman'; font-size:12pt; }
*.Textbody { font-family:'Times New Roman'; font-size:12pt; margin-top:0cm; margin-bottom:0.212cm; }
</style>
</head>
<body dir="ltr">
<p class="Standard">Ti amo! </p>
<p class="Standard">Ti amo! </p>
<p class="Standard">Ti amo! </p>
</body>
</html>
Ditelo con ... CGI
#!/bin/sh
# Esempio di programma CGI in Bourne shell
echo "Content-type: text/html"
echo
echo "<html>"
echo "<body>"
i=0
while [ $i -lt 3 ]
do
echo "<br>Ti Amo!"
i=`expr $i + 1`
done
echo "</body>"
echo "</html>"
Dal punto di vista del browser non cambia nulla rispetto alla visualizzazione
di un normale file HTML. Il Web server si accorge che l'URL
richiesto non corrisponde ad un file di testo ma ad un programma da eseguire
(perche' appartiene ad un virtual directory... ma non complichiamoci la vita:
lo capisce e basta!). Quindi esegue il programma e tutto l'output che genera
viene rispedito al browser come un normale file HTML.
Ditelo con ... il LAMP
Linux e' il sistema operativo che ospita file system, ambienti ed
applicazioni.
Apache il web server che, con i suoi moduli, supporta diversi
linguaggi di scripting.
MySQL e' l'RDBMS che mantiene i dati sul database.
Perl / PHP / Python sono tre potenti linguaggi per la
scrittura di applicazioni su web.
<?php
# Esempio in LAMP (Linux Apache MySQL PHP)
$cnn = mysql_connect('localhost', 'root', '');
$sql = "SELECT testo FROM test.dimmelo";
$result = mysql_query($sql);
while ($record = mysql_fetch_array($result)) {
echo $record['testo'] . "<br>";
}
?>
<?php
# Esempio "completo" in LAMP (MySQL+PHP)
if ($cnn = mysql_connect('localhost', 'root', '')) {
if (mysql_select_db('test', $cnn)) {
$sql = "SELECT testo FROM dimmelo";
if ($result = mysql_query($sql)) {
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
while ($record = mysql_fetch_array($result)) {
echo $record['testo'] . "<br>";
}
}
}
else {
echo "Error: " . mysql_error();
}
}
else {
}
}
else {
echo "Error connecting to server: " . mysql_error();
}
?>
Anche il publishing e' banale: basta porre il file in una directory
del web server come se fosse una semplice pagina HTML.
Ditelo con ... LAPO
L'architettura LAMP
(Linux Apache Mysql Perl/Php/Python)
conosce diverse varianti come WAMP
(dove si utilizza il sistema operativo Windows anziche' Linux), LAPP
(dove si utilizza il database PostgreSQL anziche' MySQL), ...
Vediamo quindi un semplice esempio che permette di accedere ad Oracle con il PHP:
<?php
$conn = oci_connect("scott", "tiger", "localhost:1569/XE");
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM dimmelo');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "<td>\n";
}
echo "<tr>\n";
}
echo "<table>\n";
?>
Un poco meno semplice e' la configurazione. Trattandosi di ambienti solo in parte
Open Source, trovare tutti i componenti nelle versioni corrette e
con i link alle librerie giuste non e' immediato. Pero' prima o si riesce:
bastano l'estensione php-oci ed un client Oracle (eg. Oracle Instant Client Basic+Devel)
con versioni/architettura allineate tra loro, con il PHP ed il server Apache.
Ditelo con ... LAPP
Vediamo quindi il solito esempio che permette di accedere a PostgreSQL con il PHP:
<?php
# Esempio in LAPP (PostgreSQL+PHP)
$cnn = pg_connect("host=pg.xenialab.it port=5432 dbname=postgres user=postgres password=postgres");
$sql = "SELECT testo FROM dimmelo";
$result = pg_query($sql);
while ($record = pg_fetch_array($result)) {
echo $record['testo'] . "<br>\n";
}
}
?>
Anche la configurazione e' semplice, basta installare i moduli aggiuntivi php-pdo e php-pgsql
su una normale installazione Apache e PHP.
Ditelo con ... T9
Poiche' chi utilizza smodatamente gli SMS ha molta fretta
e' stato realizzato il T9 che consente di premere i tasti una sola volta.
Poiche' chi utilizza smodatamente gli SMS non ne ha molta...
l'intelligenza e' costretto a metterla il cellulare!
Il T9 mantiene un vocabolario con le parole piu' diffuse e cerca di
indovinare la parola che l'utente scrive. E' quindi sufficiente
premere un solo tasto per lettera, il T9 scegliera' quella giusta.
In caso di ambiguita? Basta premere * fino a che non appare la
parola giusta.
84****0266****1****084****0266****1****084****0266****1****0
Ditelo con ... il WAP
Vi sono tuttavia una serie di importanti differenze. WAP infatti tiene conto
di reti con elevata latenza e scarsa banda e di display con limitate possibilita'
grafiche.
<wml>
<card name="tiamo" title="Ti amo">
<p>Ditelo con... WML
<p>Ti amo!
<p>Ti amo!
<p>Ti amo!
</card>
</wml>
L'architettura e' analoga a quella di un Web Server. La differenze principali
stanno nei protocolli che sono ottimizzati per la trasmissione via GSM. Percio'
il proxy server Wap si occupa di convertire i messaggi tra i due protocolli...
Ditelo con ... Android SDK
Per essere precisi Android e' un sistema operativo Linux, ottimizzato per sistemi con
modeste capacita' elaborative e di memoria.
Android e' stato sviluppato da Google appositamente per telefoni
cellulari: i famosi Smartphone.
I programmi applicativi "girano" all'interno di Dalvik una JVM (Java Virtual Machine) register-based.
Per lo sviluppo delle applicazioni e' utilizzato l'Android SDK, tipicamente installato
come Plug-in Eclipse.
Chiarito tutto questo (e' tutto chiaro vero?), un'applicazione Android e' semplicemente
un programma Java! E per realizzarlo si utilizza l'Android SDK.
package com.example.tiamo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class TiAmo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView messaggio = new TextView(this);
messaggio.setText("Ti amo!");
setContentView(messaggio);
}
}
Riferimenti: Java, AppInventor for Android, ...
Ditelo con ... Zlango
Ditelo con ... un Applet Java
La differenza fondamentale tra un'applicazione Java ed un applet Java sta nel
fatto che l'applet viene eseguito su un browser. La JVM del browser consente
un limitato accesso alle funzioni di sistema da parte del programma java in
modo da evitare "virus" o altre infestazioni da parte di programmi maliziosi.
/**
Esempio di Applet Java
*/
import java.awt.*;
public class Dimmelo extends java.applet.Applet
{
public void paint(Graphics g) {
int i;
for (i=0; i<3; )
g.drawString("Ti amo!", 1, 16*++i);
}
}
<html>
<head>
<! Esempio con un Java Applet>
<title>Ditelo con ... un applet</title>
</head>
<body>
<applet code=dimmelo.class HEIGHT=100 WIDTH=100>
</applet>Ti amo!
</body>
</html>
O quasi... La pagina che contiene l'applet e' una pagina HTML normale
per il Web Server. L'applet e' scritto in bytecode e viene semplicemente scaricato
al browser. Quando il browser ha ricevuto il codice attiva una JVM (Java Virtual
Machine) ed esegue il codice dell'applet. Quindi l'applet gira sul browser.
Ditelo con ... RMI
L'idea di base e' quella
dell'RPC (remote procedure call) ed anche la generazione di stub,
la definizione delle interfacce sono simili.
Ma l'utilizzo nativo di oggetti e la portabilita' intrinseca di
Java rendono la tecnica assai piu' ricca di potenzialita'.
RMI (Remote Method Invocation) e' un API Java per
effettuare richiami di procedure remote.
L'RMI e' un'API generalizzata poiche' permette implementazioni
differenti. Quella iniziale e' indicata dalla sigla JRMP
mentre la piu' diffusa (che useremo nell'esempio seguente)
e' RMI-IIOP che si basa su CORBA.
L'utilizzo e' piutosto semplice e richiede di sviluppare il codice
di due interfacce (una per il client che richiede la funzionalita'
ed una per il server che la fornisce).
Le interfacce:
public interface myServer extends Remote
{
void receiveRequest(myClient client, String message) throws RemoteException;
}
public interface myClient extends Remote
{
void receiveReply(String message) throws RemoteException;
}
public class MyServerImpl implements myServer
{
void receiveRequest(myClient client, String message) throws RemoteException
{
String reply = "";
Int i;
for (i=0;i<3;)
reply = reply+"Ti amo!\n"
client.receive(reply);
}
}
public class MyClientImpl implements myClient
{
MyServer server;
public MyClientImpl(String Server_IOR, ORB orb)
throws Exception
{
server = (MyServer) PortableRemoteObject.narrow(
orb.string_to_object(Server_IOR), MyServer.class);
}
void receiveReply(String message) throws RemoteException
{
System.out.println(message);
}
public void talk(String conversation)
{
server.receiveRequest(this, conversation);
}
}
the_client.talk("Dimmelo!");
Grazie alla possibilita' dell'RMI di richiamare funzioni remote
questa tecnica
viene spesso utilizzata negli Applet. In questo modo si puo'
realizzare un'architettura in cui l'applet si occupa della
presentazione grafica e la logica di business e' implementata
su servizi remoti ospitati sul server.
Ditelo con ... un Servlet
La differenza fondamentale tra un Applet Java ed un Servlet e' che
che l'Applet viene eseguito su un browser mentre il Servlet viene
eseguito sul Web Server/Application Server.
/*
* @(#)ILoveYouServlet.java 1.00 03/02/14
*
* Copyright (c) 2001-2003 Meo
*
* CopyrightVersion 1.0
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* I Love You. This servlet simply prints I love You!
*
* Since I am a very boring man it prints "I love You" three times...
*/
public
class ILoveYou extends HttpServlet {
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
int i;
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
out.println("<html>");
out.println("<head><title>I Love You</title></head>");
out.println("<body>");
for (i=0; i<3; )
out.println("I love You!");
out.println("</body></html>");
}
public String getServletInfo() {
return "Create a page that says <i>I love You!<i> three times";
}
}
Per la compilazione e' sufficiente seguire
le indicazioni relative ai programmi Java. Occhio ai package... (facilmente dovranno
essere aggiunti nel CLASSPATH i riferimenti ai file .jar dell'Application Server).
Su server piu' recenti (che aderiscano alle specifiche Servlet
API Specification 2.2) la struttura di directory per il pubblishing
delle applicazioni e' invece standardizzata e prevede
una struttura di directory standard: WEB-INF, ...
la distribuzione automatica delle applicazioni
deployate come file .WAR, ...
O quasi... Quando il Web Server riceve la richiesta attiva la JVM del JRE
configurato e fa eseguire il Servlet. L'output generato e' la
risposta inviata al browser.
Da questo punto di vista un Servlet e' molto vicino all'architettura delle
applicazioni CGI ma con alcune importanti differenze...
Sul server la JVM o le JVM sono sempre attive.
I servlet vengono istanziati alla prima richiesta (init()), ogni richiesta attende
il termine dell'inizializzazione quindi tutte vengono soddisfatte dalla stessa istanza
di servlet ed il thread e' disponibile fino a che non viene richiamato il destroy().
Quindi, dal punto di vista prestazionale, l'attivazione di un servlet e' notevolemente
piu' efficiente di un richiamo CGI.
Ditelo con ... JSP
La scrittura di una pagine JSP e' infatti molto semplice
e la sua lettura ricorda quella di una pagina HTML.
Infatti si tratta di una pagina HTML/XHTML cui vengono
aggiunte direttive JSP (include, page, taglib) introdotte con <%@,
script JSP (declaration introdotte con <%! ,
scriptlet introdotte con <% , expression introdotte con <%= )
azioni JSP (include, forward, useBean, getProperty, ... introdotte con
<jsp:include)
ed eventuali TAG custom.
Le possibilita' sono molte ma il risultato e' comunque piuttosto
semplice, come si vedra' nell'esempio.
<html>
<head>
<! Esempio in JSP>
<title>Ditelo con ... JSP</title>
</head>
<body>
<% for (int i=0; i<3; i++) { %>
<p>Ti amo!
<% } %>
</body>
</html>
Ditelo con ... Java Script
Dal punto di vista sintattico Java Script e' simile al linguaggio Java, tuttavia
vi sono molte semplificazioni e minori possibilita'.
Dal punto di vista tecnico le differenze tra Java e Java Script sono talmente
grandi che probabilmente l'unica cosa in comune e'... il nome!
Un programma in Java Script
e' scritto direttamente all'interno di una pagina HTML (sotto forma di commento)
ed e' di facile lettura e programmazione anche da parte di non esperti.
<html>
<head>
<! Esempio in Java Script>
<title>Ditelo con ... Java Script</title>
<script language="JavaScript">
<!--
function dimmelo()
{ var i
for (i=0; i<3 ; i++)
document.write("Ti amo!");
}
//-->
</script>
</head>
<body onLoad=dimmelo()>
<p>Esempio in Java Script
</body>
</html>
Java Script e' semplicemente un'estensione dell'HTML. Poiche' si tratta
di un'estensione procedurale, cioe' che consente di programmare, viene eseguita
o meglio interpretata dal browser. Tutto qui.
Ditelo con ... VB Script
Dal punto di vista sintattico VBS e' simile al linguaggio Visual BASIC con un
notevole utilizzo di oggetti e della relativa sintassi.
VB Script e' interpretato dal browser esattamente come
Java
Script... Quindi rileggetevi il capitoletto precedente!
Ditelo con ... Enterprise Java Bean
L'EJB contiene quindi solo la "logica di business"
dell'applicazione.
Vi sono tre tipi di EJB:
L'utilizzo di un EJB da parte delle applicazioni che lo richiamano
e' molto semplice. E' in pratica analogo al richiamo di un
Java Bean.
Il richiamo e' quindi immediato con i piu' comuni IDE che
semplificano
i dettagli dell'attivazione come
l'RMI, il JNDI, il JAAS, ...
package oracle.ejb30;
import javax.ejb.Remote;
@Remote public interface HelloWorld
{
public void sayHello();
}
package oracle.ejb30;
import javax.ejb.Stateless;
@Stateless public class HelloWorldBean implements HelloWorld
{
public void sayHello()
{
int i;
for (i=0; i<3; i++)
System.out.println("Ti amo!");
}
}
Context context = new InitialContext();
HelloWorld helloWorld = (HelloWorld)context.lookup("java:comp/env/ejb/HelloWorld");
helloWorld.sayHello();
Ditelo con ... un Portlet (JSP-168)
Il Portale si occupa di autenticare gli utenti, di effettuarne
la profilazione, di definire il layout grafico.
Il Portlet realizza la logica applicativa, che puo' essere
una semplice presentazione di un testo, ma anche un programma
vero e proprio.
Anche dal punto di vista di programmazione la creazione di un Portlet
e' analoga a quella di un Servlet.
Si tratta di realizzare una serie di classi Java che implementano
l'interfaccia prevista dallo standard.
Lo standard prevede diversi stati del Portlet: View, Edit, Help, ...
che corrispondono a diverse modalita' di visualizzazione del
Portlet nel suo contenitore grafico.
Nella classe Java del Portlet
debbono quindi essere implementati i diversi metodi
dell'interfaccia relativi alle modalita' di visualizzazione.
Ed ecco la parte JSP:
public void doView (RenderRequest request,
RenderResponse response) throws PortletException, IOException
{
response.setContentType("text/html");
String jspName = getPortletConfig().getInitParameter("jspView");
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(request,response);
}
<%@ page session="false" %>
<%@ page import="javax.portlet.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri='/WEB-INF/tld/portlet.tld' prefix='portlet'%>
<portlet:defineObjects/>
<p>Ti amo!</p>
<p>Ti amo!</p>
<p>Ti amo!</p>
Portlet Mode: <%=portletRequest.getPortletMode()%>
Un altro importante standard sull'argomento e' il WSRP
(Web Services for Remote Portlets) che descrive come debbono essere
scambiati i dati tra le applicazioni (WSRP Producer) ed i portali
(WSRP Consumer).
I due standard sono complementari e sono spesso utilizzati entrambi.
Vi sono molteplici possibilita' di realizzare le funzionalita' di
un portale.
Molto diffusi sono, ad esempio, portali di Content Management che possono essere
estesi con moduli... quella presentata in questo paragrafo e' la
realizzazione di Portlet utilizzando le API Standard JSP-168
che e' maggiormente rivolta all'integrazione, alla sicurezza, ...
per le altre architetture quando avro' un po' di tempo scrivero'
qualcosa.
Ditelo con ... ASP
Dal punto di vista tecnico le pagine ASP corrispondono alle pagine
JSP, naturalmente...
mutatis mutandis!
<html>
<head>
<! Esempio in ASP>
<title>Ditelo con... ASP</title>
</head>
<body>
<% for i = 1 to 3 %>
<p>Ti amo!
<% next %>
</body>
</html>
<html>
<head>
<! Esempio in ASP che richiama Java Script>
<title>Ditelo con ... Java Script</title>
<script language=JScript runat=Server>
<!--
function dimmelo()
{ var i
for (i=0; i<3 ; i++)
alert("Ti amo!");
}
//-->
<script>
</head>
<body>
<p>Esempio in ASP che richiama un Java Script
<% call dimmelo %>
</body>
</html>
Ditelo con ... un Cartridge PL-SQL
Per programmare una pagina in PL-SQL e' sufficiente creare una stored procedure
o un package utilizzando alcuni package di estensione dell'PL-SQL (eg. ht).
create procedure dimmelo is
declare
i number;
begin
for i in 1..3 loop
ht.print( '<p>Ti amo!');
end loop;
end;
Ditelo con ... External Procedure Oracle
Innanzi tutto bisogna fare un bel programma in C:
#include
SID_LIST_LISTENER_ORCL =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc_ORCL)
(ORACLE_HOME = /home/app/oracle/product/10g)
(PROGRAM = extproc)
(ENVS="EXTPROC_DLLS=ANY,LD_LIBRARY_PATH=/home/app/oracle/product/10g/lib:/usr/oracle/")
)
(SID_DESC =
(SID_NAME = ORCL)
(ORACLE_HOME = /home/app/oracle/product/10g)
)
)
LISTENER_ORCL =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.xenialab.it)(PORT = 1569))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_ORCL))
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_ORCL))
(CONNECT_DATA = (SID = PLSExtProc_ORCL) (PRESENTATION = RO))
)
)
create or replace library system.dimmelo
is '/usr/oracle/dimmelo.so'
/
create or replace procedure system.dimmi (sr IN OUT string )
is external name "dimmelo" library dimmelo language C parameters (sr string);
/
SET SERVEROUTPUT ON
/
DECLARE
stringa varchar2(100) := '------------------------------';
BEGIN
DBMS_OUTPUT.PUT_LINE('Prima: ' || stringa );
system.dimmi( stringa );
DBMS_OUTPUT.PUT_LINE('e Poi: ' || stringa);
END;
/
Ditelo con ... Cache'/SOAP
Ma bisogna fare attenzione a non scivolare sulle sigle...
Le richieste possono essere inviate ad un SOAP Server che pubblica
l'elenco dei servizi forniti con un documento
WSDL (Web Services Description Language).
Le richieste vengono inviate dai SOAP Client.
Il protocollo SOAP e' stateless.
Ogni XML WS deve utilizzare un namespace unico per distinguerlo
da tutti gli altri. Il namespace e' un URI (che sono i
cugini bizzarri degli URL).
Le idee di base sono molto semplici ed, utilizzando un IDE, e'
anche semplice sviluppare applicazioni. Ma si tratta di concetti
molto potenti che consentono di realizzare un architettura SOA
(Service Oriented Architecture).
/// Esempio di Web Service SOAP in Cache'
Class Parole.Dimmelo Extends %SOAP.WebService [ProcedureBlock]
{
Parameter SERVICENAME = "Dimmelo";
Parameter LOCATION = "http://127.0.0.1/csp/samples";
Parameter NAMESPACE = "http://tempuri.org";
ClassMethod Test() As %String [ WebMethod ]
{
set frase=""
for i=1:1:3
{
set frase= frase _ "Ti Amo! "
}
Quit frase
}
}
Ditelo con ... SOAP (PHP)
Vediamo quindi un altro esempio relizzato con uno dei linguaggi
piu' semplici e produttivi utilizzati per applicazioni web: il
PHP.
Il SOAP Server (tiDico.php) si implementa con queste semplici istruzioni:
<?php
require_once('nusoap/lib/nusoap.php');
$ns="http://myhost.mydomain/soap_demo/tiDico.php";
$server = new soap_server();
$server->configureWSDL('Dimmi',$ns);
$server->wsdl->schemaTargetNamespace=$ns;
$server->register('Dimmi',array(), array('Frase' => 'xsd:string'),$ns);
function Dimmi() {
$retval='';
for ($i=0;$i<3;$i++) {
$retval = 'Ti amo! '.$retval ;
}
return $retval;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
Il server definisce un serizio SOAP, configura lo schema WSDL e registra
il metodo Dimmi definendone i parametri di input e di output.
A questo punto debbono essere implementati tutti i metodi definiti...
il vero e proprio "lavoro" e' tutto nel richiamo di server->service()
che restituisce quanto richiesto da chi richiama il servizio.
<?php
require_once('nusoap/lib/nusoap.php');
$client = new soapclient('http://myhost.mydomain/soap_demo/tiDico.php?wsdl',true);
$result = $client->call('Dimmi', array());
print $result;
?>
Con il PHP e' tutto molto semplice: basta copiare script e libreria
sul proprio web server (purche' supporti il PHP), modificare l'URL ed
e' tutto fatto!
Ditelo con ... Jython e con il Grinder
Non ci sarebbe molto da dire poiche' e' analogo al Phython...
ma noi ne approfittiamo
per mostrare un esempio di script in Jython utilizzato
con Grinder.
Grinder e' un tool Free Source
per effettuare test di carico su applicazioni web (e non solo).
Per programmare test run utilizza il Jython:
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
log = grinder.logger.output
test1 = Test(1, "I Love You Test")
logWrapper = test1.wrap(log)
class TestRunner:
def __call__(self):
for i in range (3):
logWrapper("I love You!")
Ditelo con ... COM/ActiveX
import sys
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
s = 'Ti hamo!'
try:
for i in range(3):
speaker.Speak(s)
except:
if sys.exc_type is EOFError:
sys.exit()
Per eseguire l'esempio, oltre all'interprete Python, e' necessario installare il
package win32com. Con tale interfaccia Python puo' richiamare quasi ogni programma COM
(ad esempio MS-Word, MS-Excel, ...), scrivere server ospitati da client COM, ...
Ditelo con ... l'UML
Ditelo con ... i fiori
Si tratta di un linguaggio universale, ad oggetti,
da interpretare, interpretato ma qualche
volta incompreso, di notevole diffusione e compatibile i18n ed L10n.
Per rimanere nell'esempio comprate tre rose rosse! ;-)
Ditelo con ... l'Ikebana
Ditelo con ...
linguaggi: C++, C#,
ASSEMBLER (con i diversi dialetti),
Lisp,
Toscano (con i dialetti livornese e pisano),
...
ambienti: JCL, SAP/ABAP, BAAN, VBA: Visual Basic for application,
NASL,
...
architetture:
cgi (in altre mille altre "salse"),
RMI socket factory, J2ME,
ODBC, CORBA, .NET,
X-Window (Xt intrinsics), MS-Windows,
IS-API, NS-API, Browser Plug-in, PRO*Cobol,
VMware, VNC, protocollo WSRP (producer, consumer),
JSR-168 (Portlet), JSR-170 (Content Management), JSR-286 (Portlet 2),
Struts, HTTP tunneling, JNDI,
CSS,
...
ancora in preparazione.
CHISSA' QUANDO SUL TUO SCHERMO !
Molto simpatica e'
l'evoluzione di un programmatore.
Per i piu' curiosi, un po' di
geneaologia
e (sigh;) una
pagina simile e piu' completa...
ma assai meno romantica di questa!
Data: 14 Febbraio 1999 - San Valentino
Aggiornamento: 14 Febbraio 2011 - San Valentino
Versione: 1.3.26
Autore: mail@meo.bogliolo.name
Dedicato: ... a te! ;-)