Monday, April 27, 2009

Threads ( Hilos ) en PHP

Para los que estemos acostumbrados al api de threads de java y queramos realizar una acción multihilo en php existe una clase PHP_FORK de la cual podemos extender y sobreescribir el método run como haríamos en java para después llamar a start().

Dicha clase utiliza la función pcntl_fork para ejecutar la acción en un nuevo proceso.

Esta función es parte de una extensión para php creada para realizar control de procesos ya que esto no es nativo del lenguaje, dicha extensión solo funciona en entornos Unix, así que lo sentimos por los windowseros pero no podrán realizar este ejemplo:

Ponemos el código en un archivo al mismo nivel que el archivo Fork.php y lo ejecutamos.



include ( './Fork.php' );

class executeThread extends PHP_Fork {
var $counter;

function executeThread($name)
{
$this->PHP_Fork($name);
$this->counter = 0;
}

function run()
{
$i = 0;
while ($i < 5) {
print time() . "-(" . $this->getName() . ")-" . $this->counter++ . "\n";
sleep(1);
$i++;
}
}
}


for ($index = 1; $index < 5; $index++) {
$thread = new executeThread("hilo numero -> ".$index);
$thread->start();
}

?>

Saturday, April 25, 2009

Desinstalando Xampp para Linux e instalando Apache por paquetes

Hace un tiempo que uso Xampp para linux, pero me he decidido por cambiar he instalar PHP, Apache y Mysql por paquetes para no tener que estar especificando en todo momento el socket a la base de datos y demás historias.

Así que vamos manos a la obra, la tarea en si no es muy complicada lo único que tenemos que hacer es
sudo apt-get install php5 php5-cli php5-cgi php5-common php5-curl php5-gd php5-mysql apache2 apache2.2-common apache2-mpm-prefork apache2-utils

"No instalo el query-browser, adminstrator y workbench por que ya los tenia instalados"

pero si ya teníamos instalado php por algún motivo o hemos estado trasteando con los paquetes de antes al arrancar apache nos pueden salir mensajes de error al no cargar el modulo de php y que el navegador nos muestra la ventana de abrir aplicación, en ese caso hacemos uso de "purge" un argumento de apt-get que no usamos muy a menudo con lo que eliminamos todos los paquetes relacionados que tengamos y reinstalamos

sudo apt-get purge php5 php5-cli php5-cgi php5-common php5-curl php5-gd php5-mysql apache2 apache2.2-common apache2-mpm-prefork apache2-utils
sudo apt-get autoremove


Y otra vez

sudo apt-get install php5 php5-cli php5-cgi php5-common php5-curl php5-gd php5-mysql apache2 apache2.2-common apache2-mpm-prefork apache2-utils
Creamos un index

sudo gedit /var/www/index.php

Dentro le ponemos el php info

<?php phpinfo(); ?>

reiniciamos apache " Toda precaución es poca ;) "

sudo /etc/init.d/apache2 restart
ponemos en el navegador http://localhost/ y Et voilá!

P.D -> S.O Ubuntu 9.04 Jaunty Jacklope

Sunday, April 19, 2009

Spring Security Dao Authentication Provider

Vamos ha explicar como configurar fácilmente Spring Security ( Acegi ) para que nos autentique los usuarios mediante Hibernate - Dao.

La única clase que debemos crear es una implementación de la interfaz

org.springframework.security.userdetails.UserDetailsService

que declara un metodo

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {

En este método es donde tenemos que realizar toda la recogida de los datos de nuestro modelo de usuarios y roles especifico. Para devolver una instancia de la siguiente clase
org.springframework.security.userdetails.User

El constructor de esta clase recibe un array de GrantedAuthority[] yo he utilizado este metodo para que convertir los nombres de los roles de mi modelo a este Array

public static GrantedAuthority[] convertToGrantedAuthorityArray(Collection roles) {
GrantedAuthority[] result = new GrantedAuthority[roles.size()];

int i = 0;
for (String role : roles) {
result[i++] = new GrantedAuthorityImpl(role);
}

return result;
}


Lo mas sencillo es añadir una Annotation @Service a la clase y el nombre que le demos a la clase es el que debemos añadir en authentication-provider.

Lo siguiente es añair el filtro en nuestro web.xml y crear el archivo de configuración de spring.



securityFilter
org.springframework.web.filter.DelegatingFilterProxy

targetBeanName
springSecurityFilterChain




securityFilter
/*



Para organizarnos mejor creamos un archivo de configuración para el Acegi, en mi caso lo nombro applicationContext-security.xml y yo no tengo que tocar el context-param por le pattern pero sino tendriamos que añadirlo a mano.



contextConfigLocation
/WEB-INF/applicationContext*.xml



Por ultimo personalizamos las reglas de acceso segun necesitemos, aqui pongo un ejemplo sencillo


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">



login-processing-url="/j_security_check"/>











Con esto tendriamos la autenticación, en siguientes posts quisiera poner como encriptar las contraseñas así como utilizar jsr250-annotations

Friday, April 17, 2009

Plugin SFTP para eclipse


Por parte de Jcraft se nos aporta un plugin para sincronizar un proyecto mediante sftp.

Normalmente yo lo uso en proyectos PHP en los que no se dispone de SVN.

Para instalarlo solo tenemos que ir a nuestro eclipse ( 3.4 en mi caso )
Help -> Software Updates -> Available Software -> Add Site y añadir http://eclipse.jcraft.com/ Seleccionamos el SFTP Plug-in pulsamos sobre instalar y ya tendríamos el plugin instalado.

Para importar un proyecto mediante Sftp tendremos que pulsar en Import -> Other -> Sftp y seleccionar una carpeta remota.

Se recomienda tener el proyecto PHP creado de antemano y cuando nos da a elegir proyecto seleccionar ese ya que sino no nos permite poner la vista PHP (cosas del .project ).

Una vez importado el proyecto podemos sincronizarlo y que nos muestre los cambios a subir o bajar, como apunte decir que se puede sincronizar en un momento determinado una carpeta del proyecto y no todo el proyecto entero, para que sea mas ligero.

Para sacar la vista de sincronización Pulsamos sobre Window->Show view -> Team -> Synchronize.