lunes, 30 de marzo de 2009

IPv6

IPv6 es una nueva versión del protocolo IP (que utilizamos diariamente en la conexión a Internet), pensada para reemplazar a la IPv4 que utilizamos en la actualidad.

La principal necesidad de este cambio surje debido a algo muy simple, nos quedamos sin direcciones IP. Actualmente, más de las 2/3 partes de las direcciones IP están en uso y con el mundo chino irrumpiendo con fuerza en este mundo, pronto no quedará ninguna libre.

El protocolo IPv4 lleva asociadas direcciones que constan de 4 números de 32 bits (de 0 a 255), por tanto, la cantidad de direcciones que puede haber son 255^4=4.228.250.625. Ahora bien, de esa cantidad a la real hay una diferencia bastante grande debido al desperdicio de direcciones.

El desperdicio de direcciones IPv4 se debe a varios factores.

Uno de los principales es que inicialmente no se consideró el enorme crecimiento que iba a tener Internet; se asignaron bloques de direcciones grandes (de 16,71 millones de direcciones) a países, e incluso a empresas.

Otro motivo de desperdicio es que en la mayoría de las redes, exceptuando las más pequeñas, resulta conveniente dividir la red en subredes. Dentro de cada subred, la primera y la última dirección no son utilizables; de todos modos no siempre se utilizan todas las direcciones restantes. Por ejemplo, si en una subred se quieren acomodar 80 hosts, se necesita una subred de 128 direcciones (se tiene que redondear a la siguiente potencia de base 2); en este ejemplo, las 48 direcciones restantes ya no se utilizan.

Este problema queda resuelto con la IPv6, ya que tiene direcciones de 128 bits, habiendo por tanto 2^128+-=3,4+E38. Una cantidad increiblemente grande y que parece más que suficiente a largo plazo.

Además de este recurso obligado, la IPv6 tiene otros beneficios:

Simplificación del formato de cabecera

Algunos campos de la cabecera IPv4 se han sacado o se han hecho opcionales. Los motivos de esto son reducir el costo del caso común en el proceso los paquetes y para ahorrar ancho de banda.

Soporte mejorado para las extensiones y o

pciones

Los cambios en la manera en que se codifican las opciones de la cabecera IP permiten un reenvío más eficiente, límites menos rigurosos en la longitud de opciones, y mayor flexibilidad para introducir nuevas opciones en el futuro.

Capacidad de etiquetado de flujos

Una nueva capacidad se agrega para permitir el etiquetado de paquetes que pertenecen a "flujos" de tráfico particulares para lo cuál el remitente solicita tratamiento especial, como la calidad de servicio no estándar o el servicio en "tiempo real".

Capacidades de Autenticación y Privacidad

IPv6 incluye la especificación de extensiones que proveen autenticación, integridad, y (opcionalmente) confidencialidad de los datos.


Pero esto no es algo nuevo...la IPv6 ya surgió hace bastantes años (en 1996), pero es lenta...realmente lenta, tal y como muestra la siguiente tabla generada con datos de google.

Aunque se espera que en el 2010 se empiece a implantar de manera masiva. Como siempre, parece que nada se hace hasta que no se le ven los cuernos al toro.

jueves, 26 de marzo de 2009

Campeón de la EUITIO Sumo Wars 08/09!!

Ayer, 25 de marzo de 2009, se celebró en la EUITIO un torneo de lucha entre robots llamado Sumo Wars. Como dice la página web del evento:
Para competir en el torneo los competidores desarrollan un programa que es cargado en los robots que se enfrentan en cada ronda. Estos programas, que les confieren una inteligencia artificial sencilla, están orientados a conseguir que el robot contrario abandone el tatami o sea incapaz de continuar debido a una limitación de sus movimientos.
Estos programas se implementaron en Java, utilizando la API LeJOS. La versión de la API fue la 0.7.0. beta NXT.
Estos combates se realizaron sobre un "tatami" de suelo claro, de 1.5m de diámetro y delimitado por una marca circular negra. En el interior del tatami hubo otras 2 líneas (marcas hechas con celo) para marcar desde donde salían los robots (que a diferencia del sumo los robots salían de espaldas y no frente a frente).
Los robots utilizados tenían dos motores (uno por cada rueda), un sensor de luz capaz de distinguir el color del suelo donde estaba posicionado y un sensor ultrasonico que podía obtener la distancia al objeto más cercano (máximo 255cm)
Al torneo se presentaron 9 personas, 1 de las cuales fue directamente eliminada al no poder compilar con éxito su proyecto. Entonces quedaron unas eliminatorias en forma de árbol, cada combate al mejor de 3.
Los combates la verdad que fueron muy cómicos, había todo tipo de robots, uno no paraba de dar vueltas a toda velocidad, otro que parecía que escapaba del otro rival y el mío, que iba a velocidad de tortuga.
Y al final...mi Ralph_O_Cop (nombre que le puso un amigo mío, Jacobo) consiguió llegar a la final y llevarse el campeonato en un combate lleno de igualdad. Gracias a ello gané un portátil, una buena experiencia con muchas risas, salir en el priódico y algo que añadir a mi curriculum.

Aquí os dejo las noticias donde se recoje el evento:
La nueva España
La voz de Asturias

lunes, 23 de marzo de 2009

Actualización programa pachangas

Aquí os subo una pequeña modificación sobre el programa de la anterior entrada. La actualización consiste en equiparar a las personas que mandan las valoraciones, de manera que cuente lo mismo la valoración de una persona que envía una nota que la de una persona que envía 10.

Pongo un equipo, la persona A manda 1 valoración sobre X puntuándolo con un 2. La persona B manda dos archivos con nota 5 y 8. En el programa anterior la media sería (2+8+5)/3=5, con esta nueva actualización sería (2 + ((5+8)/2)/2=(2+6.5)/2=4.25

Además, hay que añadir, en la primera, el nombre de la persona que pone las notas.

src del programa

jueves, 19 de marzo de 2009

Programita para organizar pachangas

En la actualización de hoy os enseñaré un pequeño programa (por consola) en Java que creé para organizar pachangas de fútbol 5.

La idea del programa es simple. Existirán unos ficheros en los que se puntuarán a los jugadores. (Del formato hablaremos luego). En teoría, cuanta más gente mande ficheros más reales serán las puntuaciones. De estos ficheros se hace una media por jugador y se sacará un ranking ordenado por puntuación así como se generarán equipos compensados.

Respecto a los ficheros enviados existen dos buenas opciones a considerar, la primera es que después de cada partido se actualice el fichero con las notas, la segunda es que se mande un nuevo fichero con las valoraciones tras cada partido. La segunda opción es, en mi opinión, mejor, ya que la primera puede ser bastante variable de un partido a otro; en cambio, con ésta, a largo plazo podría ocurrir que una persona inicialmente mala mejore mucho y por tener muchas notas como "malo" podría tener una nota mediocre a pesar de ser ahora bueno. Entonces estos ficheros podrían tener una duración de 5 partidos o algo así.

El formato del fichero es muy simple. En cada línea hay un jugador con su valoración. Primero se pondrá el nombre del jugador, luego se utilizará un tabulador y por último la nota, que puede ser entera o decimal separada por un punto. Hay que tener en cuenta que todo el mundo debe nombrar a los jugadores por igual, es decir si hay un jugador que se llama Pablo pero que le llaman Popi y en algunas valoraciones sale como Pablo y otras como Popi, el programa lo contará como 2 personas diferentes. Por esto sería bueno tener una plantilla con los nombres y enviarla antes a todo aquel que vaya a hacer valoraciones. Otro aspecto a tener en cuenta es que da igual el número de personas que se valore, si por ejemplo, siguiendo con lo de la plantilla anterior, no sabes como juega alguien, pues directamente borrar la línea y ya está. Así como también es posible valorar a 10 personas ya que puede que no siempre vaya la misma gente.

Generar equipos compensados:
El programa genera todas los equipos posibles, suma las puntuaciones de todos sus integrantes y saca por pantalla todos aquellos que se distancien del equipo perfectamente compensado en la cantidad que nosotros elijamos. Además podremos elegir algunas condiciones como que por ejemplo ciertos jugadores jueguen juntos o no.

Variables a modificar:
  1. String[] jugadoresPartido: Meteremos aquí los 10 nombres de los juugadores que vaya a jugar el partido.
  2. String[]jugadoresEnEquipo: Meteremos aquí los jugadores que queremos que estén en los equipos que se generan.
  3. String[]jugadoresNoEnEquipo: Meteremos aquí los jugadores que NO queremos que estén en los equipos que se generan. Por ejemplo, yo(Popi) quiero jugar en el equipo de Juan y ser contra Pedro, entonces pondré jugadoresEnEquipo={"Popi","Juan"}; y jugadoresNoEnEquipo={"Pedro"};
  4. private boolean equipoMasEqulibrado: Se pondrá a True si se quiere sacar solamente el equipo más equlibrado, por contra se pondrá a False si se quiere que se saquen todos los equipos cuya diferencia respecto al equipo perfectamente equlibrado sea menor que la variable explicada a continuación.
  5. float diferenciaRespectoEquipoPerfectamenteEqulibrado: será la diferencia máxima que habrá entre los equipos que se muestren y el equipo perfectamente equilibrado. Normalmente serán sólo unas pocas centésimas.
  6. String directorioBase: será la dirección donde se pondrán los ficheros con las puntuaciones. En el método cargarJugadores() se pondrá ya la dirección final de cada fichero.
  7. boolean pruebas: se pondrá a false si no quieres que se saquen por pantalla unos cuantos datos que muestran el seguimiento de la ejecución.
Y no hay mucho más la verdad, el programa lo hice en una mañana y la verdad que no son más que 300 líneas y hechas bastante aprisa y corriendo. No hay ni comentarios y seguramente haya código ineficiente y no sea todo lo mantenible que debiera, pero a veces para programas que sabes que no se van a usar casi, estas propiedades no son del todo obligatorias, aunque siempre es bueno que cualquiera programa que las cumpla.

Sin más adjunto los src y un fichero de puntuación de ejemplo:
Ficheros

viernes, 13 de marzo de 2009

Lenguajes de programación más populares



Buscando el otro día los lenguajes más requeridos a la hora de buscar trabajo, encontré una página que me pareció muy interesante. En ésta, hay una clasificación de los lenguajes en función de su popularidad, el índice se basa en la popularidad al buscar estos lenguajes en algunos buscadores como por ejemplo Google o Yahoo. Esto quiere decir que no evalúa cuál es el mejor lenguaje, ni en cuál se han escrito más lineas de código ni nada por el estilo.
Además, hay que tener en cuenta que este ranking es sobre los lenguajes de programación. Éstos tienen la característica de que son Turing completos. Por tanto no aparecen los lenguajes de marcas como HTML o XML ni tampoco lenguajes de acceso a datos como SQL ya que, por ejemplo, no pueden hacer bucles infinitos; en cambio si que aparecen extensiones como PL/SQL.
Fuente(En inglés): Tiobe Index

jueves, 12 de marzo de 2009

Aprender a escribir

Desde la siguiente página podrás realizar un pequeño cursillo para aprender a escribir con los 10 dedos y a gran velocidad. Son sólo 27 lecciones, todas ellas prácticas, y cada una no te debería de llevar hacerla más que unos minutitos. Sin más, dejo el vínculo.

curso meca

viernes, 6 de marzo de 2009

10 programadores al precio de 1

Como primera entrada de verdad quiero mostraros un artículo que encontré hace no mucho por internet. En él nos habla de la diferencia de productividad que puede haber entre un buen y un mal programador, explicando el por qué se da una diferencia tan grande y, aunque sean cosas bastante obvias, nos puede ayudar a adquirir buenas costumbres de programación.


Fuente: 10 Developers For The Price Of One

In the The Mythical Man-Month, Fred Brooks highlights an eye opening disparity in productivity between good and poor programmers (emphasis mine).

Programming managers have long recognized wide productivity variations between good programmers and poor ones. But the actual measured magnitudes have astounded all of us. In one of their studies, Sackman, Erickson, and Grant were measuring performance of a group of experienced programmers. Within just this group the ratios between the best and worst performances averaged about 10:1 on productivity measurements and an amazing 5:1 on program speed and space measurements!

Tortoise and Hare: http://users.cwnet.com/xephyr/rich/dzone/hoozoo/toby.html

Robert Glass cites research that puts this disparity even higher in his book Facts and Fallacies of Software Engineering.

The best programmers are up to 28 times better than the worst programmers, according to “individual differences” research. Given that their pay is never commensurate, they are the biggest bargains in the software field.

In other words, the best developers are generally underpaid and the worst developers overpaid.

But don’t leave your job just yet. This is not to say that there should be a 1 to 1 correlation between productivity and pay. People should be paid by the value they bring and productivity is only part of the value proposition, albeit a big part of it. Even so, we’d expect to see some amount of correlation in pay with such a drastic productivity difference. But in general, we don’t. Why is that?

It’s because most managers don’t believe this productivity disparity despite repeated verification by multiple studies. Why should they let facts get in the way of their beliefs? That would only mean the factonistas have won.

Kidding aside, why is this productivity difference so hard to believe? Allow me to put words in the mouth of a straw-man manager.

Well how in the world can one developer write code 28 times faster than another developer?

This sort of thinking represents a common fallacy when it comes to measuring developer productivity. Productivity is not about the lines of code. A huge steaming pile of code that doesn’t get the job done is not productive. There are many aspects to developer productivity, but they all fall under one main principle (borrowing a term from the finance industry), TCO.

TCO - Total Cost Of Ownership.

In general, I’ve tried to always hire the best developers I can find. But I’ve made mistakes before. Yes, even me.

One situation that comes to mind was with a developer I had hired (under a lot of pressure to staff up I might add) at a former company. I handed off a project to this erstwhile coworker to take over. A few days go by and I don’t hear anything from the guy, so I assume things are humming along nicely.

Fast forward another few days and I swing by to see how it’s going and the developer tells me he doesn’t understand a few requirements and has been spinning his wheels trying to figure it out this whole time.

Good Developers take Ownership so You Don’t Have To

This is one of the first ways that good developers are more productive than average developers. They take ownership of a project. Rather than spend a week spinning wheels because they don’t understand a requirement, a good developer will go and grab the decision maker and squeeze out some clarity.

Likewise, a good developer doesn’t require you to prod them every few moments to make sure they are progressing. If they get overly stuck on a problem, they’ll come to you or their coworkers and resolve the problem.

A developer who can write code fast, but doesn’t take ownership of their projects is not very productive because they end up wasting your time.

Good Developers Write Code With Less Bugs

I once worked with a developer who was praised by my boss for being extremely fast at writing code. He sure was fast! He was also fast at introducing bugs into code. His code was sloppy and hard to understand.

The key measure that wasn’t figured into his productivity measurement was the amount of productivity lost by the QA team attempting to reproduce bugs introduced by his code, along with the time spent fixing those bugs by this developer or other developers.

Everyone focused on his time to "completion", but not on the total cost of ownership of that code. Code is not complete when a developer says it is complete. That is not the time to stop the stopwatch. It’s when QA has had its say that you can put the stopwatch away for the moment.

As I like to say, productivity is not about speed. It’s about velocity. You can be fast, but if you’re going in the wrong direction, you’re not helping anyone.

Good Developers Write Maintainable Code

Hand in hand with writing less bugs is writing understandable maintainable code. As soon as a line of code is laid on the screen, you’re in maintenance mode on that piece of code.

Code that is brittle and difficult to change wastes hours and hours of developer cycles when trying to amend a system with updates and new features. By writing maintainable code, a good developer can make these changes more quickly and also improves the productivity of his or her team members who later have to work on such code.

Good Developers Do More With Less Code

Another hallmark of a good developer is that they know when not to write code. As a friend always tells me

Why build what you can buy? Why buy what you can borrow? Why borrow what you can steal?

With a few exceptions, the NIH (Not Invented Here) syndrome is a pathological productivity killer. I’ve seen developers start out to write their own form validation framework until I point out that there is already one built in to ASP.NET that does the job (It’s not perfect, but it’s better than the one I saw being written).

All of that time spent reinventing the wheel is wasted because someone else has already written that code for you. And in many cases, did a better job as it was their only focus. In such a situation, finding an existing library that gets the job done can provide a huge productivity boost.

The caveat in this case is to be careful to avoid non-extensible and rigid 3rd party libraries, especially for very specialized requirements. You might a lot of time trying to fit a round peg in a square box.

Even when you must invent here, good developers tend to write less (but still readable) code that does more. For example, rather than build a state machine to parse out text from a big string, a good developer might use a regular expression (ok, some will say that a regex is not readable. Still more readable than hundreds of lines of text parsing code).

Back to TCO

Each of these characteristics I’ve listed keeps the total cost of ownership of a good developer low. Please don’t let the term ownership distract you. What I mean here is the cost to the company for having such a developer on the payroll.

By writing less code that does more, and by writing maintainable code that has fewer bugs, a good developer takes pressure off of the QA staff, coworkers, and management, increasing productivity for everyone around. This is why numbers such as 28 times productivity are possible and might even seem low when you look at the big picture.

Hopefully seeing this perspective will convince managers that good developers really are as productive as the studies show. Negotiating a 28x pay increase on the other hand, is an exercise left to the reader.

Inauguración

Inauguro este blog con la intención de escribir en éste todas las inquietudes sobre el mundo de la informática, mostrar artículos que me hayan parecido interesantes e incluso mostraros el código de algún programa que pueda realizar.

Espero tener con vosotros una buena y larga duración y que no dudeis en añadir comentarios para aconsejar, criticar o mostrar cualqueir opinión que tengais.