Hibernate: Strategie di Fetch

Quando si a che fare con delle entity (padre) che hanno delle collection di altre entity (figli),  Hibernate offre la possibilità di “tirare su” dal db la collection dei figli subito, nel momento in cui si accede al padre, o in un secondo momento, quando si cerca di accedere direttamente ai figli.
L’attributo che indica QUANDO prendere la collection dal db è  lazy=”true|false”. Con true,detto anche comportamento lazy, l’oggetto figlio sarà preso dal db solo nel momento in cui viene invocato. Questo fa si che le query siano molto veloci, si prendono dal db solo i padri, però, se la lettura dei figli avviene fuori dal contesto di hibernate (come ad esempio un EJB),  potremmo avere che la sessione è chiusa e quindi verrà sollevata una exception. 
Con  lazy = “false”, detto anche comportamento eager, non avremo problemi di sessione chiusa  ma le prestazioni potrebbero decadere in quanto con una singola query si potrebbe tirare su  tutto il DB.
Per indicare COME i figli devono essere letti dal db si l’attributo fetch = “select|subselect|join|batch”.
select: una seconda select è usata per leggere la collection,  quindi Hibernate eseguirà  una select per il padre e una select per i  figli. 
Se, per esempio, abbiamo 10 entity padre (A) e ciascuna padre ha al suo interno una collection  di figli (B) di grandezza qualsiasi, verranno eseguite le seguenti select:
select  A –> eseguita  1 volta, ci darà tutti i padri che ci interessano
select B where A.Id = ? —-> eseguita altre 10 volte
avremo quindi in totale 11 select eseguite.  Questa opzione è quella di default. 
join:  verrà eseguita un’unica select, mettendo in JOIN il padre con  tutti i suoi figli. 
batch-size=N: questo è un  po contorto, esso indica non quanti elementi della collection devono essere letti ma indica quante collection devono essere lette. Riconsiderando l’esempio precendente, se  batch-size = 5 leggeremo al  massimo 5 collection di figli per volta
select A —> 1 volta
select B where A.id in ( ?, ?, ?, ?, ? )  –> eseguito 10/5= 2 volte
le select totali questa volta sono 3,  al posto delle 11 select richieste normalmente, un bel risparmio di tempo.
subselect: hibernate utilizzerà le subquery. In questo caso le select generate sono
select A—> 1 volta
select B where A.id  in ( select A  )     –>   1 volta
quindi in questo caso avremo 2 select in tutto. 
Ogni opzione ha i suoi pro e i suoi contro, molto dipende dal tipo di DB usato e dalla complessità dello schema.

Android: Toast con Immagine e vibrazione

Codice per visualizzare un Toast di Android con una immagine e  vibrazione:

package com.AndroidImageToast;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class ImageToastExample extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
Toast toast1 = new Toast(getBaseContext());
       LinearLayout toastLayout = new LinearLayout(getBaseContext());
       toastLayout.setOrientation(LinearLayout.HORIZONTAL);
       ImageView image = new ImageView(getBaseContext());
       TextView text = new TextView(getBaseContext());
       image.setImageResource(R.drawable.radiazioni);
       toastLayout.addView(image);
       toastLayout.addView(text);
       toast1.setView(toastLayout);
       toast1.setGravity(Gravity.CENTER | Gravity.CENTER, 0, 0);

Vibrator v = (Vibrator) getApplicationContext()
.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(300);


toast1.show();
    }
}

Arduino: Luminosità Led Con Potenziometro

L’esperimento consiste nel regolare, tramite potenziometro, l’intensità della luce emessa da un LED.

Materiale richiesto:
1 resistenza 1KOhm
1  potenziometro
1 led
e ovviamente un arduino.
Piccolo ripasso dei componenti:

Potenziometro,  fondamentalmente è un dispositivo che  permette di variare la resistenza, e quindi la quantita di corrente che attraversa il circuito, tramire una semplice manopola. O meglio, non regola la quantita di corrente  ma bensi la tensione. Infatti le resistenze NON bloccano la corrente! come per tutti i bipoli elettrici, si ha che I(in) = I(out), sempre!
Quello che fanno è assorbire della potenza e provocare una caduta di tensione ai capi. Ricordiamo che la prima legge di Ohm è V=R*I, essendo I costante variando R variamo la V.





Led, è un compontente che sviluppa luce al passaggio di corrente. O meglio, il led si comporta come un conduttore perfetto quando si applica una tensione in un certo modo (polarizzazione diretta),  e diventa un isolante quando si inverte la tensione (polarizzazione inversa) . Tutto questo in teoria, nella realtà, osservando la curva corrente-tensione di un diodo, si nota che la conduzione in polarizzazione diretta
è possibile solo superando una tensione di soglia Vg. Il polo positivo è detto anodo, quello negativo catodo. La polarizzazione diretta è quando si applica il positivo all anodo e il negativo al catodo
Riassumento e semplificando, possiamo considerare questo dispositivo dal suo aspetto funzionale (ideale) come un interruttore, il quale risulta essere chiuso quando è polarizzato direttamente (quindi percorso da una determinata intensità di corrente) ed aperto quando è polarizzato inversamente (non consente il passaggio di intensità di corrente, nel caso ideale).

Schema elettronico

 

 

 

 

 

 

 

 

Per quanto riguarda la  parte software abbiamo

int valore = 0;
int pinPonteziometro = A0;
int pinLed = 9;
void setup() {
pinMode(pinPonteziometro, INPUT); // pin potenziometro
pinMode(pinLed, OUTPUT); // pin led
Serial.begin(9600); // inizializza il collegamento seriale

}

void loop() {
valore = analogRead(pinPonteziometro); // legge il valore analogico del //potenziometro
Serial.print("Valore letto dal potenziometro:");
Serial.println(valore); // Stampa il valore letto
if (valore > 255)
digitalWrite(pinLed, HIGH); //accende il led
if (valore < 0)
digitalWrite(pinLed, LOW); //spegne il led
if (valore > 0 && valore < 255)
digitalWrite(pinLed, valore); // intensita luminosa del led uguale al valore letto dal potenziometro
delay(1000); // aspetta 1000 millisecondi, ossia un secondo
}

da notare che la luminosità del led può assumere valori che vanno da 0 a 255, mentre i valori del potenziometro vanno fino a 1024, se non sbaglio, ecco spiegato il perchè delle if.

Uno sketch è composto da due funzioni: setup() che serve a inizializzare le varie componenti e loop() che viene eseguita in continuazione su arduino. Altre funzioni native di arduino sono:

  • digitalWrite(a1,a2), comunica al pin digitale a1 di assumere il valore a2
  • analogRead(a1), legge il valore analogico dalla porta a1.