jueves, 31 de agosto de 2017

¿Qué es una tarjeta gráfica?

Mucha gente que juega a videojuegos quiere una gráfica mejor a la que tiene o presume de tener una maravilla que puede ejecutar cualquier juego del mercado, pero en realidad si les preguntas qué hace una tarjeta gráfica a nivel hardware te responderán con una aseveración parecida a la siguiente (normalmente con más tacos): “Hace que mis videojuegos se vean bien”. Pero ¿Qué mierdas es una tarjeta gráfica? ¿Lo sabéis? Pues yo sí, y aquí llega una nueva entrada del Tecnópata Obsoleto.

Cada cosita verde es un  "adolescente"

Empezaremos con lo básico: Un procesador se encarga de procesar información *aplausos*, en serio, ejecutan MUCHA información (un intel i5 de hace 5 años ejecuta 12 millones de operaciones por segundo). El microprocesador de vuestro ordenador es lo que más rápido ejecuta código casi siempre. – “¿Casi siempre?” – Eso he dicho, deja de repetir y atiende. 

Os ilustraré con una metáfora de las que tanto me gustan. Un procesador es como un economista y una tarjeta gráfica es como una horda de 1.000 adolescentes con calculadoras. Si pido a ambos que hagan una suma, el economista tardará menos que los adolescentes, si pido a ambos que me hagan la declaración de la renta también acabará antes el economista, sin embargo, si les pido que hagan 10.000 operaciones matemáticas, los adolescentes acabarán antes, porque harán 10 cada uno mientras que el economista tendrá que hacer las sumas una a una.

“¿Y qué? Pueden hacer cosas a la vez ¿en qué me ayuda eso?” – Todo programa en 3D (hablo ahora de juegos) representa cada punto que aparece con tres coordenadas (x, y, z). Si imaginas un solo coche de Gran Turismo 5, un juego de 2010, tiene más de 200.000 puntos (como curiosidad, diré que sólo el bigote de Solid Snake del Metal Gear Solid 4 tenía más de 1500 puntos). Si queremos mover el coche, tendremos que avanzar en la coordenada X (por ejemplo). pero hay 200.000 puntos que tienen cada uno su coordenada X, así que tendremos que avanzar en 200.000 puntos. Esto se traduce en 200.000 sumas.

Sólo ese bigote tiene 1500 puntos
“¿200.000 sumas? si un procesador hace 12 millones de operaciones no es tanto ¿No?” – Imagina ahora esto: el coche avanza por un circuito enorme, cuando en una curva que tiene tierra en el suelo se choca, levantando una nube de polvo y dando vueltas de campana avanzando hacia un muro sin que por ello sus ruedas dejen de girar. Además de esto se deforman un par de piezas. En esta detallada descripción que ha llenado vuestras mentes en un fantástico atardecer nos encontramos con varios millones de operaciones en cada instante. Sin contar que habrá otros coches en la pista y que también hay que calcular sus inteligencias artificiales. Podéis imaginar que esta cantidad de pequeñas operaciones matemáticas (todas fáciles por separado), dejan al procesador hundido en la miseria y lamentándose. Pero, ¿Y si inventamos un aparato que haga las sumas de 1000 en 1000? 200.000 sumas se convertirán en 200 operaciones. Parece una buena idea, pongámosla en práctica y llamémoslo Tarjeta gráfica, que será justo eso, un montón de procesadores puestos en paralelo que por separado hacen operaciones matemáticas tirando a despacio, pero que juntas hacen muchísimas cuentas a la vez, acelerando una borriquería las sumas de un montón de datos en paralelo.
Coordenadas de un punto en 3D

Algunos se preguntarán – “¿Por qué no cambiamos el procesador por una tarjeta gráfica si tan rápido va, eh listo?” – Volvamos a la metáfora de antes y dime, atento lector, si se te ocurre alguna forma de dividir entre 1.000 estudiantes el trabajo de hacer una declaración de la renta sin que sea más engorroso que pedírselo al economista que tienes a sueldo. No sólo es más fácil para quien los organiza (el programador) sino que además en la mayor parte de tareas irá más rápido tu preciado procesador-economista.


Así que ya sabes, una tarjeta gráfica no es más que eso. Una horda de adolescentes con calculadora que sumarán, restarán, multiplicarán, harán senos y cosenos muy rápido, pero no les pidas que hagan nada más complejo porque no es su cometido y te costarán más dinero que los caramelos que les das por trabajar. Ahora dime, ¿Has aprendido algo nuevo hoy?

viernes, 7 de julio de 2017

Dividir no siempre es fácil



Llevo un tiempo sin escribir, y el conocimiento a veces se hace esperar, pero hoy vengo con un nuevo post del Tecnópata Obsoleto donde hablaré de un problema recurrente para el hardware, las matemáticas. No os asustéis, hipoglúcidos, que sólo vamos a hablar de la división y de por qué un programador tiene que tener cuidado a la hora de dividir.

A todos nos han enseñado a dividir de pequeños y lo hacemos de forma automática en muchos casos, sabiendo por ejemplo que, si 2 personas van a comerse una pizza (iba a poner barbacoa, pero puede haber veganos leyendo), les corresponde media a cada uno y más aún, si está partida en 8 trozos, cada gordito zampará 4 suculentas porciones de una pizza sin piña (si una pizza llevase piña no se consideraría pizza, sino aberración culinaria). ¿Pero qué ocurre si nos dicen: “Hay una pizza y queremos dividir sus 8 deliciosas porciones entre 0 personas”? ¿Cuántas porciones se lleva cada persona? Podéis ver que es una pregunta que no tiene sentido, no hay personas que puedan llevarse pizza así que tampoco es cierto que cada persona se lleve 0 pedazos, nadie se lleva nada, pero todas las personas se llevan algo, como si dijese que toda la gente que mide más de 16 metros puede volar, es cierto porque nadie mide más de 16 metros, pero es mentira porque no hay nadie que mida más de 16 metros para probarlo.


Igual que en el lenguaje, en matemáticas tampoco tiene sentido dividir entre 0 y hay movidas mazo de chungas y tope de raras (en lenguaje técnico lo llamamos así) que harían llorar al niño Jesús si éste hubiera estudiado matemáticas. Los matemáticos normalmente se limitan a evitar el problema acercándose con lo que se llaman “límites”, y resolviendo que cuanto más cercano a 0 es el divisor, más nos acercamos a infinito. Así que la respuesta más bonita a la pregunta sería “algo parecido a infinito”.

¿Cómo resuelve la parte hardware de un ordenador una división? Imaginemos la ya nombrada pizza, humeante, apetitosa, recién cocinada y dispuesta en 8 trozos. Somos de nuevo 2 personas hambrientas y el ordenador lo sabe, así que utiliza el “método de las restas sucesivas”.

Inicio: Restan 8 porciones para acabar la pizza
Ronda 1 – Nos comemos un trozo cada uno, 2 trozos menos (restan 6)
Ronda 2 - Nos comemos 2 trozos (restan 4)
Ronda 3 - Nos comemos 2 trozos (restan 2)
Ronda 4 - Nos comemos 2 trozos (restan 0)
Fin: No quedan trozos de pizza, terminamos

Ese 0 es el resto de nuestra división, ¿Y el resultado? Cuatro, las 4 rondas en las que nos hemos comido nuestra pizza. Por lo tanto, lo que un microchip hace para dividir, es restar hasta que quedan menos porciones que gente para comer y los trozos que quedan sin comer, son el resto.

Imaginemos que esa pizza se la comen 3 personas:
Inicio: 8 porciones
Ronda 1 - Se comen 3 trozos, resto 5
Ronda 2 - Se comen 3 trozos, resto 2
Fin: Quedan 2 trozos, son 3 personas, terminamos.

Aquí podéis ver que el resultado es 2, y sobran 2 trozos por los que tendrán que luchar a muerte o partirlos de forma inexacta con un cuchillo (no voy a hablar de decimales).

¿Qué pasa si el divisor es 0?
Tenemos 8 trozos de pizza
Inicio: 8 porciones

Ronda 1 - Las 0 personas se comen 0 trozos, quedan 8
Ronda 2 - Se comen 0 trozos, quedan 8
Ronda 10.000 - Se comen 0 trozos, quedan 8 porciones, la pizza sigue entera

Como podéis ver, al restarse de 0 en 0, el cálculo nunca pararía, y seguiría así hasta el fin de los tiempos, en un bucle infinito de hardware. Por este motivo, dividir por cero en programación es un error, y si lo haces, el hardware mandará a paseo tu programa, porque la calculadora del ordenador ya está avisada: “Si recibes un 0, dile que aquí no nos andamos con tonterías”. De esta forma cuando se ejecute dependiendo del lenguaje de programación puede ser que el  ordenador estalle programa devuelva un error o que el valor recibido sea del estilo NaN (Not a Number).

Así que ya sabéis, no dejéis a vuestros niños dividir entre 0. ¿Tenéis problemas con las divisiones?

miércoles, 4 de enero de 2017

Mejor tenerla larga (La contraseña)

Hoy me he cruzado con una tira cómica de XKCD bastante mítica que hablaba de la seguridad en las contraseñas, y he pensado ilustrar vuestra seguridad online con un nuevo post que salve vuestros datos de los hackers malvados.

Tira cómica de XKCD


Corrían los primeros años en un medio naciente como era Internet, sólo había un montón de webs que intentaban hacerse con usuarios, así que querían que te registrases. Tú lo hacías utilizando contraseñas fáciles de recordar, porque nadie compraba en internet y no tenías datos que te importase perder, seguro que usaste “12345” al menos un par de veces. Ahora la cosa ha cambiado, accedemos al banco, a cuentas en las que nuestra identidad se da por supuesta, tramitamos becas y realizamos todo tipo de gestiones importantes, así que podemos preguntarnos: ¿Qué seguridad tiene mi contraseña? Vamos al tajo.

Hash
Ya hablé de los hash brevemente en el post sobre la criptomoneda, pero os concederé un recordatorio rápido: El hash calculado sobre un texto cualquiera produce otro texto distinto con longitud constante, de forma que es fácil calcular el Hash desde texto original pero es MUY difícil calcular el texto original desde un hash. Un ejemplo calculado con esta web lo tenéis en la imagen, arriba está el texto original y abajo las conversiones mediante distintos algoritmos de cálculo Hash. He subrayado el texto original y los algoritmos más conocidos y utilizados.

Algoritmos de Hash


La primera medida de seguridad no la implementaréis vosotros, sino la web en la que os registráis. Cuando tú te registras e introduces tu contraseña, se calcula su hash y ese es el valor que se almacena. Cuando tú metes tu contraseña, se calcula su hash y se comprueba que son iguales. Una página web NUNCA debería almacenar una contraseña en texto legible, porque si les roban los datos (y no es tan difícil como se cree) vuestra contraseña estará disponible para el ladrón. Adicionalmente, seguramente uséis la misma clave para más cosas. Por eso si una web os envía en un correo vuestra contraseña en texto plano, NO ES SEGURA, porque cualquier administrador de la base de datos o cualquier hacker que obtenga el fichero de claves podría leerla.
Por ejemplo, hace cerca de un año, una conocida web de componentes de PC (que ya ha solucionado el problema) me envió mi propia contraseña en texto plano por email tras registrarme. Vi el problema de seguridad y se lo notifiqué mediante un e-mail. Tras eso, ellos me respondieron asegurándome que su sistema de seguridad era robusto e inexpugnable y que no debía preocuparme por ello, así que solicité el borrado de mi información de sus bases de datos, ya que mi clave no debería ser de dominio público.

¿Y yo qué puedo hacer?
No te afijas, voz cursiva, la mayor parte de las webs hoy en día “Hashean” las contraseñas entrantes, así que tienes que preocuparte de tus propios asuntos, mejor dicho, de que tus contraseñas sean seguras. Para que una contraseña tenga mucha seguridad importa mucho el desorden, o lo que más técnicamente se llama entropía. La cantidad de entropía es un componente de aleatoriedad, a mayor entropía, más complicado será hallar vuestra contraseña. La entropía es un número que puede ser muy grande, por ello la vamos a calcular en bits. Puedes imaginar que es más complicado adivinar palabras infrecuentes y largas que palabras largas y frecuentes, pero ¿Es mejor una palabra infrecuente con números y símbolos de puntuación o varias palabras frecuentes? Pondré dos ejemplos que lo ilustren.

Palabra complicada
Tomamos una palabra ‘rara’ y moderadamente larga: “infierno”. Tiene unos 13 bits de entropía, y el tiempo estimado para averiguarla por una mezcla de inteligencia artificial y fuerza bruta sería de 0.046 segundos. Sustituyamos una de sus letras por mayúsculas: “infieRno”. Su entropía subiría a 14 bits. Realicemos unas pocas transformaciones corrientes, como son sustituir letras por números: “1nf13Rno”, ya tenemos una entropía de 15, y un tiempo para descifrarlo de 0.911 segundos. Vamos a añadir un signo de exclamación y un número al final: “1nf13Rno!4”. Con esto, el tiempo estimado en obtener tu contraseña serían 58 minutos, además la contraseña es irrecordable.

Varias palabras simples
Imagina ahora que juntas palabras de entropía baja, fáciles de recordar, por ejemplo: “MiraQueContraseñaMasSegura”. Esta contraseña es fácil de recordar, ¿Verdad? Pues la dificultad para el ordenador crece. De hecho el tiempo de descifrado alcanza los 14.112 años, una cifra respetable para cualquier hacker.

Está claro que lo más seguro sería mezclar ambas técnicas y escribir contraseñas kilométricas ilegibles e irrecordables, sin embargo mucha gente y muchas empresas confunden complejidad con seguridad. Ilustremos esto con mi empresa, donde en una de las cuentas de aplicaciones seguras corporativas te piden una contraseña de entre 6 y 12 caracteres con mayúsculas, minúsculas y símbolos de puntuación. Un ejemplo de esta “contraseña segura” sería la ya mencionada “1nf13Rno!4”, la que hemos visto que alcanza una seguridad efímera de una hora ante ataques.

Ejemplo de contraseña muy segura


Aquí termina esta entrada donde añado, como curiosidad, la web que he utilizado para calcular la entropía, los tiempos y las complejidades de cada contraseña. Adicionalmente diré que, aunque es totalmente cierto que cuanto más larga sea la contraseña más difícil  es de descifrar, la mayoría de estándares de seguridad establecen que debería tener algún número y signo de puntuación. Todo el mundo se salta los estándares, pero un ejemplo de contraseña larga y fácil de recordar la tenéis en la imagen de arriba, y no es complicado pensar otras válidas como "Somos4EnCasa+ElPerro" Así que ya sabéis, en este caso el tamaño sí que importa ¿La tenéis lo bastante larga?