Dreamhost lo ha vuelto a hacer…

Dreamhost lo ha vuelto a hacer, el sitio ha estado caído desde las 6:00 de la mañana hasta las 12:00 del mediodía (hora española), el tema ya me esta empezando a cansar…


Por : David           comentarios 3

Dar estilo a comandos de Windows con Css

CSS

David | 26/03/2008

Después de un periodo de descanso en semana santa, necesario para desconectar un poco y otro periodo de descanso forzoso debido al mal funcionamiento del hosting de Dreamhost, proseguimos con el blog, el cual había dejado un poco abandonado.

Escribiendo el articulo de MySQL se me ocurrió dar un estilo a los comandos que vaya insertando, creando un div que simule una consola de Microsoft, el típico CMD.

En un principio iba a usar una imagen capturada de la consola directamente, pero esta solución no me acababa de convencer, ya que no se podria copiar y pegar texto y ademas para Google, el texto de las imagenes es como si no existiese.

Realmente es una tontería, se me ocurrió una tarde que estaba aburrido y decidí escribir un articulo sobre esto.

La idea es usar un div con un pre dentro para introducir el texto preformateado.

Estas son las normas css que he usado :

.cmdWin {
background:url(images/cabecera.png) 2px 2px;
#background-position: 5px 5px; /* Solo para IE */
background-repeat: no-repeat;
background-color:#08246B;
color:#EFEFEF;
padding:0px;
padding-top:7px;
#padding-top:19px;  /* Solo para IE */
border: 4px #CFCFCF ridge;
}
.cmdWin pre , code{
font:monospace, Andale Mono, Lucida Console, Monaco, fixed ;
font-weight:bold;
background:black;
margin-bottom:0px;
padding:1px;
overflow:scroll;
height:400px;
}
.cmdWin pre span.cursor {
text-decoration:blink;
}

He usado un hack css , usando el carácter #, dado que Internet explorar y firefox interpretan el padding de forma distinta.

Para la cabecera del div he usado esta imagen:

También he creado una clase con nombre cursor para hacer parpadear el cursor.

Este el código html necesario para mostrar la línea de comandos.

<div class="cmdWin">
<pre>
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\felisa><span class="cursor">_</span>
</pre>
</div>

Y este es el resultado:

Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\felisa>_

Como ves, no es algo necesario, pero sirve para romper con la monotonía de la página a la hora de escribir código.


Problemas con el alojamiento en Dreamhost

Opinión

David | 25/03/2008

Estoy experimentando muchos problemas con el alojamiento web que me ofrece Dreamhost, la verdad es que estoy bastante descontento.

Ayer día 26 de marzo la web no estuvo operativa desde las 18.00 hora española hasta las 2:15, hora a la que estoy escribiendo este articulo.

Además me han dejado de funcionar todos los servicios de correo electrónico y tampoco accedía al panel. La velocidad de carga de la página es muy lenta, y no debe de ser problema de optimización, ya que uso wp-cache y pocas imagen es en la web, debe de ser un problema de la masificación de sus servidores.

Realmente me estoy planteando cambiar de servidor.

Un saludo


Google publica Google AJAX Translation API

Vía Ajaxian me entero de que google acaba de sacar otro API, llamado Google AJAX Translation API, con el cual podemos traducir textos con javascript y también detectar en que lenguaje esta escrito un texto

Por : David           Comentarios desactivados

Tablosign, un microblog de diseño

Hoy he descubierto Tablosign vía Xybernetycos, se trata de un blog de diseño al estilo twiter (microblog) donde participan varios diseñadores y van poniendo pequeñas anotaciones, trucos, recursos, lo que sea…Parece interesante…


Por : David           Comentarios desactivados

Cómo crear funciones en MySQL

BBDD

David | 20/03/2008

Como hemos comentado en el post de procedimientos almacenados, tener nuestras funciones y procedimientos en MySQL en lugar de de procesar los datos con algún lenguaje del lado del servidor, como PHP , tiene la ventaja de que viaja menos información de la base de datos al servidor web , con el consiguiente aumento del rendimiento y que estas funciones harán que podamos atacar la base de datos desde cualquier otro lenguaje, como Java o ASP.NET sin tener que volver a procesar los datos otra vez.

MySQL tiene muchas funciones que podemos usar en nuestro procedimientos almacenados y consultas, pero en ocasiones podemos necesitar crear nuestras propias funciones para hacer cosas más especializadas…

Vamos a ver cómo crear funciones en MySQL:

DELIMITER //
 
CREATE FUCNTION holaMundo() RETURNS VARCHAR(20)
BEGIN
    RETURN ‘HolaMundo’;
END
//

Para comprobar que funciona tecleamos lo siguiente en la consola de MySQL :

SELECT holaMundo();

Lo que devuelve el siguiente resultado :

mysql> select holaMundo()//
 
+--------------+
| holaMundo()  |
+--------------+
| Hola Mundo!! |
+--------------+
1 row in set (0.00 sec)

Para borrar la función que acabamos de crear :

DROP FUNCTION IF EXISTS holaMundo

Uso de las variables en funciones:

Las variables en las funciones se usan de igual manera que en los procedimientos almacenados, se declaran con la sentencia DECLARE, y se asignan valores con la sentencia SET.

DELIMITER //
 
CREATE FUNCTION holaMundo() RETURNS VARCHAR(30)
BEGIN
  DECLARE salida VARCHAR(30) DEFAULT 'Hola mundo';
;
  SET salida = ‘Hola mundo con VARIABLES’;
  RETURN salida;
END
//

Esta variable es de ámbito local, y será destruida una vez finalice la función. Cabe destacar el uso de la sentencia DEFAULT en conjunto con DECLARE, que asigna un valor por defecto al declarar la variable.

Uso de parámetros en funciones:

DROP FUNCTION IF EXISTS holaMundo
 
CREATE FUNCTION holaMundo(entrada VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN
  DECLARE salida VARCHAR(20);
  SET salida = entrada;
  RETURN salida;
END

Ahora hemos creado una función que devuelve el mismo valor que le pasamos como parámetro.

Si tecleamos :

mysql> select holaMundo("nosolocodigo")//
+---------------------------+
| holaMundo("nosolocodigo") |
+---------------------------+
| nosolocodigo             |
+---------------------------+
1 row in set (0.00 sec)

Obtenemos como resultado lo mismo que le hemos pasado como párametro, en este caso “nosolocodigo”

Para finalizar, algo un poco más complejo, vamos a crear una función que acepte un dividendo y un divisor y haga una división sin usar el operador división:

CREATE FUNCTION divide(dividendo int,divisor int) returns int
begin
    declare aux int;
    declare contador int;
    declare resto int;
    SET contador = 0;
    SET aux = 0;
    while (aux + divisor) &lt;= dividendo do
        SET aux = aux + divisor ;
        SET contador = contador + 1;
    end while;
    SET resto = dividendo - aux ;
RETURN contador;
end;
//

Para usarlo, simplemente llamaríamos a la función así:

SELECT divide(20,2)

Lo que devolvería 10.

Mirar el post sobre el control de flujo con procedimientos almacenados si no entiendes esta última función.


Crear handlers para manejar errores en MySQL 5

BBDD

David | 19/03/2008

Seguimos con MySQL,hemos visto cómo hacer procedimientos almacenados y cómo controlar el flujo de estos. Ahora le toca el turno a los handlers…

Cuando trabajamos con procedimientos almacenados en MySQL tenemos que tener en cuenta que durante la ejecución de nuestra aplicación se pueden producir errores.

Por ejemplo, si estamos trabajando con el motor de base de datos innoDB y definimos claves ajenas, podrán producirse errores de integridad referencial si intentamos hacer un insert en un campo que clave ajena y el valor que intentamos introducir no existe en la tabla que referencia.

Para llevar el control de estos errores podemos definir handlers en nuestro procedimientos almacenados .

Cada error en MySQL desprende un código de error, el cual tendremos que anotar para manejarlo en nuestro handler.

Ejemplo de un handler

Creamos la siguiente tabla:

    CREATE TABLE t2(
    s1 int,
    PRIMARY KEY (s1))engine=innodb;

Después creamos esta otra que contiene una clave ajena que hace referencia a la anterior :

    CREATE TABLE t3 (
    s1 int, KEY(s1),
    FOREIGN KEY (s1) REFERENCES t2 (s1))engine=innodB;

Después intentamos insertar un valor en la tabla t3, se trata de un valor que no se encuentra en la columna de t2 que referencia… lo que arroja el siguiente error en la consola de mysql:

INSERT INTO t3 VALUES(5);

Error:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`pruebas/t3`, CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`s1`) REFERENCES `t2` (`s1`))

Anota el código de error desprendido por que es lo que necesitamos para crear un handler que maneje este error, en este caso 1452.

Para manejar el error creamos un handler que almacenara el error en una tabla que vamos a crear donde iremos guardando un log de errores…

 CREATE TABLE error_log(error_message varchar(80));

Ahora creamos el procedimiento almacenado que se encargara de introducir datos en la BD y manejar excepciones:

delimiter //
CREATE procedure procedimientoConHandler(parametro1 int)
begin
    declare exit handler FOR 1452
    begin
        INSERT INTO error_log VALUES (concat('Time: ',current_date,'. Error de clave ajena para el valor= ', parametro1));
    end;
    INSERT INTO t3 VALUES (parametro1);
    .
    .
    .
end;
//

Creamos dentro del procedimiento un manejador de errores para el tipo de error deseado para que cuando se produzca el error introduzca en una tabla que indiquemos un log de errores y no falle la aplicación . La palabra exit significa que cuando se acabe la ejecución del handler se sale del procedimiento almacenado, si ponemos continue en lugar de exit, la ejecución de procedimiento almacenado proseguiría.

De esta manera para introducir valores en la base de datos lo haces llamando al procedimiento para que maneje los errores y tener un mayor control sobre la aplicación.

Ya tenemos nuestro procedimiento almacenado creado con control de errores.

Sintaxis para declarar handlers:

declare {exit | continue } handler for {error-number | {SQLSTATE error-string}}

Referencia : Documentación oficial de MySQL


Recopilación de plantillas en BTemplates

En BTemplates están haciendo una recopilación de plantillas para blogger, ya llevan unos cuantos..Seguro que hay muchas plantillas útiles..


Por : David           Comentarios desactivados