|
|
Il Blog di JOProject
9 giugno 2010 - 8:18 by Charlenger
Dopo un lungo silenzio per i post di informatica, ritorno con un brevissimo articolo che vuole solo presentare una semplice applicazione open source che ho sviluppato e pubblicato recentemente.
Si tratta di SrtPlayer: un riproduttore di sottotitoli in formato SRT. L’idea nasce dalla domanda “come faccio ad aggiungere dei sottotitoli a un video in streaming”. Cercando un po’ sul web ho notato che ci sono vari programmini posti alcuni in siti non molto attendibili, altri un poì di più. Tuttavia, data la semplicità dell’applicazione, ho deciso che avrei speso meno tempo a farne uno io, piuttosto che cercarlo, provarlo e quindi poterlo usare.
SrtPlayer è un’applicazione completamente Java, con interfaccia grafica basata sulle Swing, che consente per l’appunto di selezionare un file in formato SRT, di avviarlo e di scorrerne la durata con una barra o direttamente inserendo il “minutaggio”, come un normale player. L’applicazione è molto semplice e non gestisce trasparenze o altri effetti grafici di sorta, tuttavia fa esattamente ciò che deve fare: riprodurre dei sottotitoli con il corretto tempismo.
Ecco uno screenshot dell’interfaccia:

Per il download basta andare alla pagina: https://sourceforge.net/projects/subtitleplayer/files/
Tags: computer, informatica, player, sottotitoli, srt Pubblicato in Computer Science | 2 Commenti »
23 febbraio 2010 - 7:32 by Charlenger
Molto spesso c’è chi cerca di inviare sms da web, sia perché vuole nascondere la sua identità, sia per questioni molto semplici di praticità. Purtroppo (io direi per fortuna) i servizi che permettono di fare ciò sono pochi… quanto meno quelli che permettono di farlo per scopi illegali. Esistono però vari modi per inviare SMS “pseudo-anonimi” da web. La cosa non è sempre gratuita anche perché è giusto pagare per un servizio ricevuto.
Recentemente mi sono soffermato sulla libreria di Skype per java che consente di inviare SMS con la propria applicazione dal proprio PC usando le tariffe di skype. In realtà questa funzionalità è quasi inutile per l’utente finale, tuttavia fa notare come sia possibile inviare sms da un account skype che potrebbe contenere dati falsi o un nickname non riconoscibile dal destinatario.
Inviando un sms da Skype, infatti, il destinario riceverebbe soltanto il messaggio come inviato da “nickname” dove nickname è il nome del profilo usato. Fortunatamente, per acquistare credito skype è necessario effettuare una transazione identificata di denaro per cui, in caso di reati, il mittente potrebbe essere identificato dalle autorità in maniera relativamente facile.
Tornando all’utilità di questa libreria per Java, scopriamo che diventa utile se si vuole creare qualche sorta di integrazione e automatizzazione tra applicazioni che devono inviare notifiche SMS e skype. Ecco un piccolissimo esempio di quanto sia semplice mandare un sms con Skype e Java:
package org.skype.sms;
import com.skype.Profile;
import com.skype.Skype;
import java.util.Vector;
public class SkypeSMS {
public static void main(String… args) {
new SkypeSMS(args);
}
public SkypeSMS(String… args) {
Vector<String> numbersVec = new Vector<String>();
String message = “”;
for (int i = 0; i < args.length; i++) {
if (args[i].equals(”-m”)) {
message = args[i + 1];
} else if (args[i].equals(”-n”)) {
i++;
while (i < args.length) {
numbersVec.add(args[i]);
i++;
}
}
}
if (numbersVec.size() > 0 && message.length() > 0) {
try {
System.out.println(”Sending SMS”);
Profile p = Skype.getProfile();
System.out.println(”Sending message from profile: ” + p.getFullName());
for (String num : numbersVec) {
System.out.println(”Selected: ” + num);
Skype.sendSMS(num, message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Ovviamente affinché questa libreria funzioni, è necessario inserire le librerie native per il sistema operativo (sono disponibili per i vari Mac, Linux e Windows) usando l’opzione -Djava.library.path=”lib” dove lib è la cartella dentro cui risiede la libreria nativa swt-win32-3232.dll, ma soprattutto deve essere attiva una istanza di skype con un profilo utente con credito attivo.
Tags: computer, informatica, java, libreria, science, skype, sms, web Pubblicato in Computer Science | Commenti disabilitati
31 gennaio 2010 - 15:55 by Charlenger
La classificazione documentale, come spiegato nel precedente articolo sull’argomento, si compone di varie fasi e sfrutta vari strumenti. Uno tra quelli presentati è il classificatore ingenuo di Bayes o “Naive Bayes Classifier”. La solita citazione da Wikipedia è:
“A Bayes classifier is a simple probabilistic classifier based on applying Bayes’ theorem (from Bayesian statistics) with strong (naive) independence assumptions. A more descriptive term for the underlying probability model would be “independent feature model”.”
Prima di poter parlare di classificazione documentale sarebbe innanzi tutto necessario parlare di classificazione in maniera più generale. Infatti, la classificazione documentale, altro non è che un normale processo di classificazione, in questo caso basata su un approccio statistico, composta di numeri, regole e formule. Viene spontaneo chiedersi come sia possibile a questo punto che un documento, fatto di parole, lettere, punteggiatura e simboli che vanno ben oltre semplici numeri, possa essere trattato come se fosse una variabile di un’equazione matematica.
La risposta al questio si chiama “modello matematico”. I modelli matematici, grande divertimento dei ricercatori operativi, sono il risultato di processi di analisi e modellazione che permettono di mappare in qualche modo, più o meno coerente e completo, un qualsiasi elemento della realtà. Il “più o meno coerente e completo” è d’obbligo perché è noto che la natura non fa spigoli, cioè il mondo non è lineare, mentre spesso i problemi reali vengono modellizzati in modo tale da essere risolvibili, per esempio, studiandone una versione linearizzata.
Prendendo il caso particolare del metodo statistico di Bayes, e semplificando al minimo il modello matematico da utilizzare, è possibile trasformare un documento in un semplice vettore di numeri che, nel caso del classificatore classico, appartengono all’insieme {0,1}, cioè sono binari. Questa modellazione è possibile grazie a una “legenda” di riferimento detta vocabolario. In questo particolare caso, il vocabolario del modello matematico corrisponde con un vocabolario secondo la sua più stretta e umana definizione.
Passando a un esempio concreto, si supponga di avere questo vocabolario:
[giocatore, sport, calcio, pallone, scarpa, rete, palo, portiere]
e la seguente frase:
“Durante la partita, il giocatore ha dato un calcio al pallone e ha perso la scarpa”
dunque il vettore di riferimento sarebbe:
[1, 0, 1, 1, 1, 0, 0, 0]
Senza andare nel dettaglio della fase di pre-elaborazione dei dati (cioè la loro trasformazione in dati utilizzabili per l’addestramento e la fruizione del classificatore), è possibile illustrare il principio che sta alla base della classificazione ingenua. Tale classificazione è definita in questo modo perché si presuppone che gli elementi che costituiscono i vettori e il vocabolario siano indipendenti tra loro, e dunque non vengano considerate eventuali correlazioni. Per intendere meglio cosa voglia dire ingenuo può essere utile un esempio:
In un documento che parla di biologia, e in particolare del ciclo di vita di una pianta, la probabilità che nel testo appaia la parola “fotosintesi” non è indipendente dalla presenza del termine “clorofilliana”. Nella conoscenza comune è noto associare le due parole e, per di più, la presenza della seconda può addirittura essere correlata in posizione al termine precedente. Sarà infatti molto più probabile incontrare nel testo l’espressione “fotosintesi clorofilliana” che “clorofilliana fotosintesi”.
Quando si parla di classificazione ingenua, si assume che il valore corrispondente a questi due termini, sia indipendente l’uno dall’altro, cioè si ignora il fatto che la presenza delle due parole insieme costituirebbe una maggiore probabilità che un certo testo parli di biologia vegetale. Viene naturale chiedersi perché non lo si consideri. La risposta è già stata fornita in precedenza. Il modello da utilizzare deve essere semplice e computabile e inserire questo tipo di dipendenze (ne esistono anche di molto complesse nella linguistica e nella teoria della probabilità), significherebbe rendere il problema molto complesso, e in vari casi anche NP-Completo.
La regola di Bayes su cui si basa il classificatore dice che:
La probabilità P di un evento E, data l’evidenza F{1,2,…,N} è data dal rapporto tra il prodotto della probabilità del singolo evento P(E) con la probabilità dell’evidenza dato il fatto E, e la probabilità dell’evidenza.
P(E | F1,F2,…,Fn) = P(E) * P(F1,F2,…,Fn | E) / P(F1,F2,…,Fn)
Detto in termini di classificazione, si supponga che l’evento E sia la categoria da assegnare a un certo documento, e che l’evidenza siano i singoli termini che costituiscono il vocabolario, la regola potrebbe esprimersi come “la probabilità che un documento appartenga alla categoria E, data la presenza/assenza delle parole F1,…,Fn è pari al prodotto della probabilità stessa che un documento appartenga a una certa categoria moltiplicato per la probabilità di ciascuna delle parole, presupposto che si tratti della categoria E, diviso la probabilità delle parole stesse.
Anche espresso in questo modo, il concetto non rimane chiarissimo, ma la comprensione di questa legge non è lo scopo di questo articolo. In ogni caso, la legge scritta in questo modo è altamente esauriente ma sarebbe computazionalmente difficile da calcolare e rappresenterebbe il classificatore “ideale” di bayes.
La classificazione infatti avverrebbe calcolando, dato un documento, la probabilità che questo appartenga a ciascuna delle possibili categorie, scegliendo, ovviamente, quella più alta. Come fare dunque a rendere la legge utilizzabile? Proprio utilizzando il principio di “ingenuità”. Infatti, considerato che la probabilità congiunta espressa al numeratore del secondo membro dell’equazione è esprimibile come:
P(E, F1, F2, … Fn) = P(E)*P(F1|E)*P(F2|F2,E)*…*P(Fn|Fn-1,…F1)
La condizione di indipendenza o ingenuità ci permette di dire che per ogni “i” diverso da “j” è valida la seguente relazione:
P(Fi | C, Fj) = P(Fi | C)
Cioè che non c’è nessuna relazione di probabilità tra “fotosintesi” e “clorofilliana”. Questo ci permette di ridurre l’equazione precedente (dove l’evidenza sarà espressa comeF) nel seguente modo:
P(E | F) = P(C)*P(F1|C)*P(F2|C)*…*P(Fn|C)/P(F)
Adesso, posto che nella classificazione ingenua, generalmente, le categorie sono considerate equiprobabili, e che l’evidenza è un fattore identico per ogni categoria, il valore che vogliamo calcolare potrà essere calcolato come:
P(E | F) = P(F1|C)*P(F2|C)*…*P(Fn|C)
Che significa che dato un documento, il valore che ci permette di ipotizzare a quale categoria appartenga, è data dal massimo prodotto di tutti i valori di probabilità di ciascuna parola del vocabolario in relazione a ciascuna categoria. Il concetto può essere spiegato meglio con un esempio pratico.
Supponiamo di prendere un vocabolario di 5 parole:
W = [cane, soldi, deputato, calciatore, locale]
e di avere 3 categorie:
C = [sport, economia, tempo libero]
La prima cosa da fare sarebbe addestrare il classificatore. Per farlo bisogna calcolare le tabelle di probabilità di ciascun termine per ciascuna categoria e per farlo si passa attraverso l’addestramento. Per esemplificare, si prende un insieme di 3 vettori (documenti) per la categoria “sport”:
v1 = [1,0,0,1,1]
v2 = [1,0,0,1,0]
v3 = [0,0,0,1,1]
La riga relativa alla categoria “sport” per la tabella delle probabilità sarebbe:
sport = [2/3, 0/3, 0/3, 3/3, 2/3]
Si supponga di avere ache le altre due categorie e di avere dunque la seguente tabella delle probabilità positive (quelle negative si calcolano come “1 – p”):
[2/3, 0/3, 0/3, 3/3, 2/3]
[1/3, 2/3, 3/3, 0/3, 0/3]
[2/3, 1/3, 0/3, 1/2, 3/3]
Se volessimo classificare il seguente documento: “il calciatore ha giocato come un cane”, a cui corrisponde il vettore [1, 0, 0, 1, 1] potremmo calcolare i tre possibili valori come:
v(sport) = 2/3*(1 – 0/3)*(1 – 0/3)*3/3*2/3 = 4/9 = 0,44
v(economia) = 1/3*(1 – 2/3)*(1 – 3/3)*0/3*0/3 = 0
v(tempo libero) = 2/3*(1 – 1/3)*(1 – 0/3)*3/3*2/3 = 8/27 = 0,30
quindi max(V) = 0,44 cioè: il documento è classificato come “sport”.
Emerge subito come il risultato sia fortemente dipendente dai dati con cui viene addestrato il sistema e soprattutto esso non è esente da condizioni limite. Per esempio, l’assenza della parola “deputato”, dal momento che è presente nel 100% dei campioni di economia, andrebbe ad azzerare la probabilità nonostante altre parole potrebbero aumentare significativamente lo stesso valore. Questo sarebbe un caso di sotto-stima dell’insieme di addestramento. Al contrario potrebbero esserci significative differenze nel numero dei documenti utilizzati e una categoria potrebbe essere favorita. In questo caso si ha un problema di sovra-dimensionamento. Per far fronte a questi problemi si usano varie tecniche basate su tecniche che calcolano i valori di probabilità sulla base della frequenza dei termini, la loro rilevanza e la proporzione normalizzata dei documenti (e.g. TF-IDF). Questo genere di approcci può trasformare il vettore che rappresenta il documento da binario a reale (e.g. [0.2, 0.4, ... , 0.7]).
Esistono varie altre tecniche e adattamenti di questo algoritmo o che ne siano valide alternative, per esempio le macchine a vettori di supporto, tuttavia il classificatore Naive Bayes rimane uno dei più usati in quanto è facile da implementare, facilmente personalizzabile in base ai tipi di classificazione che deve svolgere, raffinabile e molto efficiente sebbene fortemente dipendente dalla qualità dei dati forniti per l’addestramento.
Tags: artificiale, bayes, classificazione, classifier, computer, documentale, informatica, ingegneria, intelligenza, language, linguistica, naive, natural, nlp, processing, science Pubblicato in Computer Science | 2 Commenti »
21 gennaio 2010 - 7:08 by Charlenger
La classificazione documentale (document classification/clustering) è un processo studiato all’interno dell’elaborazione del linguaggio naturale che si occupa di assegnare una o più categorie a un elemento detto documento. Come di consueto riporto la citazione da una delle fonti più cliccate del web, wikipedia:
Document classification/categorization is a problem in information science. The task is to assign an electronic document to one or more categories, based on its contents. Document classification tasks can be divided into two sorts: supervised document classification where some external mechanism (such as human feedback) provides information on the correct classification for documents, and unsupervised document classification, where the classification must be done entirely without reference to external information. There is also a semi-supervised document classification, where parts of the documents are labeled by the external mechanism.
In breve, dato un documento, questo viene analizzato e al termine del processo si ha un dato che può essere, per esempio, “Spam”.
La classificazione documentale ha diverse applicazioni e, l’esempio arriva non a caso, una delle prime forme di applicazione pseudo-commerciale è stata proprio la classificazione di e-mail come spam o non-spam. Tra i più famosi e usati troviamo proprio “Spambayes”, cioè un classificatore che utilizza l’approccio Naive Bayes per la classificazione “raffinabile” delle e-mail di spam. Ma procediamo con ordine.
Innanzi tutto, come è composto un processo di classificazione documentale? Esistono sostanzialmente pochi macroblocchi:
- Scelta del modello di classificatore più adatto al problema
- Addestramento (Training) del classificatore
- Implementazione/Integrazione del classificatore nel sistema che sfrutta la classificazione
- Raffinamento dinamico (dipendente dal modello) del classificatore
Il primo problema da affrontare è appunto quello della scelta di un buon tipo o approccio alla classificazione. Esistono vari metodi in letteratura ma quelli più usati e più affidabili sono sostanzialmente pochi. Tra questi troviamo il metodo statistico basato sulle reti bayesiane, cioè il classificatore ingenuo di Bayes (Naive Bayes), il metodo a vettori di supporto, cioè SVM (Support Vector Machine), le reti neurali e i metodi geometrici che rappresentano i documenti nello spazio e calcolano le aree di apparteneza (e.g. distanza di Hamming).
Ognuno di questi classificatori ha vantaggi e svantaggi che possono incidere sulla scelta. Per esempio il metodo che sfrutta l’approccio statistico bayesiano è sufficientemente semplice da implementare, ha buone prestazioni in termini di calcolo computazionale ed è facilmente raffinabile dinamicamente. Allo stesso tempo però, il termine Naive, viene proprio dal fatto che si tratta di un classificatore ingenuo, che non è in grado, da solo, di associare valori statistici di relazione tra parole che invece, nella conoscenza comune, potrebbero averle (e.g. “Fotosintesi” e “Clorofilliana”). Per portare un altro esempio, le macchine a vettori di supporto, si sono rivelate essere tra le migliori in termini di affidabilità e prestazioni, in grado di modellare anche non linearità con sufficiente semplicità, tuttavia l’implementazione dei metodi di addestramento che prevedono la risoluzione di sistemi lineari o linearizzati è meno semplice rispetto all’esempio precedente in quanto si rivela necessario applicare metodi matematici come simplesso, moltiplicatori di Lagrange, etc. Tra gli altri possibili “difetti” delle SVM troviamo anche il fatto che questo tipo di classificatore non nasce con lo scopo di modellare uno spazio multi-categoria, ma di trovare la massima distanza tra due categorie. In realtà esistono vari approcci (one vs one & one vs many) per rendere anche i classificatori SVM multi-classe.
Supponendo di avere scelto il modello più adatto, il passo successivo è quello della pre-elaborazione (pre-processing) dei dati. Non solo i documenti in ingresso non possono essere elaborati così come sono, ma devono anche subire varie modifiche affinché i risultati della classificazione siano ottimali. Per esempio, il testo che viene elaborato, soprattutto in fase di addestramento del sistema, dovrebbe essere ripulito da tutte le parole che non apportano alcun valore alla categorizzazione del documento, quali articoli, congiunzioni, avverbi, etc. Il fatto che in un documento sia ripetuta la parola “quando” non fa sì che quel testo sia più vicino a un testo di sport o di economia. Un’altra elaborazione che è possibile fare è lo “stemming” ovvero la rimozione degli elementi non significativi in termini di classificazione dalle parole. Se per esempio in una email di spam, il verbo “comprare” è usato molto spesso, questo si può presentare in varie forme “Compra questo prodotto”, “prova a comprare il nostro prodotto”, “hai già comprato il nostro prodotto?”, etc. Se per un essere umano la relazione tra queste parole sembra ovvia, per una macchina “compra” e “comprato” sono due parole differenti finché non venga fornita una informazione di relazione. Lo stemming andrebbe a rimuovere “a” da “compra” e “ato” da “comprato”, lasciando solo l’elemento realmente significativo del verbo comprare. Chiaramente questo tipo di processi è dipendente dalla linuga e introduce un ulteriore livello di difficoltà nell’addestramento di un sistema.
La pre-elaborazione può essere considerata come parte integrante del processo complessivo di addestramento che segue il modello canonico di tutti i sistemi addestrabili (pre-processing-training-check-loop). L’addestramento vero e proprio può avvenire in vari modi e generalmente si divide in supervisionato e non supervisionato. Senza scendere nel dettaglio, prendendo a esempio il classificatore Naive Bayes, l’addestramento consiste nel calcolare le tabelle di probabilità bayesiane tramite le quali sia possibile calcolare il valore di appartenenza di un documento a una certa categoria. L’addestramento, generalmente, viene fatto mediante dati etichettati cioè a partire da un insieme di documenti di cui si conosce la categoria di appartenenza. Questo non dovrebbe stupire, in fondo, se a un bambino si spiega cosa sia un testo di storia, non potrà mai riconoscerne uno se prima non sa cosa sia la storia stessa. Per le macchine il principio è più o meno lo stesso.
Particolare attenzione va rivolta alla trasformazione dei dati. Uno dei primi problemi in cui ci si imbatte è la rappresentazione dei dati. Il principio è che le macchine ragionano per numeri e quindi i dati, sebbene siano testo, vanno normalmente trasformati in numeri, vettori, matrici, etc. Un documento viene spesso trasformato in un vettore binario che fa riferimento a un vocabolario. Per esempio, se il vocabolario di riferimento fosse [io, pasta, cane, pallone, carta] e la frase fosse “io mangio la pasta, ma il cane no” il documento sarebbe rappresentato dal vettore binario [1,1,1,0,0]. Alcuni tipi di classificatore permettono di utilizzare delle versioni più complesse di rappresentazione, per esempio quelle che utilizzano valori continui e non binari, derivate dall’analisi TF-IDF (Term Frequency – Inverse Document Frequency). Quest’utlima tecnica è nata principalmente per calcolare la rilevanza di una certa parola all’interno di un contesto che può essere un singolo documento o un insieme di documenti e ha trovato larga applicazione nei motori di ricerca e negli algoritmi keyword-based.
Una volta addestrato e verificato il sistema, il passo successivo è quello di integrare il classificatore con sistemi che ne devono sfruttare le funzionalità e possibilmente devono essere in grado di fornire ulteriori dati per il raffinamento della classificazione. Un esempio è proprio “SpamBayes” che a ogni mail arrivata, determina mediante il comportamento dell’utente (cancellazione, segnalazione esplicita di spam, lettura e archiviazione) se il campione in oggetto va utilizzato o meno per raffinare il classificatore.
In conclusione, la classificazione documentale è un problema complesso che dipende da moltissimi fattori; uno su tutti è l’insieme dei documenti di addestramento che dovrebbe essere pulito, robusto e completo. Le applicazioni della classificazione documentale sono molteplici e possono rendere molto più efficienti e funzionali vari compiti attualmente, generalmente svolti “a mano”. Alcuni esempi possono proprio essere la classificazione di spam per le caselle e-mail (spam filter), il raggruppamento di documenti per la ricerca veloce (fast search), il reperimento di informazioni chiave da grossi gruppi di documenti (information retrieval), etc. Tuttavia l’utilizzo dei classificatori non finisce qui. In realtà la matematica applicata ai classificatori è la stessa che tratta anche dati differenti per cui è possibile (come già avviene) pensare di trasformare anche altri dati nelle forme classificabili. Basandosi su questo approccio è possibile pensare anche a sistemi esperti che siano in grado di selezionare dei sintomi e effettuare una prima diagnosi dei pazienti… “Sistemi esperti”… sembrano una cosa futuristica e invece si tratta di cose che esistono già da ben più di 20 anni e che hanno largamente fatto parlare di loro in termini di fattibilità, applicabilità ed etica… ma i tempi e i mezzi a nostra disposizione oggi sono fortemente cambiati.
Lo scopo di questo articolo era quello di scendere maggiormente nel dettaglio in una delle branche presentate con il precedente articolo introduttivo sulla NLP e di presentare alcune parole chiave, come per esempio Naive Bayes, che in futuro verranno approfondite. Nel frattempo spero che questa breve e veloce overview sia stata utile a chi, anche non informatico, si avvicina con interesse a quest’area di studio e ricerca.
Tags: bayes, classificazione, computer, documentale, informatica, ingegneria, intelligenza artificiale, language, linguistica, machines, naive, natural, nlp, processing, science, support, tf-idf, vector Pubblicato in Computer Science | 2 Commenti »
11 gennaio 2010 - 1:42 by Charlenger
L’elaborazione del linguaggio naturale, in inglese abbreviata con la sigla NLP (Natural Language Processing), è una branca dell’intelligenza artificiale che abbraccia tutte quelle aree all’interno delle quali si ricercano e sviluppano algoritmi per l’estrazione automatica di informazioni a mezzo di calcolatori elettronici a partire da una qualunque forma di linguaggio naturale.
Un linguaggio naturale può essere una forma scritta, verbale o anche gestuale. Qualunque tipo di linguaggio che abbia una struttura definita da regole e che venga “naturalmente” utilizzato per comunicare può quindi essere considerato un linguaggio naturale.
Tutti i problemi affrontati all’interno della NLP possono essere considerati come parte del più generale problema della comprensione del linguaggio naturale che è IA (Intelligenza Artificiale) completo in quanto presuppongono che la macchina sia in grado di sfruttare complesse capacità di logica, deduzione, apprendimento e così via, al fine di avere una conoscenza, per l’appunto, completa (o per lo meno quanto più completa possibile) del mondo in cui essa opera.
Alcune delle aree che fanno capo alla NLP sono le seguenti:
- Riconoscimento Automatico del Parlato (ASR – Automatic Speech Recognition): area che si occupa di estrarre informazioni da informazioni verbali come l’identificazione del parlante, l’identificazione di particolari vocaboli all’interno di una frase, il riconoscimento completo di frasi e così via;
- Classificazione Documentale (DC – Document Classfication): area che si occupa di analizzare testi scritti e di catalogarli o etichettarli secondo particolari categorie, siano esse binarie o multiple, estraendo dai vari documenti informazioni come la rilevanza delle varie parole, somiglianza tra campioni e così via;
- Analisi emozionale (SA – Sentiment Analysis): area che si occupa di estrarre informazioni legate ai sentimenti espressi all’interno di un testo scritto, il parere dell’autore e le possibili relazioni tra due o più documenti in termini di vicinanza a una data opinione;
- Supporto Grammaticale (GS – Grammatical Support): area che si occupa di analizzare testi scritti e di estrarre informazioni legate alla struttura grammaticale del testo in relazione alla lingua in cui è scritto o in relazione a leggi prestabilite da altri documenti;
- Sintesi Vocale (SS – Speech Synthesys): area che si occupa di creare suoni a partire da testi scritti che siano coerenti con le regole fonetiche della lingua da sintetizzare, sulla base di quanto il testo voglia esprimere;
- Interpretazione dei Gesti (GI – Gesture Interpretation): area che si occupa di associare a dei gesti visuali un significato in termini di testo o vocabolo;
Come è facile immaginare, ciascuno di queste aree ha grandi applicazioni sia al livello puro nel mondo accademico e della ricerca, che nel mondo commerciale. Tuttavia spesso non è semplice immaginare quali difficoltà stiano dietro allo sviluppo di tecnologie che si occupino di risolvere problemi che all’apparenza sono piccoli e che rappresentano anche solo una piccola parte di un sotto-problema della comprensione del linguaggio naturale.
Per fare un esempio, non molto spesso ci si ferma a riflettere su quanto complesso sia il nostro sistema di comunicazione. Quando ci capita di parlare con qualcuno in mezzo a una folla, siamo attorniati da migliaia di rumori e voci, dati che il nostro cervello scarta e non traduce in informazioni se non nello stretto necessario. Siamo tuttavia in grado di focalizzarci su ciò che il nostro interlocutore ci sta dicendo, comprenderlo ed elaborare una risposta. Sembra semplice tuttavia per una macchina non lo è. Questo è dovuto al fatto che la comunicazione umana non si basa, come è facile pensare, solo sull’elemento verbale. Essa si basa su moltissimi altri elementi contestuali come i gesti, la conoscenza pregressa, la cultura e così via. Quando crediamo di avere sentito una parola e gli abbiamo associato un significato, non è detto che questo sia avvenuto attraverso la mera elaborazione del suono.
Un celebre esempio presentato da Rabiner, uno dei luminari nel campo del riconoscimento automatio del parlato, mostra come una macchina sia impossibilitata a comprendere una semplice espressione che un umano darebbe per scontata:
“I want an ice cream” – io voglio un gelato
Facile da capire no?
“I want an I scream” – io voglio un io grido
ovviamente non ha significato… per noi. Tuttavia è interessante riflettere sul fatto che una macchina non sa a priori che “want” e “scream” siano dei verbi e che una frase come “I want an …” probabilmente ha bisogno di un complemento oggetto. Ma leggendo la frase ad alta voce con tono naturale ci accorgeremmo che la differenza fonetica è praticamente impercettibile tra le due frasi.
Il cervello umano è un sistema molto complesso e dal quale siamo ancora ben lontani dal crearne uno artificiale in grado di simulare le funzioni di uno reale. La comprensione del linguaggio naturale è un processo che nella nostra mente attiva una serie di processi di analisi sintattica e semantica, lessicale e grammaticale, che sono corredati da filtri percettivi che il nostro cervello impara a usare, come l’ignorare il rumore circostante, il ricostruire frasi o parole incomplete sulla base della “probabilità” che quel suono in quel contesto significasse qualcosa in particolare.
Dal momento che questa è una breve introduzione voglio rifare l’elenco precedente esponendo una singola possibile applicazione di questo tipo di sistemi a livello avanzato e una a livello quotidiano:
- ASR: interfaccia di comando vocale per sistemi complessi (e.g. navigazione in auto, aereo, etc) | sistema di videoscrittura digitale basata sul dettato
- DC: classificazione automatica di testi e frasi per l’interazione con chatbot di supporto online | classificazione di pagine web orientata all’ottimizzazione delle prestazioni dei motori di ricerca
- SA: analisi automatica della reputazione di un’entità sul web | classificazione di opinioni binarie su documenti con struttura specifica
- GS: creazione di testi alternativi e sommari a partire da testi più complessi | correttore sintattico per sistemi di videoscrittura
- SS: creazione di voci realistiche per l’interazione di chatbot di supporto telefonico | sintesi di annunci vocali automatici per stazioni (aeroportuali, ferroviarie, etc)
- GI: interfaccia di comando gestuale per sistemi a scarsa propagazione della voce (ambienti spaziali, subacquei, etc) | sistema di gaming entertainment basato sui movimenti
Ciascuna di queste aree presenta molti agganci e sbocchi interessanti sotto vari punti di vista e rappresenta, nel suo piccolo, una frontiera innovativa sia dal punto di vista della ricerca scientifica, sia dal punto di vista dell’evoluzione commerciale dei prodotti che usiamo quotidianamente.
Per concludere voglio introdurre un progetto attualmente in sviluppo su questo sito web. Di recente ho aggiornato una libreria che era orientata alla classificazione documentale. Questa libreria ha cambiato nome e, sebbene possa sembrare troppo generalizzato, adesso è NLP4J, cioè una libreria che vuole accrescersi cercando di fornire strumenti sempre più completi e general purpose per i temi di NLP. Ovviamente la libreria è, in tema con il progetto JOProject, open source e in Java.
Al momento NLP4J include solo il support per la classificazione documentale ma verrà presto aggiornata sia con i contributi di chiunque volesse mettere alla prova le proprie conoscenze all’interno di questo tema e instaurare una collaborazione, sia con quello che personalmente aggiungerò strada facendo. Una presentazione più dettagliata del progetto seguirà prossimanete. Nel frattempo potete visualizzare lo stato del progetto, scaricare i files relativi a sorgenti, binari e documentazione da queste pagine: pagina del progetto, forum.
Tags: artificiale, asr, classificazione, computer, documentale, elaborazione, informatica, ingegneria, intelligenza, language, linguaggio, linguistica, natural, naturale, nlp, nlp4j, processing, science Pubblicato in Computer Science | 2 Commenti »
18 dicembre 2009 - 7:01 by Charlenger
L’intelligenza artificiale, come mi è capitato spesso di dire, è qualcosa che nell’immaginario delle persone rappresenta l’eco di film fantascientifici in cui le macchine sono capaci di provare emozioni, in cui la parola intelligenza, associata a un robot, si fonde con etica, emozioni, sensazioni, passioni e così via. Nella realtà l’intelligenza artificiale raccoglie moltissime altre cose molto più vicine a noi e che ci rendono la vita più semplice, più bella e più vivibile. Eppure certe volte neanche ce ne accorgiamo. Di recente è nata in Sicilia, e più precisamente a Palermo, una nuova azienda che si occupa di qualcosa che molti definirebbero futuristico. Non tutti credono che investire in certe tecnologie sia fruttuoso, ma nella realtà del quotidiano è chi rischia e chi crede nell’impossibile che ci fa andare avanti, dimostrando a tutti che l’impossibile non sempre è così irraggiungibile.
L’Azienda in questione è InformAmuse (http://www.informamuse.com/). Si tratta di una piccola realtà relativa a quel mondo a cavallo tra l’accademico e il commerciale, che si occupa di intelligenza artificiale e che si lancia nel mercato come futuro delle tecnologie di interfaccia tra l’uomo e la macchina. Il primo grandissimo passo che è stato fatto è stato quello di sviluppare una guida museale in grado di far rivivere capolavori della storia in 3D, narrati da voci sintizzate e comandabile attraverso la voce. Come viene detto anche nel loro sito, siamo ormai a un passo dallo storico salto che ci portò a passare dalla sola tastiera con cursore lampeggiante su sfondo nero, a una bellissima grafica a finestre cliccabile con un mouse. La differenza è che adesso siamo pronti per il futuro. Voce e gesti possono diventare uno strumento ben più potente di quello che avevamo immaginato.
Il futuro dunque è qui, è una cosa che non smetterò mai di ripetere, perché se è ovvio che quello che immagiamo adesso come futuro, per esempio macchine volanti e non inquinanti, dispositivi comandati con la sola forza del pensiero, e così via, quello che altri, con più raziocinio hanno immaginato ieri, adesso è diventato realtà. Una realtà vera e molto promettente.
Personalmente sono molto fiducioso e contento di questo avvenimento, in quanto l’idea nasce da alcune persone validissime, e una in particolare, che per me ha significato molto ed è stata un’onesta e competente guida attraverso la mia carriera universitaria. E con grande piacere ne riporto la breve intervista virtuale:
***
Buongiorno Professore Gentile, innanzi tutto complimenti per l’impresa. Come ci si sente a intraprendere questa strada tra le tante possibilità?
Intanto è un piacere rispondere a questa intervista, seppur virtuale, anche perchè proposta da uno degli allievi più brillanti che ho avuto il piacere di guidare durante il percorso di studi in ingegneria informatica. Ci si sente responsabili, per una scelta che richiederà enorme impegno e che presenta delle sfide non banali da superare, soprattutto per chi, come me, parte dal mondo della ricerca e della formazione universitaria. Mi accompagno con un gruppo molto affiatato di giovani ricercatori dalle competenze complementari, ai quali si uniscono due professionisti nei settori chiave della gestione e del marketing, Giovanni Barresi e Antonio Massara, rispettivamente. Abbiamo anche alle spalle un’azienda, la Mediavoice S.r.l. molto dinamica e giovane, che guidata dal suo Presidente, Fabrizio Giacomelli, crede nella nostra iniziativa e con la quale collaboriamo sin dal 2007. Speriamo che nell’immediato futuro questo gruppo si possa ampliare e diventare una realtà produttiva che fa innovazione in Sicilia.
Come è nata l’idea di costituire una società a commerciale basata su idee e tecnologie avanzate e spesso considerate prettamente accademiche?
La spinta iniziale è stato il duro percorso (nove mesi) che abbiamo affrontato con Antonella Santangelo, dottore di ricerca in Ingegneria Informatica e ora Responsabile Interfacce Speciali di Mediavoice, per pervenire alla domanda di brevetto che anima il core computazionale di InformAmuse, ovvero la possibilità di animare con dialoghi in linguaggio naturale l’interazione con una guida museale virtuale, che sia manifestata all’interno di un kiosk o annegata in un palmare o nel cellulare del visitatore. Far ri-vivere i luoghi della storia, questa la nostra missione. Ci siamo resi conto che la tecnologia ha senso quando centrata intorno alle persone, pensata per l’utente. Il passo da prototipo accademico a prodotto industriale non è per niente banale e richiede un notevole sforzo, e economico e tecnico, che affrontiamo con entusiasmo già da tempo. Devo anche registrare che sia l’Università di Palermo, con il suo Industrial Liaison Office, che il Dipartimento di Ingegneria Informatica hanno favorito in ogni modo la nascita di InformAmuse, oggi in “incubazione” presso l’incubatore d’impresa ARCA.
Che obiettivi vi ponete come Azienda, nel breve e nel lungo periodo?
A breve termine gli obiettivi si concentrano nell’ingranare la marcia e lanciare un’azienda in start up, avendo il serbatoio pieno di idee e di prodotti. La direzione di marcia è ovviamente fondamentale, e siamo già partiti verso destinazioni che sembrerebbero molto ambiziose ma che noi riteniamo alla portata di un breve tragitto. Il fatto è che l’interazione con le macchine attraverso la voce e i gesti da un lato libera gli occhi e allarga lo spazio, dall’altro amplia il vissuto dell’utente a comprendere lo spazio narrativo. A noi sembra una cosa magnifica, che offre l’opportunità di trasformare ogni occasione turistica in un tempo per vivere e rivivere i luoghi e la loro storia e cultura, ampliandone dettagli e narrazioni senza nulla togliere all’esperienza dal vivo. E tutto ciò con un semplice cenno di voce.
Quali ritiene che saranno i principali ostacoli? E tra questi, quanto ritiene influente il fatto di lavorare in Sicilia?
Mi concentrerei sugli aspetti positivi. Gli ostacoli li affronteremo man mano che si presentano, e cercheremo di superarli. Essere in Sicilia, la sede a Palermo, è una condizione irrinunciabile. Il territorio ha i suoi innegabili problemi, ma è anche tra i più ricchi di patrimonio artistico e paesaggistico. C’è un’attenzione crescente nei confronti del turismo, del turismo culturale e delle idee d’impresa giovani e innovative. Puntiamo su tutto questo e sul volerlo fare qui, in Sicilia, Terra difficile che fa allontanare così tanti dei suoi figli migliori (e con uno di essi sto parlando adesso). Io stesso sono tornato a Palermo dopo sette anni ad Atlanta, negli Stati Uniti, con un Ph.D. conquistato al Georgia Tech e una mezza dozzina di offerte di lavoro lasciate sul tavolo per diventare ricercatore universitario. Oggi siamo a questo punto, e non lo avrei mai pensato.
Chi la conosce probabilmente sa già la risposta, ma quanto c’è di personale e di interiore in questo bellissimo progetto?
Molto. Non potrebbe essere diversamente. Ma è anche vero che godo del supporto formidabile della mia famiglia, mia moglie in testa, e dei ragazzi che con entusiasmo mi spingono avanti. InformAmuse è il risultato di un impegno collettivo, che oggi vede insieme a me e ad Antonella anche Salvatore Sorce, Eleonora Trumello e Salvatore Andolina, tutti passati dal DINFO.
Cosa si sente di dire a chi critica la Sicilia, le imprese e che potrebbe includere in queste critiche anche le aziende come InformAmuse?
Le critiche, se costruttive, fortificano e siamo pronti ad affrontarle, nel costante tentativo di migliorare. Spero piuttosto di potere testimoniare la volontà diffusa di fare crescere, al pari del resto della Nazione, anche il Meridione d’Italia e la nostra Sicilia, magari puntando ad una migliore presentazione del patrimonio artistico, culturale, paesaggistico e ambientali che tanti turisti attrae ogni anno. La migliore pubblicità al nostro saper fare è il racconto di chi ritorna a casa sua dopo una memorabile vacanza in Sicilia.
***
Ringraziando ancora Antonio Gentile, Professore Associato del Dipartimento di Ingegneria Informatica dell’Università di Palermo, concludo sottolineando ancora ciò che è il mio motto riguardo all’intelligenza artificiale e che si rispecchia pienamente in ciò che vedo in questa azienda: “Il Futuro è qui”.
Tags: computer, gentile, guida, hmm, informamuse, informatica, interfaccia, museo, palermo, professore, riconoscimento, science, università, vocale Pubblicato in Computer Science, Generale | Commenti disabilitati
12 dicembre 2009 - 20:24 by Charlenger
Qualche giorno fa, riguardando tra i vecchi progetti, mi sono accorto di un mini progetto che era partito in silenzio per dare supporto alla A-blacklist ormai praticamente defunta. Il progetto in questione era una libreria di utilità per l’analisi automatica di immagini.
In realtà la prima (e anche unica) utilità sviluppata è “SkinFilter” ovvero una semplice classe che fornisce due metodi chiamati getSkinMask ai quali è possibile passare come argomento o un’immagine in formato BufferedImage o direttamente un File.
Il codice di questa classe si basa su un metodo empirico a soglia, quindi molto potente a livello di prestazioni, ma un po’ meno potente a livello di affidabilità al confronto con reti neurali, reti bayesiane e così via.
Ecco il codice:
package org.cahung.utils.imageprocessing;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Carlo Alberto Hung
*/
public class SkinFilter {
/**
* This method is using the fast approach of fixed empiric threashold.
*
* Colorspace is RGB [0-255]
*
* Rules are:
* – R > 95
* – G > 40
* – B > 20
* – MAX(R,G,B) – MIN(R,G,B) > 15
* – R = MAX(R,G,B)
* – |R – G| > 15
*
* @param im is the input image
* @return a binary copy of the image that contains only the skin surface
*/
public static BufferedImage getSkinMask(BufferedImage im) {
int skinPixels = 0;
int width = im.getWidth();
int height = im.getHeight();
BufferedImage out = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
Color pixel = new Color(im.getRGB(i, j));
int r = pixel.getRed();
int g = pixel.getGreen();
int b = pixel.getBlue();
int max = r > b ? r : b;
max = max > g ? max : g;
int min = r < b ? r : b;
min = min < g ? min : g;
// Processing Skin Pixel
if ((r > 95) && (g > 40) && (b > 20)) {
if (max – min > 15) {
if ((r > g) && (r > b)) {
if ((r – g) > 15) {
out.setRGB(i, j, new Color(r, g, b).getRGB());
skinPixels++;
}
}
}
}
}
}
return out;
}
public static BufferedImage getSkinMask(File in) throws IOException {
BufferedImage image = ImageIO.read(in);
return getSkinMask(image);
}
}
Questa classe può essere provata utilizzando una semplice classe di test come la seguente:
package org.cahung.utils.imageprocessing;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Carlo Alberto Hung
*/
public class SkinFilterTest {
public static void main(String args[]) {
try {
BufferedImage bi = SkinFilter.getSkinMask(new File(”D:\\input.jpg”));
ImageIO.write(bi, “jpg”, new File(”D:\\output.jpg”));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Sebbene sia molto semplice i risultati, in base all’obiettivo da raggiungere, sono sorprendenti soprattutto se si pensa che questo tipo di filtro applica una prima scrematura “regolabile” e che essendo molto leggero rispetto ad altri approcci può fungere da preparatore di dati per ulteriori operazioni come erosioni, binarizzazioni, maschere etc. Alcune applicazioni di questo tipo di filtro possono essere Face Detection, Skin Segmentation, Face Feature Detection, Skin Traking etc. Nelle immagini seguenti, le immagini originali sovrastano quelle filtrate da SkinFilter (in nero i pixel considerati non di pelle “NO-SKIN”):
Tags: blacklist, computer, filter, informatica, java, programmazione, science, skin, utilità Pubblicato in Computer Science | Commenti disabilitati
3 dicembre 2009 - 7:55 by Charlenger
Ormai dovrebbe essere chiaro che uno dei temi portanti di questo sito/blog è il software e le sue innumerevoli facce e questioni, tra open-source e licenze varie. Qualche giorno fa, mi sono trovato a leggere alcuni articoli scritti da un personaggio alquanto celebre che le persone legate in qualche modo all’open source e al software “etico” conosceranno abbastanza bene. Sto parlando di Richard Stallman.
Come di consueto riporto cosa dice l’enciclopedia web 2.0, Wikipedia:
Richard Matthew Stallman (New York, 16 marzo 1953) è un programmatore, hacker e attivista statunitense.
È uno dei principali esponenti del movimento del software libero. Nel settembre del 1983 diede avvio al progetto GNU con l’intento di creare un sistema operativo simile a Unix ma libero: da ciò prese vita il movimento del software libero. Nell’ottobre del 1985 fondò la Free Software Foundation (FSF). Fu il pioniere del concetto di copyleft ed è il principale autore di molte licenze copyleft compresa la GNU General Public License (GPL), la licenza per software libero più diffusa. Dalla metà degli anni novanta spende molto del suo tempo sostenendo il software libero e promuovendo campagne contro i software proprietari e ciò che a lui sembra una eccessiva estensione delle leggi su copyright. Stallman ha anche sviluppato molti software ampiamente usati: Emacs, la GNU Compiler Collection e lo GNU Debugger.
Leggendo gli articoli che riporto in coda al post, ho riflettuto su alcuni aspetti importanti del software, indipendentemente dal suo tipo, e in particolare a quella che potrebbe essere definita “etica” del software.
Sempre da Wikipedia:
L’etica (dal greco antico ἔθος (o ήθος)[1], “èthos”, comportamento, costume, consuetudine) è quella branca della filosofia che studia i fondamenti oggettivi e razionali che permettono di distinguere i comportamenti umani in buoni, giusti, o moralmente leciti, rispetto ai comportamenti ritenuti cattivi o moralmente inappropriati.
L’etica può anche essere definita come la ricerca di uno o più criteri che consentano all’individuo di gestire adeguatamente la propria libertà nel rispetto degli altri. Essa pretende inoltre una base razionale, quindi non emotiva, dell’atteggiamento assunto, non riducibile a slanci solidaristici o amorevoli di tipo irrazionale. In questo senso essa pone una cornice di riferimento, dei canoni e dei confini entro cui la libertà umana si può estendere ed esprimere. In questa accezione ristretta viene spesso considerata sinonimo di filosofia morale: in quest’ottica essa ha come oggetto i valori morali che determinano il comportamento dell’uomo.
Cosa signifca dunque etica del software? Parlando da ingegnere dell’informazione e da appassionato di software design & development, mi sono reso conto che non è affatto facile parlare di questo argomento. In primo luogo mi sono trovato a pensare dal punto di vista dell’utente. Per l’utente, che sia un’azienda o un privato, il software dovrebbe essere sicuro, potente, facile da usare e così via… e soprattutto dovrebbe costare molto poco.
In molti, sentendo parlare di “free software”, associano alla parola free il senso di gratuito, ma non è esattamente questo ciò che Stallman intendeva quando usava quel termine. Nei paesi di lingua anglosassone la differenza è ancora più sottile in quanto free significa letteralmente sia gratis che libero. In italiano la traduzione corretta è infatti “Software Libero” e non “Software Gratis”.
Vorrei sottolineare che non ho detto che per l’utente il software dovrebbe essere gratis. Quanto meno se si tratta di qualcosa di importante e soprattutto se si tratta di un’azienda. Per qualche ragione, un software “libero” e anche “gratuito” fa paura alle aziende e a chi ha bisogno di un software che vuole percettivamente chiamare “sicuro”. Free Software e Open Source infatti spesso non sono capiti e per questo motivo non adottati.
Ma analizzando il punto di vista di chi il software lo vende, o di chi guadagna su di esso, chiaramente l’idea di software è quella di un servizio da cui tirare fuori quanti più soldi possibili a prescindere dalla qualità e dalle tecniche utilizzate. Sta poi a ciascuno operare le sue scelte, fare i propri prezzi e adottare le proprie strategie di vendita e quanto tempo dedicare alla qualità del proprio prodotto.
Come è facile intuire queste due cose non vanno esattamente d’amore e d’accordo. Ritorno dunque alla domanda iniziale. Cosa significa etica del software? Per quanto mi riguarda, la risposta, forse un po’ semplificata, riguarda tutti coloro che hanno relazioni con il software.
L’utente dovrebbe scegliere il software in base alle sue esigenze, o richiedere delle caratteristiche ragionevolmente con ciò che è disposto a scegliere, e dovrebbe fidarsi di ciò che adotta come soluzione. Parlando per esempio dell’utente finale, trovo non etico utilizzare una versione pirata di Microsoft Office perché ha delle funzioni di indubbia e superiore qualità rispetto a ogni altro prodotto dello stesso tipo. La scelta etica è quella di pagare il prezzo del software e acquistarlo, oppure se non si è disposti a pagare adottare una soluzione gratuita, per esempio l’open source Open Office di Sun Microsystem. Forse non sarà il massimo delle funzioni ma offre tutto ciò che serve per svolgere gli stessi compiti di Microsoft, quanto meno per l’utente “home”.
Dal punto di vista dello sviluppatore, ritengo che etica del software significa applicare sempre il massimo delle proprie capacità quando si svolge il proprio lavoro, applicare tariffe e prezzi ragionevoli al lavoro svolto, accettare solo lavori che si sa di poter svolgere oppure avvalersi, a fronte di un guadagno inferiore, di capacità esterne che consentano di andare incontro ai bisogni del cliente. Ritengo altrettanto etico però non svendersi, non regalare le proprie competenze perché essere buoni è un conto, essere etici è un altro, ma regalare tutto il proprio lavoro è da stupidi.
Di certo all’utente piacerebbe che i programmatori lavorassero gratis e sviluppassero ogni cosa per il semplice divertimento di farlo, ma non lo ritengo per nulla né produttivo né appunto, etico. Qualcuno, come in questo sito, può dedicarsi allo sviluppo di software che è gratuito oltre che “free software” e “open source”. Ma ciò dovrebbe avvenire solo perché il guadagno arriva in altri termini, quali esperienza, visibilità, divertimento, condivisione, etc.
La questione secondo me tocca anche chi usufruisce dei software cercando di farlo in modo etico ma senza informarsi troppo. Molti puntano il dito su Microsoft. Sebbene sia vero che quest’azienda abbia un grosso strapotere sul mercato, soprattutto riguardo sistemi operativi e suite office, e abbia adottato strategie di mercato non sempre etiche ma sicuramente vincenti, tuttavia esistono molte altre aziende che hanno adottato strategie molto simili ma su cui nessuno ha puntato mai il dito contro perché offrivano software e servizi gratuiti. Un esempio è Google.
Premettendo che io non mi schiero né contro né a favore di Microsoft o Google, c’è da dire che trovo un po’ troppo eccessiva la critica a Microsoft da parte di molti “Linuxisti” che però sono giorno e notte su internet, cercano so google, magari hanno scaricato Chrome, e presto useranno anche Chrome OS e così via. Basterebbe accorgersi che alcune cose di Microsoft, alla fine sono gratuite e open source, e sufficienti per gli utenti “home” e molte cose di Google non sono affatto “Open Source”, sebbene siano “Free”.
Dal momento che parlare di etica, richiede alcune competenze che mi mancano, voglio comunque approfittare del mio amico filosofo, per riportare un parere più specialistico. E dal momento che non voglio dilungarmi troppo, concludo riassumendo il pensiero che mi si è rafforzato sempre di più leggendo gli articoli di Stallman:
Chi sceglie di usare un software dovrebbe farlo pensando che utilizzare un software pirata non significa essere furbi e risparmiare, ma significa solo invitare chi produce software proprietario a incrementare i prezzi non proporzionalmente alla qualità, ridurne i guadagni e costringerli ad adottare politiche scorrette. Al di là del fatto che grosse aziende potrebbero comunque non essere etiche non deve essere l’utente a comportarsi per primo in maniera non etica. Allo stesso modo chi sviluppa software dovrebbe attenersi alle regole etiche della professione oltre che pensare che ciò che rende buono il lavoro non è quanto ci si guadagna, sebbene sia un fattore importante come stimolo e come sopravvivenza, ma la qualità dello stesso e dunque dovrebbe essere necessario scegliere l’approccio (open-source, proprietario, free, etc) più adatto e le tecniche appropriate per implementarlo.
E per chi si dicesse “voglio essere etico ma non posso perché mi servono software che facciano ciò che mi serve”, sappia che nella maggior parte dei casi esistono soluzioni gratuite o open source per ottenere ciò che volete. Alcuni esempi?
Suite di programmi per l’ufficio: OpenOffice – se hai proprio “bisogno” di Microsoft Office probabilmente è perché ti serve per lavoro e la tua azienda te lo potrà procurare. Se lavori in proprio e ti “serve” MS Office… compralo.
Sistemi operativi: Linux Ubuntu – facile da installare permette praticamente tutte le funzioni che l’utente home usa su windows, dalla navigazione internet, alla posta, alla videoscrittura, all’instant messaging.
Sviluppo software: sviluppi microsoft…? perché hai piratato la versione “enterprise” di Visual Studio se esiste la versione Express che per il privato è ben più che sufficiente?
Database: MySql, Microsoft Sql Server Express, etc…
Creazione PDF: BullZip Printer, Ghost Script.
Fotoritocco: Paint .NET, Gimpshop
…
e potrei continuare all’infinito.
E come anticipato ecco una breve dissertazione di LandOfNowhere:
***
riflessioni “inconcluse” sull’etica della programmazione
Sorvoliamo sul problema filosofico di cosa sia l’etica e sul fatto che per me è una domanda tutt’altro che conclusa. Sorvoliamo pure sul fatto che etica e politica, almeno secondo il sottoscritto, vanno a braccetto e che, per politica, non si debba intendere solo uno strano insieme di giochi di palazzo.
Partiamo da premesse semplici e volutamente semplicistiche: un’azione etica promuove una società migliore, rapporti sociali migliori e un’esistenza migliore per le persone che ci circondano. A molti potrà anche piacere come definizione…. ma per me, resta semplicistica; ciò nonostante da qualche parte dobbiamo partire.
Se accettiamo queste premesse, una delle “etiche” più concludenti è sicuramente quella di Stallman. Un consiglio che posso dare è quello di acquistare questa raccolta dei suoi interventi (tutti comunque rintracciabili su internet).
Si tratta di pensare la creazione di un programma come qualcosa che facciamo all’interno di una società; e che determinate scelte influenzano, in piccolo od in grande quella stessa società. Non si tratta soltanto della licenza con cui il software viene rilasciato. Si tratta, per dirla con Kant, di non pensare l’utente come un mezzo, ma come un fine. Quello che emerge, più che un etica del programmatore è, a ben vedere, un etica del lavoro. Stallman insiste sul fatto che un programmatore di software libero non rinuncia certo al suo stipendio…, ma aggiunge anche che esso verrà ridimensionato – ed in questo emerge un lato “utopico”, che a mio parere semplicemente registra una contraddizione fra questa etica e il sistema capitalistico per come è regolato attualmente.
In altre parole, quest’etica insiste su una (appunto) contraddizione della nostra società: il lavoro deve creare una ricompensa morale nel lavoratore, oltre a permettergli di vivere; la ricompensa morale si misura nell’essere riuscito a contribuire alla comunità di cui si fa parte (e quindi nella “gloria”, nella gratitudine ricevuta, ecc. ecc). La ricompensa economica va, quindi, in secondo piano. In fondo, l’etica del lavoro come “servizio” e “dono”, oltre (e forse anche più) che ai sistemi di valore “socialisti”, rimanda molto anche etiche religiose, in primis quella di molte comunità cristiane/cattoliche (non certo calviniste).
Dicevo prima, che quest’etica spinge su una contraddizione interna della nostra società: essa è costituita dalla scissione personale che ognuno di noi vive. Siamo tutti, da un lato cittadini “solidali” e dall’altro soggetti economici. Membri di una società escludente, che elargisce elemosine agli esclusi. Come molte etiche, inclusa quella cattolica, la cultura hacker insiste sull’unità dei due “soggetti”: mentre viviamo come homini aeconomici (sperando di non aver sbagliato con il latino) non smettiamo di essere cittadini solidali. Ed è questa soggettività quella preminente. Certo, l’origine non marxista di quest’etica di solito gli impedisce di cogliere l’esatta natura di questa scissione/contraddizione e di poter porre così la questione. Ad ogni modo, non può che generare un sistema di valori per cui nell’atto di rilasciare un programma, io debba tenere in mente di promuovere l’avanzamento della cultura, della fratellanza e della cooperazione. Quindi devo mediare fra i miei interessi economici e quelli della società. Ed allora, posto che il mio lavoro è ciò con cui vivo, ogni qual volta ledo gli interesse e le libertà degli utenti (o della comunità) per il mio profitto, sbaglio. E quindi, devo lasciare a tutti il diritto di modificare e ridistribuire le mie “creature”. Ci sono mille altri modi, che Stallman non si lesina ad elencare, con cui un programmatore può vivere, invece che estorcere soldi per ogni “copia”: ad esempio, un’azienda può pagarlo per avere quelle modifiche di cui ha bisogno per aumentare la produttività o altri metodi ancora.
Resta il fatto che quest’etica stride con i valori “consumistici” e di “profitto” vigenti nel mondo economico di oggi, che pur moralmente bistrattato, è la verità di quello “solidale” (sul perché non mi posso dilungare in questa sede). E che un modello di scambi economico fondato su base esclusivamente “morale”, difficilmente è in grado di creare una pratica davvero capace di scardinare le abitudini consolidate, soprattutto se si basano su sistemi di potere. Ma se dividiamo etica, da politica e se c’interessa sapere soltanto “qual’è il metodo corretto di creare software”, il lavoro di Stallman è una buon punto di partenza. I limiti qui elencati, stanno al di sotto del livello della critica. Infatti sono possibili solo, considerando insoddisfacente la definizione usuale di etica. Ma anche accettando tutte le mie notazioni, il punto di partenza della FSF resta gravido di intuizioni utili e geniali: cosa vuol dire cooperazione nel nostro secolo? Cosa vuol dire diritto di proprietà sui beni non materiali? Il sistema attuale è davvero il più “produttivo possibile”? Come sarebbe il mondo senza l’idolo del profitto? Come sarebbe la nostra società se fosse fondata sul collettivismo e non sull’individualismo?
***
Ecco gli articoli da cui è nato questo post:
http://www.gnu.org/philosophy/free-software-for-freedom.it.html
http://www.gnu.org/philosophy/open-source-misses-the-point.it.html
Tags: computer, etica, free software foundation, fsf, gnu, google, informatica, ingegneria, linux, microsoft, open source, openoffice, richard, science, software, stallman, ubuntu Pubblicato in Computer Science, Generale | 1 Commento »
24 ottobre 2009 - 8:30 by Charlenger
Recentemente mi è stata posta la domanda che in molti tra quelli che si avvicinano alla programmazione per la prima volta fanno: meglio scegliere il linguaggio JAVA o il C++?
Per i “profani”, sia il JAVA che il C++ sono due linguaggi di programmazione utilizzati per sviluppare programmi, servizi e altre entità informatiche che ormai ogni giorno caratterizzano la vita di moltissime persone. Il Java fu inventato dagli ingegneri della SUN Microsystem, recentemente acquistata da Oracle, mentre il C++ (chiamato così, mi raccontava un carissimo amico, perché è la versione “incrementata” di C) fu inventato nel lontano 1983 dai Bell Labs partendo proprio dal linguaggio di basso livello e procedurale chiamato C.
Tornando al tema principale, un confronto diretto tra Java e C++, sebbene sia oggetto di numerose discussioni, è secondo me parzialmente inutile. Chi li ha usati entrambi ha sicuramente una preferenza, ma sa bene che si tratta di due strumenti diversi. A mio parere, confrontare i due linguaggi sarebbe come chiedersi se sia meglio viaggiare in aereo o in treno. Mantenendosi su questo paragone, infatti, è possibile notare come fare esattamente la domanda “Meglio scegliere Java o C++?” è esattamente come chiedere “Meglio il treno o l’aereo?”. Anche chi non capisce nulla di programmazione concorderà che la seconda domanda, priva di ulteriori dettagli non ha senso e, seppure chi abbia viaggiato in aereo e in treno abbia una preferenza, per esempio riguardo i tempi, la comodità, la pulizia, etc, è difficile che per andare da Milano a Bergamo sia meglio prendere l’aereo invece del treno.
Dunque, la scelta tra il Java e il C++ dovrebbe essere fatta sulla base di molte più cose invece che su semplice “simpatia”. Inoltre fare un vero e proprio paragone, anche specifico, non è sempre semplice. Per esempio, è stato dimostrato come le prestazioni effettive dei due linguaggi siano paragonabili solo in maniera relativa e non assoluta. Alcuni tipi di benchmark sono risultati a favore di un linguaggio e altri dell’altro.
Dal momento che quando mi si pone una domanda, se posso provo a rispondere, faccio comunque un breve paragone basato anche sulla mia esperienza:
***
Qual è più facile da apprendere? Per chi inizia completamente da zero, la curva di apprendimento dei due linguaggi è più o meno simile ma con risultati diversi. Molti dicono che il Java sia più semplice da imparare, ma la realtà è che la complessità assoluta della sintassi è pressoché identica (sebbene gli approcci siano leggermente differenti). La differenza principale è che con le stesse competenze di base che si possono acquisire in breve tempo per i due linguaggi, in C++ sarà possibile sviluppare semplici programmi con poca grafica e funzioni relativamente limitate, mentre in Java sarà possibile sviluppare già applicazioni di maggiore effetto (attenzione, maggiore effetto non vuol dire maggiore complessità).
Qual è più potente in termini di prestazioni? Come dicevo prima non esiste una risposta assoluta, ma in generale il C++ risulta più potente in quanto, nascendo da un approccio di più basso livello, fornisce un controllo maggiore sulle applicazioni e dunque una possibilità di ottimizzare il proprio codice in maniera più efficace. Ovviamente se chi programma non è abile nell’ottimizzazione degli algoritmi, rischia comunque di cascare nel baratro dei cicli e delle ricorsioni che magari qualcun altro ha già risolto e ottimizzato. Questa seconda cosa avviene spessissimo in Java, pieno di librerie open source. L’open source è infatti una filosofia alla base del linguaggio Java e questo gli permette di avere molte librerie facili da usare e ben documentate, in giro per la rete. In ogni caso, molto spesso anche il Java offre la possibilità di ottenere ottime prestazioni anche per applicazioni real time.
Qual è più facile da usare? Anche in questo caso non c’è una risposta assoluta. Il Java è sicuramente più semplice da “integrare” viste le numerose librerie disponibili. Tuttavia bisogna “fidarsi” di quello che si trova, oppure decompilare le classi per scoprire cosa si nasconde dietro le operazioni che in java si riducono a una chiamata a un metodo. Il C++ è solo un po’ più macchinoso. Esistono moltissime librerie anche per C++ ma per la sua natura un po’ più chiusa e meno “markettara”, sono spesso povere di documentazione, più complesse da usare oppure, ancor peggio, vendor dependent.
Qual è più facile da portare da un sistema operativo all’altro? La risposta più ovvia che si trova in giro per la rete è Java. Mi sento di contraddire questa risposta. Il più facile da portare è secondo me il C++ perché il codice che viene scritto è compilato sulla base delle istruzioni della macchina su cui girerà per cui a livello di istruzioni di alto livello non cambia quasi nulla (eccezion fatta per la gestione di file e altre risorse del sistema operativo). Il Java è più portabile nel senso che un programma già “compilato” per esempio in un package eseguibile .jar, può senza necessariamente essere ricompilato, essere eseguito su più sistemi operativi. Tuttavia, per programmi veramente complessi, questo è possibile solo pensando BENE durante la fase di implementazione a tutte le possibili criticità di portabilità che possono apparire durante l’esecuzione del programma e alle varie differenti tipologie di gestione delle risorse da parte della JVM (Java Virtual Machine). Rimane vero che un programma C++ compilato per Windows non girerà mai nativamente su Linux.
Qual è il migliore per il WEB e quale per il REALTIME? Java per il WEB e C++ per il REALTIME ma si tratta comunque di due stili di programmazione e di due tecnologie ben distinte, molto più complesse di quello che si può pensare quanto si inizia a programmare e dunque inutili ai fini della risposta alla domanda iniziale in quanto, quando si arriva a programmare a livello enterprise per uno dei due settori citati, si hanno le competenze per rispondersi da soli a questa domanda.
Qual è migliore per l’approccio a oggetti? Entrambi sono orientati agli oggetti ma il Java nasce tale e promuove a livello anche pubblicitario tale approccio. Il C++ rimane sotto molti aspetti, più legato all’approccio procedurale, sebbene abbia tutte le potenzialità per essere “totalmente” a oggetti come il Java.
Qual è più limitante? Dipende dalle competenze. Se si conosce a fondo il C++, non c’è (quasi) nulla che non si possa fare. In Java, difficilmente vedrò un’applicazione in grado, per esempio, di essere richiamata dal tray icon con una pressione dei tasti CTRL+T, oppure difficilmente vedrò un virus o un keylogger interamente scritto in Java.
Prendendo spunto dall’ultima domanda, e prima di passare alle conclusioni, faccio io una domanda che è più una riflessione. Senza essere esperti dell’uno o dell’altro, ma avendo delle competenze di poco superiori alla base in entrambi, cosa vieta di sviluppare velocemente un programma anche complesso in Java e superarne le possibili limitazioni di prestazioni, interfacce o risorse, creando delle librerie C++ (magari in più versioni per tutti i SO da mettere in una cartella accessibile al programma Java) e fali comunicare per esempio tramite JNI (Java Native Interface)?
***
In conclusione, la scelta di un linguaggio dipende da molti fattori e secondo me è anche limitante fermarsi a questi due linguaggi. Oggi giorno nel mercato è molto utile conoscere anche piattaforme dipendenti dal “vendor” come il framework “.NET”, richiestissimo da molte aziende. Linguaggi come C# (a mio avviso la versione Microsoft del Java) possono essere semplici come l’uno e potenti come l’altro. Si tratta solo di definire l’obiettivo, poi di scegliere come arrivarci.
Personalmente, a livello puramente accademico, ritengo che sia utilissimo iniziare con un linguaggio procedurale e ancor meglio con la programmazione logica, per esempio con il prolog o con il lisp, per apprendere i fondamenti che stanno alla base della razionalizzazione di un’applicazione. Successivamente un linguaggio come il C o il Pascal potrebbe essere utile per capire a basso livello cosa avviene tra la programmazione e l’esecuzione utente di un programma. E solo alla fine concentrarsi su una tecnologia che si ritiene importante per la propria carriera (o realizzazione personale). Non esiste solo l’approccio a oggetti…
Alcuni utili riferimenti:
Java, C++, Prolog, .NET, JNI, JVM
Tags: c++, Computer Science, confronto, informatica, java, programmazione Pubblicato in Computer Science | 2 Commenti »
6 ottobre 2009 - 9:04 by Charlenger
Da poco la BBC ha diffuso una notizia che sta facendo il giro del web in brevissimo. Hotmail, il celebre servizio e-mail di Microsoft è stato violato da una serie di cracker che hanno pubblicato online indirizzi, password e messaggi di utenti. La prima pubblicazione pare riguardasse le lettere dalla A alla B e comprendesse migliaia di indirizzi. Ciò lascia intendere che sono davvero tanti gli account violati. Nonostante Microsoft abbia confermato l’attacco, si pensa che una delle più probabili cause possa essere stata l’ingenuità degli utenti stessi, caduti in attacchi di phishing, virus diffusi attraverso msn e servizi fraudolenti.
Personalmente non mi voglio soffermare sull’attacco a Microsoft, c’è già fin troppa gente che ne parla. Tuttavia mi voglio soffermare su quanto il buon senso sia alla base della nostra sicurezza.
In effetti, non credo che in molti attraverserebbero un’autostrada trafficata con vetture che sfrecciano oltre 100 Km/h. Il problema in rete è che per molti utenti non sempre è facile distinguere ciò che è pericoloso da ciò che non lo è. Gli attacchi più comuni a cui siamo soggetti navigando la posta o utilizzando il messenger, sono sempre gli stessi che assumono forme diverse. Ecco un elenco delle cose da evitare quando si naviga su msn:
1. Non dare la propria password a nessuno, nemmeno se si tratta di un contatto, o se proprio si deve, almeno accertarsi che la persona a cui la stiamo dando (non so… il fratello perché si ha urgenza che guardi la nostra mail), sia effettivamente chi dice di essere e sia una persona privata.
2. Non dare per scontato che il proprio account sia responsabile solo della propria sicurezza. In molti si convincono che, dal momento che il loro account è usato solo per la “spazzatura” e per chattare, allora non c’è niente da proteggere. Sbagliato! Gli stessi indirizzi e-mail dei vostri contatti sono già un bene abbastanza prezioso da proteggere.
3. Non registrarsi a servizi che chiedono di immettere credenziali. Su msn ci sono tanti di quei servizi che ormai sono repository di migliaia (e chissà magari anche di quelle dell’attacco a Microsoft) nomi utente e password come “incontra i tuoi amici”, “scopri chi ti ha bloccato”, “entra gratuitamente nella posta del vicino” e così via… servizi per chi si crede furbo e invece è più ingenuo delle sue stesse vittime.
4. Tenersi aggiornati. Nessun software è perfetto, nemmeno Linux, per cui bisogna sempre tenere aggiornati i software che si utilizzano, soprattutto se operano online, dove le vulnerabilità sono esposte a un numero maggiore di rischi.
5. Informarsi, informarsi, informarsi… non credete a tutto quello che arriva per posta, siate sospettosi quando arriva qualcosa di troppo bello, troppo brutto, o semplicemente strano. Il phishing è sempre dietro l’angolo e ormai tra i vari Google, Bing, Yahoo e compagnia bella bastano pochissime keyword per scoprire se la catena di sant’Antonio che chiede una donazione è una bufala oppure no, o se la lotteria che avete vinto e che vi chiede solo di fare il “login” esiste o è un attacco.
Infine, sempre per la sicurezza, una delle cose più importanti per proteggere i propri servizi online, come hotmail ma qualunque servizio di posta o che abbia credenziali, è scegliere delle password efficaci. Infatti è inutile preoccuparsi che un cracker possa entrare nel nostro pc sfruttando l’ultima vulnerabilità scoperta, mediante supersofisticate tecniche da spionaggio industriale, quando abbiamo una password che è 12345678.
Anche per scegliere le password c’è una sola regola da rispettare: utilizzare un metodo e non solo la memoria.
Una password difficile da violare si può scegliere seguendo pochi criteri di base che sono:
1. Usare almeno 8 caratteri
2. Usare lettere maiuscole e minuscole insieme
3. Usare numeri
4. Usare caratteri speciali come “? . _” laddove permessi
Chiaramente ricordare una password così costruita non è sempre facilissimo, ma esistono delle tecniche che ciascuno può personalizzarsi in modo tale da ricordarsi tutte le password e, chissà, magari riuscire a usare una password diversa per ogni servizio internet. Alcuni esempi? Provate a scegliere il nome del vostro animale… troppo facile vero? Beh aggiungiamo un trattino basso alla fine e leghiamogli un’altra cosa, per esempio la sua razza… ancora troppo facile, mmh? Beh mettiamo le maiuscole ma alla fine di ciascuna parola, non all’inizio… e poi… sostituiamo qualche lettera con i numeri leet… a me è venuto questo: f1dO_c4nE… probabilmente è più robusta di molte password che si vedono in giro.
Di seguito l’articolo che ha ispirato il mio post:
Hotmail hole exposes e-mails
Flaw exploits system used for messages
By BBC News Online’s Alfred Hermida
Hackers have exposed a security flaw which allows you to read other people’s e-mails in Hotmail.
Details of how to read other people’s messages have been posted on a website run by a group called Root Core and it has quickly spread to other sites and newsgroups.
If you’re feeling paranoid, get your messages offline
Graham Cluley, Sophos
“This is a serious vulnerability with Hotmail,” said Graham Cluley, senior technology consultant at the anti-virus firm Sophos.
But the process is cumbersome and involves some guesswork, limiting the threat to privacy.
“The good news is that the average person in the street doesn’t need to worry, as they would have to be specifically targeted,” said Mr Cluley.
“But if you’re feeling paranoid, get your messages offline,” he added.
Messages exposed
Hotmail is one of the world’s most popular web-based e-mail services, with Microsoft saying it has more than 110 million active accounts.
“Hotmail has been notified so it might not work for much longer but it works as of right now,” says a message on the hackers’ website.
There is the potential for some serious damage
Craig Whitney, Internet Security Systems
The flaw only allows you to read specific messages. You cannot get access to the inbox or other parts of the e-mail account and you first need to log in to Hotmail using your own account.
“There is the potential for some serious damage,” said Craig Whitney, sales manager for Europe and the Middle East at the Managed Security Services division of Internet Security Systems.
The flaw exploits the way Hotmail organises messages. Every e-mail has a consistent format and the same number of digits.
To gain access to the e-mails, you need to know a person’s username and guess the number of a message.
Limited impact
To get round this long process, Root Core have devised a scanning programme that tries about one message number per second.
Mr Whitney said various factors could limit the impact of the security flaw.
He said you would need a fast internet connection to run the scanning programme and know how often someone looked at their Hotmail account.
Additionally there would be a clear trail back to the original Hotmail account used to hack another person’s e-mails.
“It raises the question of e-mail as a secure way to communicate,” said Mr Whitney, comparing it to sending a letter in a transparent envelope.
Microsoft targeted
Microsoft has taken the brunt of criticism for security flaws exposed over the internet.
Hackers have targeted its server software, Windows operating system, Outlook e-mail program, Internet Explorer browser, instant messaging software and Hotmail.
“The problem is that Hotmail is probably the most popular web-based e-mail service, so hackers are drawn to target it,” said Mr Cluley.
“It’s not necessarily that Microsoft software has more holes, but that more people are targeting their software as there is more of it.”
Root Core describes itself as a group which focuses on “information sharing not causing havoc.”
Fonte: BBC
Tags: hotmail, informatica, microsoft, password, sicurezza Pubblicato in Computer Science | 2 Commenti »
|