Paracadute di Leonardo

Tra le tante opere di genio di Leonardo forse non tutti sanno che si è occupato persino della progettazione di un primo prototipo di paracadute che, nella sua essenza, è quasi del tutto identico a quelli usati ai giorni d’oggi.

Fate click sulla foto per accedere all’album di Skydrive…

SQL: calcolare i totali progressivi

Molto spesso, durante le analisi dati richieste dai clienti, viene richiesta l’elaborazione dei totali parziali, per riuscire ad avere facilmente una idea dell’andamento progressivo dei dati.
Purtroppo nella definizione SQL standard non esiste un operatore per questo tipo di calcolo: alcuni database, come SQL Server di Microsoft, offrono una implementazione proprietaria (attualmente lo statement COMPUTE, nelle prossime versioni sostituito da ROLLUP, una sorta di “GROUP-BY”) ma se la nostra esigenza è quella di mantenere una compatibilità cross database, oppure se stiamo lavorando con un database che non supporta questo tipo di operatori, come possiamo risolvere il problema?
Supponiamo di avere una tabella Orders, così definita:
CREATE TABLE [dbo].[Orders](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [OrderID] [int] NOT NULL,
    [OrderDate] [date] NOT NULL,
    [Amount] [money] NOT NULL
)
Come possiamo estrarre i dati, calcolando il totale complessivo?
Utilizzando questa SELECT:
select O.OrderID,O.OrderDate,O.Amount,
    (select SUM(Amount) from Orders where ID<=O.ID) AS RunningAmount
from Orders O
“It’s a kind of magic!!!” O forse no? 🙂
Il campo “RunningAmount” è definito come una subquery all’interno delle query principale, che effettua la somma di tutti i valori contenuti nel campo Amount aventi come ID un indice inferiore o uguale all’ID della riga corrente.
Semplice, rapido e funzionale… e sopratutto, valido per tutti i database, senza doversi appoggiare a “fastidiose” estensioni proprietarie.

Ponte girevole di Leonardo

Continua l’opera di realizzazione dell’intera serie Revell dei modelli delle macchine di Leonardo da Vinci.
Ora è la volta del ponte girevole, per il momento probabilmente il più complesso di tutti in termini di difficoltà di realizzazione, data anche la minutezza di alcune parti e la forma complessiva dei componenti.

Fate click sulla foto per accedere all’album di Skydrive…

AirDroid: controllare Android dal nostro PC

Molto spesso abbiamo la necessità (o anche solo la voglia) di riorganizzare la nostra rubrica o accedere ai file contenuti nel nostro terminale Android dal nostro computer.
Niente di nuovo sotto il sole, basta semplicemente aprire il nostro programma di gestione preferito installato sul nostro PC e fare tutte le operazioni che voglia.
Ma, ad esempio, se non avessimo il nostro programma installato sul computer attualmente in uso e magari perché non è compatibile con il sistema operativo che stiamo utilizzando o semplicemente perché, per le policy aziendali applicate, non siete in grado di installare nulla?
In tutti questi casi, ci viene in aiuto AirDroid.
Questa applicazione (ovviamente gratuita, ma che ve lo dico a fare 🙂 ) vi consentirà di gestire il vostro terminale Android direttamente dal vostro browser, senza installare nulla sul vostro computer.
Una volta collegati all’indirizzo ip vostro terminale (per impostazione predefinita sulla porta 8888, ma è comunque personalizzabile), vi verrà richiesta la password di accesso, visualizzata sul terminale.
Una volta inserita, verrà visualizzata un desktop virtuale, attraverso il quale saremo in grado di effettuare numerose operazioni, come se stessimo lavorando direttamente con il nostro fido robottino verde collegato direttamente al computer.
Tra le tante funzionalità offerte da AirDroid possiamo:
  • Trasferire contenuti dal PC al device e viceversa
  • Impostare le suonerie
  • Inviare e gestire SMS/MMS
  • Visualizzare e gestire le foto
  • Visualizzare e gestire la rubrica

Notazione ungara: un bene o un male?

Visto il successo ed i numerosi attestati di soddisfazione circa l’ultimo post di “programmazione teorica” (Linguaggi di sviluppo: tipizzazione forte o debole?) ho pensato di dare seguito ad una serie di post che affrontino alcuni aspetti della programmazione forse meno conosciuti o poco discussi, ma con i quali ogni programmatore si trova giocoforza prima o poi a doversi confrontare.
L’argomento di discussione di oggi è la notazione ungara (o notazione ungherese) della varibili, ossia quella convensione usata in programmazione, secondo la quale nel nome della varibile è necessario indicare il suo tipo.
La notazione è stata ovviamente pensata per essere indipendente dal linguaggio ed è stata molto utilizzata nei vecchi linguaggi come il VB6 i quali, non supportando la tipizzazione forte (vedi post precedente per i dettagli sull’argomento) anche se non è mai stata ratificata alcuna specifica ufficiale circa i prefissi da utilizzare, generando quindi un po’ di anarchia.
Alcuni esempi:
  • lngCount: numero long
  • strTemp: stringa
  • hwndWindows: handle di una finestra
  • bFlag: variabile boolean
Come si diceva poco sopra, la notazione ungara è stata a lungo diffusa tra i programmatori dei linguaggi senza tipizzazione forte, perchè di ausilio durante le fasi di scrittura del codice perchè si aveva immediatamente sott’occhio, nel nome della variabile stessa, il suo tipo, aiutando quindi a prevenire triviali errori di cast.
Il mondo informatico è comunque sempre stato spaccato circa l’utilità della notazione ungara ed anche parecchie personalità importanti (come Linus Torvald) si sono schierate contro:
Inserire il tipo della funzione nel suo nome (la cosiddetta notazione ungara) è una scemenza: il compilatore conosce comunque il tipo e lo può verificare, e l’unica cosa che fa è confondere il programmatore. Non stupisce che la Microsoft [che usa questa notazione] faccia programmi difettosi.
Personalmente ho sempre trovato la notazione ungara troppo “pesante”, il codice diventa di difficile lettura oltre che di difficile manutenzione: si ipotizzi ad esempio di avere un contatore che dal tipo Int deve passare ad un tipo Long, per questioni di dimensioni: non sarà sufficiente, volendo continuare a seguire la notazione ungara, semplicemente cambiare il tipo della variabile ma sarà anche necessario rinominarla, operazione che, anche con l’ausilio di un editor avanzato che supporti il renaming automatico delle varibili, richiederà comunque un certo tempo mentre invece, se non si dispone di un editor di questo tipo, sarà necessario operare manualmente, con tutti i rischi ed i possibili errori di regressione che una operazione del genere potrebbe introdurre.
Voi cosa ne pensate? Pro o contro notazione ungara?

Come unire più immagini in un unico file PDF #2

Qualche tempo fa pubblicari questo post: Come unire più immagini in un unico file PDF dove, utilizzando Linux Mint ed ImageMagick si può, con una semplice riga di comando, convertire una serie di file immagine in un unico file PDF.
Dato che non tutti utilizzano una distribuzione Linux o comunque non hanno la voglia di smanettare da terminale, ho pensato che fosse ora di integrare il mio post precedente con un nuovo post per risolvere il medesimo problema, ma questa volta sotto i sistemi Windows.
La soluzione che vi propongo è basata su una componente poco conosciuto di PDF Creator: Images2PDF.
PDF Creatore, per chi non lo conoscesse ancora, è un ottimo software opensource che, installando una stampante virtuale sul vostro sistema vi consente di esportare in PDF qualsiasi documento da qualsiasi programma abbia una funzionalità di stampa.
Images2PDF è un componente aggiuntivo (presente comunque nel pacchetto di installazione standard) che consente, in modo molto semplice ed intuitivo di esportare in formato PDF una collezione di file immagine.
Una volta aperto, il programma si presenta con una schermata spartana, ma funzionale:
A questo punto, con un semplice Drag and Drop nell’area di sinistra, o tramite il menu “File/Import”, possiamo importare la nostra collezione di immagini.
Dopo averla importata, se necessario, possiamo riordinarla, effettuare qualche ritaglio o resize delle stesse, prima di procedere all’esportazione, anch’esso raggiungibile dal menù “File/Export”.
Un programmino semplice, senza alcun fronzolo me che svolge egregiamente  il compito per il quale è stato progettato e che farà felici non pochi “fumettari” tra di voi 🙂

Linguaggi di sviluppo: tipizzazione forte o debole?

Da una piacevole discussione nata su Twitter con il buon Matteo Capucci @mattecapu (a proposito, per chi se lo fosse perso, mi trova su twitter all’account @albertoarmida) è nato lo spunto per questo post, che più che un post informativo (come solito) vuole essere un post di riflessione per gli “addetti ai lavori” (ossia per i programmatori).
Attualmente siamo letteramente circondati da linguaggi di programmazione di livello più o meno alto, di impostazione prettamente top-down (programmazione sequenziale) o i più moderni linguaggi ad oggetti.
Qualsiasi linguaggio di programmazione che si rispetti consente all’utente di dichiarare variabili dove memorizzare i dati elaborati dai propri algoritmi, ed è proprio da questo concetto di variabile che è nata la discussione: meglio un linguaggio di programmazione debolmente tipizzato o un linguaggio fortemente tipizzato?
Prima di procedere oltre, chiariamo il concetto di tipizzazione: con tipizzazione si intende l’associazione tra una variabile ed un tipo di dato.
Molti linguaggi di programmazione consentono di avere quella che può essere definitiva come “tipizzazione debole” o “tipizzazione dinamica“, ossia una variabile è in grado di cambiare il proprio tipo durante l’esecuzione del programma.
In pseudocodice:

var x;        // (1)
x := 5;       // (2)
x := “ciao”;    // (3)

In buona sostanza quindi, alla riga 2 la variabile è di tipo intero, mentre alla riga 3 assume il tipo stringa.
Con la cosiddetta “tipizzazione forte” o “tipizzazione statica” invece una variabile in fase di chiarazione viene appunto abbinata in modo statico e definitivo ad un tipo e non può essere mai cambiato durante l’esecuzione del flusso di codice.
Sempre facendo un esempio in pseudocodice:

int x;        // (1)
x = 5;       // (2)
x = “ciao”;    // (3) → rifiutata dal compilatore

A primo acchito potrebbe venire da pensare che solo i linguaggi più antichi ed ormai superati consentano la tipizzazione debole, mentre invece i linguaggi più moderni consentono solamente la tipizzazione forte, ma non è così: PHP, ad esempio è un linguaggio debolmente tipizzato mentre invece C è fortemente tipizzato.
Non si tratta quindi di una questione legata alla vetustà o meno del linguaggio di programmazione scelto, quanto piuttosto di una vera e proprio scelta fisolofica.
I sostenitori della tipizzazione debole sostengono che le varibili debolmente tipizzate consentano una maggior flessiblità di programmazione, evitando di dover magari dichiarare un elevato numero di variabili di appoggio (per calcoli temporanei, ad esempio) per ciascun tipo.
Viceversa i sostenitori della tipizzazione forte usano questa flessibilità proprio come “arma” contro la tipizzazione debole, asserendo che il mancato controllo a priori dei tipi in fase di compilazione presta facilmente in fianco all’introduzione di bug dovuti proprio a problemi di conversione: si pensi ad esempio all’assegnazione di una variabile stringa rappresentante una data ad una variabile di tipo data piuttosto che, per un bug logico, l’utilizzo di una variabile debolmente tipizzata contenente la stringa “ciao” presupponendo che però questa contega valori numerici… il crash è assicurato.
Personalmente sono assolutamente a favore dei linguaggi fortemente tipizzati anzi, forse con una visione un po’ “talebana”, arrivo addirittura ad impostare i compilatori in modo tale da rifiutare i cast impliciti come ad esempio l’assegnazione di una variabile intero ad una variabile in virgola mobile: è fattibile, non andrà mai in crash (dato che dal punto di vista matematico, gli interi sono un sottoinsieme dei numeri in virgola mobile), ma personalmente, se questo avviene, dato che i tipi dato sono dimensionalmente diversi, a mio avviso c’è un errore nella logica dell’algoritmo.
Voi cosa ne pensate? Meglio un linguaggio “flessibile” ma forse più prono ad errori o un linguaggio più “rigido”, ma che impone quindi al programmatore un piccolo effort ulteriore in fase di programmazione, evitando però fastidiosi crash a runtime?

Swap di due numeri senza usare variabili d’appoggio #2

Nel post precedente ho postato un piccolo “trucchettino”: come fare lo swap di due numeri senza usare una variabile d’appoggio, che ha suscitato non poca curiosità da parte degli affezionati (grazie 🙂 ) che seguono questo blog.
Da più di una persona mi è arrivata la richiesta di spiegare passo passo i passaggi della procedura esposta. ***SPOILER***: se ancora ci state ragionando sopra e non volete sapere la situazione, non proseguite la lettura.
La metodologia esposta si basa sull’algoritmo detto di XOR Swap, ossia sull’applicazione dell’operatore XOR bit per bit ai numeri. La tabella di verità dell’operatore XOR è:
In buona sostanza quindi, l’algoritmo si basa sulla proprietà dell’operatore XOR tale per cui
(x ^ y) ^ x = y
Riprendiamo quindi l’esempio numerico dell’altra volta:
int x = 7, y = 5;
Trasformando in binario:
x = 111
y = 101
Ora applichiamo le operazioni, ricordandoci di applicare lo XOR bit per bit, quindi il primo bit del primo numero con il primo bit del secondo numero, e così via:
x = x ^ y = 111 ^ 101 = 010
y = y ^ x = 101 ^ 010 = 111
x = x ^ y = 010 ^ 111 = 101

Alla fine otteniamo quindi:
x = 101
y = 111
Ossia… lo swap dei due valori iniziali! Resta di stucco… è un barbatrucco! 🙂
Che ne dite, me la merito una birretta? Il widget per le donazioni con PayPal è in alto a destra 😉

Swap di due numeri senza usare una variabile d’appoggio

L’altra settimana, ad un amico neo-programmatore, ho posto questo quesito: “Scrivimi il codice per effettuare lo swap di due variabili senza usarne una terza di appoggio” (vecchio quesito che mi aveva posto a suo tempo il mio professore di Ingegneria del Software).
Ovviamente, non era consentito cercare la soluzione in Internet! 🙂
La soluzione “classica” prevede l’uso di una variabile di appoggio, quindi:
int x = 7, y = 5, z;
z = x;
x = y;
y = z;
E fin qui tutto chiaro 🙂 Ma come farlo senza utilizzare “z”?
Dopo una settimana, è stata “gettata la spugna” da parte del mio amico quindi vi pubblico qui la soluzione:

int x = 7, y = 5;

x ^= y;
y ^= x;
x ^= y;

O, su una linea sola (per gli amanti della brevità):

x ^= y ^= x ^= y;

Chi di voi ha capito il trucco? 🙂

09/02/2012 Edit: se volete vedere la spiegazione dettagliata del funzionamento, potete fare riferimento al post successivo.