miércoles, septiembre 28, 2011

Juego de la vida de Conway (parte 3):

En la parte 2 mostraba el código fuente del programa hecho en VB.NET.
Alguien me ha dicho que le gustaría verlo en ejecución, así que aquí va una muestra de algunas estructuras simples y otras complejas del autómata celular de Conway:

Hay formas básicas que no se mueven y otras que apenas te guiñan un ojo:



Esto lo tenéis que ver porque las formas creadas de forma totalmente aleatoria tienen su propia belleza y proporción (lo he grabado por pura casualidad. Por eso hay algún tiempo muerto y algún intento de meter más puntos en el tablero. Luego he visto que la vida evoluciona en bonitas formas similares a letras y dibujos sugerentes, así que lo he subido como está).



Por último aquí vemos que la complejidad puede ir en aumento sin límite alguno. Bueno, la limitación de mi programa es que todo se reduce a un array de 20x20.


domingo, septiembre 25, 2011

El juego de la vida de Conway (parte 2):


En la parte 1 de este tema, comentaba que Alan Turing siguiendo su propia intuición descubrió y demostró matemáticamente la AUTOORGANIZACIÓN.

Posiblemente las células de los seres vivos evolucionen de forma similar. No tienen una comunicación clara con el resto de células, y tampoco hay nada que controle todas la células, pero cada una de ellas termina teniendo una función diferenciada.

Turing abrió el camino, pero luego otros se dedicaron a "diseñar" sus propios "autómatas celulares". En 1970 John Horton Conway publicó su autómata en Scientific American en la sección dedicada a juegos matemáticos.

Hoy en día es el autómata celular más conocido y se llama "JUEGO DE LA VIDA". Las reglas son muy sencillas:

Es un juego en el que tenemos un tablero dónde inicialmente colocamos una serie de células vivas.

Generación a generación las células del tablero irán naciendo o muriendo siguiente estas reglas:

1.-Si una célula viva tiene a su alrededor menos de 2 células vivas se muere por "soledad".
2.-Si una célula viva tiene a su alrededor más de 3 células vivas se muere por "superpoblación".
3.-En una celda que esté rodeada por exactamente 3 células vivas surgirá vida en forma de una célula viva.

Este es el programa que he hecho en VB.NET.

Muestra un tablero de 20 x 20, dónde podemos marcar las celdas con células vivas.
Hay tres botones:
  1. Haciendo clic en "Una hora más" aplicamos las reglas para pasar a ver cómo queda la siguiente generación de células.
  2. Pinchando "Lanzar hasta el final" vemos como evolucionan las células hasta el infinito.
  3. Para terminar la simulación clic en "FIN".
En el próximo post publicaré en algún sitio el ejecutable (se aceptan sugerencias), y algunas de las figuras más conocidas que se crean, y que reciben un nombre que describe su comportamiento.

El código fuente:




Option Explicit On
Option Strict On

Imports System.Drawing.Drawing2D
Imports System.Math 'para truncate()
Imports System.Threading.Thread 'para usar sleep()

Public Class Form1

Dim oPen As Pen
Dim oGrafico As Graphics
Dim cuadro(20, 20) As Boolean

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.BackColor = Color.Gray
Dim i, j As Integer
For i = 1 To 20
For j = 1 To 20
cuadro(i, j) = False
Next
Next
End Sub

Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
Dim punto As Point
Dim cuadroX As Integer
Dim cuadroY As Integer
If e.Location.X > 30 And e.Location.X < 630 And e.Location.Y > 30 And e.Location.Y < 630 Then
cuadroX = CInt(Truncate(e.Location.X / 30))
cuadroY = CInt(Truncate(e.Location.Y / 30))
cuadro(cuadroX, cuadroY) = True
punto.X = cuadroX * 30
punto.Y = cuadroY * 30
'Dibujamos un círculo negro...
oGrafico.FillEllipse(New SolidBrush(Color.Black), New Rectangle(punto, New Size(30, 30)))
End If
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

Dim x, y As Integer
oGrafico = Me.CreateGraphics
oPen = New Pen(Color.White, 1)

For x = 1 To 21
'Ponemos 21 columnas:
Dim pt1 As New Point(30 * x, 30)
Dim pt2 As New Point(30 * x, 630)
oGrafico.DrawLine(oPen, pt1, pt2)

Next
For y = 1 To 21
'Ponemos 21 filas:
Dim pt1 As New Point(30, 30 * y)
Dim pt2 As New Point(630, 30 * y)
oGrafico.DrawLine(oPen, pt1, pt2)
Next
dibujarCelulas()
End Sub

Private Sub btnUnaHoraMas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnaHoraMas.Click
nuevaGeneracion()
End Sub

Private Sub btnLanzarHastaElFinal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLanzarHastaElFinal.Click
Timer1.Enabled = True
End Sub

Private Sub nuevaGeneracion()
Dim i, j, numVecinos As Integer
Dim cuadroNuevo(20, 20) As Boolean
For i = 1 To 20
For j = 1 To 20
cuadroNuevo(i, j) = cuadro(i, j)
numVecinos = vecinos(i, j)
If cuadro(i, j) Then 'si la célula está viva...
If numVecinos <> 2 And numVecinos <> 3 Then
cuadroNuevo(i, j) = False
End If
Else 'si la célula está muerta...
If numVecinos = 3 Then cuadroNuevo(i, j) = True
End If
Next
Next
cuadro = cuadroNuevo
dibujarCelulas()
End Sub

Private Sub dibujarCelulas()
Dim punto As Point
'dibujar la nueva situación:
For i = 1 To 20
For j = 1 To 20
punto.X = i * 30
punto.Y = j * 30
If cuadro(i, j) Then
'Dibujamos círculo negro
oGrafico.FillEllipse(New SolidBrush(Color.Black), New Rectangle(punto, New Size(30, 30)))
Else 'Dibujamos círculo gris que es como borra ya que el fondo es gris.
oGrafico.FillEllipse(New SolidBrush(Color.Gray), New Rectangle(punto, New Size(30, 30)))
End If
Next
Next
End Sub

Private Function vecinos(ByVal i As Integer, ByVal j As Integer) As Integer
Dim numero As Integer = 0
If i > 1 And j > 1 Then
If cuadro(i - 1, j - 1) Then numero = numero + 1
End If
If i > 1 Then
If cuadro(i - 1, j) Then numero = numero + 1
End If
If i > 1 And j < 20 Then
If cuadro(i - 1, j + 1) Then numero = numero + 1
End If
If j > 1 Then
If cuadro(i, j - 1) Then numero = numero + 1
End If
If j < 20 Then
If cuadro(i, j + 1) Then numero = numero + 1
End If
If i < 20 And j > 1 Then
If cuadro(i + 1, j - 1) Then numero = numero + 1
End If
If i < 20 Then
If cuadro(i + 1, j) Then numero = numero + 1
End If
If i < 20 And j < 20 Then
If cuadro(i + 1, j + 1) Then numero = numero + 1
End If
Return numero
End Function

Private Sub btnFin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFin.Click
Timer1.Enabled = False
Application.Exit()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
nuevaGeneracion()
End Sub
End Class

miércoles, septiembre 21, 2011

Cómo surge la vida? Qué tiene que ver con la matemática/informática esto? Parte 1






Bueno, empezamos una serie de posts algo filosóficos, algo matemáticos, algo informáticos, algo místicos. Cada uno que reflexione y decida por sí mismo.


Me gusta decir que Alan Turing fue el primer informático. Desde luego es uno de los más grandes matemáticos, y el teórico más importante en la creación del computador moderno. Aunque la gente no lo sepa fue además un gran corredor de larga distancia.



El caso es que, antes de morir en extrañas circunstancias (envenenado al comer una manzana), hizo un trabajo inédito que tenía mucho que ver con un misterio de la biología (todavía hoy en día sigue en estudio), y consiguió probar matemáticamente lo que intuitivamente parece imposible.



Echarle un vistazo al reportaje de la BBC (La vida secreta del caos), que merece la pena (más teniendo en cuenta lo mal que está la TV hoy en día). Arriba he puesto la parte 1 de 7 que es la que se centra en el trabajo de Turing.



Más o menos recuerdo esto (el video lo vi en vacaciones):



Hay una célula. La célula se divide en dos células iguales. Es la multiplicación celular. El proceso sigue y sigue, hasta que las células van agrupándose según la función que van a desempeñar (se especializan). De esa especialización surgirán los órganos.



Ahora bien, si las células son exactamente iguales, ¿cómo es posible que sepan cómo agruparse, y cual es su "misión"?. En principio no hay comunicación entre ellas y no hay un ente central que las maneje.



Turing en su estudio explica como funciona la Autoorganización, y es curioso que tenga que ser un informático el que inicio el camino para aclarar este misterio.



En cuanto tenga un par de horas programamos el más famoso de los autómatas celulares, pero se disfruta más sabiendo el origen de todo esto, así que si tienes unos minutos echa un vistazo al documental.



Saludos.

martes, septiembre 13, 2011

Microsoft, parte 4. El nacimiento de un imperio


Parte 1: Los inicios de Bill Gates.

Resumen de la parte 3: Microsoft contrata a buenos programadores, hace dinero con BASIC y piensa en FORTRAN como forma de crecer. Vuelta a Seattle.

En julio de 1979, Microsoft contrata un Director de Marketing (Steve Smith) mucho mayor que Bill Gates (Bill tenía 23 y Steve 34). Querían dar imagen de seriedad.

IBM estaba invirtiendo mucho dinero en crear un minicomputadora. No querían ser una más. Querían hacer la mejor de todas. Decidieron contratar la programación de un sistema operativo para los PC-s (Personal Computer) que iban a lanzar en 1981.

Como hemos visto, Microsoft se había iniciado con BASIC y estaba probando suerte con FORTRAN. Cada fabricante tenía su propio sistema y eso suponía que el interprete fuera diferente en cada máquina.

Cada vez que visitaban un cliente para venderle el BASIC le recomendaban que hablaran con un antiguo amigo de Gates de la época de la compañía "Computer Center Corporation" (ver parte 1, los inicios de Bill Gates).

Ese amigo recomendado era Gary Kildall que había desarrollado un sistema operativo llamado CP/M. La empresa de Kildall era Digital Research y merece también una entrada en la historia de la informática, pero esto será en otro momento.

Si los clientes de Microsoft adoptaran ese sistema operativo común, facilitaría el trabajo de Microsoft. Por reciprocidad Gary debía recomendar el BASIC de Microsoft.

El caso es que IBM decide incorporar el lenguaje BASIC de Microsoft y sus aplicaciones derivadas. Además de ello IBM quiere que desarrollen COBOL, FORTRAN y PASCAL.

El septiembre de 1980, Bill le dice a IBM que para que funcionen el resto de lenguajes debería hablar con Kildall para incorporar su Sistema Operativo.

ESTA PARTE DE LA HISTORIA ES MUY CONFUSA E INTERPRETABLE:

El máximo negociador de IBM, Jack Sams, según dijo él mismo, fue a la cita con Kildall pero no estaba. En otros sitios he leído que el matrimonio Kildall (la mujer de Gary también era de la empresa) no aceptó las claúsulas de confidencialidad y por eso no fueron. Una interpretación mía (sin ninguna base por cierto, pero la más lógica), es que tal vez la confidencialidad suponía que no supieran con quien iban a reunirse, y que por ese motivo decidieron no ir a la cita.

El caso es que IBM volvió a contactar con Microsoft. Microsoft tenía miedo de no poder cumplir en la implementación de todos esos lenguajes, y al final IBM, después de algunas reuniones, le encargó el desarrollo del sistema operativo a Microsoft.

Bill Gates se comprometió a proporcionar el S.O. en un año, pero empezaba de cero y era mucho trabajo. Se enteró de que Tim Paterson de la empresa Seattle Computer Products tenía un sistema operativo que llamaba 86-QDOS (Quick and Dirty Operating System). Bill Gates compró los derechos de uso del QDOS por 25.000 dólares. Antes del contrato con IBM adquirieron los derechos exclusivos por 50.000 dólares (esto me recuerda la película el ROBOBO DE LA JOJOYA).

En las negociaciones entre Microsoft e IBM, Microsoft se comprometió al desarrollo del BASIC, FORTRAN, COBOL y PASCAL, y para ello les ofrecía su sistema operativo.

IBM se comprometió a abonar un porcentaje a Microsoft incluyera o no su sistema operativo.

Luego ocurrió que el PC de IBM se desarrollo en la mayor parte por componentes de otros fabricantes (menos la BIOS que era propiedad exclusiva de IBM). Otros fabricantes empezaron a fabricar su computadoras compatibles sin tener que pagar nada a IBM.

En cuanto al software (sistema operativo, interpretes, etc.) eran propiedad de Microsoft que se hizo de oro vendiendo su MS/DOS a todos los fabricantes.

En 1980 IBM tenía 340.000 empleados y beneficios de 3.600.000.000 dólares.
Microsoft tenía 32 empleados.

Microsoft empezó en ese momento a hacer desarrollos propios para el PC. En la primavera de 1983 lanza Microsoft Word (entonces Multi-tool Word), pero esto es otra historia.

Saludos.

viernes, septiembre 09, 2011

Microsoft, parte 3. Trabajo a todo ritmo


Parte 1: Los inicios de Bill Gates.

Resumen de la parte 2: Microsoft desarrolla un interprete BASIC para un minicomputador (ALTAIR), y espera poder hacerlo para el resto del mercado a medida que surjan otros fabricantes.

Enseguida vieron que los aficionados al BASIC copiaban el programa. Hubo algunas entrevistas a Gates en las que se quejaba del "robo" del trabajo de Microsoft. Decía que estas copias ilegales afectarían a su trabajo impidiendo hacer software nuevo. Bill Gates cogió mala fama.

El grupo de desarrollo formado por Allen, Bill y otros se denominó Mikrokids. Trabajaban en Albuquerque menos Bill que seguía en Harvard. En 1976 se incorpora Marc McDonald al que conocían de la etapa del colegio de Lakeside.

Hicieron grandes clientes como el "National Cash Register Company" y "General Electrics".

Allen dejó el trabajo en MITS y empezó a trabajar en Microsoft a tiempo completo. Se incorporaron programadores muy conocidos como Albert Chu y Steve Woods para desarrollar FORTRAN. Bill y Allen pensaban que la programación derivaría hacia este lenguaje.

Así las cosas, Microsoft abrío su primera oficina cerca del aeropuerto de Albuquerque.

En 1977 Bill Gates deja definitivamente la Universidad. Veía que aquello iba a despuntar en los siguientes años.

Ese mismo año Commodore lanza el PET, Tandy el TRS-80 y Apple el AppleII. Necesitaban un lenguaje comun y Microsoft lo podía proporcionar, pero todavía tenían un contrato con MITS.

El propietario de MITS vende la compañía a la empresa Pertec, y los abogados de Pertec comunican a Bill Gates que no van a seguir comercializando BASIC y que tampoco pueden vendérselo a los que son competencia suya.

Los tribunales dieron la razón a Microsoft y de esta forma ya podían vendérselo a quien quisieran. No tenían ninguna competencia y venían versiones de BASIC por 50.000 dólares de la época. Sus clientes eran Commodore, Apple, Radio Shack, NCR, General Electric, Texas Instruments, Intel, etc. etc.

Se dice que trabajaban muchísimas horas, que incluso Bill se quedaba a veces a dormir en la oficina. El ambiente de trabajo era informal para los tiempos que eran. Nada de trajes, todo ropa cómoda, despachos decorados,...

A finales de 1978 la empresa ganaba dinero. Tenían 13 empleados y habían ganado un millón de dólares. Decidieron volver a Seattle y la mayoría de los empleados fueron con ellos.

No todo era perfecto. Al parecer Bill tenía un trato duro con los programadores. Les increpaba para que trabajaran más y más. Les decía que él lo haría mejor y más rápido...

La compañía creía, y Bill tampoco apreciaba a las secretarias que en su opinión no tenían conocimientos técnicos.

Luego tuvo problemas con el personal que le pedía el pago de las horas extra. Le denunciaron y tuvo que pagarlas. Es después de estos líos cuando llama a su amigo de Harvard, Steve Ballmer, para que le ayude en la dirección de Microsoft.

Se contrataba a gente joven de unas 20 universidades conocidas, y con buenas notas. No pagaban demasiado pero el ambiente era muy adecuado para la programación (horarios flexibles, horario nocturno para el que quisiera, ropa informal, etc. etc.). Los empleados también tenían opciones de compra de acciones.

Bueno, y mañana a ver si explico ya cómo le robaron la tostada a IBM.

Saludos.

miércoles, septiembre 07, 2011

Microsoft, parte 2. El nacimiento de Microsoft



Según dicen, Bill Gates metía todas las horas que podía en el centro de cálculo. Steve Ballmer debía ser parecido.

En noviembre de 1974 Paul Allen va a Harvard de visita. Había leído el último número de la revista "Popular Electronics" y en la portada aparecía un Altair 8800. Según Allen podía ser una computadora que todo el mundo podría utilizar. Le dijo a Bill (con 19 años) que esta máquina debería ofrecer un lenguaje sencillo como BASIC.

Bill y Allen ofrecieron al fabricante del Altair (MITS) desarrollar BASIC para su hardware, y se lo enseñaron en 8 semanas.

Los dos crearon Microsoft y firmaron su primer contrato con MITS. El objetivo era desarrollar el BASIC para las demás minicomputadoras que surgieran en el mercado.

Claro que Bill Gates tenía un gran asesor en casa (su padre), y ya había aprendido de sus experiencias anteriores. Eso hizo que se asegurara de que a pesar de vender los derechos de uso del BASIC a MITS, mantuviera la propiedad sobre el lenguaje.

Allen se desplazó a Albuquerque como Director de software de MITS.

Saludos.

viernes, septiembre 02, 2011

Microsoft, parte 1. Los inicios de Bill Gates


En la foto Bill Gates (nacido en 1955) y Paul Allen (del 1953). Bill es el que está de pie. Allen tiene dos años más que Bill. La foto es de 1970 en el colegio Lakeside. Allen está utilizando una consola de teletipo.

Normalmente, la gente cree que Bill Gates empezó en un mundo como el nuestro, y como la mayoría de nosotros. Vamos, pensamos que pertenecía a una familia de clase media y que las computadoras estaban extendidas. Por lo que he podido leer la familia de Bill en la época era de clase media-alta, y con gran influencia en su Seattle natal. Respecto a las computadoras, en la década de los 60 eran un bien valioso y de utilización limitada incluso para Bill Gates.


La familia de Bill


Hay gente que se ha molestado en obtener el árbol genealógico de Bill Gates. Lo podemos ver aquí. El autor ya dice que es un borrador, pero de lo que no hay duda, porque coincide con todas las fuentes, es que su bisabuelo era James Willard Maxwell (senior) un rico banquero, fundador del National City bank de Seattle en 1906. El hijo de este banquero fue James Willard Maxwell (junior), abuelo de Bill Gates por parte de su madre, y también banquero.


La madre de Bill Gates se llamaba Mary Maxwell (hija del banquero), y es muy importantes en esta historia. Fue muy importante para el imperio Microsoft, según se publicó en su obituario el 11 de Junio de 1994 en el New York Times: "Mary Maxwell ayudó a su hijo a crear Microsoft".


Los padres de Bill, Mary y William H. Gates (senior) eran dos figuras muy importantes en Seattle. Ella profesora en la Universidad de Washington y él un conocido abogado. Mary formó parte de varias ONG-s y por ejemplo fue la primera Presidenta de una ONG denominada "National United Way".


Y ahora empiezan las casualidades, porque mira por donde que el CEO de IBM, John Opel también pertenecía a esa organización que presidía la madre de Bill Gates.


Volvamos un poco atrás en el tiempo:


La adolescencia de Bill Gates y las computadoras:


Bill Gates y Paul Allen se conocieron en "Lakeside school". En su web podemos ver cosas tan curiosas como que hay un profesor por cada nueve alumnos, imaginaros lo que tiene que costar esto.


En 1968 el colegio con la ayuda económica de la asociación de padres, alquila un DEC PDP-10 (minicomputadora de última generación cuya primera unidad se vendió en 1966), a General Electric. Estas minicomputadoras se pagaban por uso. Lógicamente hubo chavales que en seguida se engancharon a la máquina (Bill Gates, Paul Allen y Kent Evans por ejemplo) y en pocos meses gastaron el dinero que tenían para todo el año, quedándose sin minicomputadora.


El caso es que con 14 años, Bill programaba el Tik-Tak-Toe (el tres en raya) con BASIC en un host que valía entonces varios miles de dólares.


Bill Gates el hacker:


El libro de David Marshall nos cuenta algunas anécdotas como estas:


Una empresa llamada "Computer Centre Corporation" ofreció al colegio la posibilidad de utilizar su PDP. Se contabilizaba el tiempo de uso y en función de ello se facturaba al colegio. Bill y un par de amigos encontraron la forma de aminorar la cuenta reduciendo la factura. El caso es que la empresa se dio cuenta y tras informar al colegio fueron castigados con seis semanas sin computadora. Vaya con Bill, ¡un hacker!


Bill Gates, el implacable joven de los negocios:


En 1970 la empresa "Computer Centre Corporation" quebró, y Bill y Kent Evans compraron algunas cintas de la misma. ¡Con 15 años ya pensando en negocios! Allen se enteró y se enfadó mucho, llegando a coger aquellas cintas. Bill le amenazó con denunciarle en los tribunales.


Bill Gates, el programador:


En 1971 una empresa llamada "Information Science, Inc." solicita al grupo de programadores del colegio que desarrolle un programa de nóminas. Ante las dificultades que tenían pidieron a Bill que se incorporara, haciendo un buen trabajo (siempre según David Marshall). Como pago a este trabajo consiguieron tiempo de proceso en otra computadora (en el libro no se detalla cual). El padre de Bill (el abogado) les ayudó a cumplir los trámites legales y se convirtió en su consejero jurídico.


Bill y Allen ganando dinero con la programación:


Luego a Bill y Allen se les ocurrió un programa para facilitar la lectura de los registro de pasos de vehículos en el tráfico de la ciudad. En aquella época (y ahora creo que también), se ponían unos tubitos de goma en las calles de grandes y pequeñas ciudades. Esas lecturas se recogían marcando papel continuo. Bill y Allen programaron un programa llamado Traf-O-Data con el que ganaron dinero.


Siguiendo el interés por los negocios Kent Evans y Bill Gates crean "Logic Simulation Company".


En mayo de 1972 el consejo escolar pide a Gates y Evans que hagan un programa para planificar las horas lectivas. Kent Evans falleció en esta época por un accidente en la montaña, causando una gran conmoción.


Con 17 años va a Harvard y se da cuenta de que no tan bueno en matemáticas como programando, por lo que pierde interés. Allí conocerá a Steve Ballmer.


Continuará...