Microsoft e jQuery (sembra uno scherzo, ma non lo è)

Risale a qualche minuto fa la notizia che Microsoft ha stretto una partnership con il team di jQuery non solo per supportare ufficialmente questa libreria all'interno dei suoi prodotti di sviluppo come Visual Studio 2008 e la versione free di Visual Web Developer ma anche per distribuirla in alcune sue librerie web-oriented come l'ormai prossima ASP.NET MVC o AJAX Control Toolkit. Il supporto negli ambienti di sviluppo sarà fornito inizialmente da un pacchetto scaricabile gratuitamente nelle prossime settimane mentre in futuro sarà integrato direttamente in Visual Studio. Vorrei citare solo due passaggi, il primo dal blog di Scott Guthrie che riporta l'annuncio:

We will distribute the jQuery JavaScript library as-is, and will not be forking or changing the source from the main jQuery branch.  The files will continue to use and ship under the existing jQuery MIT license.

Il secondo invece arriva dal post di Scott Hanselman (e che in effetti riassume uno dei principali motivi per cui questo annuncio mi ha stupito):

Folks have said Microsoft would never include Open Source in the platform, I'm hoping this move is representative of a bright future.

Ecco i rispettivi annunci ufficiali da parte di Scott Guthrie e John Resig (il quale estende la notizia riportando anche la collaborazione ufficiale di jQuery con Nokia).

Sinatra has taken the stage!

Non si tratta del compianto Frank, ma di uno degli ultimi framework per lo sviluppo web arrivati in casa Ruby. La caratteristica principale di Sinatra è la sua semplicità, ancora più spinta rispetto a quella a volte anche un po' troppo magica di Camping: con sole 5 righe è possibile ottenere una risposta dal server. Non ci credete? Allora, dopo averlo installato usando rubygems (gem install sinatra -y), provate il seguente codice...

# main.rb require 'rubygems' require 'sinatra' get '/' do 'Cool, Sinatra is performing on the main stage!' end

Usando il comando ruby main.rb si ottiene un'istanza di Mongrel con la nostra applicazione pronta a ricevere le chiamate dal browser, mentre nella finestra del terminale si viene avvisati che Sinatra has taken the stage on port 4567! Non resta da far altro che verificare l'effettivo funzionamento con un semplice wget -qO- http://localhost:4567/ (oppure curl http://localhost:4567/ se preferite):

Cool, Sinatra is performing on the main stage!

Sinatra può essere definito un micro-framework traverstito da DSL dotato di una grammatica ridotta, semplice e immediata. Sinatra non obbliga lo sviluppatore a strutturare la propria applicazione seguendo l'architettura MVC (ma è comunque possibile replicarla), non è legato a un particolare motore di template (ma supporta molto bene ERB e l'ottimo HAML), non offre la miriade di helpers inclusi nel prezzo come altri framework e inoltre è assolutamente ORM-agnostico: tutto ciò può avere i suoi pro e contro, ma queste caratteristiche lo rendono indubbiamente un ottimo framework per lo sviluppo di prototipi o di applicazioni semplici ma relativamente veloci. Sinatra, per come è strutturato, promuove inoltre lo sviluppo di interfacce REST per le proprie applicazioni web, rendendolo quindi uno strumento agevole per prototipizzare API.

get '/' do # mostra risorsa end post '/' do # crea risorsa end put '/' do # aggiorna risorsa end delete '/' do # cancella risorsa end

Viene naturale a questo punto chiedersi come vengano gestite le rotte, ma anche in questo caso è tutto molto semplice e intuitivo:

get '/hello' do redirect '/hello/anonymous' end get '/hello/anonymous' do 'Hello Mr. Anonymous, I would be glad to know your name!' end get '/hello/:name' do user = params[:name] "Hello, #{user}!" end # wget -qO- http://localhost:4567/hello # Hello Mr. Anonymous, I would be glad to know your name! # wget -qO- http://localhost:4567/hello/anonymous # Hello Mr. Anonymous, I would be glad to know your name! # wget -qO- http://localhost:4567/hello/NRK # Hello, NRK!

Occorre solamente far notare che Sinatra effettua il lookup delle rotte nell'ordine di definizione, per questo motivo la seconda rotta /hello/anonymous non viene catturata dalla terza che invece specifica un più generico /hello/:name. Concentrandosi appunto su quest'ultima, possiamo notare come più in generale le variabili all'interno di una rotta possano essere definite semplicemente sfruttando la stessa sintassi utilizzata per definire un simbolo in Ruby e come esse vengano automaticamente rese disponibili nell'hash params.

Se avessimo bisogno di un approccio più in stile MVC? Partendo dal presupposto che con Sinatra non serve creare una classe controller ma basta definire le singole azioni, a questo punto mancano solo le viste. Occorre quindi creare una directory views nel path della nostra applicazione, preparare il proprio template salvando il file relativo nella suddetta directory (per esempio greet.haml oppure greet.erb a seconda di quale motore di template vogliate usare) e scrivere una semplice riga di codice per la rotta:

get '/hello/:name' do haml :greet end

Per convenzione Sinatra effettua l'autocompletamento del nome del file della vista aggiungendo .haml o .erb, per cui basta specificarne il nome. Se avessi voluto utilizzare erb avrei scritto erb :greet ma dal momento che haml tutto sommato mi piace (gem install haml), ecco qui il codice d'esempio assolutamente minimale:

!!! %html %head %title Greetings! %body %span Hello, %strong= params[:name]

A questo punto la chiamata a http://localhost:4567/hello/NRK produrrà il seguente output:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Greetings!</title> </head> <body> <span> Hello, <strong>NRK</strong> </span> </body> </html>

Tutto molto semplice, no?

Sinatra è in una fase di sviluppo abbastanza attiva ma è un framework già particolarmente interessante per tutte quelle necessità in cui Ruby on Rails oppure framework similari risulterebbero soluzioni spropositate. Essendo basato su Rack è possibile servire le applicazioni usando server differenti da Mongrel, come per esempio Thin o Phusion Passenger via Apache. Personalmente lo sto provando nei ritagli di tempo per creare una sorta di gateway da un servizio JSON-RPC che avevo realizzato qualche tempo fa a un servizio REST-oriented con tanto di interfaccia web per la gestione delle azioni e la visualizzazione dei dati, per ora sono molto soddisfatto della sua semplicità.

Ping? Pong! Spizzichi di Chrome, virtual machine, io, telecomandi e ruby

Per esserci ci sono... sì insomma, esisto ancora. Il fatto è che non avevo alcuna voglia di scrivere sul blog e mi scuso per questo, purtroppo però non riuscirò mai a rientrare nella logica blogorroica e spesso prettamente italica secondo cui l'assenza di un flusso costante di messaggi, possibilmente con cadenza giornaliera e magari anche quando da scrivere non si avrebbe proprio nulla, equivale a essere marchiati a fuoco come bloggher un po' scarsi. Oddio in effetti un po' scarso lo sono in questo senso (oso addirittura fregarmene delle statistiche!), però il fatto di non aver scritto per più di un mese non mi stupisce troppo dal momento che periodi simili mi sono capitati anche in passato in quel di usenet, quando ci bazzicavo una decina di anni fa. Tuttavia, in passato come oggi, il risultato finale è sempre lo stesso: rieccomi. Ah beh, che culo!

Digressioni & deliri messi da parte, ci terrei a confessarvi di avere una discreta quantità di argomenti utili e interessanti (spero) su cui scrivere, mi auguro di avere il tempo materiale per riuscire nell'impresa, prima però preferirei seguire un percorso riabilitativo al posting abbastanza dolce per cui... ecco il temibile tag <ul/>, una bella unordered list per voi:

  • Chrome. Google è un fenomeno del marketing, me lo fa pensare il fatto che tutti stiano andando pazzi per un browser che fondamentalmente... crasha. Ehi, però crashano i singoli tab, mica tutto il browser: accidenti scusate, allora è tutto ok posso unirmi al delirio generalizzato! 🙂 Ironie e crash a parte, il browser è veloce e in effetti v8 è una scheggia, magari non sempre sovraumana in tutte le circostanze come vorrebbero far credere con i benchmark studiati ad hoc ma si tratta comunque dell'engine ECMAScript/Javascript più performante attualmente in circolazione, lo sta dimostrando con dei fatti. Il browser in sè potrebbe non essere malvagio, ma magari ci rivedremo più avanti quando Google l'avrà sistemato ancora un po', avrà fatto uscire qualcosa di compilato anche per le altre piattaforme e magari, già che sono in ballo, avrà smesso di fare presunti pasticci con l'EULA. Per ora sulla mia macchina virtuale linux di sviluppo sono rimasti solo i sorgenti di v8 e il risultato della loro compilazione, mi interessano molto di più di tutto il resto.
  • A proposito di macchine virtuali, ho acquistato una VPS linux con SliceHost scegliendo il loro piano di base da 20$/mese. In seguito ho registrato un nuovo nome di dominio con Aruba (mi tornava comodo solo per la registrazione, infatti ho provveduto a cambiare immediatamente i nameserver autoritativi con quelli di SliceHost appena è stato possibile) e infine per gestire la posta ho creato un account di Google Apps sottoscrivendo il profilo standard nonché gratuito. Livello di soddisfazione: elevato, per ora. Ho diverse idee in testa, tra le varie figura anche la migrazione di questo blog (come del resto mi ripropongo da almeno due anni), ma ogni cosa avverrà a tempo debito.
  • Scusate se non ve l'ho mai detto, ma io è un linguaggio di programmazione grandioso. Dinamico, basato sulla prototipizzazione degli oggetti come Javascript, interamente orientato ai messaggi, totalmente privo di keywords, dannatamente curioso e divertente da scoprire. Ok è molto giovane, ci sono pochissime librerie e la documentazione non è propriamente aggiornata con lo stato dello sviluppo, inoltre è probabile che non sarà nemmeno la next big thing in programming (anche se non si sa mai), però vi assicuro che è un linguaggio molto divertente.
  • L'altro giorno ho acquistato il gadget allegato all'ultimo numero di Win Magazine (mai comprato in vita mia, sia chiaro): un telecomando IR per PC e Media Center, completo ovviamente di ricevitore USB. Semplice, sottile, 15€... ne volevo uno da tempo, ma non lo desideravo abbastanza intensamente da giustificare una spesa da 30€ o più. Peccato però che non sembri andare molto d'accordo con Zoom Player (da anni il mio player video per Windows preferito) per quanto riguarda la mappatura dei comandi. Fortunatamente però ZP è grande e può essere remotato in maniera piuttosto banale e documentata via TCP/IP oppure usando l'API SendMessage di Windows, per cui ho pensato: perché non sviluppare un'applicazione residente in background che ascolti i comandi provenienti dal mio bel telecomando e li traduca in comandi da inviare a ZP, mappando il tutto come diamine voglio io? Ci sto lavorando in C#, anche se il core è più lavoro di interazione con le API Win32 che altro. Qualche messaggio sull'argomento approderà anche su questi lidi.
  • Dalla saga del telecomando è scaturito quasi per caso un altro piccolo progetto, questa volta più generico e potenzialmente più utile anche ad altri. L'idea inziale per l'applicazione di cui vi ho accennato poco sopra prevedeva l'utilizzo integrale di IronRuby per la sua realizzazione, tuttavia mi sono accorto presto che le sue capacità di interop sono ancora particolarmente limitate per diversi aspetti (ecco perché ho scelto di usare C#). In compenso il codice che ho scritto per le prove mi ha portato all'idea di effettuare un porting per IronRuby del modulo Win32API distribuito nella standard lib dell'MRI, il tutto in onore di una sana compatibility-love. Dopo 3 giorni avevo già una prima versione funzionante come testimoniato da questo gist, ora inizia il lavoro di pulizia e ottimizzazioni che si concluderanno con il rilascio del tutto su GitHub e con una serie di post sul blog dedicati all'argomento dal momento che ci sono svariate considerazioni tecniche che potrebbero risultare particolarmente interessanti.

Per ora è tutto. Per ora...

Gist, il pastebin definitivo

Oggi come oggi esiste una moltitudine di servizi pastebin sparsi per internet ma da qualche giorno è stato aperto quello che attualmente considero essere il pastebin definitivo: Gist. Gist è offerto dall'ormai noto GitHub, il servizio di hosting di progetti probabilmente più in voga in questo momento, e può vantare funzionalità piuttosto interessanti come:

  • supporto per una settantina di linguaggi/grammatiche differenti... anche se manca LOLCode, nonostante ci sia Brainfuck 🙂
  • pastie (qui chiamati gist) pubblici o privati, anonimi oppure "identificati" se effettuati tramite il proprio account GitHub. Le operazioni, in questo caso, sono elencate all'interno della dashboard
  • ogni gist può essere composto da file multipli, con possibilità di scaricare comodamente la versione raw di ogni file oppure di effettuare il download del pacchetto intero in formato tar.gz
  • possibilità di modificare i propri gist con tanto di accesso allo storico delle varie revisioni
  • clone URL pubblici e privati per ogni singolo gist, pronti per essere dati in pasto a Git

Provatelo, è veramente ottimo. Giusto per curiosità, questa è la pagina con i miei Gist pubblici...

LuaRocks! Ovvero, un comodo package manager per le librerie di Lua

Lua è un linguaggio di programmazione dinamico e portabile particolarmente noto e utilizzato come linguaggio embdedded grazie ad alcune caratteristiche, proprie e della sua VM, che lo rendono ottimo per lo scripting di applicazioni più o meno complesse scritte in altri linguaggi, solitamente compilati. Ovviamente può essere utilizzato anche per programmare intere applicazioni oppure semplicemente script di automazione, ma in casi simili è molto facile che ci si ritrovi con la necessità di utilizzare librerie esterne da installare e gestire separatamente e manualmente: Lua infatti, diversamente da linguaggi come Ruby o Python, nella sua distribuzione ufficiale non fornisce un set di librerie standard insieme al runtime. Il crescente numero di queste librerie di terze parti ha cominciato a rendere difficile la gestione delle stesse nei propri sistemi e per questo, quasi un anno fa, è nato LuaRocks, un progetto per la realizzazione di sistema di distribuzione e gestione di moduli per Lua che per certi versi risulta essere molto simile a RubyGems.

Attualmente per installare LuaRocks nella maggior parte delle distribuzioni Linux è necessario prelevare il tarball ed eseguire i soliti passaggi ./configure && make && make install, tuttavia l'installazione sulle Ubuntu-derivate a partire da 8.04 Intrepid Ibex o su Debian a partire da 5.0 Lenny sarà molto più semplice dal momento che basterà installare il pacchetto luarocks tramite apt-get. Per Windows esiste un installer che automatizza le procedure, lasciando all'utente la scelta se installare un interprete Lua basilare senza librerie fornito dallo stesso installer o se utilizzare un interprete già installato nel proprio sistema. Tutte le informazioni necessarie al download e all'installazione di LuaRocks sono disponibili sul relativo sito.

Nel frattempo pochi mesi fa è nato un installer di Lua per Windows chiamato, con molta fantasia, Lua for Windows. Esso include molte delle più note librerie per Lua e un ambiente di sviluppo/debug già configurato e basato su SciTE. Si tratta quindi di un'ottima soluzione per avere in pochi secondi tutto il necessario per poter programmare in Lua, tuttavia LuaRocks non è stato ancora incluso per cui ecco i passaggi da seguire per integrare il tutto:

  • Scaricare Lua for Windows (LfW) e procedere con l'installazione: la mia installazione è stata effettuata nel path proposto di default, ovvero C:\Programmi\Lua\5.1
  • Scaricare LuaRocks per Windows, decomprimere l'archivio e aprire la shell dei comandi nella directory contenente install.bat
  • L'installer di LuaRocks permette di specificare alcune opzioni. Ecco come installarlo in modo che sfrutti l'interprete reso disponibile da LfW e che utilizzi un unico path per l'installazione dei pacchetti rock:

    install /LUA C:\Programmi\Lua\5.1 /BIN C:\Programmi\Lua\5.1 /P C:\Programmi\Lua\5.1\LuaRocks\0.6 /CONFIG C:\Programmi\Lua\5.1\LuaRocks /TREE C:\Programmi\Lua\5.1\LuaRocks\ /SCRIPTS C:\Programmi\Lua\5.1\LuaRocks\ /FORCECONFIG

    Di default LuaRocks permette anche ad utenti non amministrativi di installare dei pacchetti rock locali (solitamente in %APPDATA%/luarocks/rocks/), mentre con l'opzione /FORCECONFIG verrà considerato un unico file di configurazione, quello specificato da /CONFIG, e un unico path per l'installazione di rock e script a livello di sistema, specificati rispettivamente da /TREE e /SCRIPT. Potete fare riferimento alla documentazione per un approfondimento in merito.

  • La directory C:\Programmi\Lua\5.1 viene automaticamente aggiunta al PATH di sistema dall'installer di LfW per cui possiamo creare un hardlink ai file luarocks.bat e luarocks-admin.bat con il fine di poter invocare gli stessi più comodamente dalla shell. Da Windows XP in avanti si può operare come segue:

    cd C:\Programmi\Lua\5.1\LuaRocks\0.6
    fsutil hardlink create ../../luarocks.bat luarocks.bat
    fsutil hardlink create ../../luarocks-admin.bat luarocks-admin.bat

  • Modificare la variabile di sistema LUA_PATH aggiungendo ai path già impostati da LfW il seguente percorso per il caricamento dei file della libreria LuaRocks:

    C:\Programmi\Lua\5.1\LuaRocks\0.6\lua\?.lua

Ora LuaRocks è installato e funzionante, basta aprire la shell dei comandi e lanciare luarocks search --all per visualizzare tutti i pacchetti rock disponibili sul server (è disponibile anche un elenco consultabile più comodamente) e luarocks install nomepacchetto per installare i pacchetti rock nel sistema. A questo punto negli script Lua basterà aggiungere la riga require "luarocks.require" che si occuperà di effettuare l'override della funzione require standard di Lua, rendendo possibile il caricamento delle librerie installate tramite LuaRocks. Alternativamente si può ottenere lo stesso risultato lanciando così l'interprete: lua -lluarocks.require

Ecco un esempio di come sfruttare una libreria installata tramite LuaRocks:

-- luarocks install colors require "luarocks.require" require "colors" green = colors.new("#0f8923") print("Verdolino:", green) -- Verdolino: #0f8923

LuaRocks con l'ultima release ha raggiunto un livello di maturità accettabile e l'elenco delle librerie disponibili sotto forma di pacchetti rock è in lento ma costante aumento, ma ci sono alcune applicazioni o framework che ne traggono beneficio per l'installazione e la gestione delle loro dipendenze come per esempio Kepler (un framework per lo sviluppo web generico in Lua), Orbit (un altro framework per lo sviluppo web in Lua, ma MVC oriented) e Sputnik (un wiki scritto in Lua, leggero ma estendibile). Per la cronaca, ecco invece cosa si era costretti a fare solamente un anno fa per avere un'installazione minimale di Lua in Windows e cominciare ad aggiungere librerie come LuaSocket.