Comprobar desgaste de un SSD en MacOS

Hace casi exactamente un año pude cambiar el SSD original del MacBook Pro por un SSD NVMe con una sustancial ganancia tanto en capacidad de almacenamiento (desde 256Gb a 2Tb) y de rendimiento.
Escogí el SSD de Silicon Power porque utilizaba tecnología TLC, en teoría más duradera que la QLC aunque no lleguen al nivel de MLC, la tecnología del componente original del equipo.
Con un año de uso intensivo a sus espaldas (edición de vídeo, de audio, programación, máquinas virtuales, fotografía, etc. etc.) quise comprobar cómo iba de salud.

Una forma bastante fiable de hacerlo es a través de la medida TBW (TeraBytes Written) proporcionada por el sistema SMART. Para verificarlo, necesitamos instalar una herramienta que nos permita recuperar esa información.
A falta de una mejor alternativa, voy a instalar Homebrew, un gestor de paquetes muy al estilo Linux que nos permitirá instalar paquetes de software y nuevas aplicaciones desde el terminal, incluso muchas que no están disponibles de otra forma o que no tendremos que preocuparnos de instalar manualmente. Para instalar Homebrew, basta con introducir:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
A continuación instalamos el software Smartmontools:
$ brew install smartmontools
Y para terminar, lanzamos el programa con:
$ smartctl --all /dev/disk0

Con esto podremos ver toda la información de salud del dispositivo y nos fijaremos en particular en “Data Units Written”:

En mi caso he comprobado con gran satisfacción que todavía dispongo de muchísimo margen hasta alcanzar los 500TBW que teóricamente el fabricante marca como frontera antes de que aparezcan fallos por desgaste de las celdas de memoria, por lo que podría esperar que el ordenador se quedase obsoleto antes de que esto suceda.

Apollo 13

<< Houston, hemos tenido un problema >>
Astronauta Jim Lowell, Comandante de la misión Apollo 13

Muchos recordaréis la película que se hizo sobre la misión Apollo 13, protagonizada por Tom Hanks, Bill Paxton, Kevin Bacon, Ed Harris y algunos otros. Es una película histórica (en el sentido de que dramatiza un hecho histórico real) que relata el accidente y los problemas que derivaron del mismo durante el viaje a la Luna.
Tras superarlos, el último escollo era la reentrada en la atmósfera terrestre y conseguir que el módulo de mando amerizase en el Océano Pacífico.
Amerizar es un término muy generoso para lo que en realidad sucede: la cápsula entra a velocidades supersónicas en la atmósfera, incandescente por el rozamiento con el aire y en medio de una bola de plasma que imposibilita la comunicación por radio. A determinada altura, se despliegan unos paracaídas y la cápsula llega al agua a una velocidad razonable para que el choque no sea fatídico. Se trata de un impacto amortiguado, pero un impacto en toda regla.
Aquel día no iba a estar exento de más dificultades: una alerta por tormenta estaba activa en el lugar.
Así que entre el mal tiempo y el golpe, podríamos decir que… “Tifón y Pumba”.

MacBook 2007 (A1181): Cambiar pasta térmica y teclado

Estoy muy contento con el MacBook que compré y la verdad es que, tras actualizarlo, todavía es un equipo que puede sacarte de más de un apuro.
Sin embargo me quedaban dos tareas pendientes para dejar este equipo perfecto: una limpieza interna a fondo y sustituir toda la parte superior de la carcasa por otra nueva.

Una pista de que el portátil necesitaba la limpieza eran las temperaturas que podía ver en MacOS mediante iStat Menus, o en Windows con CoreTemp. Sin haber hecho apenas nada, solo arrancando el equipo, el procesador estaba a unos bastante preocupantes 75ºC y solo bajaba hasta 57º después de unos cuantos minutos sin hacer nada.

El ventilador estaba corriendo de forma bastante ruidosa la mayor parte del tiempo y sospechaba que jamás se le había cambiado la pasta térmica al procesador o a la tarjeta gráfica. Desmontar el equipo es un poco más laborioso que en el MacBook Pro, ya que es un equipo anterior a los Unibody, pero se puede hacer con un sencillo destornillador de estrella. Me apoyé también mucho algunos videos de youtube, como éste, hasta tener el equipo finalmente desmontado ante mí.

Para la limpieza empleé un pequeño pincel y quité todo el polvo que cubría los componentes. A continuación, usé un paño de microfibra empapado en alcohol para retirar todos los restos de la antigua pasta térmica del procesador y la tarjeta gráfica hasta dejarlos relucientes:

Ésta es una parte muy importante porque aquí debe producirse la primera transferencia de calor: por contacto entre el procesador y el disipador. Éste lo conducirá hasta el radiador, se radiará al aire que hay a su alrededor y es el único ventilador del equipo el que debe encargarse de expulsar ese aire caliente hacia el exterior.
Una vez quité la pasta original ya reseca y solidificada, apliqué una pasta térmica nueva. Me han recomendado la Thermal Grizzly Kryonaut, que también empleé en el MacBook Pro cuando lo abrí para cambiar el SSD.
También hice una limpieza profunda en las aspas del ventilador y las láminas del radiador antes de volver a colocarlos.

Éste portátil fue comprado en EE.UU. en su momento, por lo que venía con un teclado tipo ANSI. Esto se puede reconocer fácilmente por la forma de la tecla Intro, o por el hecho de que no hay ninguna tecla entre la letra Z y May. Izq.

Los teclados ANSI suelen ser bastante valorados entre los programadores porque tienen un acceso cómodo a símbolos muy comunes en todos los lenguajes sin necesidad de utilizar combinaciones de teclas. A mi en particular no me preocupaba en absoluto la ausencia de la letra Ñ o la disposición de los signos de puntuación, acentos, llaves, etc… pero es cierto que en el día a día cometo más equivocaciones porque estoy acostumbrado a los teclados ISO españoles, los más comunes.
Según iFixit, se puede sustituir toda esta parte de la carcasa y conectar un teclado de diferente tipo sin ningún problema. Además, ya que el ordenador acusaba desconchados en el borde del plástico (algo muy común en esta generación de Macs), preferí lanzarme a la búsqueda de un repuesto con teclado español. Sinceramente, la búsqueda es complicada. No hay repuestos originales, obviamente, y por eBay se pueden encontrar algunos, pero o bien se encuentran en muy mal estado, o corresponden a otro idioma.
Sin embargo pude encontrar una cubierta con teclado español en un estado razonablemente bueno, así que simplemente enchufé ese y volví a cerrar el equipo, que ahora tiene incluso un mejor aspecto.

Había bastante polvo y suciedad acumulados tras 14 años en el interior del equipo y la pasta térmica se había degradado tanto, que esperaba ver una sustancial diferencia en el funcionamiento del equipo. Así sucedió:

De un plumazo, el equipo arrancó y la temperatura se estabilizó en unos frescos 36ºC. Haciendo algunas tareas durante un rato, subió a los 45-50º:

Esto significa que el ordenador estaba funcionando con una diferencia de 20ºC tras arrancar y unos 10-15ºC menos durante una carga de trabajo moderada. Realmente impresionante.

Lo mejor es que automáticamente el MacBook se volvió una máquina mucho más silenciosa ya que ahora no suele superar los 60ºC. Si lo hace, el ventilador empieza a girar a pocas revoluciones y su velocidad de giro aumenta si la temperatura lo sigue haciendo. Al estar en general por debajo de ese umbral, trabajar en él es una experiencia mucho más placentera.

Java: Tres En Raya

Continuando con la senda del reciente post sobre el juego del ahorcado, esta vez vengo a compartir mi versión del tres en raya.
Está desarrollado sin muchas florituras a nivel de algoritmo; pero puede valer para repasar conceptos ya vistos.

La clase Tres En Raya
Al principio definiremos algunas cosas que vamos a necesitar. Nuestro tablero de juego no es más que un vector de 9 caracteres. Esas nueve casillas que representa pueden estar vacías (un espacio en blanco) o ocupadas por el carácter con el que juega el usuario (charUsuario=’x’) o la máquina (charMáquina=’o’). También aquí tenemos los contadores de victorias y derrotas.

Por otra parte, el método main es prácticamente calcado al visto en el juego del ahorcado. Simplemente muestra un menú y ejecuta las acciones pertinentes:

Por supuesto importaremos las clases necesarias para el Scanner y el tratamiento de excepciones.

El tablero
Para mostrar el tablero a lo largo del juego voy a desarrollar tres métodos. Al empezar una partida, quiero que se le muestre al jugador un tablero con los números de cada casilla (del 1 al 9), que son los números de casilla que introducirá por teclado para saber dónde quiere colocar sus fichas.
Después, ese tablero deberá estar vacío (introduciendo caracteres ‘ ‘) para poder empezar y se mostrará su estado paso a paso conforme se vayan realizando movimientos hasta terminar la partida.

No hay nada especial en estos tres métodos salvo convertir un número a un carácter mediante la concatenación de dos métodos: Integer.toString(numero).charAt(0). Prácticamente auto-explicativo.

Desarrollo
He tratado el desarrollo del juego en dos métodos para hacerlo más legible. Sigo un modelo Top-Down así que el primero que veremos es “jugar()”, que es el que se invoca desde la opción 1 del menú. Básicamente cuando el usuario escoge jugar, se le muestra el tablero numerado y se vacía.

Este método a su vez invoca a “partida()”, donde se desarrolla la partida, y que devuelve un char correspondiente a quien haya obtenido la victoria o en caso de empate. Aquí se actualizan los contadores si es el caso.
Ahora bien, para decidir quien empieza a colocar sus fichas he creado un método auxiliar “turnoInicial()” muy sencillo donde se sortea de forma más o menos aleatoria el turno. Requiere importar la clase Random.

Y ya estamos listos para comenzar la partida.
El bucle de jugadas se ejecutará mientras no haya un ganador y mientras el numero de fichas introducidas en el tablero sea menor que 10.
Primero mostramos el estado actual del tablero, preguntamos si aún no se han introducido todas las fichas posibles y según de quien sea el turno, introduciremos una ficha del jugador o de la máquina. En el caso de que sea turno del jugador, simplemente comprobamos que la posición indicada está vacía y le preguntamos de nuevo si no lo está. Si es el turno de la máquina, llamamos al método “ocuparCasilla()”, del que hablaré más tarde.
Una vez colocada la ficha, cambiamos el turno, comprobamos si hay un ganador con el método “victoria()” y aumentamos el contador de fichas ya introducidas.
Una vez que el bucle acabe, mostramos el estado final del tablero y devolvemos el char correspondiente al ganador (o un carácter vacío si ha sido empate).

Casillas y victorias
No hablo de estadísticas del Real Madrid ni de la Selección Española. ¿Como decide la máquina qué casillas ocupar para buscar la victoria? Hay varias formas sencillas de hacer esto pero me temo que ninguna satisfactoria. Buscando información en internet llegué al algoritmo minimax, pero no quería complicarme mucho para implementarlo.
De modo que la máquina hará una serie de comprobaciones para que parezca que juega de forma inteligente cuando en realidad no lo hace.
La primera y más evidente se trata de comprobar la casilla central (posición 4 del vector). Si está libre, la ocupa.
Si ya estaba ocupada por una ficha suya, la máquina tratará entonces de buscar las casillas 1, 3, 5 y 7 para formar la línea central vertical u horizontal. Si después de comprobarlas, no las ha podido ocupar, entonces buscará cualquiera de las restantes simplemente iterando a lo largo de todo el vector.
Si la posición central pertenece al jugador, no obstante, la máquina realiza un proceso análogo buscando jugar en los vértices del tablero, es decir, las posiciones 0, 2, 6 y 8, para formar una de las dos líneas diagonales.

No se trata, ni mucho menos, de una “inteligencia artificial”. Más bien se trata de un “primitivo artificio intelectual”.

Como después de introducir una ficha, hay que comprobar si tenemos un ganador, lo que he hecho es el método “victoria()”, que simplemente aglutina una serie de comprobaciones para verificar si existen tres fichas en raya en alguna de las verticales, horizontales u oblicuas.

De nuevo, es un mecanismo muy rudimentario, pero suficiente.

Jugando
Compilamos con:
$ javac TresEnRaya.java
Y ejecutamos con:
$ java TresEnRaya
Dejo a continuación tres capturas de como se comporta el programa así como del código completo. Si quieres descargarlo puedes hacerlo desde éste enlace y como siempre, los comentarios del blog están a vuestra disposición para cualquier duda o sugerencia 🙂