sabato 27 giugno 2015

Come estrarre un file tar con php

A partire dal Php 5.2.0, è disponibile la classe Phar, che permette di interagire con archivi Zip e Tar.
In questo post mostro un semplice snippet per estrarre un archivio Tar in una directory temporanea.

$phar = new PharData('nome-archivio.tar');
//Estraggo tutti i files posizionandoli in /tmp/
$phar->extractTo('/tmp/', null, true);

venerdì 26 giugno 2015

Elencare tutti i files con estensione jpg in una directory con php

Oggi pubblico un semplice codice php che sfrutta la comoda funzione glob().
Questa funzione permette di ricercare files con un determinato pattern all'interno di una cartella specificata.
Di seguito, un semplice snippet per ricercare files con estensione .jpg

$_DIR = '/var/www/html/images/';
$images_array = glob($_DIR . '*.jpg');       
foreach ($images_array as $image) {
   echo $image;
}

giovedì 18 giugno 2015

Automatic scaling di una finestra in C#

Sviluppando un software a finestre in C# e non una web application, spesso si ha il problema di renderlo in qualche modo "responsive" e quindi adattabile alle varie risoluzioni dello schermo o al ridimensionamento della finestra.

Dopo aver cercato su internet per un po', sono finalmente giunto ad uno script facile e veloce per gestire la cosa. Una premessa è doverosa: il C# ha un suo metodo di scaling che però non agisce direttamente sui Font. Il che significa che, oltre allo scaling del controllo, è necessario effettuare anche un ridimensionamento del font con la stessa proporzione.
E' importante disabilitare la funzionalità di autoscale nativa, che permette un adattamento solo parziale e successivamente ridimensionare ogni controllo della finestra con una determinata proporzione (ratio).


Di seguito i pochi passi necessari per il corretto funzionamento del ridimensionamento.

1. Aggiungere nelle dichiarazione delle variabili
private Size currSize;
2. Aggiungere nel costruttore, dopo InitializeComponent()
this.AutoScaleMode = AutoScaleMode.None;
currSize = this.Size;
3. Aggiungere la seguente funzione
private void autoscale()
{
   Font tempFont;
   SizeF ratio = SizeF.Empty;
   //calculate resizing ratio
   ratio = new SizeF((float)this.Width / currSize.Width, (float)this.Height / currSize.Height);
   //loop through all controls and scale them
   foreach (Control c in this.Controls)
   {//Get current font size, Scale object and scale font
      tempFont = new Font(c.Font.Name,
      c.Font.SizeInPoints * ratio.Width * ratio.Height);
      c.Scale(ratio);
      c.Font = tempFont;
   }
   //update current size
   currSize = this.Size;
}
4. Utilizzare la funzione precedente nell'evento SizeChanged della windows form
private void Form1_SizeChanged(object sender, EventArgs e)
{
   autoscale();
}

mercoledì 17 giugno 2015

Monitorix - uno snello sistema di monitoring risorse per Linux


Oggi presento Monitorix, un sistema di monitoraggio delle risorse del sistema per Linux. E' strutturato in due parti:
- un demone che colleziona i dati storicizzandoli;
- un webserver con uno script cgi che permette la visualizzazione dei dati raccolti in formato grafico.

L'installazione è molto semplice, sul sito si trovano le istruzioni. Riporto i passi per l'installazione su Debian / Ubuntu:

1. Modificare il file /etc/apt/sources.list aggiungendo
deb http://apt.izzysoft.de/ubuntu generic universe

2. Scaricare la chiave GPG del repository
wget http://apt.izzysoft.de/izzysoft.asc

3. Aggiungere la chiave
sudo apt-key add izzysoft.asc
4. Installare monitorix
sudo apt-get update
sudo apt-get install monitorix

A questo punto, ci si può godere il risultato collegandosi all'indirizzo ip del server sul quale monitorix è installato, oppure in locale: porta 8080, sottocartella monitorix/
http://localhost:8080/monitorix/



venerdì 5 giugno 2015

Caricamento automatico delle classi in Php

In principio fu l'include (o il require) di tanti file php che contenevano funzioni. 
Poi vennero le classi, incluse a mano una per una.
Ed ora? Adesso il Php è un linguaggio molto più maturo, dotato di namespace, che permettono a classi con lo stesso nome di coesistere (con namespace diversi) all'interno dello stesso progetto. In questo modo, includere una libreria di terze parti progettata a namespace non comporta più problemi di omonimia di classi.
Altra caratteristica utilissima, novità rispetto al passato, è l'autocaricamento delle classi. Onde evitare una lunghissima lista di inclusioni, una per ogni classe, è stata introdotta la funzionalità di autoload.
Come funziona? Semplice: utilizzando la funzione spl_autoload_register() spiegheremo all'interprete Php come comportarsi in caso di classi "che non conosce", ovvero che non sono state esplicitamente incluse nello script. Per maggiori informazioni, consiglio il sito ufficiale.
Vediamo un semplice esempio:
//Autoloading classes
spl_autoload_register(function($className)
{
     //Obtain the pure class name
     $pureClassName = getRealClassName($className);
     //Build the path
     $namespace = getNameSpace($className);
     if(file_exists($namespace.'/'.$pureClassName.'.php')) {
         include_once($namespace.'/'.$pureClassName.'.php');
     }
});

function getRealClassName($fullClassName) {
     //Explode class name
     $classNameArray = explode('\\',$fullClassName);
     //Obtain the pure class name
     return end($classNameArray);
}
    
function getNameSpace($fullClassName) {
     //Explode class name
     $classNameArray = explode('\\',$fullClassName);
     //Remove the pure class name
     array_pop($classNameArray);
     //Remove the main namespace (first)
     array_shift($classNameArray); 
     //Build the path
     $namespace = implode('/', $classNameArray);
     return $namespace;
}
Breve spiegazione: nel caso il Php non trovi una classe, tenta una inclusione automatica, cercando il file posizionato nel percorso indicato dal namespace (stessa struttura delle cartelle quindi) e chiamato come il nome della classe, con estensione php. Le due funzioni getRealClassName() e getNameSpace() sono semplici funzioni che interpretano il nome della classe separando namespace dal nome "proprio" della classe stessa. Unica cosa degna di nota, viene eliminato il primo ramo del namespace, che solitamente è il nome del progetto.
Quindi, riassumendo, un comando simile:
new \ProjectName\Core\Othernamespace\Classname()
Causerà una include automatica del percorso
Core/Othernamespace/Classname.php