2013-02-01

Cómo configurar un directorio virtual en Apache

Mediante directorios virtuales podemos acceder a los recursos que están fuera del directorio raíz del servidor (DocumentRoot), por ejemplo en C:\ruta\a\directorio mediante una url como http://localhost/mialias

Yo utilizo esto, por ejemplo, para tener la versión en desarrollo de los proyectos en una ruta distinta a la de la instalación del servidor pero poder probarla directamente en el servidor.

Para configurar un directorio virtual en Apache tenemos que:
  1. Abrir el fichero httpd.conf
  2. Buscar el bloque
    <IfModule alias_module>
    
  3. Y después de
    ScriptAlias /cgi-bin/ "C:/xampp/cgi-bin/"
    
  4. Añadir la siguiente línea:
    Alias "/mialias" "C:\ruta\a\directorio"
    
  5. Por último, después de
    <Directory "C:/xampp/cgi-bin">
     AllowOverride None
     Options None
     Require all granted
    </Directory>
    
  6. Añadir el siguiente bloque:
    <Directory "C:\ruta\a\directorio">
     Options Indexes FollowSymLinks Includes ExecCGI
     AllowOverride All
     Order allow,deny
     Allow from all
     Require all granted
    </Directory>
    
  7. Reiniciando Apache ya podremos navegar a http://localhost/mialias

2013-01-24

Clases para un modelo de datos en PHP

Para los modelos de datos que presenté (Modelo de datos) presento el conjunto de clases que lo soportan haciendo uso de la herencia.

Primero un diagrama:

// TODO

Y ahora el código de las clases, junto con las 2 clases de ejemplo, MiClaseDesactivable y MiClaseHistoriable:

<?php
abstract class Desactivable {
 
 public $activo;
 public $alta;
 public $baja;
 
}
?>
<?php
abstract class Historiable extends Desactivable {
 
 public $inicio;
 public $fin;
 
}
?>
Como me gusta hacer borrados lógicos en vez de físicos en las tablas de datos, todas las clases de mis proyectos heredarán de una de éstas 2 clases abstractas, directamente de Desactivable, para los casos generales, o de Historiable, para tablas versionadas o históricas (Slowly Changing Dimension de tipo 2). Ver http://raulcad.blogspot.com.es/2013/01/modelo-de-datos.html
<?php
class MiClaseDesactivable extends Desactivable {
 
 // TODO añadir los campos propios
 
}
?>
<?php
class MiClaseHistoriable extends Historiable {
 
 // TODO añadir los campos propios
 
}
?>

2013-01-14

Modelo de datos

Voy a exponer un modelo de datos general para el diseño de bases de datos que a mi me resulta práctico a la hora de trabajar:

Estos serían los campos básicos de una tabla:
  • id smallint(5) NOT NULL AUTO_INCREMENT
    Tener un identificador único para cada fila (se denomina Surrogate Key) tarde o temprano se agradece mucho más que tener que identificarlos mediante claves compuestas por varios campos. Además, como me gusta utilizar tablas versionadas o históricas (Slowly Changing Dimension de tipo 2), las Claves de Negocio (Business Key) pueden no tener un valor único en la tabla. Este concepto es muy utilizado en el diseño de bases de datos en entornos de Data Warehouse y Business Intelligence. En una tabla versionada SCD Tipo 2 es posible realizar un seguimiento de los cambios almacenando en cada fila, es decir, en cada versión, el periodo de tiempo para el cuál es válida la información de dicha fila (por ejemplo, incluyendo dos campos Fecha Desde y Fecha Hasta en la tabla). En consecuencia, ya no podremos definir la Clave de Negocio como un campo único, ya que pueden existir múltiples filas (múltiples versiones, tanto la actual como una o varias versiones históricas) con el mismo valor de la Clave de Negocio (Business Key). El campo id almacena un valor numérico único para cada fila de la tabla, actuando como una clave sustituta, de forma totalmente independiente a los datos de negocio. [guillesql.es]
  • activo tinyint(1) NOT NULL DEFAULT '1'
    Permite realizar borrados lógicos ("UPDATE tabla SET activo = 0" en vez de "DELETE FROM tabla") de los datos de la tabla y de esta manera es fácil restaurar datos y mantener el histórico de los datos en la tabla.
Los siguientes campos son la fecha de inserción de la fila y del borrado lógico de la misma, para poder hacer un mejor seguimiento de las acciones. No me gusta incluir otros campos de auditoría como pueden ser el usuario de las acciones o fechas de modificación. Si estos datos son relevantes, prefiero guardarlos en otra tabla a modo de log.
  • alta datetime NOT NULL
  • baja datetime DEFAULT NULL
Y por último, los dos campos siguientes los incluyo cuando necesito que haya más de un registro de una determinada información, cada uno de los cuales tiene la información válida correspondiente a un cierto periodo de tiempo:
  • inicio datetime NOT NULL
  • fin datetime DEFAULT NULL
Por ejemplo, una tabla de impuestos en la que queremos poder consultar el porcentaje de IVA general que era válido en 2011 y el que está vigente ahora, según mi modelo tendría esta forma:
id activo alta baja inicio fin porcentaje_iva
1
1
15/06/2010 08:09:10
01/07/2010 00:00:00
31/08/2012 23:59:59
18
2
1
20/08/2012 11:10:09
01/09/2012 00:00:00
21

2012-12-01

Desarrollo en PHP

Empiezo un proyecto PHP y estas van a ser mis herramientas para desarrollar en entorno Windows:
  • Zend Eclipse PDT 3.0.2 [zend.com]
    IDE. Eclipse Indigo 3.7.2 + PDT 3.0.2
  • XAMPP 1.8.1 [apachefriends.org]
    Paquete integrado de productos (Apache + MySQL + PHP + Perl) que nos simplifica mucho su instalación y configuración
    • Apache 2.4.3 [apache.org]
      Servidor web HTTP de código abierto para plataformas Unix, Windows, Macintosh, ... 
    • PHP 5.4.7 [php.net]
      Lenguaje de programación interpretado diseñado originalmente para la creación de páginas web dinámicas y usado en bastantes sitios importantes de Internet
    • MySQL 5.5.27 [mysql.com]
      Sistema de gestión de bases de datos relacional, multihilo y multiusuario
    • phpMyAdmin 3.5.2.2 [phpmyadmin.net]
      Herramienta hecha en PHP para manejar la administración de MySQL a través de páginas web
    En lugar de XAMPP podía haber utilizado WAMPSERVER (Apache, MySQL y PHP en Windows) [wampserver.com (inglés) wampserver.es (español)] pero, en el momento de escribir este artículo, las versiones de sus componentes eran más antiguas que las de XAMPP.
¿Qué más incluye XAMPP?
  • XAMPP Control Panel
  • OpenSSL [openssl.org]
    Proporciona funciones critográficas para acceso seguro a sitios HTTPS, implementación de SSL y TLS, además de creación de certificados digitales que pueden aplicarse al servidor Apache
  • Webalizer [webalizer.org]
    Reporta estadísticas e información de los accesos recibidos en un sitio web
  • Mercury Transport System [pmail.com]
    Servidor de correo electrónico para Windows gratuito y completamente funcional
  • FileZilla FTP Server [filezilla-project.org]
    Servidor FTP con licencia GNU y código abierto
  • Tomcat (with mod_proxy_ajp connector) [apache.org]
    Servidor web con soporte de servlets y JSPs, que a menudo se presenta en combinación con el servidor web Apache
  • Strawberry Perl Portable [strawberryperl.com]
    Entorno para desarrollar scripts Perl en Windows
¿Qué más incluye WAMPSERVER?
  • SQL Buddy [sqlbuddy.com]
    Administrador de MySQL basado AJAX, con menos funcionalidades que phpMyAdmin pero con mejor interfaz y usabilidad
  • XDebug [xdebug.org]
    Extensión de PHP que proporciona capacidades de depuración y profiling (rastreo del tiempo de ejecución de los scripts)
  • XDC (XDebugClient)
    Frontend para Xdebug en Windows
  • webGrind [google.com]
    Frontend web para visualizar los datos ofrecidos por XDebug, que permite comprobar el tiempo gastado en las funciones según su coste y conocer dónde es llamada cada función y qué función la llama

2012-10-27

Begin

> log in
name?
> raulcad
logged in
raulcad> start blog
raulcad@blog> welcome :)

En fin, que empiezo, y por ello voy a dedicar mi primera entrada del blog a mandar este típico saludo en varios lenguajes:

<script> document.write("Hola Mundo"); </script>

<? echo "Hola Mundo"; ?>

<% Response.Write("Hola Mundo") %>

<% out.print("Hola Mundo"; %>