Archivo para la categoría ‘ web ’

no_script_name en Symfony (1.2)

Sábado, Octubre 3, 2009

Sólo un pequeño y corto apunte para recordarme a mí mismo un problema que acabo de tener desarrollando con Symfony.

Recordad, para usar no_script_name en Symfony es necesario que mod_rewrite esté activo en Apache 2.

Para activarlo en un servidor con ubuntu:

  1. sudo a2enmod rewrite

Via: Symfony forum

Google Reader se me ha muerto

Sábado, Julio 25, 2009

Pues sí, acabo de entrar en Google Reader con Firefox 3.5 desde Leopard y resulta que el lector de feeds se ha quedado “frito”. No sé muy bien cómo explicarlo, así que lo mejor es que veáis una imagen.

Google Reader "frito"

Google Reader "frito"

¿A alguien más le ha pasado esto? No he conseguido reproducir el problema con Safari, Opera ni Google Chrome… así que me da por pensar que es un problema mío.

Detener el registro de bots en Wordpress

Domingo, Mayo 24, 2009

Últimamente una cantidad enorme de bots spammers se están registrando en Otro Blog Geek… no le di importancia hasta que me di cuenta de que prácticamente todos los usuarios registrados del blog son spammers. Una pena que Akismet no se haga cargo de esto, sin embargo hay vida más allá de Akismet y no es tan difícil deshacerse de estos bots.

Lo primero ha sido comprobar unas cuantas de las direcciones y eliminarlas buscando el e-mail de los usuarios registrados en Stop Forum Spam. Una vez que los usuarios ya estaban eliminados, lo importante es evitar que no se vuelvan a registrar este tipo de bots. Para esto he encontrado Sabre, un plugin para Wordpress que es bastante completo y se encarga de evitar de un montón de formas que los bots se registren.

Los métodos que Sabre utiliza son bastante variados:

  • Captchas.
  • Preguntas lógicas a los usuarios (operaciones matemáticas simples, etc.)
  • Requerir una activación por parte de los usuarios (o del administrador)
  • Comprobar si el navegador dispone de soporte javascript.

Yo por ahora he activado el soporte para activación por parte del usuario, ya que me ha parecido el menos invasivo para los usuarios que quieran registrarse.

Por cierto, si alguno ha perdido su usuario reguistrado (que lo dudo) lo siento muchísimo.

Nomina a Symfony en los premios SourceForge.net

Viernes, Mayo 15, 2009

Via: symfony.es

HOWTO: Cambiar el look&feel de netbeans 6.5.1 en Ubuntu

Domingo, Mayo 3, 2009

Otro cortito. Los desarrolladores de Ubuntu (o los de netbeans, no lo sé muy bien) parece que no se han dado cuenta, que con el look&feel por defecto de Netbeans la ventana de depuración tiene el mismo color de fondo que la tipografía que se usa para los valores de las variables… por lo tanto es muy difícil o casi imposible depurar cómodamente.

Veamos como cambiar este look&feel.

  1. Editamos el fichero etc/netbeans.conf que está en el directorio de instalación de netbeans
  2. Añadimos --laf javax.swing.plaf.metal.MetalLookAndFeel al final de la variable netbeans_default_options
  3. Rearrancamos el IDE y ya tendremos un look&feel mucho más agradable para la depuración
Vista de variables locales depurando PHP con netbeans

Vista de variables locales depurando PHP con netbeans

HOWTO: Configurar xdebug para depurar scripts PHP en Ubuntu Jaunty

Domingo, Mayo 3, 2009

Vamos manos a la obra directamente, por que es bien sencillo.

  1. Instalamos xdebug en Ubuntu (previamente necesitamos tener php, apache, etc. instalado)
    1. sudo aptitude install php5-xdebug
  2. Editamos el archivo de configuración de xdebug /etc/php5/conf.d/xdebug.ini y añadimos las siguientes lineas
    1. xdebug.remote_enable=on
    2. xdebug.remote_handler=dbgp
    3. xdebug.remote_mode=req
    4. xdebug.remote_host=localhost
    5. xdebug.remote_port=9000
  3. Reiniciamos apache
    1. sudo /etc/init.d/apache2 restart

Ya podemos depurar PHP con nuestro IDE preferido, como Eclipse o Netbeans

HOWTO: Symfony Framework 1.2 en Ubuntu Jaunty 9.04

Sábado, Mayo 2, 2009

Symfony es un framework para desarrollar aplicaciones web basándonos en el patrón MVC.

La instalación es bastante cómoda y se puede realizar a través de PEAR. El proceso es muy simple:

  1. Instalamos Apache. También es posible usar otros servidores, pero yo me siento cómodo con Apache. Yo tengo la mala costumbre de usar para ello un método bastante “cutre” que consiste en instalar phpmyadmin, ya que así se resuelven todas las dependencias necesarias para Apache, PHP y MySQL de una vez.

    Durante la instalación nos preguntará qué servidor queremos usar con PHPMyAdmin, seleccionamos Apache y listo.

    Yo instale y configuré previamente MySQL manualmente, pero usando este método es posible que os guíe durante la configuración.

    1. sudo aptitude install phpmyadmin
  2. Instalamos pear:
    1. sudo aptitude install php-pear
  3. Añadimos el canal de Symfony:
    1. sudo pear channel-discover pear.symfony-project.com
  4. Instalamos Symfony mediante PEAR:
    1. sudo pear install symfony/symfony

Por último solo nos resta configurar Apache. Yo he configurado un host virtual con un log separado, así podré testear y depurar cómodamente. Veamos como hacerlo por pasos.

  1. Añadimos la entrada con el dominio que queramos a /etc/hosts. Yo he elegido dominio.com para el ejemplo, pero se puede elegir otro
    1. echo "127.0.0.1 dominio.com" >> /etc/hosts
  2. Ahora creamos una entrada en /etc/apache2/sites-available/dominio.com con el siguiente contenido:
    1. <VirtualHost *:80>
    2.         ServerName dominio.com
    3.         ServerAdmin webmaster@dominio.com
    4.  
    5.         DocumentRoot /var/www/web
    6.         DirectoryIndex index.php
    7.  
    8.   Alias /sf /usr/share/php/data/symfony/web/sf
    9.   <Directory /sf>
    10.     AllowOverride All
    11.     Allow from All
    12.   </Directory>
    13.  
    14.         ## Cambiamos esta ruta por la que nos convenga
    15.         ErrorLog /path/al/log/fichero.log
    16.  
    17.         # Possible values include: debug, info, notice, warn, error, crit,
    18.         # alert, emerg.
    19.         ## Podemos cambiar también el nivel de log por el que más nos convenga
    20.         LogLevel debug
    21.  
    22.         CustomLog /path/al/log/fichero.log combined
    23.         ServerSignature On
    24.  
    25.   #Configuracion de symfony
    26.   <Directory "/var/www/web">
    27.     AllowOverride All
    28.     Allow from All
    29.   </Directory>
    30. </VirtualHost>
  3. Por último activamos el host virtual, mod_rewrite y reiniciamos apache
    1. sudo a2ensite dominio.com
    2. sudo a2enmod rewrite
    3. sudo /etc/init.d/apache2/reload

Solo falta editar el archivo /etc/php5/apache2/php.ini y cambiar la linea magic_quotes_gpc = Off por magic_quotes_gpc = On

Para comenzar a desarrollar podemos acudir a la página de Symfony y seguir su increíble “tutorial” escrito en forma de libro o en librosweb si preferís el libro en español.

Evitar problemas con las peticiones AJAX y la caché en Internet Explorer

Viernes, Octubre 17, 2008

Desde hace unos días tengo algunos problemas con un módulo en Javascript que estoy desarrollando en el trabajo. El script hace una petición AJAX y obtiene un XML. El problema es que Internet Explorer cachea el XML cuando le apetece y eso provoca que a veces el módulo no cargue como debería. La solución es tan sencilla como añadir un nuevo argumento aleatorio a la petición, evitando así que Internet Explorer la cargue desde la caché la siguiente vez.

El siguiente ejemplo está basado en Prototype

  1. var ajaxRequest = new Ajax.Request(’sample.xml’, {
  2.   method: ‘get’,
  3.   //Extra parameter on request
  4.   parameters: {  
  5.     differentiator: Math.floor(Math.random()*50000)  
  6.   },
  7.   onSuccess: function(response){
  8.     whatever();
  9.   }
  10. });

Solución via: The Arsenalist

bind() y bindAsEventListener() en Prototype, como utilizarlos

Lunes, Octubre 13, 2008

Desde que empecé a trabajar mi función principal es la de desarrollador web. Básicamente me peleo todo el día con Prototype y con AJAX. Después de unas cuantas semana Prototype se ha convertido en parte en un gran aliado, pero también en un enemigo a batir. Conocer el framework con profundidad es esencial para trabajar con él y a veces no es fácil. Una de las cosas que mas trabajo me costó entender fue la utilidad de las funciones bind() y bindAsEventListener(). Ambas son muy potentes y muy útiles cuando se utilizan bien, pero comprender su uso puede ser difícil y a veces nos pueden dar quebraderos de cabeza.

Voy a intentar explicar de forma clara y simple como se usan estas dos funciones y para qué sirven. Vayamos por partes.

  1. bind(): Es una de las estrellas en Prototype y también es una de las más trabajo suele costar entender. Imaginemos un objeto que tiene métodos para acceder a sus datos miembro. Usando bind() podemos hacer que esos objetos accedan a datos miembro de otros objetos en lugar de a los del objeto original. Veamos un ejemplo:
    1.  
    2. var Clase1 = Class.create({
    3.   initialize: function(msg){
    4.     this.mensaje = msg;
    5.   },
    6.   log: function(){
    7.     console.log(this.mensaje);
    8.   }
    9. });
    10. var objeto1 = new Clase1("Mensaje, Objeto1");
    11. var objeto2 = new Clase1("Mensaje, Objeto2");
    12.  
    13. objeto1.log(); //Genera -> Mensaje, Objeto1
    14. objeto2.log(); //Genera -> Mensaje, Objeto2
    15. //Creamos el bind de alerta para que se ejecute en el
    16. //contexto del objeto2.
    17. var log_bind = objeto1.log.bind(objeto2);
    18. log_bind(); //Genera -> Mensaje, Objeto2

    Como vemos, la llamada a log_bind() realiza la llamada a objeto1.bind() usando el contexto del objeto2, lo cual en terminos prácticos equivale a hacer objeto2.bind()

    También podemos usar bind() para añadir argumentos a la llamada a una función. Veamos un ejemplo de esto.

    1. var Clase2 = Class.create({
    2.   initialize: function(msg){
    3.     this.mensaje = msg;
    4.   },
    5.   log: function(){
    6.     console.log(this.mensaje + ‘ ‘ + $A(arguments).join(‘, ‘));
    7.   }
    8. });
    9.  
    10. var objeto3 = new Clase2("Mensaje, Objeto3");
    11. objeto3.log();
    12. var log_bind_mas_argumentos = objeto3.log.bind(objeto3,1,2,3,4,‘ lo que sea’);
    13. log_bind_mas_argumentos();

    Esta vez no cambiamos el contexto de la función, pero añadimos varios argumentos extra que luego se extraen usando $A(arguments), convirtiéndolos así en un Array de Prototype.

  2. bindAsEventListener(): Una vez hemos comprendido el uso que tiene bind() es fácil entender la dinámica de bindAsEventListener(). Su funcionamiento es el mismo que el de la función bind() pero con adaptaciones específicas para un contexto concreto, el de la captura de eventos.Este es el mismo ejemplo que hay en el API de Prototype pero un poco retocado:
    1. var obj = {
    2.   name: ‘Un bonito ejemplo’
    3. };
    4.  
    5. function handler(evento){
    6.   var tag = Event.element(evento).tagName.toLowerCase();
    7.   var data = $A(arguments);
    8.   data.shift();
    9.   console.log(this.name + \nHas clickado en ‘ + tag + \nOtros argumentos: ‘ + data.join(‘, ‘));
    10. }
    11. $(‘elemento’).observe(‘click’, handler.bindAsEventListener(obj, 1, 2, 3));

    Por partes, el objeto obj tiene una propiedad name y la función handler(evento) se encarga de manejar el evento una vez se ha disparado. Esta función extrae el nombre del elemento de la página que ha disparado el evento, los argumentos extra pasados a la función y los muestra todos por la consola de facebook. La clave de todo el ejemplo es la línea:

    1. $(‘elemento’).observe(‘click’, handler.bindAsEventListener(obj, 1, 2, 3));

    Esta línea asigna la función handler(evento) como manejadora del evento onclick del elemento y además cambia su contexto al del objeto obj y le pasa 3 números como argumento. Pero echando un segundo vistazo a la función vemos que en ningún momento le pasamos el argumento evento. Esa es precisamente la función especial de bindAsEventListener() pasar como primer argumento el objeto de la clase Event que representa al evento que se ha disparado.

    Usando bindAsEventListener() siempre recibiremos el objeto Event como primer argumento, sin necesidad de pasar ese evento de forma manual.

Espero que después de este par de ejemplo quede todo un poco más claro, como siempre se aceptan preguntas, dudas y sugerencias :) y para todo el código que necesitéis pegar podéis usar Pastie

Colabora para que NetBeans soporte Symfony

Miércoles, Septiembre 10, 2008

Acabo de leer en el blog de Symfony en español que la versión 6.5 de netbeans incluirá soporte para PHP y que además se espera que soporte algún framework PHP. Los desarrolladores de netbenas han decidido someter a votación que 2 frameworks serán soportados en esta nueva versión.

En este post del blog en español de Symfony explican como dar nuestro voto a Symfony :)

Firebug pasa a formar parte de la fundación Mozilla

Sábado, Julio 19, 2008

Lo acabo de leer en anieto2k y la verdad es que me ha parecido una noticia genial. John Resig lo anunció el jueves en su blog.

El equipo de Firebug está realizando un gran trabajo con la versión 1.2 y la verdad es que estoy impaciente por saber qué es lo que le depara el futuro a esta genial extensión. Desde luego seguro que todavía no lo hemos visto todo acerca de Firebug y en los próximos meses dará mucho que hablar.

Comentarios en Tumblr

Domingo, Junio 22, 2008

Tumblr

Como he dicho en mi anterior apunte, he comenzado a escribir un tumblelog. La idea me parece muy interesante, pero lamentablemente Tumblr, la plataforma que uso para el tlog, no dispone de comentarios.

Buscando un poco he encontrado Disqus, una sistema de comentarios que permite agregar comentarios a Tumblr y a otras plataformas. Con la ventaja de que no necesita registro para los comentaristas y que permite usar cuentas de OpenID.

Agregarlo a un tlog de Tumbler es sencillísimo, solo hay que darse de alta y seguir las instrucciones que dan. Cómodo y rápido.

HOWTO: Obtener el tipo MIME de un archivo mediante PHP

Domingo, Junio 15, 2008

Edito sábado, 09 de agosto de 2008: Corregido un error en el nombre del paquete de PEAR en Ubuntu. Gracias david.

Sigo peleándome con mi proyecto fin de carrera, y mi última batalla ha consistido en obtener el tipo MIME de un archivo mediante PHP. Tras un vistazo al manual de PHP me encontré con esta extensión de PHP que hace lo que necesito y mucho más.

Se puede instalar mediante PEAR, para ello seguimos el siguiente procedimiento.

  1. Instalamos PEAR, las librerías para desarrollo de PHP y de libmagic.
    1.  
    2. sudo aptitude install php-pear php5-dev libmagic-dev
    3.  
  2. Usamos el comando pecl para instalar la extensión
    1.  
    2. sudo pecl install fileinfo
    3.  
  3. Añadimos la extensión a nuestro php.ini, para ello accedemos creamos un nuevo archivo llamado extensiones.ini en la carpeta /etc/php5/conf.d y añadimos dentro la linea:

    extension=fileinfo.so
    
  4. Por último reiniciamos apache
    1.  
    2. sudo /etc/init.d/apache2 restart
    3.  

Ya tenemos la extensión instalada, ahora para obtener el tipo mime podemos usar un código parecido a este.

  1.  
  2. $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
  3. $filename = ‘/ruta/al/archivo.jpg’;
  4. $mime_type = $finfo->file($filename);
  5.  

Tras esto tendremos el tipo MIME almacenado en la variable mime_type. Para más ejemplos de uso de la extensión se puede acudir a la página del manual de PHP.

Enlaces útiles para comenzar con Symfony Framework

Viernes, Junio 13, 2008

Como el nombre del post indica, ahí va una lista de enlaces que pueden ser bastante útiles a la hora de comenzar a desarrollar aplicaciones con Symfony.

Extensión de Firefox: Split Browser

Lunes, Junio 9, 2008

Split Browser en Firefox 3.0

Hoy he encontrado una extensión bastante curiosa para Firefox. Estoy hablando de Split Browser. Esta extensión nos permite dividir la ventana del navegador para mostrar varias webs a la vez. El sistema de pestañas de firefox es muy potente, pero a veces es algo incómodo, por ejemplo cuando quieres ver la vista previa de una entrada mientras posteas. En la imagen se puede ver lo que permite esta extensión.