RSS
 

Posts Tagged ‘php’

TDD for dummies!!!

23 Mar

Visto che trovo ben poco materiale in italiano sulla questione TDD, ho deciso di scrivere un articolo banale banale per raccontarvelo. Qualche tempo ha ho scritto un post su come configurare PHPUnit con NetBeans e xampp. Spero che questo nuovo post serva per completare il quadro del tdd.

Cosa significa la sigla TDD?

Significa Test Driven Development ovvero sviluppo guidato dal testing.

Più precisamente?

Significa che per sviluppare un software, si scrivono prima i test, e poi il codice vero e proprio. Per dirla in un modo più amichevole: sapendo che cosa deve fare una applicazione, noi dobbiamo prima scrivere del codice che si basa sulle specifiche di un progetto e che afferma che ciascun metodo deve risultare determinati valori.

Troppo complicato? Proviamo con un esempio semplice: scriviamo i test per implementare il metodo somma.

Immaginiamo di dover implementare una calcolatrice e di avere un metodo somma($addendoUno,$addendoDue); Va da se che somma(1,3) dovrà restituire 4. E’ un requisito del metodo. Bene, prima di implementare una qualsiasi riga di codice per la somma, scriviamo il test che controlla che dati due precisi valori, restituisca un terzo nel modo corretto. Scriviamo diversi test. Molto bene: i requisiti della nostra funzione somma, sono che la somma funzioni. (lol)

Abbiamo scritto i test, ed ora?

Ora lanciamo i test.

I test falliranno tutti, perchè non abbiamo ancora scritto nessun codice. Quindi procediamo e scriviamo il nostro metodo.

Testiamo il codice!

Adesso che abbiamo implementato il codice, lo possiamo testare e se il metodo somma funziona correttamente, farà andare a buon fine tutti i test. Bene! Il codice che abbiamo creato è stato testato e funziona.

Perchè ho scritto un test?

I testi si possono scrivere per varie ragioni ed ora elenco alcuni vantaggi che ho visto fino a questo momento:

  • è facile intuire, che dicendo al codice come deve comportarsi quando è corretto (scrivere un test) ci porterà a ridurre i bug e, per esempio, a non avere errori di logica nella programmazione.
  • possiamo fare refactoring e ritestare tutto il codice. Se i test vanno a buon fine, non dobbiamo chiederci se ci sono errori “in giro”. Il codice funziona bene come prima del nostro operato quindi siamo felici e tranquilli =). Abbiamo fatto un buon lavoro.
  • vengono testate le singole funzionalità, o unità (unità di test appunto) ed si cicla in questo modo: si decide la funzionalità, si scrive il test, si scrive il codice e lo si modifica se e fino a quando il test non è soddisfatto. Da quel momento in poi, non dovremo più preoccuparci di nulla.
  • ogni test è documentazione, in quanto spiega il funzionamento di ogni piccola unità di codice. Talvolta può persino sostituire la documentazione stessa.

Molto bene, non entro oltre nel dettaglio anche perchè se devo essere sincero, solo oggi ho realizzato una classe usando il TDD. In particolare ho pensato di scrivere del codice oop per realizzare una pagina html5 di base. Ho ragionato in questo modo: so come è fatto un documento scritto in HTML5, implemento dei test in modo che mi vengano restituite delle parti di codice nel modo esatto che desidero. Implemento il codice e via di seguito.

Ancora più semplicemente, vediamo gli steps:

  1. scrivo un test
  2. faccio fallire il test (per assicurarmi che la funzionalità non è stata implementata)
  3. metto mano al codice in produzione fino a che il test non ha esito positivo
  4. torno al passo 1

Ma scrivere un test dopo aver scritto il codice di produzione non è uguale?

Di primo acchitto potrebbe sembrare. Difatti, però, scriveremmo dei test influenzati dal codice, e di conseguenza non sarebbero test rivolti allo scopo dell’applicazione ma del codice appena scritto. Per ora il post lo concludo qui. Spero che sia utile a qualche lettore …

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in php

 

Joomla e Community Builder hanno qualche problema con phpmailer?

12 Jan

Ho installato un joomla per realizzare un ecommerce/community. Installiamo VirtueMart per fare il carrello. Installiamo Community Builder per fare la community. Modifichiamo qualche template e sistemiamo un pochino di codice a destra ed a sinistra per renderlo fico. Proviamo la registrazione.. PAM dai e dai … viene fuori che community builder (o meglio comprofiler) non invia le email ai domini di alice.it.

La cosa è assurda. Fatto sta che sono andato a scavare il codice che invia le email e sorpresa, phpmailer non riesce a costruire correttamente l’header. Ho provato a registrarmi sia con un indirizzo di gmail ottenendo questo:

Date: Tue, 12 Jan 2010 03:22:20 +0100 Return-Path: From: Registrazione utenti <> Reply-To: Registrazione utenti Message-ID: <44ffffbc0197cce7915279957c5a8734@www.oragiovane.it> X-Priority: 3 X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.0 rc3] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=”UTF-8″

E con quello alice.it invece:

Date: Tue, 12 Jan 2010 03:22:20 +0100 Return-Path: From: Registrazione utenti <> Reply-To: Registrazione utenti Message-ID: X-Priority: 3 X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.0 rc3] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=”UTF-8″

Ho scavato un altro pochino nel codice e viene fuori che per ragioni che ignoro e che voglio scoprire domani… non riesce a costruire correttamente il “Message-ID”. Non ho trovato nulla su bug, o forum o altro. E’ anche facile che pochi abbiamo riscontrato problemi con alice.it e con joomla e con community builder contemporaneamente.

Fatto sta che per il momento ho risolto il “bug” semplicemente non inserendo l’header quando viene inviata la mail. Il file in questione è di phpmailer e trattandosi di una libreria opensource, credo che mi dovro sbrigare a segnalarlo agli sviluppatori. La cosa buffa, è che se faccio un var_dump di mail(); restituisce bool(true) ma la mail non viene mai inviata.

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto

 

include_path di php.ini

13 Dec

Con php, è possibile modificare il percorso in cui vengono ricercati i file, ogni volta che vengono richiamati con il comando include. Questo ci da la possibilità di tenere tutto il codice riciclabile in una sola cartella. Questo ci permetterà di programmare con più ordine. In oltre, i nostri singoli script saranno più “leggeri” e non dovremo sempre portarci dietro tutte le classi ed i file di funzione che stiamo riciclando perchè si troveranno sempre nello stesso luogo.

Ovviamente si parla di programmazione in locale. Quindi occhio!

Per ottenere questo risultato, dobbiamo aprire il file php.ini. Utilizzando un programma come wamp è tutto molto semplice:

Modificare php ini con wamp

A questo punto dobbiamo solo cercare il parametro “include_path”. Io, per esempio, l’ho modificato in questo modo:
include_path = “c:/php/”
Oltre a questo piccolo accorgimento, ho inserito in alcuni files un codice magico:
function __autoload($ClassName){include $ClassName .”.php”;};

Attenzione: tutti i files da riciclare ora si trovano dentro c:\php. Non solo: iul codice qui sopra include automaticamente il file php della classe che si sta cerc ando. A questo punto, scrivendo semplicemente NomeClasse::metodo(); verrà automaticamente incluso il file c:/php/NomeClasse.php. Non ci sarà più da includere o cercare i files di classi o di template: in generale, basterà indicare in php.ini dove si trovano e per il resto dovremo sempre scrivere meno codice.

Da un punto di vista della sicurezza, in oltre, le classi si possono trovare in un livello del webserver che non può essere visto dall’esterno. Con questo metodo, quindi, possiamo anche mantenere i files di configurazione con username e password dei nostri database in un luogo sicuro. Beh, non so se ho detto una cosa vera =) non me ne intendo di sicurezza ma è la prima cosa che mi viene da pensare.

Il rovescio della medaglia sta nel fatto che tutto il codice sta li: compreso quello che non serve. Se dovessi spostare un nostro programma come facciamo?

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto

 

simple_xml_load_file() & foreach() per modificare un file XML con php

22 Aug

In questo post, ho pensato di mostrarvi un modo (sicuramente non il migliore) per modificare un file xml ed in particolare per eliminare un item a seconda del contenuto di uno dei suoi paramentri. Veniamo al File xml:

<newslist>

<news>

<ID>1</ID>
<data>21.08.2009</data>
<titolo>Primo inserimento</titolo>
<descrizione>prima news</descrizione>
<immagine>upload/img0.jpg</immagine>

</news>
<news>

<ID>2</ID>
<data>22.08.2009</data>
<titolo>Secondo inserimento</titolo>
<descrizione>seconda news</descrizione>
<immagine>upload/img1.jpg</immagine>

</news>
<news>

<ID>3</ID>
<data>22.08.2009</data>
<titolo>terzo inserimento</titolo>
<descrizione>terz2 news</descrizione>
<immagine>upload/img2.jpg</immagine>

</news>

</newslist>

Quello che voglio fare, è analizzare il file XML ed eliminare il la news con id = 1. Come posso fare? La soluzione che propongo è la seguente:

<?php

$file_xml = “file.xml”;
$id_da_escludere = “1″;

if (file_exists($file_xml))
{

$xml = simplexml_load_file($file_xml);
foreach($xml as $item)

if($item->ID!=$id_da_escludere)
{

$new_xml .= ”
<news>
<ID>{$item->ID}</ID>
<data>{$item->data}</data>
<titolo>{$item->titolo}</titolo>
<descrizione>{$item->description}</descrizione>
<immagine>{$item->immagine}</immagine>
</news>”;

}

}
else
{

exit(“Non sono riuscito a trovare il file ‘{$file_xml}’.”);

}
$new_xml = “<newslist>{$new_xml}\n</newslist>”;

?>

<pre>
<?php echo htmlentities($new_xml); ?>
</pre>

Il risultato di questo codice, sarà un file xml del tutto simile a quello presente all’inizio del post, con l’eccezione che non sarà più presente la news con id = 1:

<newslist>

<news>

<ID>2</ID>
<data>22.08.2009</data>
<titolo>Secondo inserimento</titolo>
<descrizione>seconda news</descrizione>
<immagine>upload/img1.jpg</immagine>

</news>
<news>

<ID>3</ID>
<data>22.08.2009</data>
<titolo>terzo inserimento</titolo>
<descrizione>terz2 news</descrizione>
<immagine>upload/img2.jpg</immagine>

</news>

</newslist>

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto

 

Dimenticata la password di MySQL? Ecco come modificare la password di root!

12 Jun

Se come a me vi è capitato di aver dimenticato la password del vostro MySQL e non riuscite più ad entrare nel vostro phpmyadmin, ora vi spiego un modo per reimpostarla nuovamente. Questa semplice guida è la traduzione di un messaggio ritrovato nel forum di ubuntu che mi ha permesso di risolvere un grosso problema.

Per prima cosa dobbiamo fermare mysql. Prima di mostrare i comandi che dobbiamo eseguire da shell, ci tengo a ricordare che il simbolo $ sta ad indicare che l’istruzione va esegiuta come root oppure con i permessi di root.

$ /etc/init.d/mysql stop

A questo punto dobbiamo assicurarci che nessun processo MySQL sia attivo. In caso contrario sono da fermare e killare. Per prima cosa quindi lanciamo il comando

$ ps waux | grep mysql

Se per caso ci dovessero essere altri processi MySQL potreste trovare come risposta al comando precedente una cosa come questa:

1234 4567 … /bin/sh /usr/local/mysql/bin/safe_mysqld …
8976 7568 … /usr/local/mysql/libexec/mysqld –basedir= …

Adesso potete anche killare il processo con

kill 4567

Bene… abbiamo eliminato tutti i processi di MySQL, ora dobbiamo riavviarlo così:

$ /usr/bin/mysqld_safe –skip-grant-tables

Intuitivamente… non abbiamo fatto altro che bypassare i permessi. Adesso dobbiamo solo aprire una nuova sessione del terminale senza chiudere quella in cui ci trobviamo ora.

Quindi lanciamo nuovamente mysql

$ /usr/bin/mysql

Ed orache abbiamo lanciato il nostro programma, al suo interno lanciamo il comando

use mysql;

Il prossimo passo, altro non è che una query SQL banalissima che sovrascrive il campo password dell’utente che ha come username ‘root’. Ricordatevi di termianre la vostra query con ‘;’.

UPDATE user SET Password=PASSWORD(‘YOUR_PASSWORD_HERE’)
WHERE Host=’localhost’ AND User=’root’;

Se volete controllare per sicurezza che è andato tutto bene, vi basterà lanciare una query SELECT pr verificare lo stato della tabella user:

SELECT user, pass FROM user;

Adesso non ci rimane altro che far ripartire MySQL.

$ /etc/init.d/mysql restart

Questo è tutto. Ora potete aprire il vostro browser e phpmyadmin (o altri programmi…). La password che avete appena modificato vi permetterà di accedere nuovamente a MySQL. (Ed io che stavo per formattare la macchina ahahah.

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto