Blog

Search by tag: ruby on rails

bruno @ 06/10/2008 19:39 - No comments yet
WARNING! Violento attacco di programmazione!

In questo periodo pieno di lavoro mi riesce particolarmente facile avere qualcosa da dire riguardo alla programmazione: parliamo sempre di lui, il mio amico Ruby on Rails!

A volte capita di avere a che fare con modelli complessi, collegati con associazioni has_many, per i quali la creazione di una nuova istanza deve prevedere un form dinamico.

Ad esempio: una rubrica in cui ogni nominativo può avere più di un numero di telefono.
Significa che all’interno del modello Person sarà specificata l’istruzione
has_many :phone_numbers
Si dovrà quindi implementare un form dinamico che consenta l’aggiunzione di uno o più campi riguardanti i numeri di telefono, che poi andranno salvati nella relativa tabella con l’associazione al nominativo (dopo essere stati validati).

(... e se non credete ci sia complicato, provate a farlo senza leggere questo post! ihihi!)

Ovviamente un buon programmatore RoR sa che, soprattutto in queste occasioni, bisogna applicare la filosofia DRY (don’t repeat yourself), perciò la soluzione da ricercare non sarà una soluzione elegante… bensì la più elegante =)

Non starò qui a descrivere tutta la procedura, ma vi rimando a tre screencast che chiariscono ogni dubbio:

Se non andate d’accordo con il video-learning, nelle pagine linkate trovate anche la trascrizione di tutte le operazione effettuate… veramente semplici e da applicare il più possibile, per rendere più cool le nostre web application :)


bruno @ 03/07/2008 11:51 - No comments yet

In ogni grande azienda, quando si tratta di adottare una nuova tecnologia, ci si trova sempre frenati da qualcuno che pone la domanda “e con tutto il software sviluppato finora che facciamo?”.
In effetti è vero che non si può pretendere di fare il porting di tutto il codice già scritto ogni volta che viene scoperto un nuovo framework di programmazione.

interoperabilityLa soluzione sono i Web Services, “un sistema software progettato per supportare l’interoperabilità tra diversi elaboratori su di una medesima rete” (fonte: Wikipedia).

Il Web Services Description Language (WSDL) è uno standard internazionale, promosso dal World Wide Web Consortium (W3C), che permette la descrizione delle caratteristiche di un Web Service attraverso uno schema XML/SOAP, il quale viene utilizzato come “strumento di sincronizzazione” tra il framework fornitore del servizio e quello che sarà l’utilizzatore (che, grazie a questa forma di comunicazione standard, potranno anche essere basati su linguaggi di programmazione eterogenei).
Grazie al WSDL è possibile, per esempio, utilizzare un’infrastruttura software progettata e sviluppata su un server Java (es. Tomcat), richiamandone i metodi da un server basato su Ruby on Rails (es. Mongrel).
In particolare, per quanto riguarda Ruby, si dovrebbe utilizzare la gemma SOAP4R, che però nelle ultime versioni è inclusa direttamente nel pacchetto ufficiale.

Un piccolo esempio di tutto ciò si può realizzare in pochi semplici passi, non c’è neanche bisogno di scrivere un vero tutorial.

  • Creare una Web Application con un Web Service in Java e deployarla su Tomcat:
@WebService()
public class MyWebService {
    @WebMethod(operationName = "sayHello")
    public String sayHello(@WebParam(name = "firstName")
    String firstName) {
        return "Hello, " + firstName + "!";
    }
}
  • Creare un progetto in Rails e richiamare il Web Service remoto:
class MyController < ApplicationController
  require 'soap/wsdlDriver'

  def index
    XSD::Charset.encoding = 'UTF8'
    wsdl = "http://TOMCAT_SERVER:8080/MyWebApp/MyWebService?wsdl" 
    service = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver

    result = service.sayHello :firstName => 'Bruno'

    render :text => result.return
  end
end

Ovviamente i due componenti precedentemente descritti potranno anche stare sulla stessa macchina, comunicando tramite l’interfaccia di loopback.

C’è da ricordare che lo standard XML dei Web Services permette di ritornare come output soltanto i seguenti tipi di dato:

  • Boolean
  • Byte
  • Double
  • Datatype
  • Decimal
  • Enumeration
  • Float
  • Int
  • Long
  • Qname
  • Short
  • String
  • TimeInstant
  • UnsignedByte
  • UnsignedInt
  • UnsignedLong
  • UnsignedShort
  • Array dei suddetti tipi

quindi per passare tipi di dati complessi da un’applicazione all’altra sarà necessario implementare dei metodi di serializzazione/deserializzazione sugli oggetti.

PS: un motivo in più per utilizzare NetBeans, che dalla versione 6 supporta anche Ruby on Rails e PHP! :)


bruno @ 14/04/2008 11:22 - 2 comments

La notizia è tanto semplice questo attesissima: finalmente qualcuno ha concretizzato ciò che mancava a Ruby on Rails per entrare nel cuore di tutti i web-developer, cioè un metodo semplicissimo per deployare le applicazioni RoR su un server di produzione Apache, senza usare “Mongrel + mod_proxy” o moduli anche più strani, e soprattutto mantenendo delle ottime prestazioni!

mod_rails
Passenger (a.k.a. mod_rails)

Non riempirò il post di procedure di installazione, perchè il tutto è creato veramente in “RoR-style”, cioè semplice ed immediato: si installa con gem e ogni applicazione si configura con un paio di righe in httpd.conf :)

E per concludere… cito la reazione di David Heinemeier Hansson, papà di Ruby on Rails:

“This could definitely become very popular, very fast ;)”


bruno @ 19/01/2008 21:14 - No comments yet
E’ una notizia talmente ovvia che non sembra neppure una notizia, ma qualcuno ha sviuppato un plugin per Ruby on Rails che permette di fare il rendering in HTML delle pagine scritte con la sintassi di MediaWiki... cioè lo stesso software utilizzato da Wikipedia. :)
Sarebbe successo… prima o poi. Gli automatismi di Rails non potevano permettersi una tale carenza!
MediaCloth
margherite e rubini… un regalo di sicuro effetto! :)

MediaCloth è il nome del plugin: implementa tutti i tag più diffusi della sintassi di MediaWiki, lasciando però al programmatore il compito di gestire le caratteristiche che cambiano da un sito all’altro, come la gestione dei link e delle immagini.

Mi sono convinto che questo post potesse essere utile nel momento in cui ho cercato un po’ di documentazione riguardo quest’ultimo punto. Essendo il progetto in via di sviluppo (la versione corrente è la 0.0.3), probabilmente nessuno si è ancora preso la briga di scrivere due righe sull’argomento… quindi ho dovuto andarci per tentativi! :P

L’installazione è semplice:

# gem install mediacloth

... mentre nel controller o nel modulo che si occuperà del rendering, servirà qualcosa del genere:

require 'mediacloth'

parser = MediaWikiParser.new
parser.lexer = MediaWikiLexer.new
ast = parser.parse(input)
generator = MediaWikiHTMLGenerator.new
generator.parse(ast)
output = generator.html

Quello che nessuno vi dirà mai è che… è proprio qui che si deve intervenire per includere il nostro gestore di link!

Prima di tutto creiamo il file lib/mywikilinkhandler.rb :
require 'mediacloth'
require 'builder'

class MyWikiLinkHandler < MediaWikiLinkHandler
  def url_for(page)
    "/wiki/#{page}"        # ... PER ESEMPIO
  end

  def link_attributes_for(page)
    { :href => url_for(page) }
  end

  def link_for(page, text)
    elem.a(link_attributes_for(page)) { |x| x << text }
  end

  def link_for_resource(prefix, resource, options=[])
    case prefix
    when 'Image' # ANALOGAMENTE E' POSSIBILE AGGIUNGERE ALTRI TIPI DI RISORSA
      "<img src=\"/images/#{resource}\" alt=\"#{resource}\" />" 
    else
      link_for "#{resource}",
            !(options.empty?) ? options.join(', ') : "#{resource}" 
    end
  end

  protected
  def elem
    Builder::XmlMarkup.new
  end
end

... e poi modifichiamo il codice di prima, dicendogli di utilizzare il nuovo link handler:

require 'mediacloth'
require 'mywikilinkhandler'

parser = MediaWikiParser.new
parser.lexer = MediaWikiLexer.new
ast = parser.parse(input)
generator = MediaWikiHTMLGenerator.new
generator.link_handler = MyWikiLinkHandler.new
generator.parse(ast)
output = generator.html

Fatto! :)

Adesso il parser riconoscerà [[Link interno]], [http://www.brunomendola.net Link esterno] e [[Image:immagine.png]].

Per una panoramica sulla sintassi wiki, fate riferimento alla guida base di MediaWiki.

Opzionalmente, se proprio voleste realizzare un super-wiki, c’è la possibilità di utilizzare un altro plugin per fare il rendering delle differenze tra le diverse versioni dei documenti: diff-lcs un porting in linguaggio Ruby del famoso algoritmo Diff che viene utilizzato un po’ dappertutto.
Al contrario di MediaCloth, questo plugin è molto ben documentato… basta leggere e programmare! :)

Spero che questo post faccia risparmiare tempo a qualche programmatore in cerca di lumi :)

Buon divertimento!


bruno @ 06/12/2007 20:16 - 2 comments

E’ un periodo un po’ tormentato questo, e qualcuno del gruppetto lo sa bene.

Però in mezzo a tanta confusione emerge questa cosa divertente: ieri mi hanno chiamato al cellulare per un’offerta lavorativa, da Londra. Il tizio, in perfetto “Oxford english” (che veniva u’ cori a sentirlo… non come l’irlandeseee!), mi ha detto che ha trovato il mio CV italiano su internet e voleva mandato quello in inglese, perchè desiderava propormi qualcosa.
Abbiamo parlato un po’ di quello che faccio per ora, della situazione del settore IT in Italy, delle tecnologie e dei linguaggi di programmazione con cui ho esperienza e… ha fatto un bel salto sulla sedia quando ho pronunciato le parole “Ruby on Rails”! :P

Tutto ciò per dire che alla fine RoR è tornato utile: l’ho imparato quasi costretto da alcune pressioni, mi è piaciuto, ci ho programmato questo sito… e poi è arrivata questa bella notizia!
A prescindere da come si svilupperà la situazione (che ancora non è nemmeno una situazione, è una cosa indefinita), sono contento di sapere che qualcuno investe in tecnologie nuove e forse anche rischiose… e soprattutto che pensi a me per realizzarle! :D

La birra promessa all’ex team di sviluppo dell’ “INFOPA community portal” comincia a materializzarsi…


bruno @ 11/11/2007 16:45 - 9 comments

Dopo una piccola pausa di riflessione, eccomi di nuovo nel mondo dei blogger! :) Alcuni pensavano che fossi rimasto a Lampedusa (non era poi così improbabile), ma sotto sotto ho continuato a lavorare per cambiare un po’ le carte in tavola.

Sì, in effetti c’è qualcosa di diverso. Si nota appena, vero?
Nel tempo libero ho studiato un nuovo linguaggio di programmazione, Ruby on Rails, e il miglior modo per impararlo veramente bene era realizzare qualcosa di concreto.

Ed ecco che è nato il mio nuovo sito! :) Finalmente uno spazio molto meno “angusto” per poter mettere on-line ciò che mi pare! Credo proprio che non ci sia paragone con il vecchio sito… penso di aver fatto anche un buon lavoro dal punto di vista grafico, un po’ in stile web 2.0, con iniezioni di AJAX che non mancavano neanche prima, ma adesso sembrano meglio integrate nel contesto.

Devo ringraziare il gruppo dei “lamentosi” di INFOPA.net: era nata una polemica sulla richiesta di rendere aperto al pubblico il codice da me sviluppato in PHP… cosa che mi faceva girare abbondantemente le scatole, perchè praticamente nessuno si era mai reso disponibile per aiutarmi nel colossale lavoro di costruzione del portale; o almeno nessuno di quelli che PRETENDEVANO i sorgenti di INFOPA, riempiendosi la bocca di paroloni che evidentemente lasciano il tempo che trovano (l’avevo capito solo io però, fin dall’inizio). Per tutta risposta, visto che c’era tutta questa voglia di “sentirsi una comunità”, ho aperto un progetto su Sourceforge, con l’intento di costruire veramente un portale che fosse il risultato della collaborazione di un gruppo.. e non del solito kamikaze di turno che si accolla tutto il lavoro.

Si è cominciato a parlare del progetto, del linguaggio di programmazione (si è scelto appunto Ruby on Rails), della struttura del sito e delle idee innovative che si volevano realizzare. Com’è andata a finire? Beh.. sono stato l’unico a fare veramente qualcosa, mentre il gruppetto di 10 persone che si era formato inizialmente è andato piano piano scemando nel mutismo più totale. Come volevasi dimostrare… complimenti vivissimi! :)

Io intanto c’ho guadagnato un linguaggio di programmazione in più…. e CHE linguaggio di programmazione!! :P Si riescono a fare con pochissime righe di codice cose che, dovendole fare in PHP, mi ci sarebbero volute ore ed ore di sbattimenti di testa al muro. Sono contento! =)

C’è ancora molto da migliorare, soprattutto “dietro le quinte”, ma non vedevo l’ora di mettere tutto on-line.

Ah… ricordatevi di cambiare i vostri bookmark: adesso mi trovate su…

www.BrunoMendola.net