martes, 1 de mayo de 2012

Google Drive, Dropbox, Skydrive

La cosa es muy sencilla: quiero compartir documentos, principalmente PDF, con mis alumnos. Estos consisten en presentaciones de diapositivas comentadas, ejercicios, soluciones, exámenes, es decir, nada nuevo ni excepcional.

Habiendo que hay infinidad de opciones de almacenamiento en la nube, los productos del título son ya archiconocidos y, si es por prestigio de buen hacer, Dropbox gana por ahora. ¿Qué tienen los otros que no tenga Dropbox? Almacenamiento, ahora mismo 5GB Google Drive y, si fuiste rápido en su día, 25GB en Skydrive. Aparte de este detalle, ¿algo más?

Claro que si piensas en Google y todo su universo de aplicaciones piensas que es la opción a considerar porque esperas una fácil convivencia entre unas y otras. Mi idea, importada de Google Sites y sus plantillas de página de archivos, es que, al menos, una breve descripción podría acompañar al nombre del fichero. Ya si viene el tamaño, tipo de archivo y hasta un numerito de versión, pues mejor.

Lo incómodo de esta forma de trabajar es que hay que adjuntar el archivo a la página en Google Sites y gastas espacio de almacenamiento. Tampoco es que sea tan importante, pero si tienes Google Drive (que subsume al Google Docs, con lo bueno y con lo malo), ¿por qué no aprovecharlo? La cuestión es no tener que ir fichero a fichero sino tenerlo en una carpeta y poder actualizarlo cuando toque y añadir cuando se quiera.

El problema, pequeño si se quiere, con Google Drive es doble. Por un lado, lo que ve el dueño debidamente identificado no es lo mismo que ve un usuario anónimo. Es infinitamente más rica la vista del dueño, hablando de descripción, iconos, etc. El usuario anónimo solo ver el nombre del fichero y poco más.

Vista del dueño en Google Drive.

Vista del usuario anónimo en Google Drive.

Esta es exactamente la vista que tendría un usuario del tradicional Google Docs, por lo que parece que es que todavía no han adaptado la nueva interfaz para todos los usuarios y situaciones.

Por otro lado, como te salgas de Firefox (¡qué cosas!), empiezan los problemas: en iExplorer hay problemas con el ancho, ni vista de compatibilidad ni nada, la parte derecha se queda oculta. Lo peor de todo, y lo que me hace evitar la faceta pública de Google Drive, es que si la lista de archivos es lo suficientemente grande, ni iExplorer ni Chrome muestran una barra desplazamiento que te permite llegar al final de la lista, directamente no puedes verlos ni acceder a ellos si no tienes un cacho-pantalla o disminuyes la fuente hasta lo invisible. No he probado con más, me niego.

Da la impresión de que las cosas de Google van tan rápido que es fácil encontrarte con pequeños detallitos que no se acaban de pulir y que no te acaban de gustar. Al final, si se trata de mostrar una simple vista de archivos, te vuelves a lo conocido y demostradamente fiable, el Dropbox de toda la vida. 

¿Y Skydrive? Pues es exactamente lo mismo que Dropbox, así que es otra alternativa, ya a gustos. Tiene un detallito, eso sí, casillas de selección (checkboxes) para elegir varios archivos y descargarlos todos de golpe pero Dropbox lleva bastante más tiempo y está más integrado y abierto a otras plataformas. El dichoso iPad, por ejemplo. Hasta el momento, que yo sepa, aplicación de Skydrive para IOS no hay.

jueves, 19 de abril de 2012

Exportar de Blogger a WordPress

Ya se va a notar que ahora estoy enfrascado en labores de importación y exportación desde Google a WordPress (WP). Tan tonto como querer hacer una prueba y enterarme de cómo funciona WP pero reciclando todo aquello y todo esto que tengo diseminado entre los productos Google.

Ahora vamos de exportar un blog de Blogger, digamos este mismo, e importarlo en WorPpress. Lo primero que me dirán es que WP ya tiene una preciosa herramienta de importación directa desde Blogger, le das permiso a WP para que entre en tu cuenta Google y listo. Bien, lo he probado en dos sitios distintos, en uno funcionó pero me acabó insertando un caracter extraño (un "mayor que") en el inicio de todas las entradas. Sí importó las etiquetas aunque transformándolas en categorías de WP. En el otro sitio, mi casa, me salió un mensaje  de esos harto desagradables: unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? No he mirado mucho, pero lo que he encontrado es que la culpa la tiene Google, no yo. Al menos, así me lo he querido creer para no trastear mucho más.

La otra opción, también dentro de las herramientas de WP, es importar desde un archivo XML. No es directo, pero como Blogger sí tiene un opción de exportación a XML, así que lo primero ya está hecho. Lo segundo es que hay que adaptarlo al formato de WP. Nuevamente, San Google te da la solución: blogger2wordpress. Es de una simplicidad insultante, le das la ruta en tu disco duro del fichero obtenido en Blogger y te descarga un *.wxr.xml que se carga en segundos en WP, desde la opción herramientas/importar/WordPress, eso sí. Lo malo es que este no importa las etiquetas.

Según parece, no todo son flores, hay problemas con el tamaño, dicen algunos, y otros se han encontrado problemas con blogger2wordpress. De hecho, el problema de las etiquetas se me ha atragantado y me he dedicado a buscar alternativas. El hecho es que blogger2wordpress no codifica las categorías y etiquetas en un formato que WP entienda. La pista me ha venido de la importación parcialmente exitosa de mi primer sitio y de comentarios sobre soluciones al problema.

Efectivamente, me he ido a mi primer sitio y he exportado desde ese WP (lo que no estoy seguro es que, desde ese sitio, pudiera volver a importar de nuevo directamente desde Blogger). El problema del carácter raro que introduce al inicio de cada entrada lo he solucionado abriendo el fichero XML en el bloc de notas. En el fichero me he encontrado esto, <![CDATA[> que he sustituido por <![CDATA[. Hecho esto, la importación ya incorpora, eso sí, las etiquetas como categorías. Habrá que probar la otra herramienta de WP para transformar categorías en etiquetas.

Seguiremos dándonos tortazos e informando.

Copia de respaldo de Google Sites

Como bien dicen por ahí, una de las debilidades de Google Sites es su falta de herramientas de respaldo. Sí se puede hacer una copia del sitio entero a otro nuevo, pero dentro de Google, no a tu PC, por ejemplo.

No "problemo", el propio universo Google tiene la solución: google-sites-liberation, un programa en java que te lo descarga todo con cierta simplicidad. No me acaba de gustar esta obligación que tenemos de dar los usuarios y contraseñas para todo y para todos pero, si no, es que no hay manera. En cualquier caso, los detalles los tienen en la wiki del proyecto.

Tampoco es nada nuevo que grandes productos, principalmente por su dimensión, no entro en si Google Sites es mejor o peor que otros, dejen hacer y se nutran de terceros que rellenan pequeños o grandes agujeros del producto de referencia.

lunes, 27 de febrero de 2012

MySQL y ONLY_FULL_GROUP_BY

Una de "arreglo una cosa y estropeo otra". MySQL, históricamente, se toma varias licencias frente a los estándares de SQL que pueden venir bien o no tan bien. Uno que particularmente no me gusta nada es la relajación de las columnas obligatorias en el GROUP BY.

Si no tocas nada de la configuración del servidor, cosas como esta se pueden hacer:

drop table if exists TT;
create table TT(a varchar(2), b varchar(1), c int, primary key (a));

insert into TT values ('a1','a',1),('a2','a',2),('a3','b',10);

select a,b,sum(c)
from TT
group by b;



absum(c)
a1a3
a3b10

Desde el estándar SQL, group by debería contener todas las columnas no calculadas que aparecen en select, es decir, group by a,b, independientemente de que esto tenga sentido o no. En realidad, todavía no entiendo qué se gana permitiendo esta sintáxis. Sí tendría algún sentido, por aquello de ahorrarnos algo de trabajo, si la columna "b" dependiera funcionalmente de la columna "a", de hecho algo de eso hay en el estándar SQL99, pero sigo sin verle mucha gracia.

De todas formas, como se trata de enseñar SQL y no las triquiñuelas de MySQL, a nuestros alumnos les obligamos a que no hagan estas cosas, es decir, la compilación de esta orden debería dar un error similar a "TT.a no está en GROUP BY". Para que se comporte así, MySQL permite configurar una variable global, sql_mode, en la que se puede establecer, entre otras cosas, ONLY_FULL_GROUP_BY, esto es, "compórtate como te dice el estándar"; y como hacen otros como Oracle o SQL Server, dicho sea de paso.

set session sql_mode='ONLY_FULL_GROUP_BY';

Esto obliga a cambiar la orden durante la sesión que tengamos abierta en MySQL. Si seguimos queriendo que el group by se haga por las dos columnas anteriores:

select a,b,sum(c)
from TT
group by a,b;


absum(c)
a1a1
a2a2
a3b10

Bueno, seguramente es que tampoco queríamos esto sino

select b,sum(c)
from TT
group by b;


bsum(c)
a3
b10

Que es en realidad para lo que vale el group by.

Resulta que lo pones todo contento, el sql_mode mencionado, y va y otras consultas que antes funcionaban ahora dejan de hacerlo.

select b
from TT
where c >= ALL (select c from TT);

La consulta anterior, estando sql_mode='ONLY_FULL_GROUP_BY', genera un error cuando no debería hacerlo. Di tú que la suerte es que para la mayoría de las cosas que preguntamos en clase hay una alternativa y además intuitiva:

select b
from TT
where c = (select max(c) from TT);


Pero no deja de ser molesto. Es un bug más o menos documentado que, hasta donde yo sé, se arrastra al menos hasta las versiones 5.1.x de MySQL. En las 5.5.x he comprobado que ya no. 

-----
Actualización: nos han actualizado a la versión 5.1.61 y ha desaparecido el bug.

miércoles, 22 de febrero de 2012

Botón imprimir en Google Sites

A raiz de un problemilla de un alumno con la impresión de una de nuestras páginas de FBDdocs, me he puesto a buscar una solución. El caso es que, si quieres imprimir una página, las barras laterales, superior e inferior no hacen más que molestar. Solución: el típico botón de "imprimir" que genera una página limpia (o casi) y más apta para la impresora. Pero ese botón, ¿de dónde lo saco?

En los foros de Google he encontrado lo que buscaba. Lo he adaptado un poco a mis gustos, los colorines y tal, pero se trata de editar la página en cuestión en HTML e insertar el siguiente código:

<form xmlns="http://www.w3.org/1999/xhtml">

<STYLE type="text/css">
input.btn {
  color:#005;
  font: 75% 'trebuchet ms',helvetica,sans-serif;
  background-color:#ddd;
  border:0px solid;
  border-color: #696 #363 #363 #696;
}
</STYLE>
<input class="btn" onclick="window.open('http://fbddocs.dlsi.ua.es/practicas-sql-espanol/expresiones-de-seleccion-de-filas?tmpl=/system/app/templates/print/&showPrintDialog=1')" style="width:75px; height:25px" type="button" value="Imprimir" />
</form>

Acto seguido, al salir de la edición HTML, se convierte en un gadget que puede editarse y colocarse donde queramos. El inline style es para darle ese aspecto más personalizado. El resto no merece más comentario. Por cierto la página en cuestión, la original se puede ver aquí, con el botoncito de marras a la derecha.

Bonito.

miércoles, 1 de febrero de 2012

La timidez de MySQL

No sorprende ya el que MySQL haya dejado para más tarde ciertos aspectos de SQL, de hecho, forma parte de su filosofía de origen, un producto destinado a obtener la máxima velocidad en entornos cliente-servidor sobre HTTP.

No obstante, esto ha sido hasta gracioso, uno de esos errores que dice uno "manda uebos" pero que mira, es así. Todo surge de un compañero que me llama todo alarmado porque MySQL no funciona como es debido.
 use apruebas;

 select *
 from L_TA rigth join  L_TB on  a=d ;

 select *
 from L_TB left join  L_TA on  a=d ;

Me he tomado la libertad de ponerle colorines a las palabras clave en vez de colocar un pantallazo de MySQL Workbench, pero es tal y como se ve en su ventana de edición. Tampoco muestro la estructura de las tablas porque no hace falta para lo que voy a contar. En cualquier caso, parece evidente que las dos consultas deberían dar el mismo resultado. Pues no.

Hasta que me he dado cuenta del colorín de rigth, y es que, claro, está mal escrito:
 select *
 from L_TA right join  L_TB on  a=d ;

Adonde quería llegar es que MySQL no dice nada sobre el "rigth", se lo traga sin más, y ejecuta un inner join sin más preocupaciones. Como siempre, la suerte de comentárselo al de al lado, y la suerte de la inspiración de este. Ya conocía los casos de foreign key fuera de innodb pero ¿esto? Será que MySQL es tímido...

martes, 31 de enero de 2012

Kill, kill, kill... procesos en MySQL

A toda prisa me he tenido que ir al interné a buscar como parar un bucle infinito de inserciones en una tabla desde PHP.

Después del susto inicial, nada, fácil: show full processlist y kill x. Menos mal.

Tampoco me voy a arrostrar todo el mérito, el primero que me lo aclaró fue Trucos Informáticos.