Author Archives: admin

Programmazione – Lazy Initialization Design Pattern

14 Jun, 2017
admin
No Comments

La Lazy initialization, ovvero inizializzazione pigra, è una tattica che prevede l’istanziazione un oggetto, inizializzazione di una variabile, lo svolgimento di un calcolo piuttosto che l’esecuzione di un processo esclusivamente nel momento in cui tale operazione è richiesta.

Lo scopo di questo pattern, è legato al miglioramento delle performance di un applicativo.

Come si può dedurre quindi, la Lazy initialization si rende applicabile nei seguenti casi:

ritardare un’operazione costosa fino a quando è assolutamente necessario svolgerla
memorizzare il risultato di operazioni complesse in modo da non doverle svolgerle nuovamente
Le immediate conseguenze dell’applicazione di questo pattern, sono quindi espresse dalla logica alla base del pattern stesso. Ottimizzare le operazioni costose, rendendole pigre e tenendo memorizzati i risultati dell’elaborazione ove fossero presenti.

Come ovvio il miglioramento delle performance che si ottiene applicando questo pattern (ove ce ne fosse), è strettamente legato alle caratteristiche del problema e a volte può non essere significativo. Come per ogni ottimizzazione, questa tecnica dovrebbe essere utilizzata solo se c’è un beneficio evidente.

Di solito, il pattern viene implementato memorizzando in un flag l’avvenimento di un determinato processo. Ogni volta che avviene un certo evento, si esamina il flag. Se il flag è settato a false, si continua, altrimenti si inizializza una certa variabile o si istanzia un certo oggetto.

Programmazione – Prototype Design Pattern

14 Apr, 2017
admin
No Comments

L’utilizzo di questo pattern permette la creazione di nuovi oggetti a partire da un oggetto iniziale, detto appunto prototipo. A differenza di altri pattern permette di specificare nuovi oggetti a run time, utilizzando un gestore di prototipi per salvare e reperire dinamicamente le istanze degli oggetti desiderati.

Come per gli altri pattern creazionali, lo scopo dell’applicazione del design pattern Prototype, è principalmente quello di separare il processo di creazione di un oggetto complesso dal flusso applicativo del client.

Il pattern Prototype risulta molto utile nei seguenti casi:

gli oggetti da creare sono noti soltanto a run-time per cui un codice statico non sarebbe utile.
quando desideriamo che le istanze di una classe abbiano un set limitato di stati per cui rimane più conveniente effettuare una clonazione di un prototipo corrispondente piuttosto che costruire manualmente l’oggetto ogni volta.
Le conseguenze dell’applicazione del pattern Prototype sono le seguenti:

Indipendenza dal metodo di creazione: il client utilizza soltanto l’interfaccia fornita dal pattern, disinteressandosi di cosa viene invocato e di come si realizza il processo di creazione.
Modularità a run-time: questa caratteristica consente ai client la possibilità di aggiungere un prodotto a run-time, rendendolo disponibile per la clonazione da parte di altri client. L’utilizzo di questa feature è delegata al prototype manager il quale è in grado di registrare e gestire un nuovo prodotto.

Definizione di nuovi oggetti tramite nuove rappresentazioni: quando si devono definire numerosi oggetti, che si distinguono esclusivamente per i valori che assumono le loro variabili interne, è molto più comodo effettuare una clonazione e impostare la configurazione desiderata piuttosto che costruire gli oggetti manualmente.
Definizione di nuovi oggetti modificandone la struttura: l’utilizzo di prototipi, nelle applicazioni che necessitano di oggetti composti da più parti ne facilitano la creazione e la gestione.
Non proliferazione delle sottoclassi: a differenza di altri pattern, nei quali è necessario creare un factory method e una gerarchia di classi corrispondenti a prodotti diversi, in questo caso occorre soltanto comporre struttura e valori.

L’implementazione di questo pattern prevede tre tipi di problematiche
l’implementazione di un gestore di prototipi, che sia in grado tramite una struttura associativa, di gestire la clonazione dei prototipi esistenti e di permettere l’aggiunta e la memorizzazione di nuovi prototipi.
l’implementazione di una copia profonda degli oggetti, che si occupi di clonare anche gli eventuali oggetti interni.
la predisposizione di un operazione di inizializzazione all’interno dei prototipi, che consenta di inizializzare in modo differente oggetti creati attraverso la clonazione.

Molto interessante.

Programmazione – Abstract Factory Design Pattern

14 Feb, 2017
admin
No Comments

L’Abstract Factory, ovvero fabbrica astratta, è uno dei fondamentali design pattern. Questo pattern si occupa di fornire al programmatore un interfaccia per la creazione di oggetti connessi tra loro, senza che lo stesso debba interessarsi della logica implementativa riguardante la creazione degli stessi.

Lo scopo principale di questo pattern quindi, è quello di realizzare una certa indipendenza dei client dagli oggetti che utilizzano, nella misura in cui possono creare e utilizzare diverse famiglie di oggetti senza conoscerne i dettagli.

Il pattern Abstract Factory risulta molto utile nei seguenti casi

si vuole mantenere una stretta indipendenza dei client dalle modalità con le quali gli oggetti vengono gestiti
è necessario poter configurare il sistema scegliendo tra diverse famiglie di oggetti
occorre fornire una libreria di classi nascondendone però l’implementazione
si vuole vincolare determinate famiglie di oggetti a utilizzare oggetti della medesima famiglia
Queste sono le principali conseguenze dell’applicazione del pattern:

Isolamento delle classi concrete: la factory viene utilizzata dai client esclusivamente tramite la sua interfaccia, realizzando di fatto la massima indipendenza dalle implementazioni dei prodotti. I client per poter utilizzare i prodotti che la fabbrica restituisce, avranno a disposizione le interfacce AbstractProduct.
Facilità di modifica della famiglia dei prodotti: visto che la ConcreteFactory viene istanziata una sola volta, basta predisporre un meccanismo di modifica a run-time della ConcreteFactory e saremo in grado di lavorare con un altra famiglia di prodotti.
Corenza nell’utilizzo dei prodotti: consente a dei prodotti appositamente progettati per lavorare assieme, di rispettare questo vincolo.
Come si può osservare dallo schema sottostante, l’AbstractFactory dichiara l’interfaccia per le operazioni che creano i prodotti astratti e le ConcreteFactory implementano le operazioni necessarie alla costruzione degli oggetti.

Da notare come nello schema, sono presenti anche le classi AbstractProduct e le classi ConcreteProduct. Le prime rappresentano l’interfacce generiche e astratte del prodotto, mentre le seconde saranno le classi delegate all’implementazione dei prodotti e alla loro costruzione.

In generale, per applicare questo pattern correttamente, occorre creare una sola istanza di ConcreteFactory (mediante il pattern Singleton), la quale si occuperà a sua volta di gestire il processo di creazione di una sola famiglia di oggetti, sebbene seguendo delle implementazioni specifiche.

La creazione dei prodotti viene delegata alla ConcreteFactory tramite un metodo apposito denominato Factory Method il quale, richiamato dall’interfaccia, sarà però necessariamente implementato nelle ConcreteFactory.

Se volessimo, perciò, creare oggetti di un’altra famiglia bisognerebbe creare ed istanziare un’altra factory.

Velocizzare Ubuntu

14 Dec, 2016
admin
No Comments

Avendo installato pochi giorni fa la mia distribuzione Ubuntu, ho notato, spostandomi tra una rete e l’altra, che la connessione a internet era improvvisamente rallentata in modo anomalo. La causa del problema era un eccessivo tempo di ricerca dei domini sui server DNS.

Un DNS, per chi non lo sapesse, consente di tradurre i nomi di dominio in indirizzi IP. In questo modo quando si effettua su un browser una richiesta del tipo “google.com”, il DNS si occuperà di trovare l’indirizzo IP del server effettuando così la richiesta nel modo corretto.

Ho risolto il problema attraverso alcuni semplici passi:

Ho disabilitato il supporto IPv6 su ubuntu e su Firefox
Ho modificato la configurazione DNS di ubuntu
In più, per aumentare le prestazioni generali ho eseguito le seguenti configurazioni opzionali:

Ho settato i server DNS di google
Ho configurato una cache DNS locale
Le indicazioni che seguono, rappresentano dei test effettuati sulla mia postazione al fine di risolvere il problema ma com’è ovvio possono essere utilizzate anche per migliorare le performance del sistema.

Disabilitazione supporto IPv6 su ubuntu
Per disabilitare questa feature, che come ho potuto apprendere su molti forum relativi a ubuntu può portare a qualche problema aggiuntivo, si può scegliere di farlo definitivamente a livello di configurazione oppure modificare le impostazioni delle connessioni create volta per volta.

Nel mio caso ho preferito disabilitarla utilizzando il secondo approccio, in modo da scegliere volta per volta cosa fare. Illustrerò comunque entrambi i metodi.

Disabilitazione IPv6 globale
Verificare con il seguente comando lo stato di abilitazione del componente:

view sourceprint?
1.
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
Come potete vedere, il risultato indica uno zero (nel caso sia già disabilitata) oppure un uno nel caso sia abilitata.

Per disabilitarla, modificare il file /etc/sysctl.conf con il seguente comando e aggiungere le righe indicate di seguito:

view sourceprint?
1.
gksudo gedit /etc/sysctl.conf
view sourceprint?
1.
# IPv6
2.
net.ipv6.conf.all.disable_ipv6 = 1
3.
net.ipv6.conf.default.disable_ipv6 = 1
4.
net.ipv6.conf.lo.disable_ipv6 = 1
Ricaricare le impostazioni tramite il seguente comando:

view sourceprint?
1.
sudo sysctl -p
Disabilitazione IPv6 manuale
Recarsi sull’applet di network-manager (presente nella barra superiore di gnome) e cliccare su Modifica connessioni. Selezionare la connessione che si sta utilizzando al momento e cliccare su Modifica. Nella scheda Impostazioni IPv6, selezionare come metodo Ignora e il gioco è fatto.

Come Configurare EasyPHP sul Computer

14 Oct, 2016
admin
No Comments

EasyPHP rappresenta la miglior soluzione per tutti gli sviluppatori web che si avvicinano allo sviluppo di applicazioni web con il linguaggio PHP su piattaforma Apache MySql consentendo la configurazione pressochè automatica dell’ambiente di sviluppo.

Prima di mettere le mani sul codice, dobbiamo prima di tutto configurare sul computer locale un server web in grado di interpretare il linguaggio di sviluppo scelto e un server di database che sia in grado di memorizzare le informazioni da interrogare.

Nel caso si sviluppi in PHP MySql i pacchetti software di cui abbiamo bisogno sono
Apache Http Web Server
MySql
Interprete Php
PhpMyAdmin

Per evitare di dovere imbatterci nella singola configurazione dei software sopra elencati, operazione che richiede un mimimo di esperienza e di praticità possiamo utilizzare easyPHP per renderci la vita più agevole e avere la nostra piattaforma di sviluppo pronta in 5 minuti.

EasyPHP è un software completo che include al suo interno Apache Http server, MySQL database e il supporto completo di PHP come strumento di sviluppo per le applicazioni web.

EasyPHP consente di velocizzare di molto l’installazione del server lasciando invariate le caratteristiche rispetto ad una installazione manuale dei singoli componenti. EasyPHP non si limita a questo, infatti configurerà automaticamente per voi il sistema di amministrazione più conosciuto per MySql, PhpMyAdmin.

Avviando EasyPHP, si potranno amministrare tutti gli aspetti del setup del server mediante un’icona nella barra di sistema di Windows, senza dover intervenire manualmente sui file di configurazione Apache e Php.

Nella configurazione di default il Server HTTP di Apache ascolterà le richieste sulla porta 80 e nel caso avessimo già installato dei servizi su questa porta, come ad esempio IIS di microsoft o altro, occorrerà modificare manualmente la porta di ascolto intervenendo sul file httpd.conf situato nella directory conf_files al’interno dell’installazione EasyPHP.

Apriamo il file httpd.conf con un qualsiasi editor di testo e modifichiamo opportunamente le seguenti direttive prima di tentare il riavvio del server.

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the
# directive.
#
#Listen 3000
#Listen 12.34.56.78:80
Listen 127.0.0.1:80

Sostituire l’80 con la porta scelta (ad es. 8080, 6060, 8060) e passare a modificare la prossima direttiva.

# Port: The port to which the standalone server listens. Certain firewall
# products must be configured before Apache can listen to a specific port.
# Other running httpd servers will also interfere with this port. Disable
# all firewall, security, and other services if you encounter problems.
# To help diagnose problems use the Windows NT command NETSTAT -a
#
Port 80

Salvare il file e a questo punto dopo aver riavviato il server interroghiamo il nostro server HTTP digitando la seguente url su un qualsiasi browser Web:

http://localhost:(porta prescelta) se abbiamo modificato la porta oppure http://localhost se non abbiamo effettuato cambiamenti.