primeros pasos con node.js en raspberry pi

Lo primero que tenemos que hacer es instalar los paquetes de node.

wget http://node-arm.herokuapp.com/node_latest_armhf.deb 
sudo dpkg -i node_latest_armhf.deb

Podemos comprobar que funciona mediante la sentencia node -v

Ahora llega el momento de escribir nuestra primera aplicación

Una vez que hemos guardado el archivo podemos ejecutarlo con las instrucción:

Para comprobar que está funcionando podemos hacerlo de dos maneras, abriendo un navegador web y accediendo a la dirección http://direccionraspberry:1237 o desde una nueva consola de la raspberry ejecutando la sentencia:

Podemos ver como el servidor nos devuelve el código 200, que la respuesta es un texto plano y que el contenido es «Hola mundo» tal y como se esperaba.

borrar registros mysql a partir de una select en la misma tabla

Si intentamos borrar registros de una tabla a partir de una select

delete from customers where customers.customerNumber in
(
select customers.customerNumber
from customers
left join payments on customers.customerNumber=payments.customerNumber
group by customers.customerNumber
having count(payments.amount)=0
)

obtenemos el error:
[Err] 1093 – You can’t specify target table ‘customers’ for update in FROM clause

Existen dos maneras de borrar registros de una tabla a partir de una select de la misma tabla:

usando in

delete from customers where customers.customerNumber in
(select customerNumber from (
select customers.customerNumber
from customers
left join payments on customers.customerNumber=payments.customerNumber
group by customers.customerNumber
having count(payments.amount)=0
) as t )

y con inner join

delete customers from customers inner join
(select customerNumber from (
select customers.customerNumber
from customers
left join payments on customers.customerNumber=payments.customerNumber
group by customers.customerNumber
having count(payments.amount)=0
) as t ) tt on customers.customerNumber=tt.customerNumber

es importante decir que tabla borras, pues al hacer el join la sentencia no sabria cual borrar.

 

Ejercicio mysql

Ejercicio

A partir del siguiente enunciado:

Se quiere almacenar información de los empleados, clientes, productos y pedidos de una empresa. De cada cliente queremos almacenar un código único, el nombre y la ciudad. Un cliente puede hacer varios pedidos, pero un pedido es dolo de un cliente. De cada pedido queremos almacenar un código único y la fecha del pedido. Cada pedido lo gestiona un empleado. Un empleado puede gestionar varios pedidos. De cada empleado queremos almacenar un código único, nombre y ciudad. Cada pedido puede incluir varias unidades de un solo producto. De cada producto almacenamos un código único su nombre y precio unitario.

Obtener las siguientes sentencias:

A. muestra un listado con las siguientes columnas: numero_de_pedido,nombre_cliente,nombre_empleado,nombre_producto,cantidad, precio_unitario y total_importe_pedido
B. Muestra un listado con las siguientes columnas: numero_de_pedidos, nombre_cliente, media_importe_pedidos y total_importe_pedidos para cada cliente ordenado por nombre de cliente
C. Muestra un listado con las siguientes columnas: numero_de_pedidos, numero_empleados, ciudad, media_importe_pedidos y total_importe_pedidos para cada ciudad de residencia de los empleados siempre que al menos en la ciudad haya 2 o mas empleados y que en total en la ciudad se hayan firmado al menos 6 pedidos.
D. Muestra todos los datos de los empleados que hayan firmado pedidos a clientes de su misma ciudad.

Solución

mysql_1

El script para crear las tablas seria:

DROP TABLE IF EXISTS `examen_cliente`;
CREATE TABLE `examen_cliente` (
`codigo` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(255) DEFAULT NULL,
`ciudad` varchar(255) DEFAULT NULL,
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

— —————————-
— Table structure for examen_empleado
— —————————-
DROP TABLE IF EXISTS `examen_empleado`;
CREATE TABLE `examen_empleado` (
`codigo` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(255) DEFAULT NULL,
`ciudad` varchar(255) DEFAULT NULL,
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

— —————————-
— Table structure for examen_pedido
— —————————-
DROP TABLE IF EXISTS `examen_pedido`;
CREATE TABLE `examen_pedido` (
`codigo` int(11) NOT NULL AUTO_INCREMENT,
`fecha` date DEFAULT NULL,
`id_cliente` int(11) DEFAULT NULL,
`id_empleado` int(11) DEFAULT NULL,
`id_producto` int(11) DEFAULT NULL,
`cantidad` int(11) DEFAULT NULL,
PRIMARY KEY (`codigo`),
KEY `id_cliente` (`id_cliente`),
KEY `id_empleado` (`id_empleado`),
KEY `id_producto` (`id_producto`),
CONSTRAINT `fk_cliente2` FOREIGN KEY (`id_cliente`) REFERENCES `examen_cliente` (`codigo`),
CONSTRAINT `fk_empleado2` FOREIGN KEY (`id_empleado`) REFERENCES `examen_empleado` (`codigo`),
CONSTRAINT `fk_producto2` FOREIGN KEY (`id_producto`) REFERENCES `examen_producto` (`codigo`)
) ENGINE=InnoDB AUTO_INCREMENT=1014 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `examen_producto`;
CREATE TABLE `examen_producto` (
`codigo` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(255) DEFAULT NULL,
`precio` float DEFAULT NULL,
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

A.
select p.codigo as numero_de_pedido,
c.nombre as nombre_cliente,
pr.nombre as nombre_producto,
p.cantidad,
pr.precio,
p.cantidad*pr.precio as total_importe_pedido
from examen_pedido p
inner join examen_cliente c on p.id_cliente=c.codigo
inner join examen_producto pr on p.id_producto=pr.codigo
inner join examen_empleado e on p.id_empleado=e.codigo

B.
select count(*) as numero_de_pedidos,
c.nombre as nombre_cliente,
avg(p.cantidad*pr.precio) as media_importe_pedidos,
sum(p.cantidad*pr.precio) as total_importe_pedidos
from examen_pedido p
inner join examen_cliente c on p.id_cliente=c.codigo
inner join examen_producto pr on p.id_producto=pr.codigo
inner join examen_empleado e on p.id_empleado=e.codigo
group by c.codigo

C.
select count(p.codigo) as numero_de_pedidos,
count(e.codigo) as numero_empleados,
e.ciudad,
avg(p.cantidad*pr.precio) as media_importe_pedidos,
sum(p.cantidad*pr.precio) as total_importe_pedidos
from examen_pedido p
inner join examen_cliente c on p.id_cliente=c.codigo
inner join examen_producto pr on p.id_producto=pr.codigo
inner join examen_empleado e on p.id_empleado=e.codigo
group by e.ciudad having count(e.codigo)>=2 and sum(p.codigo)>=6

D.
select e.*,p.codigo,p.fecha,c.nombre,c.ciudad
from examen_pedido p
inner join examen_cliente c on p.id_cliente=c.codigo
inner join examen_producto pr on p.id_producto=pr.codigo
inner join examen_empleado e on p.id_empleado=e.codigo
where e.ciudad=c.ciudad

Check en mysql

Los check en mysql no funcionan

si creamos una tabla y le añadimos un check

CREATE TABLE cliente (
SD integer CHECK (SD > 0),
nombre varchar (30),
apellido varchar(30)
);

E intentamos introducir un dato que no cumpla el check no nos da ningun error:

INSERT INTO cliente values ('-2','abc','zz');
INSERT INTO cliente values (-3,'abc','zz');

Vemos que en la tabla tenemos los valores.

mysql_2

Para solventar el problema tenemos que recurrir a un trigger

CREATE TRIGGER check_trigger
BEFORE INSERT
ON cliente
FOR EACH ROW
BEGIN
IF NEW.SD<0 THEN
CALL `Error: El valor de SD tiene que ser mayor que 0`;
END IF;
END

Ahora si intentamos introducir un valor que no cumple los requisitos

INSERT INTO cliente values (-4,’tiene que fallar’,’por el trigger’);

Obtenemos un error, tal y como esperabamos:

[Err] 1305 – PROCEDURE clases.Error: El valor de SD tiene que ser mayor que 0 does not exist

Hemos resuelto el problema, no es del todo cierto, pues el trigger era solo para insert, si actualizamos un valor no salta:

update cliente set nombre=’cambiado’ where sd=-2

En mysql no se puede crear un trigger para insert or update como en oracle, por lo que hay que duplicar el trabajo.

CREATE TRIGGER check_trigger_update
BEFORE update
ON cliente
FOR EACH ROW
BEGIN
IF NEW.SD<0 THEN
CALL `Error: El valor de SD tiene que ser mayor que 0`;
END IF;
END

Ahora si ejecutamos la sentencia:

update cliente set sd=-4 where sd=-2

Nos devuelve un error, como era de esperar.

Subir un proyecto a GIT

Lo primero que necesitamos es un servidor donde crear el repositorio,

En bitbucket se pueden registrar proyectos y configurarlos como privados.

Una vez nos registramos creamos el repositorio:

Una vez que lo tenemos creado es necesario crear el proyecto en el directorio local y posteriormente subir el contenido:

Nos vamos a la carpeta donde tenemos el proyecto y ejecutamos las siguientes instrucciones:

git add * git commit -m «Comentario deseado» git push -u origin master

Con esto hemos añadido todos los archivos, hemos hecho el commit en local y hemos subido los cambios al servidor

Una vez que tenemos hecho esto la siguiente vez que trabajemos con Xcode lo podemos hacer directamente.

 

Subir una IPA con Application loader

Lo primero que necesitamos es generar un provisioning profile de tipo Distribución para Apple Store:

Una vez que lo tenemos lo asociamos al proyecto:

Y generamos el archivo desde el menu Product->Archive.

Una vez que lo tenemos pulsamos sobre Distribute:

Pero en lugar de mandarlo directamente al Apple Store desde Xcode, seleccionamos la opción de Adhoc como si fuera para dispositivo, pero elegimos el provisioning de Apple Store:

Y pulsamos en exportar

Le ponemos el nombre y nos genera el archivo IPA.

Ahora es el momento de utilizar la aplicación «Application Loader»:

Nos validamos con la cuenta de Apple:

Y utilizamos la opción de «Entregar Aplicación»:

Aquí nos tiene que salir la aplicación que previamente habremos configurado en itunes connect y que tiene que estar en estado «Waiting for upload», seleccionamos la IPA y dejamos que se suba.

 

Generar una IPA para probar en un dispositivo II

Partimos de un proyecto y un provisioning ya creado, (si no tienes esto ultimo puedes ver como crear uno en este enlace

Lo primero que tenemos que hacer es ir a las propiedades de Xcode:

Ahora tenemos que crear la cuenta:

Utilizando los datos de la cuenta que hemos usado para registrarnos como desarrolladores de Apple:

Una vez añadido vemos que somos Agent de IOS:

Y pulsando en detalles podemos ver los provisioning que tiene asociados:

Ahora es el momento de configurar el proyecto:

Para ello elegimos en la pestaña General el TEAM correspondiente a nuestra cuenta y como Bundle identifier el que corresponde a nuestra aplicación creada en el portal de desarrollo.

En la pestaña build settings tenemos que elegir el provisioning profile y el code signing Identity:

Que corresponden con los certificados creados en el post anterior

Ya tenemos todo configurado y podemos generar la IPA. para ello elegimos como destino del proyecto un dispositivo físico, no es necesario que esté conectado:

Y generamos el archivo:

Nos preguntará por el certificado necesario para firmar:

Y nos abrirá la ventana del Organizer con el archivo generado:

Desde aquí podremos generar la ipa con el botón «Distribute», eligiendo el tipo Ad Hoc:

Seleccionando el provisioning profile:

Y por último poniendo nombre al fichero:

Con esto tenemos una archivo con nuestra aplicación, firmado y listo para ser probado en los dispositivos seleccionados:

Para pasarlo al dispositivo se puede utilizar Itunes o i-funbox

El proceso en este ultimo es tan fácil como conectar el dispositivo y pinchar en la opción de «Instalar Aplicación»

Con eso tendremos la aplicación en nuestro dispositivo lista para probar.

 

Generar una IPA para probar en un dispositivo I

Vamos a la web de desarrolladores de apple [enlace]

Una vez que nos hemos validado, lo primero que tenemos que hacer es generar un certificado:

Elegimos el tipo de Producción

que nos permitirá elegir ad Hoc.

Ahora tenemos que abrir la utilidad «Llaveros»

Y tenemos que solicitar un certificado a una autoridad

Rellenamos los datos:

Y guardamos el fichero:

Ahora volvemos a la página y vamos a continuar el proceso:

Seleccionamos el fichero:

Y una vez generado descargamos el certificado:

Ahora el siguiente paso es generar la aplicación:

Introducimos la descripción y el bundle ID:

Y confirmamos los datos:

Ya tenemos la aplicación.

Ahora vamos a dar de alta los dispositivos sobre los que se quiere probar:

Introducimos el nombre y el udid, este parametro es lo importante pues sino la IPA no funcionará. Para obtenerlo podemos hacerlo mediante itunes (http://www.innerfence.com/howto/find-iphone-unique-device-identifier-udid) o mediante una web (get.udid.io)

Y vemos que se ha generado correctamente:

El ultimo paso es generar el provisioning profile

Elegimos el tipo Ad hoc

Elegimos la aplicación de entre las existentes:

Y elegimos el certificado a utilizar entre los existentes:

Por ultimo elegimos los dispositivos sobre los que queremos interacturar:

Le ponemos un nombre y ya lo podemos descargar:

Con esto tenemos lo necesario para ir al XCODE y generar la IPA y poder probar desde un dispositivo real, puedes ver como hacerlo en [enlace]:

 

Subir una aplicación al google play

Lo primero que necesitamos es tener una cuenta de desarrollador y haber pagado la cuota (25 dolares, cuando se hizo este post).

Lo primero es crear una nueva aplicación

Rellenamos el nombre y el idioma:

Una vez creada ir al apartado APK


Y pulsar sobre «Subir nuevo APK de producción»

Ahora es momento de ir a Eclipse

Con el proyecto abierto pulsamos botón derecho y nos vamos a la opción «Android tools»->Export Signed Application Package

Indicamos el proyecto y pulsamos Next.

Ahora tenemos que elegir un keystore o crear uno nuevo.

Por se la primera vez vamos a crear uno.

Una vez creado seguimos con la key.

Y por ultimo nos indica donde queremos guardar el fichero APK.

Una vez que tenemos el fichero podemos volver al play store y proceder a subir el archivo.

Una vez subido nos aparece un resumen de la versión subida, que dispositivos soportan  y estamos listos para poder publicarla*.

*para poder publicar es necesarios ademas preparar la ficha de la aplicación, con las capturas de pantalla y los textos de descripción.