sabato 28 aprile 2012

Una bussola con javascript

Partendo dalla libreria Highstock o Highcharts (http://www.highcharts.com/) è possibile realizzare una semplice ma funzionale bussola in Javascript che indichi i punti cardinali e una direzione.
Come detto sopra occorre la libreria Highstock, la cui licenza è a pagamento ma è possibile scaricarla gratuitamente dal sito per provarla. Ritengo questa forma di vendita davvero intelligente in quanto permette agli sviluppatori di provare il prodotto prima di comprarlo.
Per far funzionare la nostra bussola sarà necessario includere la libreria nel nostro sito. Ci basterà aggiungerla nell'header con questo codice

<script src="http://www.agriculturalsupport.it/wp-content/themes/provisionpress/js/highstock.js" type="text/javascript">

</script>


Passiamo quindi alla creazione di un DIV con un ID specifico all'interno della pagina.



<div id="chart"></div>



A questo punto non dobbiamo fare altro che creare un grafico di tipo "gauge". Ovvero i grafici che indicano un valore con la lancetta. In rete si trovano esempi di come creare gauge a 180° ovvero π, ma noi dovremmo crearlo a 360° o meglio a .

function drawDial(options) {

var mis= 90;

var renderTo = options.renderTo,

    value = options.value,

    centerX = options.centerX,

    centerY = options.centerY,

    min = options.min,

    max = options.max,

    minAngle = options.minAngle,

    maxAngle = options.maxAngle,

    tickInterval = options.tickInterval,

    ranges = options.ranges;

    

var renderer = new Highcharts.Renderer(

    document.getElementById(renderTo),

    240,

    240

);





// internals

var angle,

    pivot;



function valueToAngle(value) {

    return (maxAngle - minAngle) / (max - min) * value-Math.PI/2 + minAngle;

}



function setValue(value) {

    // the pivot

    angle = valueToAngle(value);

    

    var path = [

         'M',

         centerX, centerY,

         'L',

         centerX + mis * Math.cos(angle), centerY + mis * Math.sin(angle)

     ];

    

    if (!pivot) {

        pivot = renderer.path(path)

        .attr({

            stroke: 'black',

            'stroke-width': 3

        })

        .add();

    } else {

        pivot.attr({

            d: path

        });

    }

}



// background area

renderer.arc(centerX, centerY, mis+5, 0, minAngle, maxAngle)

    .attr({

        fill: {

            linearGradient: [0, 0, 0, 200],

            stops: [

                [0, '#FFF'],

                [1, '#DDD']

            ]

        },

        stroke: 'silver',

        'stroke-width': 1

    })

    .add();





// ranges

$.each(ranges, function(i, rangesOptions) {

    renderer.arc(

        centerX,

        centerY,

        mis,

        mis-5,

        valueToAngle(rangesOptions.from),

        valueToAngle(rangesOptions.to)

    )

    .attr({

        fill: rangesOptions.color

    })

    .add();

});



// ticks

var dir;

for (var i = min; i <= max; i += tickInterval) {

dir=''

        if (i==0){dir='N'}

    if (i==90){dir='E'}

    if (i==180){dir='S'}

    if (i==270){dir='W'}

            if (i==360){dir='N'}

    angle = valueToAngle(i);

    

    // draw the tick marker

    renderer.path([

            'M',

            centerX + 90 * Math.cos(angle), centerY + 90 * Math.sin(angle),

            'L',

            centerX + 70 * Math.cos(angle), centerY + 70 * Math.sin(angle)

        ])

        .attr({

            stroke: 'silver',

            'stroke-width': 2

        })

        .add();

    

    // draw the text

    renderer.text(

            dir,

            centerX + 90 * Math.cos(angle),

            centerY + 90 * Math.sin(angle)

        )

        .attr({

            align: 'center'

        })

        .add();

    

}



// the initial value

setValue(value);



// center disc

renderer.circle(centerX, centerY, 20)

    .attr({

        fill: '#4572A7',

        stroke: 'black',

        'stroke-width': 1

    })

    .add();



return {

    setValue: setValue

};



}

    

    

// Build the dial

var dial = drawDial({

    renderTo: 'statsframe',

    value: 250, //<-- questo valore espresso in gradi indica la direzione

    centerX: 120,

    centerY: 120,

    min: 0,

    max: 360,

    minAngle: 0,

    maxAngle: 2*Math.PI,

    tickInterval: 45,

    ranges: [{

        from: 0,

        to: 45,

        color: '#D3fd53'

    }, {

        from: 45,

        to: 90,

        color: 'transparent'

    }, {

        from: 90,

        to: 135,

        color: '#D3fd53'

    }, {

        from: 135,

        to: 180,

        color: 'transparent'

    }, {

        from: 180,

        to: 225,

        color: '#D3fd53'

    }, {

        from: 225,

        to: 270,

        color: 'transparent'

    }, {

        from: 270,

        to: 315,

        color: '#D3fd53'

    }, {

        from: 315,

        to: 360,

        color: 'transparent'

    }]

});


Nel codice soprastante la variabile "mis" è utilizzata per stabilire la grandezza della nostra bussola. Assegnandole valori più grandi si ingrandirà anche la bussola. Dobbiamo però prestare attenzione anche ai parametri della variabile "render" che vanno a stabilire larghezza e lunghezza del div su cui la bussola viene rappresentata.
Per direzionare l'ago della bussola non dobbiamo fare altro che cambiare il valore del parametro "value" nella variabile dial, che è quella che costruisce il grafico. Il valore è espresso in gradi, perciò se vogliamo indicare il Nord il valore da assegnare sarà 0 (o 360), per l'Est sarà 90, per il Sud 180, per l'Ovest 270. Ovviamente possiamo assegnare un qualsiasi valore intermedio.

giovedì 12 aprile 2012

Google Current, ogni blog un'app

È sbarcato in Italia Google Current. Ottimo strumento pensato dalla casa di Mountain View. Cosa fa?
Potremmo definirlo un aggregatore di notizie, ma sarebbe un doppione di Google News se fosse così semplice; con questo strumento le notizie pubblicate non sono scelte da Google, ma dai lettori e dai publishers. Per diventare publisher e iniziare a pubblicare le proprie notizie è sufficiente avere un feed RSS che le raccolga e iscriversi a Current andando su https://www.google.com/producer/home (attenzione è necessario usare Google Chrome).
Il pannello di controllo ci consente di creare la nostra App personalizzata (nulla di straordinario, ma ci sono date delle buone possibilità preimpostate) in cui raccogliere gli articoli del nostro blog. Possiamo creare sezioni personalizzate della nostra applicazione corrispondenti a diversi feed o al canale Youtube. Il nostro lettore, dopo aver scaricato Google Current sul proprio tablet o smartphone (Android o iOS) potrà decidere di seguire il blog da noi pubblicato. Tra le opportunità di Google Current la possibilità di decidere la lingua predefinita, la traduzione automatica, i Paesi da escludere o includere nella pubblicazione.
Davvero un ottimo strumento per la diffusione dei nostri contenuti. Sicuramente Current si colloca nella via scelta da Google di premiare i produttori di contenuti interessanti per gli utenti della rete.

sabato 7 aprile 2012

La Regenbogenfabrik di Kreuzberg, Berlino

Trovandomi a Berlino non ho potuto non acquistare una bicicletta, ovviamente usata, ovviamente al Mauerpark.
Ma come ognuno di noi sa, ogni bici usata necessita di revisioni, stringimenti di bulloni, oliate e una serie di altre operazioni che possono rendere il nostro economico acquisto qualcosa di cui andare fieri, aggiungendo con il nostro lavoro quel valore che abbiamo risparmiato nell'acquisto.
Per fare questo però necessitiamo di parecchi strumenti, che se andassimo ad acquistare rischierebbero di farci perdere quel poco che abbiamo risparmiato con la scelta dell'usato. Per questo ho scoperto che qui a Berlino esiste la Regenbogenfabrik che oltre ad essere ostello, centro culturale, cinema, bar ecc. è anche un'officina per la riparazione delle biciclette. Con 3€ l'ora posso riparare la mia bici utilizzando i loro ottimi strumenti. L'ambiente è amichevole e i meccanici sono sempre disposti a dare una mano; è piuttosto frequentata per cui occorre scegliere le ore giuste.
Il loro sito nel quale reperire le informazioni sulle loro attività e sugli orari: http://www.regenbogenfabrik.de.

Google Art Project: che museo vuoi visitare oggi?

Un anno fa Google ha creato uno strumento potentissimo per avvicinare gli utenti all'arte: Google Art project. Ha reso possibile che stando seduti davanti al pc si possa entrare virtualmente nei musei e vedere le opere nel dettaglio. Un po' di numeri: il progetto originale contava 17 musei in nove paesi e 1.000 immagini, quasi tutti dipinti di maestri occidentali, oggi l'Art Project include più di 30.000 opere d'arte ad alta risoluzione (di cui 46 con "gigapixel"), con immagini di Street View per 46 musei. Quindi non solo dipinti, ma anche scultura, street art e fotografie provenienti da 151 musei di 40 paesi.
Alcuni giorni fa è stato potenziato, sono state introdotte: nuove funzioni di ricerca (per periodo, artista o il tipo di opere d'arte), l'integrazione con Google+ e Google Maps e uno speciale Street View "trolley" a 360 gradi. Come gli stessi autori affermano è uno strumento ideale per gli studenti (e io aggiungo anche per gli insegnanti!) perchè si può costruire la propria galleria personalizzata, aggiungere commenti ad ogni dipinto e condividere l'intera collezione con amici e familiari. 

venerdì 6 aprile 2012

Ufficializzata la RC di Gimp 2.8


Il più noto editor grafico open source è l'alternativa libera ad Adobe Photoshop. Certo ne deve fare ancora molta di strada per avvicinarsi, ma se uno si accontenta e sa essere creativo nelle soluzioni troverà in esso un buono strumento.
Dopo un bel po' di tempo sta forse per essere rilasciata una nuova versione, infatti il team di sviluppo di GIMP ha ufficializzato la RC della versione 2.8.

Tra le modifiche più rilevanti:
  • I progetti ora possono essere effettuati solo in formato XCF nativo di GIMP. L'esportazione diventa un'operazione separata e differente
  • E’ possibile avere stili di testo diversi nello stesso livello. La modifica del testo non sarà più eseguita su una finestra separata ma direttamente sul livello.
  • E’ possibile specificare le dimensioni anche con espressioni matematiche modificando gli attributi con percentuali, somme algebriche ecc..
  • Migliorato il motore dei pennelli.
  • E’ possibile salvare i nostri set di strumenti.
  • Aggiunto il filtro Cage
  • Introdotta la possibilità di taggare le risorse GIMP, come i pennelli e i patterns.
  • Altre piccole migliorie e bugfix.

Non si conosce ancora la data di rilascio della versione ufficiale, ma queste modifiche sembrano davvero ottime e sentite come necessarie dagli utenti