Yahoo Pipes – mashup made easy

4 09 2009

Oggi ho provato ad utilizzare Yahoo Pipes: davvero impressionante!

Si tratta di un servizio che consente di aggregare, filtrare, generare feed partendo dalle più disparate fonti. E’ ad esempio possibile recuperare i feed dei principali quotidiani e filtrare gli articoli in base al fatto che contengano o meno alcune parole (o più in generale un’espressione regolare). Potentissima poi la possibilità di utilizzare come fonte una ricerca di google news (o blog search), sfruttandone tutte le potenzialità per ottenere un’inesauribile fonte personalizzata di new di qualità. Putroppo non è possibile utilizzare (direttamente) i risultati di una ricerca sul web (con google), ma è possibile avere a disposizione quelli di yahoo.

Tecnicamente le sorgenti possibili comprendono oltre ad rss e atom, anche XML, JSON, HTML, CSV, consentendo davvero di accedere a qualsiasi fonte disponibile sul web. L’unico limite è che le fonti non devono avere un file robots.txt che ne impedisca l’accesso.

Alle sorgenti è poi possibile applicare un gran numero di “operatori” che consentono di filtrare, dividere, unire, contare, troncare, verificare l’univocità, ordinare, etc, etc. in modo da ottenere davvero qualsiasi risultato si desideri.

Ma l’aspetto davvero straordinario del servizio è l’eccezionale tool grafico di generazione:

yahoo pipes edit

yahoo pipes edit

E’ un ambiente visuale estremamente semplice da utilizzare e allo stesso tempo potentissimo. Con qualche click è possibile selezionare le sorgenti, filtrarle unirle ed ottenere poi un feed che si può pubblicare con estrema semplicità.

Date un’occhiata al box qui a lato: trovate il feed che ho costruito per ottenere news simili ai contenuti di questo blog. In pochi minuti un risultato davvero eccellente!





La sottile differenza tra IP delivery e Cloaking

12 05 2009

Tra le linee guida di google più “profonde” c’è ovviamente il fatto di evitare il cloaking, ovvero di presentare a googlebot contenuti differenti rispetto a quelli presentati ad un normale utente. Ci sono però alcuni casi in cui presentare un contenuto differente sulla base dello user-agent, non è affatto un “imbroglio”, ma è anzi un modo per fornire migliori informazioni o addirittura una necessità in qualche caso.

In particolare può essere necessario fornire contenuti differenti in base al browser utilizzato (ad esempio in mobilità o con una risoluzione molto bassa) o in assenza di plugin (come flash) o ancora in seguito ad informazioni ottenute automaticamente (tramite cookies) sull’utente.

Altro caso tipico in cui una generazione “specializzata” dei contenuti è utilizzata in modo lecito è legato alla lingua o alla localizzazione geografica dello user-agent. Si tratta di tecniche ormai diffusissime che possono essere estremamente utili e funzionali per gli utenti, anche capisco che possano mettere in difficoltà sistemi puramenti automatici di crawling.

Purtroppo però la posizione di google rispetto all’utilizzo di tali tecniche non è completamente chiaro e mette quindi in grosse difficoltà i webmaster che devono valutare (paradossalmente) se implementare funzionalità a vantaggio degli utenti con il rischio di essere penalizzati dai bot convinti che tali funzionalità siano implementate a loro vantaggio.

Tale problematica ha dato luogo a lunghi dibattiti tra gli addetti ai lavori, tra i quali va senz’altro letto questo post su seomoz blog.

Fortunatamente c’è anche un post sul blog ufficiale di google che fa una buona chiarezza sulla vicenda; lo spirito della “legge” di gogle è estremamente ragionevole:

Googlebot should see the same content a typical user from the same IP address would see.

Ovviamente non è chiarissimo cosa voglia dire “the same content”: identico al byte ? identico solo nei contenuti (ad esempio non nella pubblicità) ? uguale in una buona percentuale del sito ? Sinceramente non credo che sia possibile determinare in mo affidabile al 100% nessuna procedura completamente automatica, visto che mi vengono sempre in mente casi “leciti” estremamente difficili da estrapolare. Ma almeno lo spirito mi sembra estremamente condivisibile.





Alcuni modi comuni per rovinarsi la vita con l’XML

12 03 2009

In un ottimo articolo Kyle Brown, elenca tre “comuni” problemi che affliggono i Web Services basati su XML (SOAP o meno). Merita una lettura attenta perché non mette in evidenza  le meravigliose capacità di un qualche tool, libreria o linguaggio, ma collega a errori di principio nel design i disastri che si riesce a produrre anche in contesti abbastanza semplici e con strumenti tutto sommato ben conosciuti.

Il primo errore è davvero banale e non mette in evidenza nulla di “profondo”: gestire messaggi da parecchi megabyte, magari con dati binari (senza forse neppure accorgersene) è semplicemente una scelta da incapaci; non è certo un problema dell’XML.

Il secondo è invece molto più interessante, perché è davvero una forza che guida spesso il design: definire i servizi ad un livello esremamente basso (ad esempio a livello di ogni singola operazione SQL). Perché (come dice Brown) “[...]such low-level data services often fail.” ? A mio parere il discorso è molto generale: Un Web Service dovrebbe rappresentare un’interfaccia che maschera la complessità che si trova a monte, semplificandone l’utilizzo in base alle esigenze di chi si trova a valle. Purtroppo invece scrivere un XML o richiamare un servizio non è più facile che accedere direttamente ad un DB e scrivere l’SQL relativo, né maschera alcuna complessità o dettaglio implementativo se il contenuto informativo necessario a richiamarlo è in relazione biunivoca con l’SQL utilizzato. Introdurre un layer (o un’interfaccia per l’accesso di una qualche risorsa/servizio) deve essere motivato da concreti vantaggi nel contesto specifico e non è certo buono in astratto e in generale.

Il terzo problema è paradossale e viene fuori soprattutto con SOAP: siccome non è comodo né banale definire gli schema in modo completo e soprattutto non è facile modificarli, spesso alcuni servizi sono solo semi-definiti con una parte (spesso predominate) magari ancora in XML, ma non parte dello schema della richiesta. Questa situazione è spesso solo la spia del fatto che si è sbagliato nel definire le interfacce, che risultano complesse ed devono essere cambiate molto spesso, perché sono poste al livello sbagliato.

Ultima nota a livello generale: in programmazione qualcosa di inutile è quasi sempre dannoso, specie un’astrazione.





Perdita di pacchetti ad alti bitrate

19 01 2009

In un progetto sul quale ho lavorato di recente, mi è capitato di avere a che fare con flussi (streaming multimediali) a bitrate relativamente alto, per l’hw in questione. Scrivo questo post perché siamo stati vittime di un nostro (banale) bug che ci è costato qualche giorno di test e qualche mal di testa: magari qualcuno potrà evitarseli leggendo questo post… non si trova molta documentazione in giro.

Intanto qualche altro dettaglio sul sistema: un client che riceve flussi multimediali in UDP (fino a 10 mbs) su windows embedded ce 6.0, realizzato in c++ con il visual studio 2005, utilizzando direttamente winsock2. Un thread si occupa della ricezione utilizzando semplicemente una socket in modalità bloccante in un ciclo di lettura che ha anche il compito di effetture alcune operazioni sui dati (poco onerose in termini di CPU) e di copiarli in un buffer dal quale un thread consumatore le preleva. Viene utilizzata la funzione recv(), visto che la modalità bloccante non è affatto un problema (e quindi l’ overlapped I/O è inutile) e le completion routine non sono ben supportate da windows embedded ce 6.0.

Tutto sembra funzionare bene, fino a bitrare inferiori a 2 mbs, ma superando tale valore… si manifestano degli strani problemi. Dopo molta fatica (visto che ovviamente non era possibile andare in debug, ma neppure scrivere su file se non pochi kbytes e quidi il debug stesso non poteva che avvenire anch’esso via rete), sembrava inequivocabile che si trattasse di perdite di pacchetti dallo 0.3% al 3% circa. A ridurre la nostra lucità di analisi si metteva anche il fatto che ad avere problema era solo uno streamer che utilizzavamo per la prima volta, mentre quello che avevamo utilizzato fino ad allora funzionava alla grande (ora sappiamo che dipendeva solo dal bitrate).

Il passo successivo (e molto poco divertente) è stato quello di usare wireshark per verificare se una tale perdita di pacchetti era in qualche modo imputabile alla nostra lettura… provate a cercare in un dump 1 paccheto perso, verificando che non ci siano buchi in un continuity counter a 4 bit e con il parser di wireshark bacato. Davvero poco divertente. Comunque le perdite non c’erano!

Il problema è semplicemente legato al fatto che il sistema operativo allocca un buffer interno, settato di defaut a pochi kbytes, che può facilmente venire saturato se il thread che effettua la lettura non è sufficientemente veloce o se viene sospeso (anche solo per pochi ms).

Fortunatamnte la soluzione esiste: basta settare un buffer di ricezione più grande.

unsigned bufferSize = 1024 * 1024;
::setsockopt(s_, SOL_SOCKET, SO_RCVBUF, (const char FAR*)&bufferSize, sizeof(bufferSize));

con 1 mbyte di buffer, a 10 mbs, si possono gestire circa 800 ms di flusso: si tratta di un valore congruo che ci ha permesso di eliminare del tutto le perdite.





Eccesso di successo

21 11 2008

E’ stato lanciato nei giorni scorsi Europeana, quella che sarà la più grande libreria europea con ben due milioni di opere in 23 lingue, fra testi, spartiti, registrazioni audio, video e immagini: tutto pubblicato gratuitamente sul Web per la consultazione degli utenti.

Peccato che il servizio sia già stato sospeso:

The Europeana site is temporarily not accessible due to overwhelming interest after its launch (10 million hits per hour).

We are doing our utmost to reopen Europeana in a more robust version as soon as possible.

La domanda che mi faccio è questa: non sviluppare il sistema perché sopportasse un simile carico è stato un errore completo ed inqualificabile o ha una sua ratio ?

Nel mondo reale, è infatti necessario fare delle scelte che limitino il consumo di alcune risorse (ad esempio il tempo) nella fase di realizzazione di un progetto, con delle conseguenze (non sempre completamente prevedibili) su alcune caratteristiche finali quali ad esempio l’efficienza, scalabilità e affidabilità.

In quasi tutti i progetti sui quali mi è capitato di lavorare, (valutando a posteriori la cosa) abbiamo dedicato troppe risorse all’efficienza (specie locale), meno (ma comunque troppa) alla scalabilità (visti i carichi effettivi che abbiamo dovuto sopportare) e troppa anche all’affidabilità, nel senso soprattutto che abbiamo utilizzato architetture eccessivamente complesse, senza reali vantaggi nel contesto operativo e anzi con qualche problematica dovuta proprio al sistema di monitoraggio. Ovviamente ogni considerazione è fortemente relativa al singolo progetto, ma mi sento di fare qualche considerazione in generale:

I più grandi vantaggi in termini di efficienza, scalabilità ed affidabilità si consegueno a livello di architettura di sistema e un’architettura semplice, pur anche con alcuni limiti bene noti, è il miglior investimento possibile sia in termini di risorse utilizzate che di effettivi risultati ottenibili.

Tornando al caso Europeana, credo che non siano giustificabili. Hanno commesso un grave errore di progettazione, visto che in un caso del genere la scalabilità non puo’ non essere considerata un obbiettivo prioritario. Brutta figura.





C plus plus vs C

12 10 2008

Una poco velata critica al C++ da parte di Linus Torvalds, mi ha portato a fare qualche considerazione sul C++ e più in generale sulle motivazioni delle scelte (apparentemente solo di natura tecnica) dei programmatori.

Devo premettere che sono di parte, visto che da molti anni utilizzo (con soddisfazione) principalmente il C++. D’altro canto ho comunque avuto a che fare nel corso degli anni con altri linguaggi, ambienti e procedure di sviluppo, in progetti molto diversi per numero di partecipanti, complessità e obbiettivi. Spero quindi di poter fare delle considerazioni non partigiane…. :)

Fondamentalmente io non concordo con Torvalds, ma paradossalmente concordo per certi versi con lui quando dice

I've come to the conclusion that any programmer that would prefer the project to be
in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn't come and screw up any project I'm involved with.

Semplicemente io non vorrei assolutamente nessun programmatore nel mio team che preferisse un qualsiasi linguaggio (ma anche tool o sistema operativo), in modo INCONDIZIONATO, non relazionato agli obbiettivi del progetto.

Questo non vuol dire affatto che la scelta non debba dipendere ANCHE dalle proprie inclinazioni personali o quanto meno dal proprio patrimonio di conoscenze (stando attenti a non infilarsi nelle profezie auto-avveranti di Carlo Pescio). Vuol dire semplicemente e molto banalmente che la scelta di un linguaggio, un tool o una metodologia da utilizzare deve dipendere dagli obbiettivi di progetto e non da valori pure apparentemente validi in generale.

Più in generale si tratta di una forma di dis-allineamento tra i VALORI del progetto (spesso ad esempio i tempi di rilascio) e quelli ritenuti tali dagli sviluppatori (efficienza, scalabilità, ma anche documentazione, copertura dei test di unità etc). E’ vero che spesso non è affatto facile capire quali siano i valori del progetto (anche per responsabilità del menagement) e che non è certo compito degli sviluppatori definirli, ma è sicuramente loro compito comprenderli e lavorare onestamente al fine di massimizzarli.

L’errore più comune è quello di scambiare strumenti con obbiettivi: un programma deve fare senza errori quello che gli utenti si aspettano, non avere la barra verde dei test unità sulla macchina degli sviluppatori. O aprossimarli con valori considerati sempre validi: ad esempio le prestazioni (cosa spesso non utile o magari da ricercare su piani molto diversi dell’ottimizzazione delle strutture base) o la flessibilità che viene intesa in termini estremamente tecnici (come magari la molto remota possibilità di utilizzare db server differenti), mentre ciò che sarebbe veramente utile è la flossibilità di reagire a cambiamenti delle spicifiche.

La cosa più interessante è che, paradossalmente, questi “errori di prospettiva” sono possibili SOLO a programmatori che abbiano un discreto grado di conoscenze e anche una certa dose di passione e che quindi potrebbero anche essere considerati dei buoni programmatori. Sicuramente però sarebbero dei pessimi team leader, quelli che Carlo Pescio chiama super-programmatori e che sono ottimi per portare a compimento il progetto che esiste nella loro mente (non quello che gli viene affidato).

In questo senso è più probabile che un super-programmatore usi il C++ piuttosto che il C ? Probabilmente sì, visto che è assolutamnete coerente con la sua psicologia utilizzare lo strumento più avanzato, innovativo e “potente” (qualsiasi cosa voglia dire). Ma a dire il vero (e per le stesse motivazioni) è più probabile che usi Java (o magari Ruby o Python) e che sia un patito di linux, dell’open source e soprattutto dell’extreme programming.

Nel merito delle caratteristiche tecniche del C++ rispetto al C o ad altri linguaggi invece è meglio che parli in un altro post… questo è già troppo lungo così :)





Google Protobuf

8 07 2008

Se l’XML non vi è mai piaciuto e JSON non vi sembra una soluzione adeguata, Protobuf potrebbe essere la soluzione che aspettavate.

L’idea interessante è quella di generare delle classi (ad esempio in C++) che forniscono un accesso estremamente comodo attraverso setters e getters (anche se io avrei fatto una scelta diversa) e integrazione con le funzionalità del linguaggio (come gli stream di IO) e contemporaneamente estremamente efficiente in termini di parsing (realizzato infatti ad hoc per il singolo schema)  e memorizzazione (direttamente in strutture del linguaggio).

Da molti punti di vista un approccio di questo tipo è la soluzione ottimale nel caso in cui si abbia a che fare con dati con una struttura omogenea e nota a priori, la cui manipolazione ha un peso significativo per l’efficienza del sistema nel complesso.

Non sono un fan dell’XML, ma non posso non notare che una soluzione del genere è implementabile anche con XML (e viene nei fatti usata da tempo ad esempio da gSOAP), ma non con JSON che manca di uno standard di definizione degli schemi. Rispetto a XML però non so dire quali siano i vantaggi: semplicità nella generazione delle classi nel linguaggio scelto ? Efficienza nella rappresentazione dei dati (utile ad esempio per ridurre la banda in caso di trasmissione) ? Efficienza comunque nel parsing (anche se ad hoc per schema) ? Non saprei, presto per dirlo, ma se dovesse servirmi qualcosa del genere, darò sicuramente un’occhiata più approfondita a questa libreria.





Refcardz

7 07 2008

Servizio lanciato da DZone, Refcardz è in pratica una raccolta di pratici riferimenti su temi specifici (da Spring a GWT, dal formato Atom alla costruzione dei plug-in di eclipse).

Mi ha fatto pensare ad una sorta di bignami dell’era digitale…. ti chiedi se possa servire davvero a qualcosa. Mah forse per certi argomenti estremamente specifici, tipo “Shortcuts in NetBeans 6.1″, potrebbe avere un senso…. per il resto non mi pare.





Tabella delle Competenze

2 07 2008

Spesso le tabelle sono molto utili per rappresentare in modo visuale delle informazioni complesse, ma rappresentabili in qualche modo su un piano (bidimensionali) e discritizzate. Ovviamente la discretizzazione dev’essere sufficiente a focalizzare il significato delle grandezze, ma tale da non comprometterne il significato. E quasi sempre la vera difficoltà è scegliere il piano di rappresentazione e l’entità della discretizzazione.

Le competenze di un programmatore sono una di quelle cose che (per eccesso di complessità) si rischia di considerare non formalizzabili in una qualche forma rigorosa… ed in buona misura sono convinto che così sia. Non per questo non è apprezzabile lo sforzo di qualcuno che prova a determinare un piano e una discretizzazione per il problema in esame. Con l’obiezione che ha troppi valori (sia in x che in y), alcune idee mi sembrano interessanti.