Firefox 4: primi indizi e prime bozze di GUI

Firefox 4.0 vs Firefox 3.5

Arrivano le prime frammentarie voci a riguardo di della nuova versione del browser open source di Mozilla.
Sembra che gli sviluppatori siano in ritardo rispetto alla tabella di marcia e che probabilmente la nuova major release di firefox si faccia attendere almeno a fine 2010 se non ad inizio 2011.
Ho trovato però in giro per la rete, un link al blog del graphical designer dell’interfaccia di firefox, che ha postato sul suo blog alcune immagini dei suoi ultimi lavori…

Pare che si voglia andare verso una direzione più minimalista che esalti l’essenziale e nasconda il superfluo…

Firefox 4.0 new Windows themeAd esempio mi piace l’idea alla chrome di avere le schede on top, e approvo allo stesso modo il merge tra la search bar e la address bar… Effettivamente quando l’idea è interessante perchè non prenderla in prestito? ;-)

Per il resto l’unione del pulsante vai-ricarica-stop la trovo (per me) inutile visto che il 99,9% delle volte uso l’invio della tastiera e l’F5, però per i mouse dipendenti potrebbe non essere una cattiva idea…

Insomma stanno cercando di alleggerire l’interfaccia senza privarla delle sue funzionalità principali… e voi che ne pensate?

ps: dimenticavo l’autore delle GUI di firefox è Stephen Horlander

[ad]

Un tool open source per la progettazione dei database

Ogni buon programmatore che si rispetti sa che non si può creare un database dal nulla. Proprio i database sono alla base di qualsiasi software degno di nota, e sono indispensabili per la realizzazione di un sito web.

Da buon fanatico di progetti open source, ma soprattutto dell’ambiente php-mysql per la creazione di web application mi sono dato da fare nel mio sport preferito e ho trovato un tool davvero interessante.

Si chiama MySQL workbench e proviene dagli stessi laboratori dai quali ci viene fornito uno dei DBMS open source più conosciuti al mondo. E’ da qualche mese che lo uso ogni volta in cui ho bisogno di realizzare un db, a lavoro o a casa e lo trovo davvero utile e funzionale. Che cos’è workbench? Semplice! Un sw che consente di progettare un database, partendo dalla realizzazione dello schema E-R e risparmiando molto lavoro a noi poveri programmatori.

In sostanza basta disegnare lo schema del database inserendo tabelle, chiavi primarie, chiavi esterne, indici, trigger, viste e chi più ne ha più ne metta, e workbench farà per noi tutto il resto. Una volta disegnato lo schema infatti, sarà possibile esportare la struttura del db creato e reimportarla nel nostro DBMS. Io uso abitualmente MySQL e workbench mi permette di esportare in un file .sql le query di creazione della mia base dati, pienamente compatibili con questo DBMS, e di creare con una import il database vero e proprio.

Esiste in due versioni, la community e la standard, la prima rilasciata gratuitamente sotto licenza GPL mentre la seconda a pagamento (e con alcune funzionalità in più) al costo di 79$ per svillupatore per anno. Ovviamente non mi sono potuto permettere di acquistare la versione standard, ma la community svolge il suo egregio lavoro in maniera impeccabile.

Dimenticavo, workbench è multipiattaforma ossia esiste nella versione per Linux (comodo pacchetto debian autoinstallante, o rpm), nella versione per Mac OS X e nella versione per Windows in modo che nessuno possa lamentarsi e tutti possano progettare in tutta serenità i propri database sul proprio sistema preferito.

Direi che non vi resta che provarlo!
[ad]

Esportare immagini per il web con gimp!

Nonostante non sia un appassionato di grafica, a volte mi trovo a dover fare dei piccoli fotoritocchi.

Usando ubuntu ovviamente non ho a disposizione il dio sceso in terra dei programmi di fotoritocco, per cui mi devo arrangiare.

Checchè se ne dica, trovo che gimp faccia il suo onesto dovere, ma così com’è quando viene installato (su win) o quando ci arriva (insieme ad ubuntu) non permette di salvare immagini ottimizzate per il web.

Ecco che quindi oggi voglio suggerirvi un ottimo plugin per esportare immagini nei più comuni formati, adattate e ottimizzate per essere utilizzate sul web:

Questa è la pagina ufficiale del plugin dove trovare un .tar.bz2 per linux e un .zip per windows (32bit):

http://registry.gimp.org/node/33

Per installarlo dovete andare a copiare il contenuto dell’archivio estratto all’interno della cartella locale di gimp dei plugin path-to-gimp/plug-ins/ e riavviare il programma.

Noterete che è stata aggiunta una voce al menu file (“save for web” appunto) e cliccando qui, potrete scegliere le varie opzioni di esportazione…

Non ancora abbastanza soddisfatto però ho cercato il pacchetto per ubuntu e ovviamente esiste! ;-)

Quindi eccovi il link per scaricare il .deb bello pronto per essere installato sul vostro ubuntu:
http://www.mediafire.com/?yngomdz4hem

Un ultimo consiglio: prima di dire che certe cose si fanno solo con photoshop provate a googleggiare un po’ e vedrete che gran parte delle cose, sono ben spiegate in guide per gimp, nonostante senza ombra di dubbio photoshop è e rimane il miglior software per il fotoritocco. :-)
[ad]

Pubblicare automaticamente i propri post su twitter


Proprio oggi è uscita la notizia che l’interfaccia utente di twitter è stata tradotta in italiano.

Personalmente non ho ancora preso l’abitudine di usare questa piattaforma di microblogging però ne ho sperimentato la sua potenzialità in alcune occasioni. Una in particolare mi ha lasciato davvero senza parole. Certo l’argomento non era dei più “scottanti” ma poco importa, è il succo della questione che lascia a bocca aperta. Qualche tempo fa (un martedì) quando era nell’aria un aggiornamento dei nuovi iMac, macbook e macmini mi collegai a twitter e digitai nel campo di ricerca la parola apple store già dal primo pomeriggio (le 14,30 circa)… Così ogni frazione di secondo ero aggiornato sui nuovi cinguettii che contenessero la parola apple store. Proprio così sono stato informato che per primi erano stati messi offline gli apple store di australia e nuova zelanda, e poco per volta venni informato del totale oscuramento degli apple store di tutto il globo. Allo stesso modo appena tornarono online i negozi apple con tutte le novità, rimasi quasi aggiornato in tempo reale.

Da allora mi sono iniziato a documentare un po’ e ora voglio suggerirvi un sito, molto utile per poter avvertire chi ci segue da twitter, sui nostri nuovi post. twitterfeed.com preleva i post dal feed del vostro blog e automaticamente riempie i 140 caratteri con l’inizio del post e una tinyurl al post. Figata? Oh yes! In pochi secondi lo configurate, e senza che ve ne dobbiate ricordare, questa applicazione vi aggiorna in automatico il vostro profilo su twitter… provatelo![ad]

SPDY alias Speedy

SPDY

Tanto per cambiare Google ne ha tirata fuori un’altra… Ora diventano quasi monotoni quelli di Big G a forza di sfornare cose nuove

Questa volta hanno in progetto di rivoluzionare il protocollo HTTP. Come da titolo infatti stanno lavorando a SPDY che si legge SPEEDY. Una nuovo protocollo che dovrebbe continuare a sfruttare HTTP eliminando tutto ciò che fa perdere tempo. Dovrebbe sfruttare un singolo canale e una singola sessione TCP e usando il protocollo sicuro SSL come base per il trasporto dei dati. SPDY utilizzerà tecniche di priorità e di compressione degli header per evitare eccessi di tempo e banda quando i clients contattano i servers.

Gli ingengeri di Mountain View hanno già sviluppato un server web (open source) e una versione ad hoc di chrome per la fase di testing. Dal blog si legge che i primi esperimenti indicano risultati significativi, con le pagine caricate il 55% più rapidamente rispetto allo standard HTTP.

Cosa ne dite? Un’altra rivoluzione nel web, che porterà bandiera googleggiante?

In ogni caso se volete leggere approfondimenti in italiano, vi lascio il link su macitynet, dove io ho letto la notizia.
[ad]

Effettuare un redirect da un vecchio dominio ad uno nuovo

Come tutti voi ben sapete, questo blog in precendenza aveva un altro indirizzo. Quando sono poi passato al nuovo dominio ho scritto un articolo per informare i lettori del cambiamento di dominio.

Per le persone basta questo, ma per un blog indicizzato dai motori di ricerca, tutto ciò non è sufficiente, così ho scoperto come effettuare un redirect senza che l’utente neppure se ne accorga.

Inserendo (o modificando) il file .htaccess all’interno della cartella dal quale si vuole effettuare il redirect, con una regola specifica si può fare in modo che qualsiasi indirizzo relativo al vecchio dominio venga riscritto con il nuovo dominio. La regola da inserire è questa:

redirectMatch 301 ^(.*)$ http://www.tuo-nuovo-dominio.com$1

Ecco fatto, potete verificare andando sul mio vecchio blog http://ilferre.setupstat.com/. Tornerete a http://blog.davideferrero.com.

Prestate però attenzione a dove posizionate il file .htaccess. Se siete in una situazione come la mia, in cui sul vecchio dominio avevo anche un altro sito, il file contenente la regola dovrà essere posizionato nella cartella del sottodominio e non nella root, altrimenti qualsiasi indirizzo contenente il vecchio dominio rimanderà al nuovo indirizzo.
[ad]

Workin’ @

Tanto per cambiare cazzeggiando ho fatto una nuova scoperta…

Partiamo come si usa fare, dall’inizio: da qualche giorno mi sono iscritto all’rss dell’Official Google Blog perchè spesso escono notizie interessanti soprattutto per gli appassionati di Big G… dopo qualche articolo letto ho notato un link ad una “directory” che contiene tutti i blog ufficiali di google (prodotti, servizi, ecc ecc…)… Dopo averne visitato qualcuno, e averne visti di quelli di cui conoscievo già la loro esistenza, ho trovato il blog ufficiale di YouTube. L’ultimo post diceva che l’azienda in questione (youtube.com appunto) è alla ricerca di ingegneri da assumere. Cliccando sulla pagina delle informazioni relative a questo annuncio, ho trovato il video intitolato working@youtube:

Ovviamente inutile dirvi che come i video degli uffici di facebook, anche questi fanno venire parecchio l’acquolina in bocca…

Ho anche scoperto il canale di youtube dedicato alla vita all’interno di google, lifeatgoogle, ovvero come si lavora-vive (il confine tra i due termini credo sia molto sottile per Big G, ma d’altronde chi non lo farebbe?!). Date un’occhiata ad esempio di come si lavora a Google Zurigo:

Figo no? :-D
PS: invece questo è un tipico job meeting a Facebook :-P (il giorno di halloween)

Se volete vedere la gallery completa del giorno di halloween a facebook, qui c’è l’album

[ad]

Nato di domenica…

Ho scoperto oggi un trick davvero interessante, che permette in php di creare delle variabili con nomi dinamici… :-O Cosa vorra mai dire tutto ciò? Semplice:
Se io voglio che una variabile prenda il nome del contenuto di un’altra variabile, posso farlo così:

$a="pippo";
${$a}="pluto";
echo $pippo;//a video verrà visualizzato: pluto

Mi sono trovato di fronte a questo problema, quando stamattina dovevo leggere dei records da un db, e creare delle variabili che si chiamassero come i campi del db.

Siccome sono pigro (e da qui il titolo di questo post, infatti mio papà dice che sono nato di domenica :-P), per semplificarmi la vita i campi letti dal db sono all’interno di un array associativo del tipo $array[0][‘campodb’] e scorro i risultati con un:

foreach(array_keys($array[0]) as $k){ ... }

Quindi sfruttando questa piccola scoperta in poche righe mi sono letto i valori dal db e creato le variabili contenenti i valori letti dal db.

Il codice finito risulta una cosa del tipo:

$q="SELECT campo1,campo2,...,campo20 FROM tabella WHERE condizioni";
$db->query($q); /**/
if($db->numRows>0){
   foreach(array_keys($db->rows[$i]) as $k){
      ${$k}=$db->rows[$i];
   }
}

Alla fine della fiera avrò una variabile per ogni campo presente nella SELECT con all’interno il valore letto dal db ($campo1, $campo2, … , $campo20).
In alternativa qui sotto ci sono alcuni esempi dell’utilizzo di questa features in php (direttamente da php.net)

define('ONE', 1);
function one() {
    return 1;
}
$one = 1;

${"foo$one"} = 'foo';
echo $foo1; // foo
${'foo' . ONE} = 'bar';
echo $foo1; // bar
${'foo' . one()} = 'baz';
echo $foo1; // baz

Sapevate già tutto? D’oh! Sono sempre l’ultimo a scoprire le cose interessanti! ;-(
[ad]

Indici Full Text in MySQL

Post da nerd, astenersi perditempo… :-P

[NERD MODE ON]

Alcuni giorni fa sul lavoro mi sono cimentato in un nuovo esperimento.

Tutto è partito dal problema di dover indicizzare dei contenuti, sui quali poi eseguira una ricerca “generica” in stile google (ovvero un unico campo che riceve un insieme di parole, che possono corrispondere a diversi campi del db).

Bene non voglio stare qui a spiegare nei dettagli la soluzione che abbiamo deciso di adottare, ma in sostanza mi sono ritrovato con un campo testuale con dentro tutte le parole che corrispondono ad una chiave.

Ok, e ora? L’idea iniziale è stata quella di eseguire una query con ” LIKE ‘%parola%’ ” in OR con altre LIKE simili, per ogni parola inserita dall’utente. Una volta implementata, tutto funzionava (avevo 3 record in quella tabella). Siccome per scrupolo avevo anche implementato un timer che misurasse il tempo di esecuzione, ho provato a fare un test pesante… Con python mi sono creato un programma per scrivere su file qualche centinaia di query di inserimento su quella tabella, lo eseguo e popolo il db. Ora ci sono 1000 record (non sono ancora abbastanza ma rende già l’idea), rilancio la ricerca e il timer segna 0,3 secondi. Buono no? sì ma sono 1000 record, se mai i record dovessero essere 100K o ancora di più? Mmm non mi soddisfa questa cosa. *Googleing*….*Googleing*….*Googleing* FULL TEXT INDEX

Cos’è? In MySQL è possibile definire su un campo di una tabella, un indice FULL TEXT, ovvero una struttura che indicizza in maniera ottimale tutte le parole presenti in uno o più campi. Ci sono alcune restrizioni però. Quella più importante è che la tabella non può essere creata con il motore InnoDB (il più comune perchè supporta query multiple in una singola transazione). Inoltre le stringhe da cercare con le query dovranno avere più di 3 caratteri (altrimenti bisogna andare a modificare le impostazioni di MySQL, cosa impossibile se non si ha accesso al server, e comunque relativamente complicata da fare).

Detto ciò i passi da fare sono i seguenti:
Definiamo la tabella e l’indice:

CREATE TABLE test (
id INT UNSIGNED   AUTO_INCREMENT NOT NULL PRIMARY KEY,
keywords TEXT,
[keywords2] VARCHAR(255),
FULLTEXT (keywords[,keywords2])
);

[Tra le parentesi quadre ho messo il secondo campo, spero si capisca che è opzionale…]

Fatto questo e dopo aver popolato la tabella, possiamo provare la nostra ricerca con la seguente query:

SELECT * FROM test WHERE MATCH(keywords) AGAINST('pippo')

In questo modo andremo a dire a MySQL di cercarci l’esatta parola ‘pippo’ all’interno del campo keywords.

Una cosa che non si trova facilmente nelle guide che ho seguito (ho fatto perciò riferimento alla documentazione ufficiale di MySQL) è che così facendo si effettua una ricerca in linguaggio naturale, che è ottimale per indicizzare frasi di senso (più o meno) compiuto. Il “difetto” se può definirsi così, è che con questo tipo di ricerca alcune parole non verranno trovate, infatti MySQL utilizza un array di stopwords che verranno saltate a piè pari dalla ricerca. Per effettuare una ricerca su tutte le parole e utilizzando operatori logici (ad esempio “+” significa OR mentre “-” esclude la parole che segue questo simbolo) bisogna effettuare una ricerca IN BOOLEAN MODE, più lenta, ma più efficace. La nostra query dovrà quindi essere modificata in:

SELECT * FROM test WHERE MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE)

In questo modo si effettua una ricerca all’interno del campo keywords, delle parole che contengono al loro interno “pippo” o “pluto”. Il carattere “*” funziona un po’ come il “%” nelle LIKE.

A questo punto manca un ultima chicca. La funzione MATCH (..) AGAINST(..) ritorna un valore che rappresenta la pertinenza delle parole cercate nel campo. Nel BOOLEAN MODE sarà il numero di parole trovate nel campo, mentre con la ricerca in linguaggio naturale ci sarà un algoritmo che calcola la pertinenza con delle regole strane ma che funzionano ;)

Quindi per sfruttare al massimo questo algoritmo bisognerà scrivere la query con:

SELECT *, MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE) as pertinenza FROM test WHERE MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE) ORDER BY pertinenza DESC

Così facendo ordiniamo i risultati dal più pertinente, a quello meno.

Risultato? sui miei 1000 records il tempo si è dimezzato, nel caso peggiore… Risultato accettabile no? :-)

Non vi resta che provare per credere, buon divertimento!

[NERD MODE OFF]
[ad#ad-1]

jQuery User Interface: interfacce utente in javascript!

Intanto benvenuti a tutti nel mio nuovo-vecchio blog. Ho solamente cambiato indirizzo, mantenendo tutto il vecchio blog e cambiando la veste grafica… Un piccolo aggiornamento contro la noia, insomma! ;-)

Detto ciò in per inaugurare davideferrero.com, voglio portarvi a conoscenza di un tool molto utile, se non lo conoscete ancora.

Come tutti ormai sapete (non lo sapete? sapevatelo :-P ) sono fan e infognato (leggi “addicted” che fa più figo) di jQuery, un javascript framework molto intuitivo, semplice e abbastanza leggero per animare e migliorare le proprio pagine web.

Bene, usando un po’ jQuery noterete subito di aver bisogno di interfacce grafiche per l’utente, ad esempio per una scelta di date (ne avevo già parlato qui) o per creare dei blocchi trascinabili (drag&drop), barre di caricamento, pulsanti “slider” o dei tabs… Ok, con jQuery UI tutto ciò è possibile, potete crearvi il vostro tema personalizzato scegliendo i colori e le caratteristiche dei vari oggetti e scaricarvi i file (javascript, css e immagini), personalizzandovi il pacchetto di download con solo gli oggetti di cui avete bisogno. Per tutte le personalizzazioni dei vari gadget, troverete un’ampia documentazione che vi aiuterà nel caso aveste problemi a farli funzionare.

Appena pubblicheremo il progetto a cui sto ancora lavorando in ufficio, potrete vedere all’opera alcune di queste UI… a presto per i prossimi aggiornamenti su questo argomento!

PS: aggiornate il feed rss facendolo puntare al nuovo indirizzo se non lo avete ancora fatto, ma soprattutto se vi eravate abbonati a quello vecchio… Se invece non lo avevate aggiunto tra i vostri preferiti, avete un motivo in più per farlo ora! ;-)
[ad#ad-1]