Feeds:
Posts
Comments

Posts Tagged ‘Erlang’

I have just published the packages for the latest version (R14B03) of Erlang: as usual, you can find them in my PPA.

As a reminder, they have been backported directly from Debian Unstable, without changes, so they work for me and may work for you, but I have published them “as are“, and I am not taking any responsibility for bad behavior.

Read Full Post »

(Edit: lo davo per scontato, ma meglio chiarirlo: nel grafico sottostante l’asse Y è misurato in millisecondi di esecuzione per ciascun test, quindi un valore inferiore è preferibile)

Uno dei punti di forza da sempre declamati di Erlang è la capacità del runtime di gestire la concorrenza anche di migliaia di processi leggeri, grazie alle capacità del runtime, sviluppato appositamente attorno (tra le altre cose) a questa caratteristica. E’ anche il motivo per cui si dice che linguaggi concorrenti implementati su altre macchine virtuali (ad esempio, Scala sulla JVM) non potranno mai avere le medesime prestazioni.

Ebbene, dopo un post intrigante in una mailing list, ho esplorato le prestazioni del progetto Erjang (Erlang sulla JVM) versus Erlang stesso, utilizzando un programma di test distribuito direttamente con i sorgenti di quel progetto: gli autori di Erjang stesso dichiarano che le performance sono, in media, in linea con quelle del runtime originario; il mio test è stato fatto sull’Atom N270 dell’Eeepc, ed è interessante vedere come in alcuni punti la versione Java riesca ad avere le performances più alte.

Grafico del confronto

Grafico del confronto

Ammetto di non aver fatto i test in modo eccessivamente scientifico, in ogni caso i valori sono stati presi alla seconda esecuzione del test stesso, supponendo che la prima possa essere inficiata dal caricamento o dalla compilazione del codice.

Read Full Post »

Erlang R14B02 has been uploaded a few days ago in Debian Unstable, and I have just backported the same packages in my Launchpad PPA, compiled for Ubuntu 10.10 Maverick. I have also added an additional patch that resolves a compilation problem for 64bit architectures, a solution suggested in Erlang bugs mailing list.

As I said in previous occasions, these packages are a direct backport from the Debian repository, without (almost) any other modification; they work in my system, but they may not work for you. I am not the official Erlang maintainer in Ubuntu, and I may not have time to hunt for bugs, so if you find a problem feel free to report it, but it may not be solved (at least in short time).

Read Full Post »

Un breve post per introdurre una caratteristica di Erlang che non viene spiegata in modo così chiaro: le guards per le funzioni lambda (o fun nel linguaggio in questione).

Ordunque: anche Erlang ha la possibilità di filtrare gli input di una funzione utilizzando alcune funzioni predefinite; questo permette di evitare l’uso di condizionali, che peraltro non sono il massimo dell’usabilità in un linguaggio del genere.

Qualunque manuale vi mostrerà, ad esempio, un listato come il seguente:

abs(Number) when Number < 0 ->
    -Number;
abs(Number) ->
    Number.

Questo è un banale esempio di una funzione che calcola il valore assoluto di un numero: quando questo è minore di zero, viene ritornato il suo opposto, in caso contrario viene ritornato il numero stesso.

E fin qui, tutto bene. La questione è: è possibile filtrare anche nelle lambda allo stesso modo? E la risposta è sì, anche se la sintassi non è proprio chiarissima e soprattutto non è segnata nei manuali; ad esempio, riprendendo l’esempio di prima:

abs(List) when is_list(List) ->
    lists:map(fun(Element) when Element < 0 ->
                     -Element;
                 (Element) ->
                     Element end, List).

In questo caso, il filtraggio avviene esattamente come prima, in una funzione che prende in input una lista di numeri e ne restituisce una versione con i valori assoluti di ciascun valore. Da notare la sintassi per applicare le guards nella lambda interna alla map: bisogna ripetere i parametri della funzione, parentesi comprese, ma senza ripetere la dichiarazione fun.

E’ una caratteristica che cercavo da tempo, ed ora finalmente ho scoperto come si applica…

Read Full Post »

Read Full Post »

C’è un nuovo arrivato nel mio PPA: si tratta di Tsung, uno strumento per eseguire test di carico verso server Web ma non solo; è scritto in Erlang, e ne sfrutta tutte le caratteristiche di distribuzione tra i processi per un’esecuzione rapida ed indolore (per il PC da cui viene lanciato), e può essere configurato per lanciare richieste utilizzando HTTP, WebDAV, Jabber, [My|Postgre]SQL ed LDAP.

La configurazione avviene tramite un file XML, che può essere parzialmente generato tramite una sorta di “registrazione” delle proprie azioni: il programma infatti può installare un proxy tramite cui è in grado di salvare tutte le richieste effettuate in remoto, sia http che https, e successivamente si può partire da questo e personalizzarne solamente la configurazione dei client e la tempistica delle richieste stesse.

Offre inoltre la possibilità di effettuare un parsing della risposta del server, per confrontarla con quanto ci si aspetta di ricevere, o di inserire dinamicamente dei parametri ricavati ad esempio da funzioni sviluppate ad hoc in Erlang.

Le statistiche prodotte vengono ricavate tramite diversi agenti in grado di monitorare la rete: il primo è nativo del linguaggio ma richiede configurazioni particolari di ssh; il secondo è SNMP ed il terzo è Munin: entrambi devono essere presenti lato client, sono installabili facilmente sulle distribuzioni più diffuse, ed io personalmente ho puntato sul secondo dato che la configurazione base del nodo è sufficiente allo scopo (si tratta solamente di modificare l’IP in ingresso, da loopback a quello del PC da cui lanciate i client simulati).

Insomma, dateci un’occhiata: i sorgenti del pacchetto Debian erano già presenti sul sito dell’applicativo, quindi il passo verso la pubblicazione nel PPA è stata piuttosto breve, ed i miei test hanno dato esito positivo; in caso di problemi, fatemi sapere!

Edit: ho appena scoperto che esiste un tool secondario installato con il programma, chiamato tsplot, che è in grado di produrre grafici di confronto, mettendo assieme fonti differenti e permettendo così di individuare facilmente variazioni a fronte di diverse configurazioni passate al sistema. Risultati spettacolari…

Read Full Post »

Oggi ho pubblicato il progetto scritto per la mia tesi di laurea specialistica (il cui testo sarà inserito tra le pubblicazioni dopo il 20 dicembre) su Github, è possibile scaricare il codice sorgente sia del framework che della demo.

CREST-Erlang è un framework Web in grado di supportare il paradigma Computational REST, uno stile architetturale che evolve REpresentational State Transfer e permette la trasmissione di computazioni assieme ai dati.

Ho una lista di ulteriori modifiche da integrare, in parallelo ad un articolo che sto preparando per l’università, e qualunque nuova modifica verrà quindi inserita nel repository pubblico; il tutto è pubblicato sotto licenza LGPL (salvo le librerie integrate, che seguono le proprie licenze, ed i moduli per la demo che sono pubblicati sotto GPL), ed è utilizzabile all’interno di progetti compatibili. L’ultima versione è la 0.7.1, quindi si consiglia di non andare oltre il test delle applicazioni.

Read Full Post »

(Premessa: ieri ho consegnato la tesi, di conseguenza il lavoro è sostanzialmente finito, e l’appello di laurea è confermato per il 20 dicembre; è ora di rispondere ad un po’ di richieste che ho ricevuto sull’argomento del mio elaborato, premesso che per una descrizione dettagliata del lavoro e le relative conclusioni dovrete venire alla mia laurea o a scelta aspettare i giorni successivi, quando pubblicherò il PDF)

Il progetto che verrà presentato il 20 dicembre ha avuto origine da una ricerca più ampia riguardante sistemi in grado di adattarsi a runtime al contesto all’interno del quale si trovano ad operare, e possano perciò modificare il proprio funzionamento, i servizi offerti ad eventuali client o il modo in cui sfruttano servizi a loro offerti in base a modifiche dell’ambiente o delle condizioni di funzionamento proprie dei sistemi stessi considerati. Due sono stati i settori di questa ricerca su cui il lavoro si è concentrato: il primo riguarda gli stili architetturali in grado di supportare questo paradigma, mentre il secondo riguarda i linguaggi di programmazione più adatti per sviluppare programmi di questo tipo.

Per quanto riguarda i primi, la condizione è che riescano a garantire scalabilità e ad isolare quelle parti del software che effettivamente possano richiedere un aggiornamento; l’esempio primo di architettura è REST, che essendo alla base del Web di oggi è evidentemente in grado di supportare uno scenario dinamico come quello di Internet, mentre l’esempio che segue immediatamente è Computational REST, una sorta di evoluzione del primo sviluppata da alcuni ricercatori presso l’Università della California presso Irvine, il quale riprende alcuni concetti di codice mobile e li integra in un’infrastruttura costruita sul protocollo HTTP, per costruire un Web in cui l’attenzione non sia più sul contenuto ma sulla computazione: per semplificare molto (forse troppo), da un certo punto di vista potreste vedere questa visione come un AJAX “on steroids“: invece di avere semplice codice Javascript che si muove nella Rete, ci sarebbe codice vero, scritto in linguaggi di programmazione “reali” e veramente eseguito dalle macchine…

Per i linguaggi, invece, una disamina dei più promettenti è stata fatta nell’articolo scritto per il corso di “Argomenti avanzati di Ingegneria del Software“, e tra i migliori è emerso Erlang, un linguaggio di programmazione funzionale orientato alla concorrenza: esso supporta non solo la creazione e gestione di migliaia di processi leggeri, distribuiti dinamicamente sui core di una singola macchina o addirittura tra macchine di una rete, ma permette anche l’aggiornamento dinamico del codice: un applicativo può infatti subire l’aggiornamento di uno o più moduli “a caldo”, senza dover fermare il servizio e senza che le istanze del codice precedente l’aggiornamento vengano fermate o in qualche modo disabilitate.

L’idea della tesi è stata quindi di mettere insieme l’architettura CREST, in origine sviluppata in Scheme, ed Erlang, e verificare se l’utilizzo di un linguaggio di programmazione in grado di offrire numerose facilitazioni sia per la comunicazione tra processi che per l’aggiornamento dinamico del codice avrebbe ben supportato tale architettura. Per i dettagli e le conclusioni sia sul linguaggio che sull’architettura, non posso anticiparvi nulla: vi aspetto a dicembre!

P.S.: dopo l’appello di laurea seguirà un secondo post con le conclusioni ed un paio di riflessioni personali sullo sviluppo di Internet, se non doveste farcela ad essere presenti vedrò comunque di soddisfare la curiosità che questo post vi dovrebbe lasciare…

Read Full Post »

Se vi è capitato di creare progetti Erlang un minimo complessi, è molto probabile che abbiate usato un makefile, più o meno complesso, con cui compilare i sorgenti, creare la documentazione e magari funzionalità più complesse.

Ebbene, finalmente c’è uno strumento adatto a questo linguaggio e framework: Rebar. Si tratta di un progetto scritto naturalmente in Erlang, di fatto è uno script di circa 85k, il quale è in grado di eseguire le richieste più comuni, ovvero la compilazione, la generazione di documentazione, la pulizia del progetto ed il lancio dei test EUnit; è supportata anche la generazione di scheletri di applicazione, dato un file template che descriva cosa debba essere copiato.

In realtà, la funzionalità più utile è la possibilità di gestire le dipendenze: ciascuno dei comandi di cui sopra, infatti, controlla se esiste una sottocartella deps, e se esiste ciascuno dei progetti lì contenuti viene a sua volta compilato prima del progetto principale; unico vincolo: sia le dipendenze sia l’applicazione principale devono essere configurate utilizzando il behaviour application, ed in particolare la soluzione migliore rimane inserire nella directory sorgente un file del tipo:

{application, myapp,
 [{description, "Myapp description"},
  {vsn, "x.y"},
  {modules, []},
  {registered, []},
  {mod, {myapp_app, []}},
  {env, []},
  {applications, [kernel, stdlib, crypto]}]}.

con la configurazione dei moduli vuota, e questa viene automaticamente riempita dai moduli effettivamente compilati e copiata nella directory binaria in fase di compilazione; naturalmente, non è sufficiente avere tale file, servono anche i sorgenti correttamente configurati per utilizzare il behaviour. Unico bug: se una delle dipendenze non è un’applicazione, il sistema restituisce errore, mentre io personalmente avrei preferito che si limitasse ad un warning, o comunque a compilare i sorgenti da src a ebin; nulla di grave, la maggior parte dei progetti Erlang presenti online sono anche applicazioni, ed anche voi se scrivete un progetto conviene che utilizziate la medesima modalità, che vi permette anche di gestire le release e l’aggiornamento (automatico).

La configurazione avviene tramite un file rebar.config, in cui si possono specificare le directory del progetto ed alcune opzioni minori, peraltro tutte documentate nella pagina linkata sopra.

Non viene distribuito ufficialmente con Erlang, ma è decisamente un ottimo strumento, quantomeno costruito appositamente per questo linguaggio, rispetto a makefile che è sicuramente flessibile ma richiede qualche linea di codice in più per supportare bene queste applicazioni.

Read Full Post »

Un breve update al post precedente sull’argomento: ho aggiornato i pacchetti del PPA alla versione 14B di Erlang (dalla precedente 14A, un update minore dell’interprete e delle librerie), sempre con un backport da Debian, questa volta experimental; questo ha come principale conseguenza il fatto che i pacchetti potrebbero non essere stabili, per quanto dallo stato degli stessi nel sistema originale sembra che non siano emersi problemi al momento.

Naturalmente, continuerò a seguire il percorso dei pacchetti dall’altra parte, ed i backport da questa parte; vi rimando alle release notes per sapere i cambiamenti rispetto alla versione precedente, da un primo test in locale direi che le applicazioni principali non sembrano dare problemi.

Read Full Post »

« Newer Posts - Older Posts »