La comunidad de MySQL pide apoyo para Ivan Nikitin

Hace unos días que lo leí en Propiedad Privada, y parece que, como excepción, este caso de ayuda no es scam ni una estafa, es totalmente real y muy urgente.

Drupal 5.9, corrección de idiomas en los feeds no-ingleses

Hoy ha salido la versión 5.9 para Drupal que ya corrige el error en los feeds heredado de Drupal 6 que comenté ayer y que provocaba que una traducción en las fechas situara todos los feeds del blog afectado como los primeros en los agregadores.

Cálculo de fechas incorrecto en Drupal 5 para los feeds en español

Actualización: La versión 5.9 de Drupal ya corrige este comportamiento.
Carlos ya tuvo el problema hace unos meses y todos sus posts salían los primeros en el Planeta de Drupal. Pues bien, como si fuera un virus, la nueva versión de Drupal 5, la 5.8, viene con este bug incorporado, que hace que, cada vez que generes un nuevo post, algunos agregadores pongan todos tus posts los primeros de la lista. Por lo que todos los que hemos actualizado ya, tendremos problemas con los feeds y los agregadores.
Para resolverlo, hay que aplicar el parche del comentario de Damien Tournoud de esta entrada de drupal.org.
Para aplicar un parche en un sistema Linux, podemos seguir las recomendaciones del blog de carlos si usamos linux, pero si no, o si no tenemos acceso por línea de comandos a nuestro server, solamente hay que substituir la línea 1922 del fichero modules/node/node.module, que es esta (antigua)

<?php
$extra = array_merge($extra, array(array('key' => 'pubDate', 'value' =>
format_date($item->created, 'custom', 'r')), array('key' => 'dc:creator',
'value' => $item->name), array('key' => 'guid',
'value' => $item->nid .' at '. $base_url,
'attributes' => array('isPermaLink' => 'false'))));
?>

por esta (nueva)

<?php
$extra = array_merge($extra, array(array('key' => 'pubDate', 'value' =>
gmdate('r', $item->created)), array('key' => 'dc:creator',
'value' => $item->name), array('key' => 'guid',
'value' => $item->nid .' at '. $base_url,
'attributes' => array('isPermaLink' => 'false'))));
?>

Estas dos sentencias son una sola línea, pero no me cabian en pantalla ;)

La tortuga asesina

Lorena me ha pasado este link a Cool Stuff y no he podido dejar de reirme, no tenia ni la más remota idea de que las tortugas fueran tan agresivas y tenazes... y tan rápidas!!!

¡¡¡Aquí van los videos de las tortugas asesinas!!!
(Advertencia: algunas imágenes pueden herir la sensibilidad del espectador)

Una tortuga atacando a un gato


Duplicar o clonar tablas en mysql

MySQL nos proporciona dos maneras de "clonar" una tabla, tanto su estructura como su estructura y sus datos, podemos querer duplicar una tabla para hacer algún tipo de backup rápido, mantener un histórico, o migrar la tabla a un esquema o base de datos diferentes, entre otras cosas.

Clonar una tabla usando SELECT

La sentencia de creación CREATE TABLE (..) SELECT nos permite crear la tabla con los registros que devuelva la consulta de selección, pero tiene las siguientes limitaciones:

  • No traspasa las constraints de tipo PRIMARY KEY
  • No traspasa las definiciones de AUTO_INCREMENT
  • No traspasa las definiciones de DEFAULT CURRENT_TIMESTAMP
  • Utiliza el storage engine por defecto y no el de la tabla (en caso de que sean distintos)
  • Solamente traspasa los registros afectados por la SELECT, que podría no devolver ninguno y crear la tabla vacía

Parking con tolerancia "Cero"

Este amistoso cartel me lo encontré de paso por la zona de la Bonanova en Barcelona, me gustaría haber visto la cara del ferretero al que le llevaron a grabar el letrero en cuestión...

Sin duda es una buena mezcla de agresividad pasiva y consecuencias fatales....

Módulo de Views para Drupal

Nota: Este post es parte de una serie de posts dedicados a CCK y al uso avanzado de las vistas con argumentos en Drupal.

Cómo poner la primera letra de una frase en mayúsculas con MySQL

Normalmente los sistemas de programación y bases de datos nos proveen con una función relativamente simple cuya utilidad consiste en transformar la primera letra de una frase o palabra a mayúsculas, en php es ucfirst(), en Oracle es initcap (en el caso de transformar una frase, la función de Oracle pone cada primera palabra en mayúsculas), pero parece ser que MySQL no la tiene, por lo que tenemos que explorar un poco más y usar una solución más creativa. Pongamos como ejemplo esta frase:

mysql> SET @frase = 'bienvenidos a cambrico.net'; 
Query OK, 0 rows affected (0.00 sec) 
mysql> SELECT @frase; 
+----------------------------+ | 
@frase | 
+----------------------------+ | 
bienvenidos a cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec)

Nota: He utilizado una variable de mysql con SET y @ para hacer las siguientes operaciones un poco mas simples. Tenemos funciones como UPPER/UCASE y LOWER/LCASE para transformar a mayúsculas o minúsculas la cadena:

mysql> SELECT UPPER(@frase); 
+----------------------------+ | 
UPPER(@frase) | 
+----------------------------+ | 
BIENVENIDOS A CAMBRICO.NET | 
+----------------------------+ 
1 row in set (0.00 sec)

Y para obtener la primera letra de la cadena en mayúsculas podemos utilizar un encadenado de las siguientes funciones: LEFT, para tomar el primer caracter de la izquierda y SUBSTR para coger los restantes, de esta forma tenemos aislada la primera letra. Aplicamos UPPER para transformarla en mayúsculas y unimos la cadena de nuevo con CONCAT (si tenemos sql_mode en ANSI_QUOTES, podemos usar ||)

mysql> SELECT CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2));
+------------------------------------------------+ | 
CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2)) | 
+------------------------------------------------+ | 
Bienvenidos a cambrico.net | 
+------------------------------------------------+ 
1 row in set (0.00 sec)

Actualizo: Para hacer lo que comenta Roberto, es decir, poner todas las palabras con la primera letra en mayúscula, tienes que hacer un procedimiento o una función (esto solo es posible a partir de MySQL 5.0). Os dejo un ejemplo:

DELIMITER // 
DROP FUNCTION IF EXISTS initcap; // 
CREATE FUNCTION initcap(cadena VARCHAR(100)) RETURNS VARCHAR(100) 
BEGIN 
DECLARE pos INT DEFAULT 0; 
DECLARE tmp VARCHAR(100) DEFAULT ''; 
DECLARE result VARCHAR(100) DEFAULT ''; 
REPEAT SET pos = LOCATE(' ', cadena); 
 IF pos = 0 THEN SET pos = CHAR_LENGTH(cadena); 
 END IF; 
 SET tmp = LEFT(cadena,pos); 
 SET result = CONCAT(result, UPPER(LEFT(tmp,1)),SUBSTR(tmp,2)); 
 SET cadena = RIGHT(cadena,CHAR_LENGTH(cadena)-pos); 
UNTIL CHAR_LENGTH(cadena) = 0 END REPEAT; 
RETURN result; 
END; //

Y a partir de ahora, en la base de datos que hayamos creado la función, podremos utilizarla:

mysql> SELECT initcap(@frase); 
+----------------------------+ | 
initcap(@frase) | 
+----------------------------+ | 
Bienvenidos A Cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec)

Con una pequeña modificación de la función anterior, podemos filtrar las palabras de menos de 4 caracteres (por ejemplo), para no poner en mayúsculas la mayoría de conectores:

DELIMITER // 
DROP FUNCTION IF EXISTS initcap; // 
CREATE FUNCTION initcap(cadena VARCHAR(100)) RETURNS VARCHAR(100) 
BEGIN 
DECLARE pos INT DEFAULT 0; 
DECLARE tmp VARCHAR(100) 
DEFAULT ''; 
DECLARE result VARCHAR(100) DEFAULT ''; 
REPEAT SET pos = LOCATE(' ', cadena); 
 IF pos = 0 THEN SET pos = CHAR_LENGTH(cadena); 
 END IF; 
 SET tmp = LEFT(cadena,pos); 
 IF CHAR_LENGTH(tmp) < 4 THEN SET result = CONCAT(result, tmp); 
 ELSE SET result = CONCAT(result, UPPER(LEFT(tmp,1)),SUBSTR(tmp,2)); 
 END IF; 
 SET cadena = RIGHT(cadena,CHAR_LENGTH(cadena)-pos); 
UNTIL CHAR_LENGTH(cadena) = 0 END REPEAT; 
RETURN result; 
END; //

Y el resultado sería ligeramente distinto:

mysql> SELECT initcap(@frase); 
+----------------------------+ | 
initcap(@frase) | 
+----------------------------+ | 
Bienvenidos a Cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec) 

Curso Introducción a Drupal 5.x

Oskar Calvo me ha pasado esta información sobre un curso que van a impartir a través de su empresa. Se trata de una formación online orientada a la toma de contacto con Drupal donde se podrá obtener una idea general del funcionamiento del CMS y bastantes nociones para administrarlo a nivel de webmaster.

Artículos destacados del mes de Junio

Os dejo algunos de los artículos que he leído el mes pasado y me han parecido muy interesantes.
Aquí podéis ver los del mes de Mayo

Páginas