Pregunta de entrevista técnica #1 ¿En java para qué sirven los métodos equals() y hashCode() en un objeto?

Aquí comienzo una serie de pequeños artículos para aprender a responder a preguntas típicas de una entrevista técnica, por un lado aprenderás a desenvolverte mejor y a la vez obtendrás conceptos interesantes que te pueden ser útiles en tu día a día, empezamos por un clásico de los clásicos, los dos métodos que puedes encontrar por defecto en toda clase que extienda de Object en Java, o sea, todas.

equals()

El método equals() de la clase Object se utiliza para comprobar si el objeto actual es igual o no al objeto que se pasa. Por defecto, comprueba la dirección de memoria del objeto de las instancias. Si ambos objetos tienen la misma dirección de memoria, entonces son iguales.

hashCode()

El hashCode(), de la clase Object, se utiliza para identificar un objeto de forma única. De forma predeterminada, devuelve la dirección de memoria del objeto en un formato de número entero.

La ventaja de utilizar juntos equals() y hashCode()

Para las clases IntegerFloatString, etc, no tienes que preocuparte por ellas. Pero para tus propias clases, es posible que desee sobrescribir estos métodos, siempre para casos especiales y no todo siempre. 

Por ejemplo, si deseas usarlo como una clave en un Map o si no quieres tener objetos duplicados y esa duplicación está basada en algunos campos de identificación de la clase.

Al sobrescribirlo, nos aseguramos que equals() se base en hashCode() y hashCode() se base en un valor único. Entonces, si obj1.equals(obj2) es true, entonces obj1.hashCode() == obj2.hashCode() deberá ser true. Si no, pueden comportarse de formas muy extrañas.

Ejemplo:

Supongamos que tengo una identificación int (int id) en mi clase que debe ser única para cada objeto y no me importa si hay otros campos duplicados excepto este. Y quiero hacer de este objeto una clave para un Map. Entonces sobrescribimos los métodos hashCode() y equals() de esta manera:

private int id;
@Override
public int hashCode(){
    return this.id;
}
@Override
public int equals(Object obj){
    if(obj == null) 
    	return false;
    if(! obj instanceOf ThisClassName) 
    	return false;
    return this.id == obj.id;
}

Github Pages y Jekyll

Buscando probar cosas nuevas, he decidido probar la solución que da Github para alojar blogs utilizando el software de creación de blogs estáticos Jekyll. Para crear el blog, he seguido este tutorial de Devexperto, pero con la diferencia de en vez de hacer un fork de jekyll-now lo he hecho directamente de una versión modificada con un tema que me gustó bastante y que pude encontrar gracias a Jekyll Themes.

Finalmente para gestionar el dominio personal, utilicé este tutorial de Aunitz Giménez y finalmente utilicé un plugin para exportar de wordpress a Jekyll.

Para quien quiera escribir post, una solución para poder escribir los posts es stackedit para que sea todo mucho más sencillo y amable.

Silicon Valley

Leer Silicon Valley es transportarnos mentalmente a empresas punteras del ámbito  de la tecnología y a un lugar laboral idealizado por muchas personas del sector TIC. Todos los que hemos visto la película “Piratas de Silicon Valley” nos hemos imaginado  fundando una pequeña empresa de tecnología para, años después, descubrirnos siendo los  dueños de una prestigiosa organización en donde todo el mundo desea trabajar. 

Pero, como todo, Silicon Valley tiene un comienzo humilde que para nada parecía  presagiar lo que iba a significar varias décadas después. 

En la fundación de Silicon Valley se unen varias pequeñas biografías: por un lado,  tenemos la mudanza en 1938 de un joven emprendedor de la electrónica (David Packard), quien, después de casarse con su mujer (Lucile Salter), compró junto a ella una casa en  Palo Alto (ciudad del condado de Santa Clara que se encuentra en el extremo norte de Silicon Valley). Por otro lado, esta casa, además de todas las comodidades que un  americano podía esperar a finales de los años 30, tenía un cobertizo, el cual no tardó en  ser ocupado por otro joven, Bill Hewlett. 

Al año siguiente de la mudanza, mientras David estudiaba en Stanford, él y Bill fundaron  una pequeña empresa (Hewlett-Packard) utilizando sus apellidos. En ella comenzaron a  diseñar pequeños ingenios eléctricos. Cuando esta empresa empezó a crecer y ya era turno  de tener unas oficinas mayores que el pequeño cobertizo de la casa de David, se juntó  otra casualidad: en 1953, en su antigua universidad, empezaron a aprovechar un espacio  no edificado de esta para montar algo parecido a una incubadora de empresas, de tal forma  que estas aprovecharan el estar cerca unas de otras para innovar juntas. Esta idea le vino  como anillo al dedo a Hewlett-Packard para no marcharse de Palo Alto y quedarse en  estos nuevos terrenos. 

Mientras todo esto sucedía, el futuro premio Nobel William Bradford Shockley había  construido el transistor de unión. Este usaba una unión entre dos partes, tratadas de modo  diferente, de un cristal de silicio, abriendo paso a la miniaturización de los circuitos  electrónicos presentes en radios, televisiones y ordenadores, siendo el impulso definitivo  al desarrollo de la electrónica y la informática. Para esta fabricación fundó una división  de la empresa Beckman Instrument (con financiación propia de la compañía) y se trasladó a Palo Alto para cuidar de su anciana madre, así que, al igual que Hewlett-Packard,  encontró en estos terrenos de la Universidad de Stanford el lugar ideal para esta nueva  empresa y con esto llevar el silicio al valle, conocido desde entonces como Silicon Valley. 

Todo esto fue el comienzo de lo que conocemos hoy en día; de aquí surgieron empresas como Intel o IBM que, si bien fueron las protagonistas de las siguientes décadas,  resultaron reemplazadas (aunque no retiradas) por otras nacidas al calor de lo que se  conoció como “Las puntocom”. Yahoo!Google o Facebook fueron las primeras en traer  la cultura que ahora conocemos; sus fundadores, todos ellos estudiantes de Informática  en Stanford, entendían la cultura empresarial como un gran campus universitario y  llevaron estas ideas a sus recién creadas empresas (Serguéi Brin y Larry Page se conocieron primero en la universidad antes de fundar Google; Mark Zuckerberg no había terminado  de graduarse cuando ya era millonario con Facebook). 

Esta cultura es lo primero que ha atraído al talento de todo el mundo a trabajar en estas  empresas. En su interior parece existir un mundo de innovación en donde uno estará  rodeado de genios en su materia y donde su crecimiento laboral y personal será  exponencial.

¿Pero esto lo has probado?

Ayer saltaba la noticia, un fallo en la web de la Sanidad de Madrid deja al descubierto los datos del rey, Pedro Sánchez o Aznar.

La Comunidad de Madrid estrenó el 1 de julio una página web para poderte descargar el certificado digital de Covid, hábil para viajar por la UE. Con solo proporcionar tu DNI se podía conseguir un JSON en claro mostrando información sensible. No es complicado conocer el DNI de la familia real española y datos sensibles como el número de teléfono han empezado a circular.

JSON que se obtenía al introducir en la URL el DNI.

Por ejemplo en la comunidad donde resido, Cantabria, para obtener este certificado es necesario introducir tu DNI, fecha de nacimiento y el número de teléfono móvil con el que estás registrado en el sistema de sanidad cántabra, una vez completado te llega un SMS con un código que debes introducir y en ese momento descargas el certificado.

La explicación del equipo de desarrollo, «la incidencia ha venido ocasionada por la subida de una actualización que pasó los protocolos de pruebas y que en el proceso de puesta en marcha generó una brecha». Mi teoría es que en los entornos de desarrollo tenían quitadas las medidas de seguridad para hacer pruebas más rápidas y eso ha acabado en producción, un error imperdonable que nunca debería ocurrir.

Si este desarrollo es un desarrollo normal, para llegar a producción, este código debería haber pasado por varios filtros de pruebas y entornos, por lo que me hace cuestionarme la metodología con la que se ha afrontado este desarrollo, porque aunque haya prisa por llegar a una fecha, con mecanismos sencillos de testing y una batería de pruebas en un entorno de preproducción nunca se debería haber llegado tan lejos, ¿nadie se dio cuenta de un bug tan grave?

Estamos ante lo mismo, los tests y pruebas para el final en vez de convertirlo en el día a día como parte del desarrollo y las estimaciones (¿alguien sigue estimando una tarea sin pensar en el tiempo que le va a llevar las pruebas?), al final eres tú como desarrollador quien se juega el cuello si algo falla, así que si tu jefe de proyecto, mánager, cliente y demás perfiles por encima de ti tuercen el gesto cuando te pasas una jornada haciendo tests, debes ser inflexible con esto o puede pasar como ayer, que por una mala praxis todo el mundo conoció el teléfono móvil del rey.

Así resucité mi Nexus 7

Tengo muy claro cual es el producto tecnológico más rentable de los que he tenido, mi vieja tablet Nexus 7 del 2013.

Esta joya diseñada por Google, que lanzó en el lejano verano del 2013, es una de las pantallas que más miro a lo largo del día, la utilizo para todo, ver vídeos, series, libros, noticias…

El problema que tuve con ella fue a nivel de software, hace ya muchos años que recibió su última actualización (Android 6.0) y eso empezó a convertirla en un producto totalmente caducado, intenté resucitarla con varias ROMs customizadas, pero seguía siendo extremadamente lenta, normal, tiene 8 años, pero a finales del 2020 saltaba la sorpresa, LineageOS le daba soporte para Android 10 en su versión 17.1 y volví a intentarlo, pero con una variación, no instalar las aplicaciones de Google y dejarla limpia de sus productos y sorpresa, la tablet empezó a volar.

¿Hecho de menos los productos de Google? No del todo, me costó acostumbrarme a no tener Google Play, pero por suerte Aurora Store cumple con su cometido, quizá no va tan fino como Google Play, pero he encontrado todo el software que necesito y puedo mantenerlo actualizado.

Para Youtube, estoy utilizando Youtube Vaned y va muy fino, sin problema puedo utilizar mi cuenta de Gmail e incluso va mejor que el Youtube original, ya que puedo escuchar los vídeos con la pantalla apagada y no veo publicidad, una maravilla.

Netflix ha sido quien me lo puso más complicado, ya que utiliza el sistema de SafetyNet de Google para saber si es un sistema seguro y en cuanto descubre que está en una ROM no se reproduce, por suerte tenemos a Magisk para subsanar esto y Netflix ya me funciona.

Por lo demás, el resto de aplicaciones se han instalado a través de Aurora Store sin problema (Feedly, Twitter, Kindle, Telegram….) y por ahora solo se me han resistido dos aplicaciones que requieren los servicios de Google y suelo utilizar, la aplicación de RTVE a la cartaGoogle Drive (en su lugar uso Dropbox en este caso) y Google Play Book (Lithium me cumple, pero hecho de menos el tener todos mis libros sincronizados).

En definitiva, la maravillosa comunidad de ROMs ha conseguido que ocho años después, mi tablet huela a nueva y con la última actualización de LineageOS incluso pueda probar Android 11 (todo un logro si pensamos que nació con Android 4.3). Si tienes un cajón olvidado esta tablet y quieres rejuvenecerla, puedes pasarte por su página oficial de LineageOS.

¡Hola, mundo!

Esta es la entrada que te crea por defecto WordPress, habitualmente la eliminaba y listo, pero esta vez la quiero aprovechar para homenajear al científico de la computación Brian Kernighan y coautor de, la biblia de los desarrolladores, El lenguaje de programación C junto a Dennis Ritchie.


#include 

int main() { 

 printf("Hello, World!"); 

}

Aunque hay polémica sobre quien es el creador del famoso Hola, Mundo. Muchos señalan a Brian Kernighan como inventor del famoso término tal como se puede ver en el libro editado en 1978.

Fragmento del libro «El lenguaje de programación» donde nos presentan «hello, world»

Aunque puede ser correcta como su primera aparición en un libro sea esta, hay pruebas de que el nacimiento del termino es anterior ya que aparece en un memorándum interno que escribió Kernighan para Bell Laboratories denominado ‘Programming in C: A Tutorial‘, con un código muy similar:

main( ) {

printf("hello, world\n"); }

Todavía hay más pruebas en donde podríamos irnos más atrás en el tiempo, pero en definitiva, ¡hola, mundo! Seáis bienvenidos.