Week 2

--Originally published at Memogcia blog

In this week we are going to make the following tasks:

. Design mockups
. Choose a web template for the design con the web app
. Make a repository on github
. Watch a vue tutorial
. Decide the technologies we will use

So we are deciding in which framework we will use (React or Vue). I thing Vue is the best option for us, because nobody knows about vue and the project is good to be developed in that framework.

La crisis del diseño o el diseño de la crisis

--Originally published at Identidad digital

Hace poco me topé con “La vida en crisis” de María Zambrano. Me sorprendió la claridad con la que describe situaciones y sensaciones que yo- y seguramente muchos otros- sentimos.

ciertamente vivimos en crisis. Personalmente estoy experimentando un punto de quiebre en mi vida, un ruptura y por ende una crisis. Como soñadora, graduada de arquitectura y aspirante a diseñadora me cuestiono la labor del diseñador de manera constanteMe parece complicado digerir la situación en la que se encuentran los diseñadores y el resto de la ciudadanía a pesar de que el diseño como disciplina lleva ya varios años y en teoría su objetivo es facilitar la vida y quehacer humano.

Me entristece la poca sensatez que poseemos, que la guerra de egos entre diseñadores y otros profesionales sea más notoria que la difusión del diseño, la educación y bienestar de la ciudadanía.

Pocas personas están conscientes de la importancia de del diseño en la vida diaria y en nuestros rituales. 

El diseño es visto como un lujo y no como una necesidad. Nos hemos dedicado a crear productos de autor que se han convertido en objetos poco accesibles para la población general.

El diseño no queda en un plano estético, es parte de la tan discutida crisis humanitaria. Claro que este fenómeno es muy complejo y abarca más de una disciplina. Abandono de planificación territorial, globalización, pérdida de identidad Son algunos conceptos relacionados con dicha crisis pero ¿qué estamos haciendo al respecto?

¿Por qué no unir fuerzas y conocimientos en pro de la población?

¿Por qué a pesar de conocer el potencial de técnicas y materiales autóctonos optamos por la globalización inconsciente, homogenización y reduccionismo?

Creo que el mundo está poblado de muchas mentes brillantes que al darles acceso a información relevante pueden hacer cambios sustanciales. Está en nosotros ser conscientes, sensatos y estar ávidos de conocimiento. Apoyar iniciativas integrales abiertas a la colaboración, nuevas ideas y reciclaje de soluciones. 

Fin de ciclo de calidad y pruebas de software P1

--Originally published at Memogcia blog

El proyecto

En el inicio del trabajo en equipo fue un poco lento por el tema de los NDA’s para poderles otrogar acceso a mis compañeros y que pudieran poder implementar sus metas que marcamos semanalmente.

Inicialmente decidí en buscar tutoriales buenos para que pudieran ir aprendiendo como se comporta el framework y se pudieran familiarizar mas con el código ya que es un framework orientado a MVC. La curva de aprendizaje no fue tan alta ya que varios compañeros ya habían tenido experiencia trabajando en servicios web, en cuanto a otros que nunca habían implementado servicios web, pero eso no fue una causa para que aprendieran lento, al contrario, mostraban mayor interés en el proyecto y al aprender como es que la mayoria de los servicios web funcionan.

En cuanto a las primeras semanas el equipo mostró interés en aprender el framework, mientras fueron aprendiendo iban surgiendo dudas, mismas que les fui respondiendo a lo largo de los días las cuales de la mayoría fueron preguntas en cómo los controlodores y las vistas funcionan en conjunto para poder mostrar la información en el fronend. En cuanto a ejercicios les pedí que fueran instalando lo necesario para que el framework pudiera correr sin problemas en sus computadoras y pudieran trabajar localmente sin necesidad de estar conectado al servidor. Las instalaciones fueron fáciles en los sistemas de Windows, pero por otro lado en los sitemas linux como Ubuntu y Mac tuvieron un poco mas de reto, lo cual me ayudó a recordar los pasos que se necesitaban hacer para que pudiera correr correctamente el framework y evitar los errores que les aparecía, mismos que me habían salido a mi cuando decidí instalar todo el entorno en Ubuntu, por razones que el servidor está basado en este sistema operativo y que hay mucha diferencia cuando se trabaj en windows, ya que los servicios cuando se instalan no hay una manera de que me llegue una notificación a la hora de haya salido una acutalización para ellos, es por eso que decidí en trabajar en Ubuntu y poder asegurar que lo que estoy haciendo funcionará en producción, es el mejor consejo que le podría decir alguien que está empesando a crear su proyecto de programación, que trabaje en el sistema operativo con el cual estará trabajando, así podrá evitar muchos errores. Con las nuevas implementaciones  de serverless de las empresas como Amazon y Google esto ya no será un problema el día de mañana ya que ellas mismas se enargarán de que tu código funcione, no importa que es lo que suceda, ellas te garantizarán que tu sitio siempre estará disponible.

Poco después del primer mes se pudieron tener los NDA’s listos para ahora si el equipo empezara a implementar sus objetivos, poder avanzar y crear sus commits, hacer push en sus ramas y poder juntar sus trabajos. Al igual que al principio hubieron algunos errores, como por ejemplo Israel que ya tenía XAMPP instalado en su computadora desde hace tiempo, le marcó un error de una dependencia que necesitaba instalarse para que la página pudiera funcionar con normalidad.

Para los que estaban trabajando en sistemas operativos con Linux, les tuve que agregar varias configuraciones en apache para que la página pudiera mostrarse correctamente en su computadora, como lo fueron varios plugin del framework para que pudiera trabar en conjunto con la nueva base de datos, tambien la instalación de composer para que las librerías extras funcionaran correctamente. En Windows fue un poco complicado la isntalación de los drivers de las bases de datos, ya que se tuvo que hacer la instalación de varias dependencias y así poder instalar correctamente los drivers de las bases de datos.

Una vez que la página se podía ver correctamente en sus computadoras sin errores, a cada quien le pedí que hiciera un ejercicio con el framework, les dejé que lo hicieran en una semana, la mayoría necesitó ayuda, ya que el ejercicio involucraba mostrar información de la base de datos, además requería que usaran un modelo, dos controladores y 2 vistas. El modelo MVC no es muy simple al principio y se tiene que tomar un poco de tiempo para poder analizarlo y entenderlo. Así se podrá tener una idea mas clara de cómo es que funciona el proyecto y varias páginas en internet.

Una vez concluido el ejericio, empezamos a crear uni-test de el registro y activación de usuarios. Para esta tarea de los test nos tomó tiempo en pensar cómo es que podríamos hacer unitest de la página que está basada en PHP, después de buscar y probar soluciones, encontramos que podemos usar curl en PHP para así poder hacer las llamadas a los endpoint y así poder testearlos.

Concluyendo con el descubrimento de cómo realizaríamos los test, empezamos a modificar los modales que nos había pedido el equipo de diseño, en este objetivo nos tardamos aproximadamente casi dos semanas ya que el sistema de los modales para usarlos como notificaciones tiene una manera especial de usarse para mejorar la experiencia de usario. Una vez terminado los modales, empezamos a cambiar varias cosas de los modales de registro, una de ellas es que en vez de que tengan que hacer click en el checkbox el cliente tenga que escribir la palabra “acepto” para que fuera mas concientes de que están aceptando nuestras políticas. Pero poco tiempo después hicimos pruebas con usuarios reales y opinaron que como estaba con el checkbox era mucho mejor, para no crear una experiencia de usuario.

Una vez terminados los modales empezamos a agregar nuevas cosas al listado de los cuidadores, como es la cantidad de perritos que han cuidado, esta fué una tarea ardua ya que tuvimos que traer nuestros conocimientos de fundamentos de bases de datos y crear una query que nos trajera la cantidad de perritos y después poder unirla a la query con la que ya estaba funcionando la búsqueda de cuiadadores y hacer que funcionara. Esta tarea fue el principio de una mejor experiencia con el framework, ya que mi equipo se estaba familiarizando cada vez más y más con el código, otra de las cosas que emepezamos a mejorar fue el diseño de la lista de los cuidadores para móvil, en este paso aprendieron que la información que se muestra en una laptop a aun celular no necesariamente tiene que ser la misma, ya que la pantalla de un celular a comparación de una laptop es mucho más grande, por lo cual no se puede mostrar el mismo diseño, el diseño tiene que ser interactivo y funcional. Entonces empezamos a optimimzar la parte móvil, la cual si nos llevó un poco mas de tiempo de lo planeado.

El siguiente paso fue mejorar el diseño del perfil del cuidador, la diseñadora nos pidió que por medio de íconos o logos se pudiera dar a entender que es lo que tiene el cuidador, si es que vive en una casa o departamento, si sabe administrar medicamento oral, etc… además de quitar el calendario que teníamos y solamente confundía mas a los usuarios que buscaban reservar en la plataforma. Esto tambíen nos tomó un poco de tiempo, por un problema que tuvimos al querer agregar fechas que el cuidador no iba apoder estar disponible en los inputs de las fechas de inicio a fin, el mayor problema fue traer las fechas parseadas para el plugin de los inputs pudiera reconocerlas correctamente. Además también se implementó un total en el perfil de cuidador el cual se muestra cuando el cliente está en su sesión, este total se va modificando cuando el cliente va cambiando de fechas, este también fué una tarea dura, ya que tenía que obtener las fechas que el cliente seleccionó del plugin y además poder hacer operaciones con ellas. Para el manejo de las fechas nos ayudamos de una librería que nos ayuda a parsear las fechas en cualquier formato que estén. Esta libería nos ayudó mucho a la para poder terminar la tarea y que funcionara correctamente. Un bug que nos apareció al principio es que cuando queríamos obtener los días que hay entre la fecha de inicio y la fecha fina, cuando la fecha final estaba en otro mes, el resultado de los números nos daba negativo y es por eso que decidimos manejar mejor las fechas con una librería que se especializara en el manejo de las mismas…

Proyecto Final

--Originally published at davidalex1996

Introducción:
En en este nuevo siglo XXI se esta tratando de implementar mas inclusion hacia la sociedad en general y el tema de las personas con capacidades diferentes entra en esto mismo, por ello el tema de nuestro proyecto, el cual va dirigido hacia las personas con discapacidad visual. Nuestro proyecto consiste en un dispositivo que ayuda a la detección de objetos cercanos, aproximadamente a partir de 1 metro o menos, de manera que la persona que utilice este dispositivo no necesite de apoyo de algún objeto incomodo o pesado como lo puede ser un bastón, y de esta manera tener la posibilidad de tener las dos manos libres. Este dispositivo en general consta de sensores de ultrasónico, HC-SR04, al cual se le manda una señal de reloj desde un microcontrolador, MK64FN1M0, después de ello se procesa en el micro para designar los rangos deseados y despues de ello se le manda la informacion por bluetooth a cualquier dispositivo, ya sea un modulo reproductor de audio, un buzzer, etc. Y con ello alertando a la persona de moera auditiva de algun obstáculo.
Diagrama de Hardware:
Toda la comunicación en los dispositivos esta a un baudrate de 9600 bps, con alimentación de 5V, para su conexión se implemento voltajes salientes del microcontrolador para alimentar los sensores ultrsónicos, ya que su consumo de corriente es bajo comparado a los bluetooth´s los cuales se tuvieron que conectar a otra fuente aparte. Para el input capture se implementaron 2 canales del FTM uno para el rising edge y otro para el falling edge.
Hardware:
Funcionamiento del HCSR04:
La forma en la que este módulo funciona la siguiente: el microcontrolador crea un pulso de alrededpr de 10 uS, el cual acciona al módulo, que al detectarlo emite ocho pulsos de 40 KHz. Estos pulsos emitidos rebotan contra objectos y vuelven al módulo. Por último, el HCSR04 emite un echo proporcional al tiempo que tardo el pulso en volver al módulo. Este echo se captura en el microcontrolador, donde debera ser procesado para obtener el tiempo.
Input capture:
El FTM en la k64f fue utilizado para convertir el valor capturado del echo a tiempo, para poder crear las condiciones con las que, posteriormente, se decidiría el valor enviado por bluetooth. El FTM, operando como input capture, detecta un primer flanco de subida, y devuelve el valor de la cuenta hasta ese punto. Ya que tambien necesitamos el valor de bajada para poder obtener el tiempo completo del echo, un segundo FTM como input capture fue utilizado. Combinando los dos input capture, obtenemos la diferencia de cuenta y asi, obtenemos el tiempo del echo.
Bluetooth´s (HC05, HC06):
Estos modulos no tuvieron mayor ciencia mas que emparejarlos con comandos at uno como modo maestro y el otro nada mas ponerlo en modo para que el maestro lo empareje.
Software:
/********************************************************************************************************/
//input capture en pag 1037 //diagrama en 979 #include "derivative.h" ///includeperipheraldeclarations/ #include "stdint.h" // #include"UART_headers.h" //Para 10 us en el timer poner en el for 8 y de parametro 2 //PTE26= TRIGGER //entrada del input capture rising edge FTM0_CH0 PTC1 y PTC2 //entrada del input capture rising edge FTM2_CH0 PTB 18 y 19 //UART baud rate 9600 //unsigned char arreglo[5]={'A','T','E','0',13}; //quitar local echo unsigned char arregloRX[100]; //unsigned char arreglo[]= "paco"; unsigned char arreglo[8]={0x7E, 0xFF, 6, 0x0D, 0x00, 0, 0x01, 0xEF}; //unsigned char arreglo[2]={85,70}; unsigned char arreglo2[8]={0x7E, 0xFF, 6, 0x01, 0x00, 0, 0x01, 0xEF}; unsigned char arregloPrueba[]="izquierda"; unsigned char arregloPrueba2[]="derecha"; unsigned char cnt; unsigned int tiempo; unsigned int tiempo2; unsigned int tiempoPerron; unsigned int tiempo3; unsigned int tiempo4; unsigned int tiempoPerron2; unsigned char x=0; unsigned char temp=0; unsigned char temp2=0; void delay_60ms(int delay); void UART_init(void){ //UART3_C1 = 0; //quitar //UART3_C3= 0b01000000; UART3_BDH=0; //BUSCLK=20MHzORBUSCLK=120MHz?? UART3_BDL=133; //UART3_C4|=0b00111; UART3_C2=0x0C; //TE=1,RE=1; //UART3_C2|=0x20;//InterruptReceiver=1,TE=1,RE=1; //UART3_C2|=0x80;//InterruptTransmitter=1,TransmiterEnable=1,ReceiverEnable=1 } void Global_UART_init(void){ SIM_SCGC4= 0b10000000000000; //1<<13; //SystemClockGateofUART3 SIM_SCGC5= 0b100000000000; //1<<11; //SystemClockGateofPORTC SIM_SCGC5|= (1<<10); //1<<11; //SystemClockGateofPORTB SIM_SCGC6= (1<<24); //activar el systemclock del FTM0 SIM_SCGC6|= (1<<26); //activar el systemclock del FTM2 PORTC_PCR16 |=PORT_PCR_MUX(3); //ALT3-->UART3_RX pg 244 PORTC_PCR17 |=PORT_PCR_MUX(3); //ALT3-->UART3_TX PORTC_PCR1 |= PORT_PCR_MUX(4); //SELECCIONAR FTM0_CH0 PORTC_PCR2 |= PORT_PCR_MUX(4); //SELECCIONAR FTM0_CH1 PORTB_PCR18 |= PORT_PCR_MUX(3); //SELECCIONAR FTM2_CH0 PORTB_PCR19 |= PORT_PCR_MUX(3); //SELECCIONAR FTM2_CH1 NVICICPR1=(1<<(37%32))+(1<<(42%32))+(1<<(44%32)); //CLEARPENDINGFLAGS UART Y FTM0 FTM2 NVICISER1=(1<<(37%32))+(1<<(42%32))+(1<<(44%32)); //ACTIVAR INTERRUPCIONES DEL UART Y DEL FTM0 Y FTM2 } void port_Init(void){ SIM_SCGC5 = (1<<13)+1; //Reloj del puerto E //NVIC_ICPR(1) = (1<<26); //Borramos banderas pendientes //NVIC_ISER(1) = (1<<26); //Habilitar interrupcion LPTMR NVICICPR1 = 1<<(58%32); NVICISER1 = 1<<(58%32); // Linea para habilitar el Mux en 001 para seleccionar el GPIO PORTE_PCR26 = (1<<8); //trigger // Linea para configurar los pines como salida GPIOE_PDDR = (1<<26); } void FTM_Init(void){ FTM0_SC=0x0C; //DESactivar la interrupcion del overflow, selecciona system clock y prescalador de 4 FTM2_SC=0x0C; //FTMx_CNT= lleva la cuenta //FTM0_MOD= el valor al que quisieras llegar si no fuera input capture FTM0_C0SC= 0x44 ; //FALLING Y RISING QUITAR TAL VEZ FTM2_C0SC= 0x44 ; //FTM0_C0SC= 0x44; //activar interrupciones msb=0 msa=0 elsb=0 elsa=1 //FTM_CnV contiene el valor capturado por el input capture FTM0_CNTIN=0; //valor inicial del contador revisar de nuevo FTM2_CNTIN=0; //valor inicial del contador revisar de nuevo //FTMx_STATUS copia del bit chnf del registro cnsc //FTM0_MODE= //configuracion extra FTM0_OUTINIT=0x01; FTM2_OUTINIT=0x01; //te quedaste en pag 1008 FTM0_C1SC= 0x48; FTM2_C1SC= 0x48; } void LPTimer_IRQHandler(void) { LPTMR0_CSR|=(1<<7); //borrar pendientes //GPIOE_PTOR = (1<<26); } void FTM0_IRQHandler(void){ //arregloRX[x++]=FTM0_CNT; FTM0_CNT=0; if(FTM0_C0SC==0xc4){ tiempo= FTM0_C0V; //capturar tiempo del input capture //hacer variable tiempo1 para contador y luego tiempo2 y restar //poner cnt= 0 en la segunda entrada //hola jeje } if(FTM0_C1SC==0xc8){ tiempo2=FTM0_C1V; tiempoPerron=tiempo2-tiempo; } (void)FTM0_C0SC; (void)FTM0_C1SC; FTM0_C0SC&=0x7F; //limpiar bandera FTM0_C1SC&=0x7F; //limpiar bandera FTM0_C0V=0; } void FTM2_IRQHandler(void){ //arregloRX[x++]=FTM0_CNT; FTM2_CNT=0; if(FTM2_C0SC==0xc4){ tiempo3= FTM2_C0V; //capturar tiempo del input capture //hacer variable tiempo1 para contador y luego tiempo2 y restar //poner cnt= 0 en la segunda entrada //hola jeje } if(FTM2_C1SC==0xc8){ tiempo4=FTM2_C1V; tiempoPerron2=tiempo4-tiempo3; } (void)FTM2_C0SC; (void)FTM2_C1SC; FTM2_C0SC&=0x7F; //limpiar bandera FTM2_C1SC&=0x7F; //limpiar bandera FTM2_C0V=0; } void write_UART_1(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arreglo[cnt++]; //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x80)){ asm("nop"); } } void write_UART_2(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arreglo2[cnt++]; //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x80)){ asm("nop"); } } void write_UART_prueba(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); //UART3_D=arregloPrueba[cnt++]; UART3_D='p'; //delay_60ms(2); //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x40)){ asm("nop"); } } void write_UART_prueba2(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arregloPrueba2[cnt++]; //delay_60ms(2); //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x40)){ asm("nop"); } } void UART3_LON_IRQHandler(void){ //flag2=1; } void UART3_ERR_IRQHandler(void){ } void null(void){ //UART3_C2|=0x80; UART3_C2|=0x20; } void delay_10(int delay){ unsigned long contador; delay = (long)(delay * 7); for(contador = 0; contador<delay; contador++) asm ("nop"); } void delay_60ms(int delay){ unsigned long contador; delay = (long)(delay * 140000); for(contador = 0; contador<delay; contador++) asm ("nop"); } void delay_2us(int delay){ unsigned long contador; delay = (long)(delay * 1); for(contador = 0; contador<delay; contador++) asm ("nop"); } void UART3_Status_IRQHandler(void){ //do{ //delay_2us(1); //contador++; //}while(BANDERAUART_RX); } void enviar_Pulso(void){ GPIOE_PDDR = (0<<26); //ON delay_10(2); GPIOE_PDDR = (1<<26); //OFF delay_10(2); } int main(void) { //680ms entre pulsos //Global_UART_init(); //UART_init(); Global_UART_init(); UART_init(); port_Init(); FTM_Init(); GPIOE_PCOR = (1<<26); //Empezar con un 0 en el puerto delay_10(2000); enviar_Pulso(); tiempoPerron=0; //UART3_D=0x0D; for(;;){ //UART3_C2|= //UART3_C2&=0x08; while(cnt<=10){ write_UART_prueba(); cnt++; } //UART3_C2&=0xF7; GPIOE_PTOR = (1<<26); //ON delay_10(2); GPIOE_PTOR = (1<<26); //OFF delay_10(2000); //PRIMER COMANDO: Entre 1 metro y medio metro if(tiempoPerron<=5800 && tiempoPerron>=2900){ temp++; } //if(tiempoPerron>=5800 && tiempoPerron<=11000 && temp==5){ //CAMBIAR ESTO A <=5800 if(tiempoPerron<=5800 && tiempoPerron>=2900 && temp>=2){ cnt=0; temp=0; tiempoPerron=0; UART3_C2&=0x08; while(cnt<=10){ write_UART_prueba(); //poner el correcto } UART3_C2&=0xF7; } /* //SEGUNDO COMANDO Menos de medio metro ftm2 if(tiempoPerron<=2900){ temp2++; } //if(tiempoPerron>=5800 && tiempoPerron<=11000 && temp==5){ if(tiempoPerron2<=2900 && temp2>=1){ cnt=0; temp2=0; tiempoPerron=0; while(cnt<=10){ write_UART_prueba2(); } } */ } return 0; }
/*******************************************************************************************************/
Resultados: