Colección de libros de programación gratuitos
En este github encontrarás una gran cantidad de libros gratuitos de programación:
https://github.com/vhf/free-programming-books
Sólo en castellano:
https://github.com/vhf/free-programming-books/blob/master/free-programming-books-es.md
Markdown para generar Documentación
¿No crees que es un poco cutre hacer la documentación de un proyecto en Word?
Hay varias opciones y voy a empezar a recopilar aquí sobre Markdown, que es la que más me ha llamado la atención.
Markdown
Markdown es un lenguaje de marcado ligero que trata de conseguir la máxima legibilidad y «publicabilidad» tanto en sus forma de entrada como de salida.
El hecho de que sea un marcado ligero está claro, utiliza mucho menos texto para sus marcas, consiguiendo ser más rápido que HTML o XML.
Sintaxis
La Sintaxis completa de Markdown la encontramos aquí: http://daringfireball.net/projects/markdown/syntax.
PHP
Puedes descargar una librería PHP para Markdown aquí: https://michelf.ca/projects/php-markdown/
Ejemplos
*Esto va en cursiva*
Genera: Esto va en cursiva
*Patatas
*Judías
*Tomates
Genera una lista:
- Patatas
- Judías
- Tomates
Editores
Editor online: Markable -> http://markable.in/editor/
.
DIA – Editor de Diagramas
DIA es un software para editar diagramas.
Creo que en este blog lo he nombrado anteriormente para el tema de Base de Datos, cuando creábamos los Diagramas Entidad/Relación.
Pues DIA también sirve para hacer diagramas UML.
La web de los desarrolladores es: https://wiki.gnome.org/action/show/Apps/Dia
Yo lo tengo ya en Windows 7 y en Ubuntu. Apenas diferencias entre versiones. No solo eso, sino que tengo un equipo en Windows 7 y otro en Ubuntu, tengo instalado Dropbox en ambos y trabajo sobre la misma carpeta. Los ficheros generados con uno son perfectamente compatibles con el otro, así no tengo que andar enviando ficheros de un sitio a otro.
Descripción del sitio en PHP
Además de para esto, voy a utilizarlo para ver las dependencias entre mis ficheros PHP.
Ya sabes que creas un fichero PHP y dentro del mismo llamas a otros con «include». Llega un momento en el que te pierdes con tanto fichero, voy a utilizar DIA para plasmar estas llamadas.
Descripción de la red de comunicaciones
Otra de las cosas para las que se utiliza DIA es para crear un mapa de tu red, con tus nodos, switches, etc.
Diagramas E/R con DIA
Dia, herramienta gratuita para crear diagramas entidad/relación
Dia es una aplicación para crear diagramas técnicos. Tiene versiones en Linux y Windows. Es Software Libre.
Consultas SELECT sobre BD Contactos
Una vez importada a MySQL la BD CONTACTOS.MDB hacer las siguientes consultas:
- Número de registros de la tabla Usuarios
- Nombre y apellidos de las personas que viven en Valencia.
- Nombre, apellidos y dirección de correo de las mujeres que no están casadas.
- Alias y número de teléfono de los hombres que tienen la EGB o el Bachillerato.
- Alias, número de teléfono móvil y dirección de correo de los hombres que hablan castellano y tienen los ojos marrones
- Alias de las mujeres que les gusta el deporte
- Alias de Mujeres heterosexuales o bisexuales que miden más de 1.60m
- Alias de Hombres que no tienen fobias y cuyos ingresos mensuales sean mayores de 1000 euros
- Número de hombres por cada ciudad
- Número medio de hijos que tienen las mujeres que pesan más de 70 kg
- Alias de las mujeres rubias de entre 25 y 40 años.
- Altura media de los hombres calvos
- Nombre de las ciudades en la que la media del peso de los hombres es superior a 80.
- Nombre de las ciudades en las que hay más de 5 mujeres dadas de alta
Pasar una BD de Access a MySQL con phpMyAdmin
De manera práctica vamos a ver cómo podemos pasar una BD completa realizada en Access a MySQL utilizando phpMyAdmin.
Si entramos en phpMyAdmin podemos utilizar la opción Importar dentro del menú Más:
Aparece la siguiente página:
Como se puede ver, soporta ficheros en formato SQL, CSV, ODS y XML.
En esta ocasión vamos a utilizar ODS. ¿Por qué? El formato ODS va a ser capaz de leer las tildes y ñ sin problema.
ODS es un formato abierto que utiliza Openoffice.org. Para obtener este formato, debemos abrir nuestro fichero de Access, sobre cada una de las tablas, exportarla a formato Excel (que es el más parecido a ODS).
Una vez obtenido el fichero Excel, lo abrimos. Tras abrirlo, utilizaremos Guardar Como para obtener el fichero ODS.
Ya tenemos generado nuestro fichero ODS.
Ahora volvemos a phpMyAdmin y abrimos la opción IMPORTAR.
Pulsamos el botón Examinar y seleccionamos el fichero ODS anteriormente generado. Veremos cómo automáticamente cambia el Formato del fichero a Hoja de Cálculo de Open Document.
Antes de pulsar el botón Continuar, seleccionaremos el Check La primer línea del archivo contiene los nombres de columna de la tabla.
Si todo ha ido bien, aparecerá un mensaje que nos informará de cuántas estructuras se han creado y cuántas consultas se han ejecutado.
Nos ha creado una base de datos que se llama ODS_DB, podemos cambiarle el nombre.
Nos ha creado una tabla cuyo nombre es igual al nombre del fichero ODS.
Las tablas se han importado casi correctamente. Los nombres de los campos los ha cogido perfectamente, pero nos faltarían algunos detalles.
En primer lugar, la llave primaria, seleccionamos el campo o campos que sean llave primaria (en este ejemplo, el campo ID) y en la parte de abajo de la página pulsamos el botón Primaria
La consulta que ejecuta es la siguiente:
ALTER TABLE `usuarios` ADD PRIMARY KEY ( `ID` ) ;
Otro problema que teníamos era con las fechas. En el ejemplo, tenemos el campo FECHA NACIMIENTO, que es una fecha, pero no está almacenado en MySQL como Date.
Cambiar simplemente el tipo del campo de Varchar a Date no funciona, ya que en el Varchar están almacenadas las fechas en el formato dd-mm-yyyy y ese formato no lo soporta MySQL.
Deberíamos crearnos un campo nuevo, de tipo Date. Tras crearlo, debemos realizar un UPDATE como el siguiente:
UPDATE usuarios SET fechanueva=STR_TO_DATE(fechanacimiento, ‘%Y/%m/%d’);
En el campo nuevo ya tendríamos los valores de manera correcta, así que el campo antiguo podemos borrarlo. Y el campo nuevo renombrarlo para que aparezca con el nombre correcto.
Algo parecido pasa con los campos BOOLEANOS, no los coge correctamente y almacena valores de tipo cadena VERDADERO y FALSO.
Así, deberíamos crear un campo nuevo, de tipo BOOLEAN, y actualizarlo utilizando la siguiente consulta:
UPDATE usuarios SET fumadornuevo=true where fumador=’VERDADERO’;
UPDATE usuarios SET fumadornuevo=false where fumador=’FALSO’;
Con esto tendríamos todo terminado para una única tabla. Si nuestra Base de Datos de Access tiene varias tablas, con llaves externas, tendremos que ir importando todos los ficheros generados para cada tabla.
..
Base de datos de ejemplo Pedidos
Base de datos de ejemplo Pedidos
Páginas dinámicas vs HTML
Si el sitio es extenso y sus contenidos cambian rápidamente, nos interesa el automatizar en la medida de lo posible todas las tareas de tal forma que podamos gestionar su explotación de la manera más óptima.
Para dejar más claro hasta que punto resulta útil utilizar páginas dinámicas lo mejor será ejemplificarlo a partir de un sitio web modelo.
Supongamos que hemos decidido realizar un portal de televisión donde una de las informaciones principales a proveer podría ser la programación semanal. Efectivamente, esta información suele ser dada por las televisiones con meses de antelación y podría ser muy fácilmente almacenada en una base de datos. Si trabajásemos con páginas HTML, tendríamos que construir una página independiente para cada semana en la cual introduciríamos «a mano» cada uno de los programas de cada una de las cadenas. Asimismo, cada semana nos tendríamos que acordar de descolgar la página de la semana pasada y colgar la de la anterior. Todo esto podría ser fácilmente resuelto mediante páginas dinámicas. En este caso, lo que haríamos sería crear un programa (solo uno) que se encargaría de recoger de la base de datos de la programación aquellos programas que son retransmitidos en las fechas que nos interesan y de confeccionar una página donde aparecerían ordenados por cadena y por hora de retransmisión. De este modo, podemos automatizar un proceso y desentendernos de un aspecto de la página por unos meses.
Este hecho lo podríamos aplicar a otras situaciones: podemos preparar el horóscopo de todos los días, las promociones de un sitio de e-comercio…
Además, tampoco resultaría complicado el introducir una pequeña caja de búsqueda que nos permitiera dar rápidamente con el programa que queremos ver, saber a qué hora y en qué cadena se emite.
Volviendo a nuestro portal de televisión, en él hay una sección en la cual presentamos todas las series actualmente emitidas con comentarios sobre ella, fotos, etc. Podríamos, en lugar de hacer una página HTML por serie, hacer una única página dinámica en contacto con una base de datos en la cual visualizamos las fotos y comentarios relativos a la serie que nos interesa. Asimismo, si lo que buscamos es modificar el formato del texto de dicha sección, podemos automatizar este proceso sin necesidad de cambiar a mano cada una de las etiquetas font y sin hacer uso de la hojas de estilo las cuales no son reconocidas por la totalidad de los navegadores.
Otra serie de aspectos tales como la gestión de las lenguas, podrían ser fácilmente resueltos sin para ello duplicar el número de páginas y buscar los textos a traducir penosamente entre el código HTML.
En realidad, a partir de estas herramientas, podemos plantearnos cuantas cosas queramos.
Ejercicio: Piezas y Proveedores
- Crea la base de datos Suministros
- Crea las 3 tablas anteriores
- Inserta al menos 5 piezas y 5 proveedores (uno de ellos debe tener código HAL). También inserta en la tabla Suministra al menos 10 filas.
- Realiza consultas select para obtener:
- Nombres de todos los artículos
- Todos los datos de los proveedores
- Precio medio de todas las piezas
- Nombre de los proveedores que suministran la pieza 1.
- Nombres de piezas suministradas por proveedor cuyo código es HAL
- Nombre del proveedor que suministra la pieza más cara
- Aumentar los precios en una unidad
- Hacer constar que la empresa «Tornillos SL» (con código TOSL) va a comenzar a suministrarnos tornillos a 7 pesetas.
- Nombre de las piezas que suministra «Tornillos SL»
- Nombre del proveedor y número de piezas que suministra.
- Nombre de las piezas cuyo precio medio sea mayor a 10 euros y menor de 20.
- Diferencia entre el producto más caro y el más barato.
- Ordena los proveedores por nombre ascendentemente y muestra sólo los 3 primeros.
- Nombre de los proveedores que empiezan por A (si no tienes ninguno que empiece por A, utiliza otra letra para hacer la prueba).
..
CREATE TABLE SUMINISTRA( codigopieza integer, idproveedor varchar(4), precio integer, primary key (codigopieza,idproveedor), key(codigopieza), foreign key (codigopieza) references piezas(codigo) on delete cascade on update cascade, key(idproveedor), foreign key (idproveedor) references proveedores(id) on delete cascade on update cascade); CONSULTAS: SELECT * FROM PROVEEDORES; SELECT AVG(PRECIO) FROM SUMINISTRA; SELECT NOMBRE FROM PROVEEDORES, SUMINISTRA WHERE CODIGOPIEZA=1 AND ID=IDPROVEEDOR; SELECT NOMBRE FROM PIEZAS, SUMINISTRA WHERE IDPROVEEDOR='HAL' AND CODIGOPIEZA=CODIGO; SELECT NOMBRE FROM PROVEEDORES, SUMINISTRA WHERE IDPROVEEDOR=ID AND PRECIO=(SELECT MAX(PRECIO) FROM SUMINISTRA); UPDATE SUMINISTRA SET PRECIO=PRECIO+1; INSERT INTO PROVEEDORES(ID,NOMBRE) VALUES ('TOSL', 'Tornillos SL'); INSERT INTO PIEZAS(CODIGO, NOMBRE) VALUES (17, 'Tornillo'); INSERT INTO SUMINISTRA VALUES (17, 'TOSL', 7); SELECT PIEZAS.NOMBRE FROM PIEZAS, SUMINISTRA, PROVEEDORES WHERE PROVEEDORES.NOMBRE='Tornillos SL' AND ID=IDPROVEEDOR AND CODIGOPIEZA=CODIGO; SELECT PROVEEDORES.NOMBRE, COUNT(*) FROM PROVEEDORES, SUMINISTRA WHERE IDPROVEEDOR=ID GROUP BY IDPROVEEDOR; SELECT NOMBRE FROM PIEZAS, SUMINISTRA WHERE CODIGO=CODIGOPIEZA GROUP BY CODIGOPIEZA HAVING AVG(PRECIO)>10 AND AVG(PRECIO)<20; SELECT MAX(PRECIO) - MIN(PRECIO) AS DIFERENCIA FROM SUMINISTRA; SELECT NOMBRE FROM PROVEEDORES ORDER BY NOMBRE ASC LIMIT 3 SELECT NOMBRE FROM PROVEEDORES WHERE NOMBRE LIKE 'A%';
Ejercicio: La tienda de Informática
- Crea la Base de datos «Tiendainformatica»
- Crea las dos tablas, fabricantes y artículos
- Inserta al menos 4 fabricantes y 10 artículos
- Realiza las siguientes consultas:
- Obtener los nombres de los productos de la tienda
- Obtener los nombres y los precios de los productos de la tienda
- Obtener el nombre de los productos cuyo precio sea menor o igual a 200 euros.
- Obtener todos los datos de los artículos cuyo precio esté entre 60 y 140 euros, ambos precios incluidos
- Obtener el nombre y el precio en pesetas (es decir, multiplicado por 166,386)
- Obtener el precio medio de todos los productos
- Precio medio de los artículos cuyo fabricante sea 2
- Número de artículos cuyo precio sea superior a 180 euros.
- Nombre y precio de los productos cuyo precio sea mayor o igual a 180 euros, ordenándolos descendentemente por precio y ascendentemente por nombre.
- Obtener un listado completo de artículos, incluyendo los datos del fabricante también
- Obtener un listado de artículos, incluyendo el nombre, precio y nombre de fabricante
- Obtener el precio medio de los productos de cada fabricante, mostrando solo los códigos de cada fabricante
- Hallar el precio medio de los productos de cada fabricante, mostrando el nombre del fabricante.
- Nombre de los fabricantes que ofrezcan productos cuyo precio medio sea superior a 150 euros
- Nombre y precio del artículo más barato.
- Añadir un nuevo producto: Altavoces de 70 euros del fabricante 2.
- Cambiar el nombre del producto 8 a Impresora Láser
- Aplicar un descuento del 10% a todos los productos
- Aplicar un descuento de 10 euros a todos los productos cuyo precio sea superior a 120 euros.
…. ALGUNAS CONSULTAS RESUELTAS:
SELECT * FROM ARTICULOS WHERE PRECIO BETWEEN 60 AND 140; SELECT * FROM ARTICULOS WHERE PRECIO>=60 AND PRECIO<=140; SELECT NOMBRE, PRECIO*166.386 AS PRECIOENPESETAS FROM ARTICULOS; SELECT AVG(PRECIO) FROM ARTICULOS; SELECT AVG(PRECIO) FROM ARTICULOS WHERE FABRICANTE=2; SELECT COUNT(CODIGO) FROM ARTICULOS WHERE PRECIO>180; SELECT NOMBRE, PRECIO FROM ARTICULOS WHERE PRECIO>=180; SELECT NOMBRE, PRECIO FROM ARTICULOS WHERE PRECIO>=180 ORDER BY PRECIO DESC, NOMBRE ASC; SELECT * FROM ARTICULOS, FABRICANTES WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO; SELECT ARTICULOS.NOMBRE, PRECIO, FABRICANTES.NOMBRE FROM ARTICULOS, FABRICANTES WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO; SELECT FABRICANTE, AVG(PRECIO) FROM ARTICULOS GROUP BY FABRICANTE; SELECT FABRICANTES.NOMBRE, AVG(PRECIO) FROM ARTICULOS, FABRICANTES WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO GROUP BY FABRICANTES.CODIGO; SELECT FABRICANTES.NOMBRE FROM FABRICANTES, ARTICULOS WHERE FABRICANTES.CODIGO=ARTICULOS.FABRICANTE GROUP BY FABRICANTES.CODIGO; HAVING AVG(PRECIO)>150; SELECT AVG(PRECIO), CIUDADES.NOMBRE FROM ARTICULOS, CIUDADES, FABRICANTES WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO AND FABRICANTES.CIUDAD=CIUDADES.CODIGO; SELECT NOMBRE, PRECIO FROM ARTICULOS WHERE PRECIO = (SELECT MIN(PRECIO) FROM ARTICULOS); UPDATE ARTICULOS SET NOMBRE='Impresora Láser' WHERE CODIGO=8; UPDATE ARTICULOS SET PRECIO=PRECIO-(PRECIO*0.1); UPDATE ARTICULOS SET PRECIO=PRECIO-10 WHERE PRECIO>120;