sabato 30 luglio 2011

Gestire le macchine virtuali vmware con uno script shell linux

Ecco un bello script Shell per gestire le macchine virtuali, l'ho preparato al lavoro per semplificarci la vita.
Funziona benino :-)
#!/bin/sh
while :
 do
    clear
dialog --backtitle "Gestione Macchine Virtuali" \
--menu "Seleziona dall'elenco l'azione che vuoi eseguire" \
15 60 5 \
1 "Visualizzare lista VM accese" \
2 "Visualizzare lista VM disponibili" \
3 "Accendere una VM" \
4 "Spegnere una VM" \
5 "Esci" \
2>/tmp/menuitem.$$
OPZIONE=`cat /tmp/menuitem.$$`

    case $OPZIONE in
        1) RESULT=`vmrun -T server -h https://localhost:8333/sdk -u administrator -p password list`
           dialog --title "Lista Macchine accese" --backtitle "Creato da Stefano Bianchini" --msgbox "$RESULT" 12 50
        ;;
        2) RESULT=`vmrun -T server -h https://localhost:8333/sdk -u administrator -p password listRegisteredVM`
        dialog --title "Lista Macchine disponibili" --backtitle "Creato da Stefano Bianchini" --msgbox "$RESULT" 12 50
        ;;
        3)
            vmrun -T server -h https://localhost:8333/sdk -u administrator -p password listRegisteredVM | grep ".vmx" > /tmp/regVM.$$
        righe=$(wc -l /tmp/regVM.$$ | awk '{print $1}')
            riga=0
            TOTALE=""
        while [ $riga -lt $righe ]; do
        #let riga+=1
              riga=`expr $riga + 1`
              #riga=$riga+1
              current=$(head -$riga /tmp/regVM.$$ | tail -1)
              TOTALE="$TOTALE \"$current\" =="
        done


        TOTALE="dialog --backtitle \"Creato da Stefano Bianchini\" --menu \"Seleziona la macchina virtuale\" 0 0 0 $TOTALE 2>/tmp/menuitem.$$"
        echo $TOTALE > /tmp/menu.$$

        chmod +x /tmp/menu.$$
        /tmp/menu.$$

        CHOICE=`cat /tmp/menuitem.$$`
        if [ "$CHOICE" != "" ] ; then
        vmrun -T server -h https://localhost:8333/sdk -u administrator -p password start "$CHOICE"
        fi
        ;;
        4) 
            vmrun -T server -h https://localhost:8333/sdk -u administrator -p password list | grep ".vmx" > /tmp/regVM.$$
        righe=$(wc -l /tmp/regVM.$$ | awk '{print $1}')
            riga=0
            TOTALE=""
        while [ $riga -lt $righe ]; do
              riga=`expr $riga + 1`
              current=$(head -$riga /tmp/regVM.$$ | tail -1)
              TOTALE="$TOTALE \"$current\" =="
        done


        TOTALE="dialog --backtitle \"Creato da Stefano Bianchini\" --menu \"Seleziona la macchina virtuale\" 0 0 0 $TOTALE 2>/tmp/menuitem.$$"
        echo $TOTALE > /tmp/menu.$$

        chmod +x /tmp/menu.$$
        /tmp/menu.$$

        CHOICE=`cat /tmp/menuitem.$$`
        if [ "$CHOICE" != "" ] ; then
        vmrun -T server -h https://localhost:8333/sdk -u administrator -p password stop "$CHOICE" soft
        fi
        ;;
        5) exit 0
        ;;
        *) exit 1
        ;;
    esac
done

venerdì 29 luglio 2011

C# - formattare in stringa la dimensione di un file

Semplice funzione per formattare la dimensione di un file, trovata a questo indirizzo.
Utilizzando in C# l'oggetto FileInfo (per ottenere informazioni su un determinato file) il valore emesso dalla funzione Lenght è di tipo long. Serve quindi una funzione che lo formatti capendo se si tratta di Mb, Gb, Kb eccetera.
public static string ToByteString(long bytes)
{
   long kilobyte = 1024;
   long megabyte = 1024 * kilobyte;
   long gigabyte = 1024 * megabyte;
   long terabyte = 1024 * gigabyte;
   if (bytes > terabyte) return (bytes / terabyte).ToString("0.00 TB");
   else if (bytes > gigabyte) return (bytes / gigabyte).ToString("0.00 GB");
   else if (bytes > megabyte) return (bytes / megabyte).ToString("0.00 MB");
   else if (bytes > kilobyte) return (bytes / kilobyte).ToString("0.00 KB");
   else return bytes + " Bytes";
}

Ed ora un semplice esempio di utilizzo:
FileInfo fi = new FileInfo(filename);
Console.Write("Dimensione file: " + ToByteString(fi.Length));
Questa funzione è fondamentale per un componente C# (User Control) che sto preparando: un fileBrowser.

mercoledì 27 luglio 2011

jQuery: semplice e veloce slideshow (base)

Girovagando per la rete, mi sono imbattuto in questo codice per creare una veloce slideshow con il framework jQuery.
Ovviamente fare il copia e incolla non è nel mio stile quindi ho apportato qualche piccola modifica nel codice (niente di speciale, tempistiche e stile degli elementi).
Questo perché, se utilizzate direttamente il codice originale, verrà mostrato un effetto non voluto: durante la transizione delle immagini, se ne vedono due in una volta che sembra che facciano a botte tra di loro per mostrarsi (ok, fate prima a provare di persona per capire cosa intendo). 
Per la cronaca, l'autore del codice originale lascia all'utilizzatore finale il compito di aggiungere tutto lo stile CSS. E così ho fatto :-)

Qui di seguito il listato della slideshow personalizzata. Iniziamo con la testata del file html (standard), dove andremo ad inglobare jQuery:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Prova Slideshow</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
Proseguiamo con il cuore del codice:
<script>
$(function(){
    $('.slideshow img:gt(0)').hide();
    setInterval(function(){$('.slideshow :first-child').fadeOut(1500).next('img').fadeIn(1500).end().appendTo('.slideshow');}, 2400);
});
</script>
Io ho aggiunto la tempistica del fadeOut e del fadeIn (1 secondo e mezzo).
Applichiamo uno stile css adeguato ai nostri scopi: slideshow centrato, sovrapposizione delle immagini per evitare effetto "litigio", eccetera:
<style type="text/css">
body {
 margin:0;
 padding:0;
 text-align:center;
}
.slideshow {
 margin:0 auto;
 padding:0;
 width:618px;
 height:246px;
 border:1px solid #eeeeee;
}
.slideshow img { 
 display:block;
 position:absolute;
}
</style>
E finiamo in bellezza con il codice html dello slideshow (e del resto della pagina)
</head>
<body>
 <div class="slideshow">
  <img src="1.jpg"/>
  <img src="2.jpg"/>
  <img src="3.jpg"/>
 </div>
</body>
</html>

martedì 26 luglio 2011

jQuery: eliminare una riga di una tabella (con richiesta ajax)

Poco tempo fa ho avuto la necessità di sviluppare un piccolo programma di protocollo. Caratteristica base era che ogni documento protocollato poteva avere più mittenti e più destinatari: la cancellazione degli stessi, così come la modifica, doveva avvenire in modo trasparente e veloce, ossia... tramite ajax :-)
Ricercando nel web, mi sono imbattuto in questa soluzione, facilmente adattata alle mie esigenze:
function cancellaMittente(id,num_progressivo,anno_progressivo){
 if (confirm('Sicuro di voler eliminare questo mittente?')) {
  jQuery.post('cancella_mittente.php', {id: +id, num_progressivo: + num_progressivo, anno_progressivo: +anno_progressivo },
  function(){
   jQuery("#mittente_"+id).fadeOut("slow");
  });
 }
}
Questa funzione verrà richiamata ogni volta che si vorrà eliminare un determinato mittente ed eseguirà le operazioni:
  1. esecuzione di una richiesta ajax di tipo post al file cancella_mittente.php con parametro id (dell'anagrafica), num_progressivo e anno_progressivo (questi ultimi identificano il documento protocollato);
  2. fadeOut, e quindi dissolvenza e cancellazione, della riga selezionata (la discriminazione è per id del tag, ad esempio mittente_1
Lato html invece la questione è semplice:
<tr id="destinatario_1">
   <td width="50">
      <a href="#" onclick="cancellaDestinatario(1,12,2011)">
      <img src="img/remove.png" /></a>
   </td>
   <td align="center">Pinco Pallino</td>
</tr>
Il file richiamato via post ajax avrà il compito di eliminare dal database la entry relativa all'id passato per parametro. Di seguito l'implementazione vera, con due parametri (num_progressivo e anno_progressivo) che per semplicità sono stati omessi nei listati precedenti:
<?php

require('engine/config.php');

if(is_numeric($_REQUEST['num_progressivo']) && is_numeric($_REQUEST['anno_progressivo']) && is_numeric($_REQUEST['id'])) {

$ris=$db->query("DELETE FROM ". $__TABLE_PREFIX."protocollo_mittente WHERE mittente_documento_num_progressivo='".$_REQUEST['num_progressivo']."' AND mittente_documento_anno_progressivo='".$_REQUEST['anno_progressivo']."' AND mittente_id_anagrafica='".$_REQUEST['id']."'");

}

?>

mercoledì 13 luglio 2011

C# - intercettare la pressione dei tasti funzione in un form

Brevissimo tips su come intercettare la pressione di un tasto "speciale" (ad esempio, tasti funzione, oppure Alt, Canc eccetera) in un form C#.
Per prima cosa, dobbiamo impostare a true l'attributo KeyPreview del form stesso, come si nota da figura:

A questo punto dobbiamo associare all'evento KeyDown del form una determinata funzione:

private void FormCassa_KeyDown(object sender, KeyEventArgs e)
{
   //Intercetto il tasto F2
   if (e.KeyCode == Keys.F2) MessageBox.Show("F2 Premuto");
}
Chiaramente se voglio intercettare F5, basta confrontare il tasto premuto con Keys.F5 . Tutto qua :-)