inicio mail me! sindicaci;ón

Firebug 1.2 Final Liberado

Si, la noticia llego un poco tarde al blog, pero vale la pena recordarlo.
Firebug es claramente una de las mejores extenciones para firefox si nos dedicamos a desarrollar claro. Así que ya fue liberada la versión 1.2 Final teniendo a cuestas:

Mejoras:
Mejorados el panel de Red, Javascript y la consola
Reparados muchos bugs
Aumentaron la seguridad de la consola
Viene desactivado (para mejorar la performance) por defecto el panel de Red,Guión y Red
Está en Español !!!
Sigue teniendo compatibilidad con FireCookie
En Red, podes filtrar los listados segun el tipo de archivo (.js/Imagen/Css/etc)

subir imagenes
Las opciones de Red, Javascript y Consola están desactivadas por defecto

Activar mod_rewrite en Xampp

Investigando una nueva forma de hacer un controlador para MVC, me encuentro, con que Xampp, por defecto no tiene activado el módulo mod_rewrite.

Que es mod_rewrite?
Para hacerla simple, es un modulo de apache, que permite procesar las URL al vuelo mediante reglas y proponer acciones a seguir.

Por ejemplo en mi caso, tenía que hacer la siguiente regla:

# Redireccionador para MVC
RewriteEngine on
RewriteRule !\.(js|gif|jpg|png|css)$ index.php

Si el archivo de la petición URL no es extención js,gif,jpg,png o css redirigir a index.php
Pero lamentablemente, al hacer el archivo .htaccess (Donde se situan las reglas) me daba el siguiente error en la aplicación:

Error 500
¡Error en el servidor!
El servidor encontro un error interno y fue imposible completar su solicitud.
Existe tambien la posibilidad de que el servidor este sobrecargado o de
algún error en un programa de CGI.

Entonces los pasos que seguí para activar el mod_rewrite fueron:

Paso 1:
Fui al directorio a donde está instalado Xampp
Paso 2:
Me metí en el directorio apache/conf/
Paso 3:
Abrí el archivo httpd.conf con el editor de textos
Paso 4:
Busque la linea que contenía: rewrite_module
La línea completa es:
#LoadModule rewrite_module modules/mod_rewrite.so
Paso 5:
Como estába comentada, la descomente (sacando el # de adelante) y guardé los cambios
Paso 6:
Reinicié apache y listo, ya tenemos el módulo funcionando !!

SQLBuddy, el reemplazo de phpMyAdmin ??

Webeando por ahí, me topé magicamente, como en tantas otras oportunidades con SQLBuddy, un Administrador de MySQL vía web hecho en PHP ( cual conocido phpMyAdmin ).
Lo bajé inmediatamente desde acá tras enterarme que era OpenSource y gratuito. Boton derecho, lo descomprimí en la carpeta de Apache, y listo, eso fue toda la instalación, me reconoció el MySQL local y la configuración, así que tras ingresar un usuario y contraseña ya estaba disfrutando del poder de esta herramienta.
Entre lo que nos permite, se encuentra:

  • Administrar usuarios de manera muy simple
  • Importar / Exportar de/a SQL
  • Ejecutar consultas y ver los resultados (Ajax)
  • Explorar las Bases de datos
  • Agregar / Modificar / Eliminar tablas
  • Brinda información sobre las tablas
  • Explorar los datos de las tablas
  • Abrir una determinada fila en una ventana interna para usarla más tarde
  • A simpe vista, note que es mucho más rápido que phpMyAdmin y está un paso sobre ésta última en cuanto a facilidad y agilidad de uso.

    Descarga:
    Version: SQL Buddy 1.2.9
    Tamaño: 167 KB
    Requerimientos: PHP 4.3+, MySQL 4+
    Navegadores Soportados:Firefox, Safari, Opera 9.5, Internet Explorer 7
    Idiomas:Español, Inglés, Aleman, Italiano, Japones, etc.
    Descarga: Link de Descarga

    Y finalizo con algunas capturas en mi Firefox :

    subir imagenes
    subir imagenes

    UML a PHP :: VI :: Iteradores en SPL

    Iteradores, cosa poderosa si las hay. Para ser concreto voy a empezar con su definición:

    Iterador:
    El patrón de diseño Iterador, define una interfaz que declara los métodos necesarios para acceder secuencialmente a un grupo de objetos de una colección (1)

    Pero lo más importante es que:

    Este patrón de diseño permite recorrer una estructura de datos sin que sea necesario conocer la estructura interna de la misma.(1)

    Esto quedo claro, ahora, que es SPL, esas siglas que aparecen en el título del post.
    SPL (Standard PHP Library) , son un conjunto de interfaces y clases que intentan resolver de manera rápida los problemas más comunes. Hablar completamente de la SPL sería cuestion de muchos artículos, así que solo me voy a dedicar a hablar de :

    ArrayIterator

    Creo que el ArrayIterator en el más útil y extendido, ya que permite crear un iterador sobre un Array.
    Es tan simple como:

    // Creo un Array con una sucesión
    $arr = Array(0,1,1,2,3,5,8,13,21);
    // Creo el iterador sobre el Array
    $iterador = new ArrayIterator($arr);
    // Mientras tenga mas valores que recorrer
    while($iterador->valid())
    {
       // Muestro el valor actual
       echo $iterador->current()."-";
       // Me muevo al siguiente valor
       $iterador->next();
    }
    echo '<br />';
    // Podemos volver al primer valor
    $iterador->rewind();
    // Lo recorremos con un Foreach
    foreach($iterador as $aux)
    { 
        echo $aux."-";
    }
    echo '<br />';
    // Muestro la cantidad de objetos en el iterador
    echo "Cantidad: ".iterator_count($iterador);

    La salida para que lo comprendan un poco mejor es:

    0-1-1-2-3-5-8-13-21-
    0-1-1-2-3-5-8-13-21-
    Cantidad: 9
    

    Para esto, Array Iterator implementa varias interfaces:

    class ArrayIterator implements 
    Iterator,Traversable,ArrayAccess,SeekableIterator,Countable
    { ... }

    Lo que lo deja con los siguientes métodos:

    mixed current() // Devuelve el elemento actual
    mixed key() // Devuelve la llave del Array
    void next() // Pasa al siguiente valor del  Array
    void rewind() // Va al primer valor del array
    void seek( int $position ) // Se mueve a la posición indicada
    bool valid() // Contiene más valores?

    Claro está que esto no sería muy útil sino se pudieran iterar Arrays de Objetos:

    // Hacemos un array de objetos
    $lista = Array();
    // Creamos objetos de Prueba
    $cliente = new Cliente();
    $cliente2 = new Cliente();
    $cliente3 = new Cliente();
    // Los agregamos al array
    $lista[] = $cliente;
    $lista[] = $cliente2;
    $lista[] = $cliente3;
    //Creamos el mismo iterador
    $iterador = new ArrayIterator($lista);
    //Lo recorremos y usamos el objeto indicado
    while($iterador->valid())
    {
       echo '<br />'.$iterador->current()->getNombre();
       $iterador->next();
    }
     
    // Objeto de prueba
    class Cliente
    {
          // El rand() es para diferenciar cada objeto
          public function getNombre()
          { return "Socio N:".rand(); }
    }

    Esto tiene una salida, por ejemplo:

    Socio N:32143
    Socio N:14364
    Socio N:7205
    

    Una modesta opinión

    Sin duda los iteradores dentro de SPL son un avance para hacer que PHP no se quede en el tiempo y se convierta en un lenguaje obsoleto frente a sus competidores como JAVA o .NET. Pero, no están al alcance de estos, por ejemplo. Primeramente faltan los métodos:

  • hasPrevious()
  • nextIndex()
  • previous()
  • previousIndex()
  • Para que? para recorrer los datos como se nos ocurra, osea ir para adelante o para atras según lo necesitemos, o para mostrar los datos en un orden inverso, son muchas las funcionalidades que dejaron de lado. Y si, algunos dirán “Pero puede hacerce de una manera muy simple”, si, estoy de acuerdo, pero la idea es simplificar las cosas, hacer que estos problemas tipicos en todo sistema se resuelvan simplemente, no hacer algunas cosas y dejar el resto en la mano del programador.¿Será que estoy muy acostumbrado a java?

    Articulos de interés:
    (1) Iterador - Wikipedia
    SPL Manual

    PHP - Implementar un Singleton para Gestionar las Configuraciones del Sistema

    Primero definimos lo que es un Singleton, y de que se encarga:

    El Patrón Singleton, garantiza que una clase tenga sólo una instancia, y proporciona un punto de acceso global a ella
    (Patrones de Diseño :: Addison Wesley :: Erich Gamma, Richard Helm, Balplit Jonhson, John Vhissides)

    Entonces, vamos a tener una y solo una instancia de la clase Singleton en memoria por ves, y solo puede accederse desde un único punto.
    Perfecto para guardar configuraciones, ya que garantizamos que esté siempre actualizada y que solo podamos acceder desde un punto y no dupliquemos datos.
    Al ser única instancia ahorramos memoria (aunque últimamente ya no es tan crítico lo que se puede proratear).

    Un ejemplo claro que estoy usando en un proyecto es éste.
    Una Clase (Singleton) Config. “SConfig” para los amigos, que no es otra que la encargada de mantener la configuración del acceso a la base de datos y algunas otras cosas, como límites, nombres, etc.
    Su uso es muy simple, se agrega el atributo, se lo inicializa, y listo.

    /**
    * DESCRIPCION:
    * Es una clase que define un patrón Singleton
    * OBJETIVO:
    * Encargado de guardar las configuraciones del sistema para poder accesarlas
    * en todo momento de forma única, simple y rápida.
    *
    * @copyright  Creative Commons Atribución 2.5 Argentina.
    * @author Iuga - iuga77@gmail.com
    * @version 1.0.6
    * @todo: ---
    *
    * Agradecimientos:
    * Enrique Place, Martin Alterisio, andres
    */
    class SConfig implements ISingleton
    {
      // Definimos el atributo que guarda la instancia del Singleton
      private static $config = null;
      // Definimos las variables de la configuracion
      private $bdHost;      // Host de la BD
      private $bdUsuario;  // Nombre de Usuario de la BD
      private $bdPass;     // Password de la BD
      private $bdBd;        // Schema a usar
     
      /**
      * Retorna la clase Singleton si existe en memoria
      * Si no existe, crea una nueva
      * @return (Singleton)
      */
      public static function getInstance()
      {
        if ( self::$config == null )
        {
          self::$config = new SConfig();
        }
        return self::$config;
      }
     
      /**
      * Constructor del Singleton
      * Se inicializan las variables
      */
      private function SConfig()
      {
       // Este es el constructor, definimos la configurcion
       $this->bdHost    = "localhost";
       $this->bdUsuario = "root";
       $this->bdPass    = "pass";
       $this->bdBd      = "BaseDePrueba";
      }
     
      /**
      * Método "GET", se usa para obtener los parametros
      * independiente si existe su get o no
      * @param  $var Nombre del atributo
      * @return  $valor_atributo
      */
      public function getData ( $key )
      {
        if(isset($this->$key))
        {
          return $this->$key;
        }
        else
        {
          return NULL;
        }
      }
    }

    Y la interfaz ISingleton:

    /**
    * Interface que define el comportamiento de todas las clases Singleton
    * del Sistema, para que cumplan con el mismo contrato de obtención de datos
    *
    * @copyright  Creative Commons Atribución 2.5 Argentina.
    * @author Iuga - iuga77@gmail.com
    * @version 1.0.0
    *
    * Agradecimientos:
    * Enrique Place, Martin Alterisio, andres
    */
    interface ISingleton
    {
        /**
         * Método que va a retornar la instancia Singleton
         * @return (Singleton)
         */
        public static function getInstance();
        /**
         * Método para obtener los datos definidos dentro del Singleton
         * @param <string> $key
         */
       // public function getData($key); 
       // Fuera de la interface hasta que alguien proponga lo contrario
    }
    </string>

    Para usar una de las configuraciones, podemos simplemente:

    echo "Host de la Base de Datos: ".SConfig::getInstance()->getData("bdHost");

    Fácil de mantener, de actualizar y acceder.
    Ese es mi caso, sería interesante ver como guardan los coders PHP sus configuraciones y comparar.

    Artículos de interés:
    PHPSenior: Patrón de Diseño “Singleton”
    WikiPedia Singleton

    Novedades en NetBeans :: Generador de setters,getters y consultas

    Si si, leiste bien, si en un punto lo criticaba mucho a NetBeans era en el que no era capaz de hacer los getters, setters y Constructores por si solo, luego de darle la definición de atributos.
    Más ahora es un punto a favor.
    Por favor, vayan a una clase creada, situense en alguna parte de la clase y presionen

    Alt + Insert

    Que es eso, un menú “Generate” con varias opciones:

    Podemos hacer solo los getters , solo los setters o ambos al mismo tiempo. Una conexion a la base de datos o una consulta mostrando los datos de una tabla, interesante.

    Si ponemos hacer los Setters nos aparecerá una nueva ventana, en la que podemos seleccionar cuales son los que realmente queremos generar, punto a favor.

    Para cerrar, ya que lo que quiero hacer es que ustedes lo conozcan y lo exploren, muestro algo interesante, pero en un proyecto grande, inútil. es buscar una tabla, seleccionar X campos y te inserta un codigo que hace la consulta, la itera y te la muestra en una tabla, simple, pero saca del apuro.
    Algo como esto:

    genera algo así:

                echo '<table>';
                echo '<tr>';
                echo '<th>nroCandidato</th>';
                echo '<th>nroPersona</th>';
                echo '<th>fechaAlta</th>';
                echo '<th>urlFoto</th>';
                echo '</tr>';
                $result = mysqli_query($conn, 'SELECT `nroCandidato`, `nroPersona`, `fechaAlta`, `urlFoto` FROM candidato');
                while (($row1 = mysqli_fetch_array($result, MYSQLI_ASSOC)) != NULL) {
                    echo '<tr>';
                    echo '<td>' . $row1['nroCandidato'] . '</td>';
                    echo '<td>' . $row1['nroPersona'] . '</td>';
                    echo '<td>' . $row1['fechaAlta'] . '</td>';
                    echo '<td>' . $row1['urlFoto'] . '</td>';
                    echo '</tr>';
                }
                mysqli_free_result($result);
                echo '</table>';

    Espero que lo vean como una novedad provechosa, y que si ya lo conocian les refresque la memoria, más de esto no puedo llegar a provocar.

    Liberado NetBeans 6.5 Beta

    Hoy fue liberada la nueva versión “Beta” de Netbeans, más precisamente es la 6.5

    subir imagenes

    Entre las novedades:

    PHP
    * Code Completion
    * Quick Fixes and Semantic Checks
    * Code Generator
    * FTP Support
    * Debugging with Xdebug
    * Support for popular Web Services
    Ajax/JavaScript
    * Debugging support for Firefox and IE
    * HTTP client monitoring
    * Bundled popular JavaScript libraries
    Java
    * Groovy/Grails support
    * Compile on Save
    * Eclipse project import and synchronization
    * Built-in Hibernate support
    * JSF CRUD Generator now Ajax-enabled
    Database
    * New Connection Dialog
    * SQL Editor Improvements
    C/C++
    * Improved code completion and error highlighting
    * Remote Development
    * Support for packaging
    Ruby
    * New Ruby/GlassFish v3 “Prelude” Bundle
    * Support for Ruby Tests
    * Updated Rails to 2.1.0
    * Improved support for Rake build tool
    GlassFish v3 “Prelude” Bundles
    * Modular, OSGi based architecture
    * Small footprint, fast startup and deployment
    * Support for scripting, including jRuby

    Para más información:

    Descargar:
    http://download.netbeans.org/netbeans/6.5/beta/index.html?cid=926302
    Documentación del lanzamiento:
    http://www.netbeans.org/community/releases/65/index.html?cid=926302
    Tutoriales y documentación:
    http://www.netbeans.org/kb/index.html?cid=926302

    La version 4.4.9 de PHP arregla muchos fallos

    Han sido descubiertas varias vulnerabilidades en PHP 4.4.x que podrían
    permitir a un atacante remoto acceder a información sensible, causar una
    denegación de servicio o comprometer un sistema vulnerable.

    A continuación se detallan los problemas de seguridad corregidos en la
    última versión:

    * La primera vulnerabilidad consiste en múltiples errores en la librería
    PCRE (Perl Compatible Regular Expressions) que podrían ser aprovechados
    para acceder a información sensible, causar una denegación de servicio o
    comprometer un sistema vulnerable.

    * La segunda vulnerabilidad está causada por un error no especificado en
    la función “imageloadfont”. Un atacante remoto podría provocar que el
    sistema dejase de responder mediante el uso de una fuente no válida.

    * La tercera vulnerabilidad consiste en un error no especificado en la
    extensión “curl” relacionado con el manejo de la función “open_basedir”.

    * La última vulnerabilidad está causada por un fallo de desbordamiento
    en la función “memnstr” que podría ser aprovechado por un atacante para
    ejecutar código arbitrario.

    Las vulnerabilidades están confirmadas para la versión 4.4.8 y todas las
    anteriores.

    Se recomienda actualizar a la versión 4.4.9 o superior

    Fuente:
    Hispasec - una-al-día - 13/08/2008

    Analizando un Generador de Clases para PHP - Proyecto phpAurora

    La idea de un generador de clases, es que mediante una GUI simple, se pueda contruir una clase con todos sus atributos, métodos y mapeo a la Base De Datos.
    En lineas generales un buen generador de clases tiene que tener:

  • Una GUI simple, de facil uso y completa
  • Tener en cuenta, la clase, atributos, métodos, tablas
  • Proveer el mapeador para la Base De Datos
  • Implementar patrones
  • Implementar la gestión de las configuraciones de una manera centralizada y única (Singleton)
  • Dividir la clase en si, del mapeo y carga
  • Permitir cargar un objeto en particular
  • Permitir la carga de multiples objetos del mismo tipo
  • Permitir la creación y actualización persistente de los objetos
  • Soporte para Herencia y Asociación
  • Ser independiente del motor de Base De Datos
  • Ésto es lo que me propongo crear, un mapeador/generador de PHP hecho en Java.
    Va a llevar tiempo y esfuerzo, pero pienso que sea OpenSource y gratuito, para que todo el que quiera ayudar o contribuir, lo logre con un pequeño esfuerzo.

    Web del Proyecto:
    http://code.google.com/p/phpaurora/

    IF cortos en PHP ? :

    Leyendo un articulo sobre PHP-GTK me encuentro con un ejemplo en el que usa un If else comprimido muy interesante, sobre todo para cuando tenemos que hacer comprobaciones simples.
    La sintaxis es la siguiente:

    echo ($condicion) ? "Es verdadera" : "Es Falsa";

    eso, equivale a un:

    if($condicion)
    {
      echo "Es verdadera";
    }
    else
    {
      echo "Es Falsa";
    }

    Acotra mucho el código e incrementa la legibilidad para que no sea tan engorroso, sobretodo cuando se mezcla PHP con HTML.

    Se denominan Operadores Ternarios (gracias Joan, Embat Consultors) y no sirven para bifurcar los caminos de la ejecución, solo se emplean para asignaciones condicionales (gracias andres)

    El ejemplo en el que fue usado, es claramente contundente:

    dl('php_gtk.'.(   strstr(PHP_OS,'WIN') ? 'ddl' : 'so')   );

    En este caso arma un string con el nombre de una librería, en el caso de que php corra sobre windows (condición verdadera) el archivo será php_gtk.ddl en otro caso, como Linux php_gtk.so.
    Como notan, puede usarse cualquier función en la pregunta, en este caso hace un strstr es decir, que si en algún momento de la cadena constante PHP_OS sale ‘WIN’ devuelve true.

    strstr
    Devuelve toda la cadena pajar desde la primera aparición de aguja hasta el final.
    PHP_OS
    Devuelve información sobre el sistema operativo en el que está corriendo PHP
    - Windows NT XN1 5.1 build 2600
    - Linux localhost 2.6.21-0.13 #1 Fri Mar 14 15:08:06 EST 2003 i686

    Entradas Anteriores »