Forum: Italian Ruby user group JRuby & Rails Controller

Posted by Pippo Sario (tuland)
on 2010-08-24 12:31
Salve a tutti. Rinnovo i miei complimenti per l'ottimo servizio che
offrite.

Volevo porvi una domanda e spero che mi possiate dare qualche
suggerimento. Probabilmente la soluzione è molto semplice, ma non riesco
proprio a sbloccarmi.

PREMESSA:
Ho scelto jRuby perché devo usare delle classi JAVA e più precisamente
vorrei utilizzare le API di Jena

PROBLEMA:
Riesco facilmente ad interfacciarmi con Java, ma trovo delle limitazioni
all'interno dei controller di Rails.

All'interno del controller inizializzo una classe jena (ModelFactory)
che crea un modello (Jena) di una ontologia. La salvo in una variabile
(@model) ma non riesco a capire come posso conservarla in tutte le
action.

@model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)

In pratica vorrei poter mantenere il contenuto di @model in ogni action

SOLUZIONI FALLITE:
- session: essendo ModelFactory una classe Jena/Java non è possibile
realizzare una conversione automatica con marshal
- model e salvataggio nel DB: l'operazione fallisce perché non riesce ad
applicare il metodo 'gsub' alla classe (perché ovviamente non lo
contiene)

SOLUZIONE ATTUALE (molto poco elegante):
Creo una costante.
MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
E' una soluzione che non mi piace affatto. C'è un modo alternativo per
superare questo mio problema?

Vi ringrazio anticipatamente
Posted by Marco Mastrodonato (marcomd)
on 2010-08-25 11:27
Ciao Pippo,
non mi è chiarissimo il problema, se ti interessa la persistenza o solo 
una visibilità maggiore, in quest'ultimo caso hai provato a crearlo 
nell'application controller?
Posted by Pippo Sario (tuland)
on 2010-08-25 16:57
Marco Mastrodonato wrote:
> Ciao Pippo,
> non mi è chiarissimo il problema, se ti interessa la persistenza o solo 
> una visibilità maggiore, in quest'ultimo caso hai provato a crearlo 
> nell'application controller?

Si scusa hai ragione mi sono espresso male. Vorrei che la variabile sia 
persistente e mantenesse quindi il contenuto fra pagina e pagina. Jena 
genera un suo modello(jena) su cui si possono eseguire svariate 
interrogazioni. Io sostanzialmente non vorrei rigenerare ogni volta 
questo modello(jena). In rails il contenuto della variabile è 
persistente solo fra il metodo del controller e la sua relativa view. 
Fra i diversi metodi dello stesso controller la variabile viene 
reinizializzata ad ogni accesso. In generale, risolvevo questa esigenza 
con session o memorizzando in un DB, ma in questo caso non posso. Credo 
che sia collegato alla spiegazione fornita qui: 
http://www.ruby-forum.com/topic/133234

Probabilmente la soluzione è banale ma proprio non trovo vie di uscita.

Sostanzialmente tu mi suggerisci di creare il modello(jena) 
nell'application_controller? Provo
Posted by gabriele renzi (Guest)
on 2010-08-25 17:05
(Received via mailing list)
2010/8/24 Pippo Sario <tuland@gmail.com>:
>
> @model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
>
provato a serializzare/deserializzare e mettere in session quello?
Puoi sicuramente come serializzazione java, ma mi pare che jena
potesse serializzare in N3 e robe simili, poi le metti come campo
text/blob nel db


> SOLUZIONE ATTUALE (molto poco elegante):
> Creo una costante.
> MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
> E' una soluzione che non mi piace affatto. C'è un modo alternativo per
> superare questo mio problema?


perché?
Posted by Pietro Giorgianni (giorgian)
on 2010-08-25 17:16
(Received via mailing list)
Ciao,

come spiegato nel link che citavi, quando passi da un'action all'altra
(ad esempio cliccando su un link o su un submit), l'oggetto controller
cambia; questo vuol dire che non puoi passare oggetti complessi da
un'action all'altra: sostanzialmente puoi passare (ad esempio tramite
session) solo stringhe e numeri.

Non conosco le classi java di cui parli, quindi ho una domanda: quanto
è costoso produrre l'oggetto che ti serve?

Se non è costoso potresti semplicemente usare un'instance variable,
una costante o quant'altro.

Se il costo è proibitivo, puoi tentare di scoprire se l'oggetto è 
serializzabile.

pietro
Posted by Pippo Sario (tuland)
on 2010-08-25 17:39
gabriele renzi wrote:
> 2010/8/24 Pippo Sario <tuland@gmail.com>:
>>
>> @model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
>>
> provato a serializzare/deserializzare e mettere in session quello?
> Puoi sicuramente come serializzazione java, ma mi pare che jena
> potesse serializzare in N3 e robe simili, poi le metti come campo
> text/blob nel db
>

Più che altro è che sto caricando una ontologia di 20 MB e tirarla su 
ogni volta ad ogni azione non è troppo divertente per l'utente. Quindi 
in Java dici che posso serializzare la classe? Ora ho fatto una ricerca 
più approfondita nelle API di Jena e credo che esistano metodi di questo 
tipo. Hai ragione. A occhio dovrebbero essere adatte cose come:

ModelFactory.createFileModelMaker
ModelFactory.createModelRDBMaker

Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente 
mi complicavo le cose.

> 
>> SOLUZIONE ATTUALE (molto poco elegante):
>> Creo una costante.
>> MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
>> E' una soluzione che non mi piace affatto. C'� un modo alternativo per
>> superare questo mio problema?
> 
> 
> perch�?

Perché poi non posso più modificare il model in run-time
Posted by Pippo Sario (tuland)
on 2010-08-25 17:49
Pietro Giorgianni wrote:

> Non conosco le classi java di cui parli, quindi ho una domanda: quanto
> � costoso produrre l'oggetto che ti serve?
> 
> Se non � costoso potresti semplicemente usare un'instance variable,
> una costante o quant'altro.
> 

Beh ma anche le instance variable vengono rigenerate, o mi sbaglio? Mi 
riferisco a @model che ho citato prima, per esempio.  Ad ogni richiesta 
al server me la ritrovo reinizializzata. Con le costanti funziona, ma 
poi non posso modificarle run-time.

Si è abbastanza costoso produrre quell'oggetto. Ogni volta sarebbe una 
lettura di 20Mb


> Se il costo � proibitivo, puoi tentare di scoprire se l'oggetto � 
serializzabile.

Si forse opterò per qualcosa di simile

Grazie
Posted by gabriele renzi (Guest)
on 2010-08-25 18:00
(Received via mailing list)
2010/8/25 Pippo Sario <tuland@gmail.com>:

>  Hai ragione. A occhio dovrebbero essere adatte cose come:
>
> ModelFactory.createFileModelMaker
> ModelFactory.createModelRDBMaker
>
> Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente
> mi complicavo le cose.


no quelli sono anche più smart: si gestiscono la persistenza da se su
file o su db, se per te va bene è sicuramente la soluzione migliore.


> Perché poi non posso più modificare il model in run-time
In realtà puoi farlo, una costante significa solo che non puoi
cambiare l'associazione nome-oggetto, ma l'oggetto rimane mutabile:

>> A=Array.new
=> []
>> A=2
(irb):2: warning: already initialized constant A
=> 2
>> A=Array.new
(irb):3: warning: already initialized constant A
=> []
>> A << 2
=> [2]
>> A
=> [2]


Ma si, se devi modificarlo poi avresti casini con i thread e i restart
e la persistenza, che è non è bello :)
Posted by Pippo Sario (tuland)
on 2010-08-26 10:19
gabriele renzi wrote:
> 2010/8/25 Pippo Sario <tuland@gmail.com>:
> 
>>  Hai ragione. A occhio dovrebbero essere adatte cose come:
>>
>> ModelFactory.createFileModelMaker
>> ModelFactory.createModelRDBMaker
>>
>> Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente
>> mi complicavo le cose.
> 
> 
> no quelli sono anche più smart: si gestiscono la persistenza da se su
> file o su db, se per te va bene è sicuramente la soluzione migliore.
> 

Grazie mille! Come sempre, gentili e di grande aiuto.
Posted by Msan Msan (msan)
on 2010-08-27 10:14
(Received via mailing list)
2010/8/24 Pippo Sario <tuland@gmail.com>:
> Salve a tutti. Rinnovo i miei complimenti per l'ottimo servizio che
> offrite.
>
> Volevo porvi una domanda e spero che mi possiate dare qualche
> suggerimento. Probabilmente la soluzione è molto semplice, ma non riesco
> proprio a sbloccarmi.
>
> PREMESSA:
> Ho scelto jRuby perché devo usare delle classi JAVA e più precisamente
> vorrei utilizzare le API di Jena

Scusa hai scelto jruby esclusivamente perche' devi usare classi java o
ci sono degli altri motivi?
Io non uso java ma utilizzo jruby sostanzialmente per un motivo, la
facilita' di deploy delle applicazioni.
Rispetto a ruby non ho trovato nessunissima differenza.
Posted by Pippo Sario (tuland)
on 2010-09-14 16:19
Concludo il topic segnalando che alla fine sto procedendo con l'utilizzo 
di activeRDF. C'è un adaptor di Jena che gestisce proprio la 
persistenza:

http://github.com/net7/ActiveRDF/blob/master/activerdf-jena/lib/activerdf_jena/jena_adapter.rb
Posted by Msan Msan (msan)
on 2010-09-14 16:26
(Received via mailing list)
2010/9/14 Pippo Sario <tuland@gmail.com>:
> Concludo il topic segnalando che alla fine sto procedendo con l'utilizzo
> di activeRDF. C'è un adaptor di Jena che gestisce proprio la
> persistenza:

Non hai letto la mia domanda?
Posted by Pippo Sario (tuland)
on 2010-09-14 17:31
Msan Msan wrote:
> 2010/8/24 Pippo Sario <tuland@gmail.com>:
>> Salve a tutti. Rinnovo i miei complimenti per l'ottimo servizio che
>> offrite.
>>
>> Volevo porvi una domanda e spero che mi possiate dare qualche
>> suggerimento. Probabilmente la soluzione � molto semplice, ma non riesco
>> proprio a sbloccarmi.
>>
>> PREMESSA:
>> Ho scelto jRuby perch� devo usare delle classi JAVA e pi� precisamente
>> vorrei utilizzare le API di Jena
> 
> Scusa hai scelto jruby esclusivamente perche' devi usare classi java o
> ci sono degli altri motivi?
> Io non uso java ma utilizzo jruby sostanzialmente per un motivo, la
> facilita' di deploy delle applicazioni.
> Rispetto a ruby non ho trovato nessunissima differenza.

Scusa non avevo letto!

Si essenzialmente per il riuso di classi Java, altrimenti tendo ad usare 
ruby. Potrei sbagliarmi, ma credo che il supporto sia più limitato (per 
esempio con le gemme). Quindi sostanzialmente uso jRuby solo quando è 
strettamente necessario. In ogni caso con jRuby non ho mai avuto 
problemi. Anch'io ho trovato il deploy molto rapido: io uso per esempio 
warbler.
Posted by Msan Msan (msan)
on 2010-09-14 17:50
(Received via mailing list)
2010/9/14 Pippo Sario <tuland@gmail.com>:
>>> Ho scelto jRuby perch� devo usare delle classi JAVA e pi� precisamente
> Si essenzialmente per il riuso di classi Java, altrimenti tendo ad usare
> ruby. Potrei sbagliarmi, ma credo che il supporto sia più limitato (per
> esempio con le gemme). Quindi sostanzialmente uso jRuby solo quando è
> strettamente necessario. In ogni caso con jRuby non ho mai avuto
> problemi. Anch'io ho trovato il deploy molto rapido: io uso per esempio
> warbler.

Anch'io uso warbler e rispetto alla soluzione apache + passenger non
c'e' paragone.
Per le gemme ormai sono quasi tutte supportate.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.