Wolfram Alpha, motore di Conoscenza Aggiungi un commento

15 settembre 2009, 16:33

Ieri il mio amico e collega informatico/programmatore Paolo (che spero di vedere presto in una home sua) mi ha mostrato Wolfram|Alpha, web application definita come “Motore computazionale di conoscenza”. Sviluppato dalla Wolfram Research, il suo scopo è presentare la conoscenza in una forma più descrittiva e puntuale di una serie di link (come ad esempio fa un motore di ricerca).

Wolfram|Alpha saluta

La Wolfram Research è la società privata di Steven Wolfram il cui prodotto più noto è Mathematica, suite per operazioni matematiche di qualsiasi tipo. La mia esperienza con Mathematica si riduce ad una ventina di ore di laboratorio durante il corso di Teoria dei sistemi (Elementi), dove l’usavamo per calcolare output di sistemi ingresso-uscita e la soluzione di equazioni differenziali.

Wolfram|Alpha è basato sullo stesso software, quindi può riconoscere espressioni matematiche  (anche in linguaggio più o meno naturale) e comportarsi di conseguenza. Qui due esempi, con una funzione complessa e una semplice:

Funzione semplice su Wolfram|AlphaFunzione complessa su Wolfram|Alpha

Con Internet a disposizione ed una stampante, situazione tipica nel laboratorio di una qualsiasi scuola moderna, si può stampare al volo un foglio di riferimento completo per qualsiasi funzione richiesta: derivata prima o seconda, limiti notevoli, integrale definito e indefinito, espansione in serie se applicabile, grafico… insomma, veramente ottimo, ma quasi scontato, almeno procedendo sui passi di un software come Mathematica che esiste da 20 anni per quell’unico scopo.

Ciò che è meno facile, Wolfram|Alpha si presenta come un motore computazionale di tutta la conoscenza. E’ ancora nella sua prima infanzia, essendo stato lanciato il 15 maggio, ma già si possono fare domande come “Quanti anni ha il principe Carlo?” o “Dove sono?” e lui risponderà in maniera appropriata. Anche domande come il valore nutrizionale di una mela, la 12ma nazione ordinata per numero di donne, per non parlare di costanti fisiche e valori notevoli, conversioni tra unità di misura, ecc. trovano pronta e spesso esauriente risposta.

Non mancano strizzatine d’occhio alle domande che un nerd potrebbe porre:

Wolfram|Alpha non disdegna di rispondere ad alcune domande personali:

  • Chi sei?
  • Dove vivi?
  • Sei Skynet? (Risposta: “No, Skynet raggiunse l’autocoscienza il 29 agosto 1997 alle 02.14 AM, ora della Costa Orientale. Io, al contrario, non sono stato messo in funzione fino al 15 maggio 2009. Inoltre, apprezzo modalità di interazione con gli umani che non involvano necessariamente l’uso di missili nucleari.”)

E infine, una buona ragione di vita per ogni persona curiosa:

Non è perfetto, ma già risultati del genere erano quasi impensabili, poniamo, 10 anni fa… e prima, erano ipotizzabili solo da un supercomputer che alla domanda “Esiste Dio?” rispondeva, dopo aver assorbito la conoscenza e la potenza di calcolo dell’Universo intero: “Sì, adesso Dio c’è” (Frederic Brown, La risposta).

In via di elaborazione sono l’estensione del motore di conoscenza ad argomenti di programmazione, complessità computazionale e conversazione naturale, à la Jabberwacky o Eliza. Inoltre, il motore per ora parla solo inglese, ma nuovi linguaggi verranno sicuramente aggiunti in futuro.

In definitiva, Wolfram|Alpha mira a diventare una raccolta organizzata di “tutto il sapere oggettivo: implementare ogni modello, metodo e algoritmo conosciuto; rendere tutta la conoscenza sistematica immediatamente calcolabile e accessibile da chiunque ” (About Wolfram|Alpha).

Laurea, C++ e MFC Aggiungi un commento

18 maggio 2009, 17:59

Tre settimane fa (oddio, come passa il tempo) mi sono laureato, finalmente. Com’è che non l’ho scritto subito? Perchè in generale evito di dire cose “personali” su questo sito, ma suppongo che una laurea in Informatica abbia qualche rilevanza dal punto di vista… beh, dell’Informatica. Anche se questa rilevanza si riduce ad essere “Ecco, esiste un laureato in Informatica in più sul pianeta.”

Produrrà qualcosa di buono, il suddetto laureato? Sta a lui. E visto che non si ottiene nulla senza provarci infinite volte, ho cominciato a studiare per conto mio la creazione di applicazioni con GUI su Windows, usando le librerie della Microsoft Foundation Classes, che dal 1992 incapsulano le Windows API (a.k.a. Win32 API) dando un maggiore controllo sulla creazione di applicazioni per Windows. Ho provato ad usare direttamente Win32, secondo il principio che hardcore è meglio, ma dopo aver visto che i bottoni apparivano sotto Windows 7 come se venissero direttamente da Windows 95, ho rinunciato.

MFC non è difficile da usare… sempre che si abbia la memoria di un elefante, cosa particolarmente richiesta nell’ambito della programmazione di interfacce in C++. Non è come le Swing di Java, che hanno contribuito a creare il mio beneamato progetto di stage, in cui il programmatore può estendere JFrame e chiamare SetVisible(true) su un oggetto della classe estesa e in cui ogni elemento ha nomi facili da memorizzare e mille metodi per fare ogni cosa. Ma non è nemmeno come Win32 nativo, in cui per far comparire una finestra vuota servono non meno di 70 righe di codice… di cui la maggior parte obsoleto e inutile.

Una volta presa familiarità con typedefs come LPCWSTR (Long Pointer to Constant Wide-character String, puntatore a una stringa non modificabile di caratteri a 16 bit) e CComPtr<T> (Component Object Model Pointer, MFC wrapper attorno a un puntatore ad oggetti COM di tipo T), MESSAGE_MAPs e HRESULT, non va poi così male.

Aggiungete l’essersi accorto di una caratteristica mancante in Windows 7, piccola ma leggermente scomoda, un po’ di manipolazione di XML (mediante XmlLite) e otterrete il primo programma nell’appena inaugurata sezione download. Sentitevi liberi di usare i programmi che troverete là (non so con quale frequenza) e lasciare tutti i commenti che volete!

Filosofia della programmazione ad oggetti Aggiungi un commento

30 gennaio 2009, 15:12

Da quando mi sono avvicinato alla programmazione ad oggetti, anni fa, durante il corso di Programmazione da 12 crediti, mi è sempre parso un metodo piuttosto comodo per programmare, secondo certe esigenze. Non dico di non aver trovato di meglio, ma quasi.

Un oggetto non è altro che un insieme vivente e coerente di caratteristiche e comportamenti. Vivente perchè può nascere, morire, figliare (e i figli ne ereditano qualsiasi tratto)… ma anche perdersi, impazzire, esplodere trascinando nella tomba altri oggetti (e il programma stesso, se non si sta attenti).

Al tempo dell’esame di Programmazione, sapevo cos’è un oggetto solo secondo la patriarcale concezione Java in cui “tutto deriva da Object”, dunque qualsiasi programma si compone di oggetti, qualsiasi struttura dati è un oggetto e così via: ammirevole, perchè permette di poter richiedere, ad esempio, il campo length su qualsiasi array, ma questo l’ho scoperto solo più tardi.

La vera bellezza degli oggetti mi è stata svelata anni dopo, quando ho imparato parte di C# per poter programmare nel framework XNA. Là, potevo definire una classe “Renderable”, che definisce qualsiasi oggetto visualizzabile sullo schermo; definire una classe “Ball” figlia di Renderable, e le classi RedBall, BlueBall, BlackBall tutte figlie di Ball. Un oggetto rappresenta, quindi, numerosi livelli di astrazione prima della definizione vera e propria di un’entità. E l’approccio, se usato bene, funziona anche quando si ha bisogno (ancora) di pochi oggetti, perchè saranno comunque brevi, ben definiti e riutilizzabili: modulari.

Fin qui, tutto rose e fiori. Ma se il paradigma ad oggetti va fuori controllo, se si tenta di usare oggetti contro natura, ci si trova con un’orribile zuppa di codice piena di oggetti qua e là, magari usati una sola volta, variabili singleton, enti statici. Un ibrido di paradigma imperativo e ad oggetti, realmente nessuno dei due. Se poi non è commentata, peggio ancora: diventa inutilizzabile; ma questo vale per qualsiasi codice.

Il mio assegnamento di stage è la creazione di uno strumento interattivo per la realizzazione del metodo del simplesso. L’ho chiamato Simply. Sto creando l’interfaccia a mano, il che è già un conseguimento non da poco; ma meglio ancora, sto cercando di applicare il paradigma ad oggetti dove possibile. Ad esempio, ma finora sono solo prototipi di idee, l’algoritmo del simplesso è un oggetto, ogni variabile è un oggetto (in grado di dirmi se è una variabile di base, se è originale o slack e di rispondere con il proprio numero se interrogata), ogni parte dell’interfaccia è un oggetto in cui non avviene nessuna computazione: l’interfaccia deve preoccuparsi di fare l’interfaccia. Fare altrimenti, complicherebbe solo le cose e snaturerebbe il paradigma ad oggetti. Un cane non è anche un gatto che è un canarino, è semplicemente un cane. (Tutti sono animali, però).

Auguratemi buon lavoro e buona voglia, ne ho bisogno!

P.s.: A tutti gli amanti del Gibber Italicus, in foto: Non volevo offendere voi né il nobile animale, ma solo porre un esempio di forme non propriamente definibili con forme “standard”.