Archive for the ‘Programació’ Category

Alliberat Zend Framework 2 versió 2.1.3

dimecres, febrer 27th, 2013

El 21 de Febrer passat va ser alliberada la versió 2.1.3 del Framework de Zend.

Podeu descarregar-lo des d’aquí: http://framework.zend.com/downloads/latest

Alliberats PHP 5.4.12 i PHP 5.3.22

dilluns, febrer 25th, 2013

php_elephant-4ee7b23-intro-thumb-640xauto-28554El proppassat dia 21 de Febrer van ser alliberades les versions 5.4.12 de PHP i la 5.3.22.

Aquestes noves versions adrecen més de 10 bugs i es recomana totalment actualitzar.

Alliberat Apache Maven 3.0.5

dilluns, febrer 25th, 2013

El proppassat 23 de Febrer fou alliberada la versió 3.0.5 d’Apache Maven.

Apache Maven és un producte imprescindible per al desenvolupament d’aplicacions complexes en Java.

http://maven.apache.org

Alliberat Apache Tomcat 7.0.37

Dimarts, febrer 19th, 2013

Apache ha alliberat la versió 7.0.37 de Tomcat.

Aquesta versió soluciona diversos bugs.

PHP 5.4 incorpora facilitats de control de progrès de la pujada

dilluns, febrer 18th, 2013

Una barra de progrès d'exempleUna de les noves característiques de PHP 5.4 és que facilita, a través de $_SESSION fer un seguiment de com va la pujada dels arxius que estem enviant.

Això és interessant perquè mentre un procés de PHP està rebent els arxius per POST, un altre pot estar atenent crides Json del navegador, i així mostrar la títpica barra de tasques.

Aquesta funcionalitat és molt interessant però heu de tenir en compte, que si heu fet que la SESSION del vostre projecte es recuperi de base de dades perquè teniu diversos frontals web, estareu afegint una càrrega de fins a 100 queries sobre la base de dades per cada arxiu (una per cada punt percentual).

Això es pot modificar amb la directiva de PHP.ini

session.upload_progress.freq =  "1%"

Podeu especificar “10%” per a que només faci 10 queries. També podeu especificar bytes.

Aquests articles us resultaran interessants:

http://docs.php.net/manual/en/session.upload-progress.php

http://php.refulz.com/new-in-php-5-4-improvements-in-session-extension/

 

També heu de parar atenció als temes de control de sessió, per a evitar els problemes de bloqueigs de sessions.

Si treballeu amb un sol servidor web i feu servir session_start estareu bloquejant l’accès d’altres processos a la sessió (per exemple peticions Ajax). Si no coneixieu  això reviseu session_write_close();

Aquest article us ajudarà: http://konrness.com/php5/how-to-prevent-blocking-php-requests/

session.upload_progress.freq =  "1%"

Una anàlisi del codi font de Duke Nukem 3D

dissabte, febrer 16th, 2013

duke3dEn Fabien Sanglard fa una anàlisi brillant del codi de Duke Nukem 3D, un joc ja antic però que va ser trencador a la seva època.

Per a aquells que us agradi la programació de videjocs, no us podeu perdre els seus comentaris sobre el codi i com esmicola els aspectes bons i els dolents, del codi.

No us perdeu la resta de seccions de la seva web on hi ha altres anàlisi brillants així com videojocs fets per ell per a diferents plataformes, amb els codi font per a baixar.

Imprescindible! També comenta problemes molt tècnics amb el compilador d’Android i el tractament dels char de C, com unsigned char o signed char depenent de la plataforma, i els problemes que li va ocasionar això en processadors ARM (per a Android), i amb quin debugger ho va solucionar.

Un geni de la programació que si us agrada la informàtica i la programació tant com a mi, no podeu deixar passar.

http://fabiensanglard.net/duke3d/index.php

 

Manquejades del PHP in_array

Dimarts, gener 22nd, 2013

Sempre dic que PHP és un llenguatge que m’agrada molt, i que em diverteixo molt treballant-hi i que un projecte Internet es pot fer diverses vegades més ràpid que en Java.

Ara bé, de la mateixa manera també dic que és ple de problemes, problemes de disseny i errors estúpids.

Avui explicaré quelcom prou poc intuitiu i que us pot portar a greus problemes al vostre codi.

L’ús d’ in_array

Observeu aquest codi:

<?php
$st_array = array(      'nom1' => 0,
                        'nom2' => 1,
                        'nom3' => '2',
                        'nom4' => 'Catalunya Lliure');

echo 'Cas 0:'.in_array('0', $st_array)."\n";
echo 'Cas 1:'.in_array('1', $st_array)."\n";
echo 'Cas 2:'.in_array('2', $st_array)."\n";
echo 'Cas n:'.in_array('n', $st_array)."\n";
echo 'Cas z:'.in_array('z', $st_array)."\n";
echo 'Cas Catalunya:'.in_array('Catalunya', $st_array)."\n";
echo 'Cas num no:'.in_array(3, $st_array)."\n";
echo 'Cas num sí:'.in_array(1, $st_array)."\n";

$st_array2 = array(2,'a','Catalunya Lliure');

echo 'Cas 1a:'.in_array(3, $st_array2)."\n";
echo 'cas 2a:'.in_array(2, $st_array2)."\n";
echo 'cas 3a:'.in_array('2', $st_array2)."\n";
echo 'Cas 4a:'.in_array('Catalunya', $st_array2)."\n";
echo 'Cas 5a:'.in_array('Catalunya Lliure', $st_array2)."\n";

Qualsevol desenvolupador de PHP diria que el resultat que espera és diferent del que rebrà.

Veiem el resultat:

PHP codi problemàtic resultat

Els resultats que he obtingut són els mateixos en sistemes Debian amb 5.3.3:

PHP 5.3.3-7+squeeze14 with Suhosin-Patch (cli) (built: Aug  6 2012 14:18:06)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

En Ubuntu amb 5.3.10:

PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli) (built: Sep 12 2012 18:59:41)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

I en PHP 5.4.10 i en 5.5.0.a.2 executats en aquesta sandbox: http://sandbox.onlinephpfunctions.com/

El resultat és l’esperat* en els casos en que el valor de l’array és numèric, però sembla totalment buggy en el cas de string (el que coneixem com Map a Java o hash a Python).
Veient els exemples hom pensaria que el problema es produeix si els valors assignats a barregen valors numèrics i string, però també si l’array té claus alfanumèriques (‘nom1′ => ‘0’). Aquest últim cas es veu clarament amb l’exemple de cercar ‘Catalunya’ al primer i al segon cas.

Però si tingués un bon amic com el meu amic Edu, us faria adonar que no es tracta de si la clau és alfanumèrica o automàtica, si no que el fet que hi hagi un 0 (zero) com a valor integer, és el que provoca aquest comportament esbojarrat i imprevisible del PHP.

Mirant la documentació del mètode loose de comparació de PHP observem on és el problema.

Encara que sigui contra intuitiu, en el mètode loose qualsevol cadena de text és == a 0 (zero integer).

* Nota: Dic que és l’esperat donat que la documentació de PHP per a in_array ja indica que “Searches haystack for needle using loose comparison unless strict is set.”, és a dir, que fa servir el mètode de comparació loose, en que es considera igual 1 i “1” per exemple.

I aquest és un dels grans problemes de PHP, que degut al sevu comportament intern, a les conversions entre tipus que fa automàticament, viola els principis de programació de fiabilitat**, i porta a situacions en que és altament probable que els programadors generin bugs o es generin bugs que només passen en situacions molt específiques.

** Quan dic que viola el principis de programació de fiabilitat de resultats, em refereixo a coses com:

Expressió Resultat
“Catalunya” == 0 TRUE
“0” == 0 TRUE
“Catalunya” == “0” FALSE

O sigui “Catalunya” == 0 i 0 == “0” però “Catalunya” és diferent de “0”. Epic fail.

Haurem d’utilitzar === que fa la comprovació de tipus també.

La solució universal que farà que els dos casos d’in_array funcionin correctament és emprar el mètode estricte.

Codi que funciona segons s’espera:

<?php 
define('METODE_STRICTE', true); 

$st_array = array(	'nom1' => 0, 
			'nom2' => 1, 
			'nom3' => '2', 
			'nom4' => 'Catalunya Lliure');

echo 'Cas 0:'.in_array('0', $st_array, METODE_STRICTE)."\n";
echo 'Cas 1:'.in_array('1', $st_array, METODE_STRICTE)."\n";
echo 'Cas 2:'.in_array('2', $st_array, METODE_STRICTE)."\n";
echo 'Cas n:'.in_array('n', $st_array, METODE_STRICTE)."\n";
echo 'Cas z:'.in_array('z', $st_array, METODE_STRICTE)."\n";
echo 'Cas Catalunya:'.in_array('Catalunya', $st_array, METODE_STRICTE)."\n";
echo 'Cas num no:'.in_array(3, $st_array, METODE_STRICTE)."\n";
echo 'Cas num sí:'.in_array(1, $st_array, METODE_STRICTE)."\n";

$st_array2 = array(2,'a','Catalunya Lliure');

echo 'Cas 1a:'.in_array(3, $st_array2, METODE_STRICTE)."\n";
echo 'cas 2a:'.in_array(2, $st_array2, METODE_STRICTE)."\n";
echo 'cas 3a:'.in_array('2', $st_array2, METODE_STRICTE)."\n";
echo 'Cas 4a:'.in_array('Catalunya', $st_array2, METODE_STRICTE)."\n";
echo 'Cas 5a:'.in_array('Catalunya Lliure', $st_array2, METODE_STRICTE)."\n";

I podeu observar el resultat:

PHP codi problemàtic solucionat amb strict

Pareu atenció a que amb el mètode estricte si cerqueu ‘1’ (string) i a l’array hi ha 1 (integer) in_array us retornarà FALSE.

Molt important a tenir en compte que tot el que rebeu de $_GET o $_POST sigui el que sigui us arribarà com un string, o un array d’strings, malgrat en el formulari hagin inserit valors numèrics com 2014.

Nota per a usuaris novells: Jo he utilitzat una constant amb el valor booleà TRUE per a fer servir el mètode estricte però prodrieu fer servir directament true.

Alliberat Firebug 1.10.6

dijous, novembre 1st, 2012

Aquesta versió soluciona un problema amb Firefox 15, on no es veia el botó.

https://getfirebug.com/firstrun#Firebug%201.10.6

Alliberat Zend Framework 2.0

diumenge, setembre 9th, 2012

El proppassat dia 5 de Setembre els creadors de PHP van alliberar Zend Framework 2.0.

Poc us en puc dir doncs encara estic estudiant-ne les funcionalitats, malgrat el que vaig començar a furgar a la beta i el que vaig esbrinar promet.

Més informació al seu bloc:

http://framework.zend.com/blog//zend-framework-2-0-0-stable-released.html

Alliberat Apache TomCat 7.0.30

divendres, setembre 7th, 2012

Ahir dia 6 s’alliberà la versió 7.0.30 del Programari Lliure Apache TomCat.

Aquesta versió adreça nombrosos problemes de seguretat i incorpora algunes noves funcionalitats.

PHP en mode interactiu

dijous, agost 23rd, 2012

PHP té un mode interactiu en que podem executar petits programes i proves de concepte.

Només cal que escriviu al terminal:

php -a

Solució al problema de que HeidiSQL no funciona en Linux amb Wine

divendres, agost 17th, 2012

Si quan tracteu d’instal·lar o executar HeidiSQL amb Wine, us peta de manera estrepitosa, la solució és ben senzilla.

Heu de canviar la configuració de Wine per a que funcioni com si es tractés d’un windows XP.

Amb això HeidiSQL arrencarà sense problemes.

Crec que el problema rau en que HeidiSQL és incompatible amb algunes versions de windows, com windows 2000, i encara que hi ha una llibreria dll específica que en teoria ho arregla, jo no vaig aconseguir que funcionés.

En canvi indicar a Wine que funcioni com si es tractés d’un windows XP és ben senzill, i soluciona el problema.

Alliberat Firebug 1.10

divendres, juliol 27th, 2012

El proppassat 13 de Juliol es va alliberar la versió 1.10 de Firebug.

La gràcia d’aquesta versió és que és final. Fins ara havíem estat presentant versions beta (no finals, amb possibles errors).

http://getfirebug.com/

Excepcions personalitzades en PHP

dimecres, juliol 18th, 2012

L’altre dia la meva amiga Laura em demanava quin objectiu més enllà de capturar errors tenen les Exception.

Li vaig comentar que a més d’atrapar errors no esperats (com que el servidor de la base de dades no respongui) també permet que l’aplicació s’enviï missatges.

Així que ara ho vaig a desenvolupar una mica.

Laura, et dedico aquest article. ;)

Agafem un exemple pràctic.

Tenim una classe que treballa amb moneda.

class Moneda
{
}

Al constructor li passem el codi de moneda:

$o_moneda_gbp = new Moneda('GBP');

Al constructor de la classe Moneda es comprova que existeixi dins l’array de monedes:

class Moneda
{

    public $st_monedes_suportades = array('EUR' => array ('activa'         => true,
                                                          'nom_ca'         => 'Euro',
                                                          'canvi_a_euros'  => 1),
                                          'USD' => array ('activa'         => true,
                                                          'nom_ca'         => 'Dòlars',
                                                          'canvi_a_euros'  => 0.82671)
                                              );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]) || 
            $this->st_monedes_suportades[$s_id_moneda]['activa'] != true) 
        {
            // Aquí hem de notificar que no hem pogut localitzar la moneda
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

És en aquest moment que volem notificar a qui crida la classe Moneda que no podem procedir amb la operació que ens demanaven.
És en aquest moment en que intervenen i tenen sentit les Exceptions, i encara més les Custom Exceptions, que són Exceptions personalitzades.

Primer de tot definirem dues exepcions personalitzades:

class MonedaNoSuportadaException extends Exception {}
class MonedaNoActivaException extends Exception {}

class Moneda
{

    public $st_monedes_suportades = array('EUR' => array ('activa'         => true,
                                                          'nom_ca'         => 'Euro',
                                                          'canvi_a_euros' => 1),
                                          'USD' => array ('activa'         => true,
                                                          'nom_ca'         => 'Dòlars',
                                                          'canvi_a_euros'  => 0.82671)
                                          );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]))
        {
            throw new MonedaNoSuportadaException('La moneda '.$s_id_moneda.' no se suporta');
        }

        if ($this->st_monedes_suportades[$s_id_moneda]['activa'] != true)
	{
            throw new MonedaNoActivaException('La moneda '.$s_id_moneda.' es troba inactiva');
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

Llavors només manca instanciar la classe amb un try catch

try {
	$o_moneda_eur = new Moneda('EUR');
} catch (MonedaNoSuportadaException $e) {
	die($e->getMessage);
} catch (MonedaNoActivaException $e) {
	die($e->getMessage);
} catch (Exception $e) {
	// Excepció no esperada
	die($e->getMessage);
}

El codi final:

<?php
/**
 * Created by Carles de http://www.codic.cat
 * User: carles
 * Date: 17/07/12
 * Time: 23:16
 */

class MonedaNoSuportadaException extends Exception {}
class MonedaNoActivaException extends Exception {}

class Moneda
{

    public $st_monedes_suportades = array(  'EUR' => array ('activa'         => true,
                                                            'nom_ca'         => 'Euro',
                                                            'canvi_en_euros' => 1),
                                            'USD' => array ('activa'         => true,
                                                            'nom_ca'         => 'Dòlars',
                                                            'canvi_en_euros' => 0.82671)
                                            );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]))
        {
            throw new MonedaNoSuportadaException('La moneda '.$s_id_moneda.' no se suporta');
        }

        if ($this->st_monedes_suportades[$s_id_moneda]['activa'] != true)
        {
            throw new MonedaNoActivaException('La moneda '.$s_id_moneda.' es troba inactiva');
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

try {
        $o_moneda_eur = new Moneda('EUR');
} catch (MonedaNoSuportadaException $e) {
        die($e->getMessage());
} catch (MonedaNoActivaException $e) {
        die($e->getMessage());
} catch (Exception $e) {
        // Excepció no esperada
        die($e->getMessage());
}

Alliberat Apache Tomcat 7.0.29

dilluns, juliol 9th, 2012

Ahir es va alliberar la versió 7.0.29 del servidor d’aplicacions java.

Aquesta versió adreça algunes regressions de la versió 7.0.28, així com incorpora algunes millores i soluciona diversos bugs.