jorge-ruiz.porexpertos.es

Jorge Ruiz - Blog

Teams. Error al conectar con el punto de conexión de configuración teams

Llevo varias semanas con un error en el cliente de MAC de Teams.

Por falta de tiempo no había podido resolverlo hasta ahora. Después de hacer varias cosas lo que me ha funcionado es esto que os dejo por aquí por si es de interés:

  1. Cierra la aplicación de Teams.
  2. Abre el archivo hooks.json que encontrarás en: /Users/{tuUsuario}/Library/Application Support/Microsoft/Teams/hooks.json
  3. Agrega al final del fichero esta línea para que puedas hacer autenticación de nuevo:
{"enableProcessIntegrityLevel": falso}

Micrófono: Trust Gaming GXT 252 Emita Plus

El 13 de marzo de 2020 con la llegada del COVID-19 tanto en Solusoft como en la Universidad Carlos III de Madrid empezamos a usar de manera intensiva las videoconferencias.

Para las videoconferencias utilizamos Teams en Solusoft y Collaborate en la Universidad ejecutados sobre un mac.

En ese momento, tenía las siguientes posiblidades para hablar/escuchar

  • micro/altavoz del portátil
  • Auriculares airpods.
  • Auriculares sony de diadema.

Debido a las características de mi trabajo con un uso intensivo de muchas horas de las videoconferencias estos dispositios tenían varios problemas:

  • fundamentalmente la calidad del sonido.
  • incomodidad, por ejemplo, los diadema de Sony acaban haciendo daño.
  • Agotamiento del uso de la batería. Los AirPods no aguantan sesiones largas sin que los cargues en la caja.

Decidí comprar un micrófon aparte para que la calidad del sonido fuera mejor, el entorno de trabajo más cómodo y se alargase el uso de las baterías de los airpod que son muy confortables.

La primera compra fue un Tempest Gradius PRO Micrófono RGB. Que por unos 45 euros prometía ser una buena opción para empezar.

La realidad fué que no funcionaba bien con mi MAC (al menos), incluso haciendo un cambio por otro nuevo. Es un micrófono de condensador que mete ruido en la línea y hace que se escuche un zumbido muy molesto al otro lado de la videoconferencia (o en la grabación).

No conseguí determinar qué es lo que fallaba así que decidí hacer la devolución y adquirir algo de mayor calidad, en previsión de que no volviese a fallar en MAC.

Y así es como llegué al modelo que tengo ahora, Trust Gaming GXT 252 Emita Plus, en su momento lo conseguí por 85 euros, con un kit completo de soporte de mesa, brazo extensible, brazo antipop y espuma de micro. Es de tipo cardiode.

Llevo usándolo desde junio con un resultado excelente.

Os dejo la referencia en Amazon:

[1] Trust Gaming GXT 2525

Código Limpio. Switch

Os detallo a continuación, un ejemplo de código limpio extraído de la lectura del libro: Código Limpio. Manual de estilo para el desarrollo ágil de software. Robert C. Martin.

El tema va sobre las instrucciones switch. Es muy difícil mantenerlas con un código reducido y con el objetivo de que una función haga una sola cosa. Por la naturaleza, de la instrucción switch vamos a tener funciones que hagan N cosas. Malo, esto no hace mantenible el software pero claro, tampoco podemos dejar de utilizar instrucciones switch.

Lo que sí que podemos hacer es asegurarnos de incluir estas sentencias switch en una clase nivel inferior y NO repetirlas. Para ello, EVIDENTEMENTE, tenemos que recurrir al POLIMORFISMO (me encanta, es probable que a alguno de vosotros en la entrevista os haya pedido que me definieráis el polimorfismo).

Vamos a fijarnos en este listado de código fuente (Payroll.java)

public Money calculatePay(Employee e) throws InvalidEmployeeType{
    switch (e.type){
        case COMMISSIONED:
             return calculateCommisionedPay(e);
        case HOURLY: 
             return calculateHourlyPay(e);
        case SALARIED: 
             return calculateSalariedPay(e);           
        default: 
             throw new InvalidEmployeeType(e.type);
    }
}

Esto, por un lado taaaaaaaaaaan habitual, tiene varios problemas:

  1. Es una función de gran tamaño y cuando se añadan más tipos de empleados todavía crecerá más.
  2. Hace más de una cosa, incumpliendo el Principio de Responsabilidad Única (Single Responsibility Principle – SRP-) ya que hay más de un motivo para cambiarla, por ejemplo cuando se añadan nuevos tipos de empleados.

Nota: No veais lo que me gusta la Orientación a Objetos. Sus conceptos que ya tienen sus años se utilizan ahora en temas de diseño de microservicios, por ejemplo.

  1. Incumple el Principio de abierto/cerrado (Open Closed Principle o OCP) igualmente porque debe cambiar cuando se añadan nuevos tipos de empleados.

  2. Pero el problema mayor, es que vamos a tener un número iliminatado de funciones que también van a tener el mismo problema.

Imagínate la implamentación de algo como:

ìsPayday(Employee e, Date date)

o

deliveryPay(Employee e, Money pay)

La estamos liando parda y no nos estamos dando ni cuenta.

La solución al problema consiste en OCULTAR LA INSTRUCCIÓN swicth en una FACTORIA ABSTRACTA e impedir que nadie la vea

Para los que no entendáis esto, digamos que lo que vamos a hacer es enterrar en lo más profundo del código ese switch (porqué tiene que estar) pero va a estar controlado por una FACTORIA que es un patrón de diseño que va a permitir crear, en este caso, los empleados con un DESACOPLAMIENTO del software (me parece brutal).

Fíjate la solución es sublime:


public abstract class Employee {
    public abstract boolean isPayDay();
    public abstract Money calculatePay();
    public abstract void deliverPay(Money pay);
}

public class CommissionedEmployee extends Employee { ... }
public class HourlyEmployee extends Employee { ... }
public class SalariedEmployee extends Employee { ... }

public interface EmployeeFactory{
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}

public class EmployeeFactoryImpl implements EmployeeFactory{
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
          switch (r.type) {   
             case COMMISSIONED:
                 return new CommissionedEmployee(r);
             case HOURLY: 
                 return new HourlyEmployee(r);
             case SALARIED: 
                 return new SalariedEmployee(r);           
             default: 
             throw new InvalidEmployeeType(e.type);

          }
    }
}

¡Madre mía! preparado para jerarquía de clase Employee y los diferentes empleados que extienden de ella. Ahí sí que nos tocará implementar cada vez que haya un nuevo empleado.
Y el switch encerrado en una factoría (interfaz con método makeEmployee más su implementación en EmployeeFactoryImpl. Si amplías a nuevos empleados extiendes de la clase Employee, implementas sus métodos abstractos y tocas la factoría que hace NEW del objeto devolviendolo sobre una referencia a clase base (Employee).

Nota: Que no te asuste la clase EmployeeRecord que es simplemente para identificar el tipo de empleado.

Teclado Mecánico. HIDITEC GK500

Voy a iniciar una serie de post en los que os voy a comentar que elementos configuran mi escritorio en estos días de trabajo remoto.

Empezamos por el teclado.

Tanto en mi etapa de estudiante como en mi etapa profesional la realidad es que he utilizado el teclado que me han puesto por delante. No era algo en lo que prestase mucha atención. Si el ordenador era de torre pues el teclado que viniese, si el ordenador era el del portátil pues el incorporado.

Pero hace un año más o menos las cosas empezaron a cambiar. El teclado del portátil que uso me empezó a parecer incómodo y busqué uno externo que acoplar. Nada del otro mundo, uno de tipo membrana.

Bueno, ya sabemos, estos teclados de tipo membrana son muy funcionales pero la realidad que la experiencia de uso con tantas horas que le meto al ordena era mediocre.

Así que decidí dar el salto, cambiaría a los teclados mecánicos. La realidad que no tenía ni idea, sabía que quería probarlos, no tenía mucho presupuesto así que me decidí a comprar un KROM KERNEL TKL.

Suficiente para comenzar. No lleva teclado numérico pero me permitiría probar la experiencia de trabajar en un teclado mecánico.

Me gustó. La sensación de pulsación de tecla es más satisfactoria que membrana. Investigando sobre el tipo de pulsación digamos que es lineal. Debes pulsar la tecla un determinado tiempo hasta recorrer unos 4 mm y se activa la tecla pulsada. Ojo porque aquí está una de las claves de estos teclados mecánicos.

El interruptor de pulsación (Switch) que lleva es rojo, justo el que proporciona esta experiencia de uso lineal aunque es un interruptor, digamos, genérico, no de marca.

Hace su ruido como todos los mecánicos y me iba bastante bien hasta este verano que empezó a fallar. Los 45 € y los componentes que lleva supongo que no dieron mucho de sí en algunas de las teclas. Tuve que pasar al teclado de membrana.

Aprovechando que este teclado mecánico estaba fallando, aproveché para aprender un poco sobre la verdadera experiencia de uso que yo quería. Y no era otra que la del tecleo en aquellos teclados mecánicos de los ordenadores IBM de los años 90 cuando yo estudiaba (existían mucho antes).

Entonces aprendí que el interruptor que realmente hay que tener en el teclado es un Blue y fijándome en las marcas, era interesante que fuera Cherry MX Blue. Cherry es uno de los primeros fabricantes de teclados mecánicos y abandera la tecnología de ellos (aunque hay muchos más con sus propias tecnologías que también van muy bien, Razor, Logitech, …)

Para los que os estéis preguntando que sensación de pulsación es, es como cuando pulsas el botón de un bolígrafo para sacar la punta. Haces todo el recorrido de pulsación y notas ese clic famoso.

Si te pones a buscar teclados mecánicos Cherry MX Blue (no genéricos) los precios se disparan un poco pero encontré la empresa española HIDITEC con su modelo GK500 que tiene uno a unos 75 €.

Lo compré y estoy encantado con él (de momento 🙂 )

Os dejo enlace a vídeo para que escuchéis el Cherry MX Blue:

 

 

Codemotion 2015 – EMT Madrid – Solusoft y Apple Watch

Un año, ha pasado justo un año desde que escribí el último post en este blog. En mi último post os contaba mi experiencia en la edición del Codemotion 2014 y vuelvo a la carga con el anuncio de que estaremos en Codemotion 2015.

Ha sido un año especialmente duro, el más duro de mi carrera profesional y a la vez el que más reto y más bonito ha sido para mí. El motivo de no escribir en este blog durante todo este tiempo no ha sido porque no haya tenido ocasión sino porque hay situaciones en la vida que no te lo permiten,

Volvemos, solusoft vuelve a Codemotion 2015, por tercer año consecutivo, a esta maravillosa fiesta de la tecnología en España. Lugar donde nos reunimos los mayores frikis del mundo, aquellos que tenemos la magia suficiente en nuestras cabezas y manos para crear esos increíbles programas que hacen que estemos pegados al móvil continuamente, que optimicen la productividad de las empresas, somos capaces de divertir a las personas con nuestros videojuegos y podemos, incluso ayudar a personas con enfermedades (Alzheimer) con el buen uso de nuestra tecnología.

Por tercer año consecutivo, solusoft acude con un mensaje de sueño el de las aplicaciones dependientes de contexto. Hace dos años os mostrábamos las capacidades de estas aplicaciones y el año pasado os enseñábamos un caso práctico de juego dependiente de contexto aplicado al turismo. Este año os contamos la aplicación Apple Watch de la Empresa Municipal de Transportes de Madrid (EMT Madrid).

La EMT Madrid, en su objetivo de ofrecer valor a los ciudadanos para favorecer el uso del transporte público en la ciudad de Madrid mediante la aplicación de tecnología, dispone desde Junio de 2015 de una aplicación para Apple Watch desarrollada por solusoft que pretende ser una evolución en las aplicaciones dependientes de contexto.

Las problemáticas de los usuarios de autobús son diferentes pero queríamos ocuparnos de una en concreto. Los usuarios del transporte público que lo utilizan de manera habitual (tienen sus rutas frecuentes). Queremos ser una herramienta para optimizar el tiempo del viajero.

El ejemplo, puede ser el siguiente, imaginemos: centro de Madrid, lunes 6 am, suena el despertador, tenemos que ir a trabajar pero nos quedamos diez minutos más en la cama, tenemos un arranque lento, nos despertamos, vamos a la ducha, agua calentita, un ratito más, ahora nuestro afeitado de lujo, apurado despacito, desayuno con café y tostadas (todo en casa que lujazo) ¡espabila bienvenido al mundo real!, ¡es un lunes de mie…! En este momento nuestro Apple Watch, que sabe nuestra rutinas, se da cuenta de todo y de lo que está pasando ahí fuera. En un instante calcula y te dice: ¡DATE UN POCO MÁS DE PRISA (notificación)! ¡Qué está lloviendo fuera! (servicio externo), tienes los próximos autobuses, el primero a 10 minutos y el segundo a 15 minutos (servicio Open Data EMT Madrid).

Con este ejemplo se puede ver como el reloj inteligente me está dando información valiosísima para que pueda yo gestionar mi tiempo.

En la charla este próximo Sábado 28 de Noviembre de 2015 estaré acompañado de Roberto Esteban (@roberes19) mobile developer en solusoft. Él será el que os detalle técnicamente como ha sido desarrollada la aplicación y quién tendrá un peso relevante en la charla porque este evento es, en definitiva, para desarrolladores.

No quisiera terminar este post sin dar las gracias a la Empresa Municipal de Transportes de Madrid por concedernos la oportunidad de presentar la charla al Codemotion y dejarnos hablar de la aplicación en modo open sin ocultar nada.

Y, por último, agradecer a Codemotion la oportunidad que nos ha concedido de estar en una edición más de esta gran fiesta técnica.

Terminó Codemotion 2014

Terminó una edición más del Codemotion. Termina con unas excelentes sensaciones para mí.

De forma directa he trabajado para tener dos charlas y un workshop durante estas dos jornadas en las que cerca de dos mil desarrolladores han tenido la posibilidad de aumentar e intercambiar sus conocimientos.

Las charlas en las que he colaborado son:

  1. Juegos dependientes de Contexto. Un ejemplo práctico. En representación de solusoft e impartida por mí, hemos expuesto un caso práctico, desde el punto de vista del negocio, de como se puede fomentar el turismo en una región. La charla se acompañaba de unas píldoras de código muy sencillo de utilizar, basándose en el uso de diferentes APIs: topoos, ArcGis Online (ESRI), Open Data de EMT, Molino de Ideas y otros.
  2. Accesibilidad Móvil: Impartida por Javier Muñoz, alumno mío al que le dirijo el Proyecto Fin de Carrera, y que tiene mucha experiencia en el desarrollo de aplicaciones accesibles. Su objetivo era sensibilizar al desarrollador para que piense más en su trabajo diario en las miles de personas con discapacidad que utilizan las aplicaciones móviles.

Además, he participado en la organización del WorkShop sobre Unity que se ha encargado de crear e impartir Miguel Ángel Taramón (Cofundador del estudio español CupraStudios). El workshop llamado Unity: Creación de Juegos Móviles Multiplataforma en Unity se impartió como profesores en representación del Máster de Diseño y Desarrollo de Videojuegos PlayStation First de la Universidad Politécnica de Madrid (GamesUPM).

Y, por si fuera poco, Quique Fernández Guerra, al que le llevo el Proyecto Fin de Carrera, también tenía una ponencia llamada, HTML5 en el universo Windows.

Sin valorar como han sido las charlas/workshop (eso os toca a vosotros) yo estoy tremendamente satisfecho del trabajo y con ganas por mejorarlo de cara al año que viene (esa será otra historia).

Desde estas líneas quería daros las gracias: Javier Muñoz y Miguel Ángel Taramón, por el excelente trabajo realizado.

GamesUPM estará en Codemotion 2014

El próximo 22 de Noviembre de 2014, el Máster de Diseño y Desarrollo de Videojuegos PlayStation First de la Universidad Politécnica de Madrid estará en Codemotion 2014, impartiendo un WorkShop sobre desarrollo de juegos multiplataforma en Unity.

Durante los próximos 21 y 22 de noviembre de 2014 se celebra en Madrid una nueva edición de Codemotion, un gran evento que une a todas las comunidades de desarrolladores para ofrecer mediante charlas y workshop lo mejor de la industria en estos momentos.

Nosotros estaremos allí, concretamente, el sábado 22 de noviembre de 2014 a las 12:0 horas impartiendo el Workshop: Creación de Juegos Móviles Multiplataforma en Unity.

En este taller de aproximadamente 2 horas trataremos la creación de juegos en plataforma móvil (iOS, Android y otros) mediante el ecosistema de herramientas y motor gráfico de Unity en una sesión práctica de creación de un mini juego.

Mi compañero del Máster Miguel Ángel Taramón  y yo seremos los encargados de dirigir este taller en el que de aprenderás los fundamentos básicos de la creación de juegos en Unity.

Si quieres asistir, prepara tu portátil, ven con la última versión instalada de Unity y déjate guiar por nuestros profesionales.

Esta edición de Codemotion se celebra en la Universidad San Pablo CEU, Campus de Montepríncipe (Boadilla del Monte, Madrid)

¡Te esperamos!

solusoft estará en Codemotion 2014 mostrando un Juego Dependiente de Contexto

Durante los próximos 21 y 22 de noviembre de 2014 se celebra en Madrid una nueva edición de Codemotion, un gran evento que une a todas las comunidades de desarrolladores para ofrecer mediante charlas y workshops lo mejor de la industria en estos momentos.

El próximo viernes 21 de noviembre de 2014 a las 13:45 horas, solusoft, con la representación de Jorge Ruiz, expondrá un ejemplo práctico de un juego dependiente de contexto.

El seminario tendrá una componente técnica en la que se explicarán tecnologías como topoos, ESRI, open data EMT o API Cultur pero sin olvidar quede debemos ofrecer una solución interesante desde el punto de vista del negocio.

En esta ocasión mostraremos un ejemplo que permite dinamizar el turismo de una región.

Esta edición de Codemotion se celebra en la Universidad San Pablo CEU, Campus de Montepríncipe (Boadilla del Monte, Madrid).

« Entradas anteriores