El otro dia tonteando vi que buscando
futbol on-line
en google virtuamanager ¡¡ aparece el primero de la lista !!
Sinceramente no sé si es bueno o malo o regular, porque tampoco parece reflejarse en más entradas al juego. Ahi está el dato.
El otro dia tonteando vi que buscando
futbol on-line
en google virtuamanager ¡¡ aparece el primero de la lista !!
Sinceramente no sé si es bueno o malo o regular, porque tampoco parece reflejarse en más entradas al juego. Ahi está el dato.
Duck Typing (que podriamos traducir como ‘Tipado tipo Pato’) es un tipo de tipado usado en lenguajes de programación. El nombre viene de aquella frase que mas o menos dice ‘Si anda como un pato, grazna como un pato y huele como un pato entonces, es un pato’
(
en este punto, me acuerdo de un episodio de ‘El Principe de Bel Air’ en el que el primo de Will, Carlton, le intenta explicar al propio Will una obviedad con ese razonamiento. Algo más o menos asi:
- Pero Will, ¿Si anda como un pato, grazna como un pato y huele como un pato, que crees que es?
a lo que Will responde:
- No sé ¿una de tus novias?
)
El término se refiere a la capacidad que tienen algunos lenguajes de programación de hacer tipado dinámico incluso en tiempo de ejecución. Por ejemplo, en PHP podemos tener:
class Empresa
{
var $Nombre;
var $SedeSocial;
var $Telefono;
…
}
class Empleado
{
var $Nombre;
var $Codigo;
var $MovilAsignado;
…
}
function ImprimirNombre($el)
{
echo “El nombre es: {$el->Nombre}\n”;
}
luego podriamos tener
$empleado = new Empleado;
$empresa = new Empresa;
….
ImprimirNombre($empleado);
ImprimirNombre($empresa);
La llamada a ImprimirNombre funcionaria perfectamente tanto para empleados como para empresas. Si tuviesemos un objeto de una clase que no tenga una propiedad Nombre, la función fallaria en tiempo de ejecución. Es decir, el runtime del lenguaje debe realizar las comprobaciones cada vez que se haga la llamada a la función. En el lado positivo, el programador de turno no tiene que andar progrmando versiones de la función ImprimirNombre para Empleado y Empresa. Algunos dicen de esto que estás gastando ciclos de CPU a costa de ahorrar ‘ciclos de progrmador’ (es decir cuesta menos desarrollar programas pero cuesta mas ejecutarlo).
En C++ hay ‘Duck Typing’ en base a templates y funciona un poco diferente…
template
ImprimirNombre(T el)
{
printf(”El nombre es: %d\n”, el.Nombre);
}
Podemos llamara a esta funcion de la siguiente manera:
ImprimirNombre
o nos podemos ahorrar introducir el nombre de la clase (ya que el compilador ‘conoce’ el tipo de ‘objeto’ justo cuando está pasando por esa linea de código (en caso contrario, si no es capaz de determinar el tipo, seria causa de error).
ImprimirNombre(objeto);
El compilador, generará una copia de la función diferente para cada tipo diferente con que llamemos a la función.
Si objeto tiene una propiedad Nombre el compilador generará el módulo ejecutable, si no es asi, generará un error. Esta diferencia es importante, ya que se determina en tiempo de compilación si el programa es correcto o no.
He incluido un par de funcionalidades AJAX en virtuamanager.com.
- Al enviar mensaje a otro club no recarga la página sino que se limita a grabarlo en la base de datos y mostrar un mensaje de conformidad.
- Al meter un jugador a la cartera de jugadores.
Dado que el envio de mensajes es una de las funcionalidades más usadas (2.694 mensajes enviados el lunes 27/11) y que para generar la página de mensajes hacen falta unas 10 sentencias SQL, son unas 20.000 consultas MENOS que se hacen a la base de datos diariamente. Pero no solo hay ventajas para la administración del juego, tambien el usuario obtiene una mejor experiencia de uso de la aplicación ya que se disminuyen los tiempos de espera de carga de la página.
Leo en una entrevista a uno de los miembros (Ion Gaztáñaga)del comité que está trabajando en la librerÃa estándard de C++, que hay propuesta hecha sobre garbage collector (recogedor de basura). Es decir, alguien plantea añadir un recogedor de basura a C++.
Un recogedor de basura es un mecanismo por el que el sistema se hace cargo de liberar la memoria que el programa deja de usar liberando al programador de la necesidad de acordarse de hacerlo él. De hecho, uno de los problemas más comunes en programas hechos en C o C++ es el llamado memory leak (goteo de memoria) que es precisamente eso, memoria que no se libera durante la ejecución de un programa y que puede llegar a consumir los recursos de la máquina.
Existen multitud de lenguajes que usan recogedor de basura: Java (el lenguaje más usuado del momento), LISP, PHP… y sin embargo, la idea de meter recolección de basura en C++ no parece entusiasmar mucho.
Y es que aunque a primera vista puede ser buena idea la liberación automática de memoria (que de paso, libera al programador de tener que hacerlo), no es una libeación completa.
El recogedor de basura es un proceso que se ejecuta ‘de vez en cuando’ haciendo una pasada por la memoria asignada liberando la que ya no se usa. El problema es que se hace de vez en cuando lo que no garantiza que se vaya a realizar durante la ejecución de un programa.
Si bien esto es un problema, quizas en la prácitca no se presente como tal y si asà fuese, los lenguajes de programación que implementa un recogedor de basura, implementan métodos que permiten al programador llamarle cuando estime necesario liberando la memoria.
Un segundo punto quizás más importante que deja de lado el recogedor de basura, es la liberación de recursos asociados a la memoria pedida (y esto es especialmente cierto en programación orientada a objetos). En efecto, si programo una clase que abre y usa un fichero puedo dejar el fichero permanentemente abierto si NO ME ACUERDO de cerrarlo o cerrarlo en el destructor. El primer caso, exige del programador acordarse de llamar a la función que cierra el fichero (¿no es eso lo que intentábamos evitar?, en el segundo caso el destructor será llamado por el recogedor de basura justo antes de liberar la memoria pero, como no hay garantia de que lo haga en un intervalo de tiempo dado, es posible que tengamos el fichero abierto durante gran parte de la ejecución del programa (posiblemente interviniendo en el funcionamiento de otros móduos que necesiten ese fichero).
Personalmente, hace tiempo que aprendà que los recursos hay que abrirlos cuando se necesitan y liberarlos tan pronto como no hacen falta (esto incluye memoria, ficheros, enlaces a bases de datos…) lo cual choca frontalmente con el modelo que propone el recogedor de basura…
LISP (de LISt Processing) es un lenguaje funcional ideado hace casi 50 años por John McArthy y estrechamente relacionado con conceptos como la máquina de Turing, el cálculo lambda… y en general…
LISP es un lenguaje de programación en el que predominan, por encima de todo, los paréntesis. En la carrera, cuando lo estudiábamos, habÃa quien decia que LISP significaba Lost In Stupid Parenthesis (o una variante en castellano). Pues bien, muchos años después de esto me doy cuenta de que algo pasa con LISP.
Para empezar, en una conocida lista en internet con los lenguajes de programación más populares, LISP aparece en el puesto 16 (no está mal para un lenguaje de programación con cerca de 50 años).
En segundo lugar, grandes y respetados gurús del tema alaban sin cesar las virtudes del lenguaje. En particular:
- Paul Graham es uno de los mayores defensores del LISP y con razón; vendió su empresa que hacia software para montar tiendas virtuales por varias decenas de millones de dólares a yahoo, software hecho en… LISP (por cierto que su socio era Robert Morris creador del gusano Morris, uno de los primeros de Internet).
- Joel Spolsky cuenta como Google usa conceptos de LISP en sus programas y eso los hace masivamente escalables, tanto como para indexar internet (ojo, Google NO usa LISP si no que adapta conceptos de LISP a C++. Pueden verse estas ideas en una publicación de Google donde explica como hacen las aplicaciones).
En tercer lugar, ciertas caracterÃsitcas del lenguaje se hacen muy desables en ciertos lenguajes de alto nivel. Me refiero a las llamadas funciones lambda que no son otra cosa que pequeñas funciones sin nombre que se usan justo donde se necesitan. La recientÃsima especificación .NET 3.0 las soportará. Lenguajes como javascript tambien las soportan y de hecho en muchas librerias se hace un uso intensivo de ello (C++ se queda atrás en este aspecto aunque hay increibles aportaciones en la librerÃa boost sobre el tema (realmente es increible lo que consiguen realizar con templates alguna gente !!)).
Visto lo visto, lo mejor será al menos echar un ojo, y para ello quizás lo mejor sea empezar con Scheme (un dialecto de LISP) del que es posible descargarse un entorno de desarrollo completo y con cuantiosos ejemplos (¡¡ juegos !!) por si quedan dudas de lo que es capaz un lenguaje funcional.
Y para terminar, una pequeña función en Scheme. No es el ‘Hola Mundo’ pero casi:
(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))
Variaciones (informáticas) sobre la frase de Bruce Lee que aparece en un anuncio de coches:
Empty your memory, with a free()…
like a pointer!
If you cast a pointer to a integer, it becomes the integer,
if you cast a pointer to a struct, it becomes the struct…
The pointer can crash…, and can Overflow…
Be a pointer my friend…
Otro chiste (informático):
Sólo hay 10 tipos de personas en el mundo;
los que entienden binario y los que no.
Estoy procediendo a añadir nuevas caracterÃsticas AJAX al virtuamanager. Para ello he creado una nueva clase PHP con, de momento, dos funciones; una para tratar enlaces y otra para tratar botones submit de formularios. El funcionamiento de una y otra es sencillo. La clase comprueba si el navegador del cliente soporta o no AJAX. Si no es el caso, emite un enlace o un botón normales, en caso contrario emiteel código necesario para una transacción tipo AJAX.
La principal ventaja es que no tengo que llevar dos desarrollos para páginas AJAX o NO-AJAX, es el mismo fuente para ambos casos.
En principio, está disponible para usuarios de depuración pero intentaré extenderlo lo antes posible a todo el mundo junto con nuevas funciones.
En http://instacalc.com/ podemos realizar operaciones matemáticas en forma de expresiones que son evaluadas al instante.
Útil cuando tienes que hacer operaciones complicadas que necesitan de paréntesis operadores no convencionales, etc
Curiosa página para crear botones
http://www.buttonator.com/
¿Cuantas formas hay de inicializar un entero (digamos) en C++?
Pues tenemos la tradicional:
int n = 10;
y la Orientada a Objetos
int n(10);
Tambien seria valida:
int n = int(10);
De hecho es bastante común inicializar variables miembro asà en los constructores de clase:
class Prueba
{
int n;
public:
Prueba()
: n(10)
{
}
};
Desde hace unas semanas que estoy migrando el simulador de virtuamanager a C++ puro y duro. El simulador hoy por hoy mezcla codigo C (el simulador en sÃ) y C++ (el acceso a la base de datos). Se programó en C fundamentalmente por si llegado el caso se ejecutara en linux. Teóricamente la portabilidad de C es mejor que la de C++.
Sin embargo, visto como está funcionando el tema de la simulación (bien), he decidido pasarlo todo a C++ que me dará mayor oportunidad de realizar cosas nuevas y de paso he reorganizado el código que falta le hace.
Al hacer la migración a C++, he decidido usar C++ puro y duro lo que quiere decir que he usado las librerÃas C++ estandar. Estas librerÃas se llaman genericamente STL de Standard Template Library. Esta librerÃa las diseño Alexander Stepanov y pronto pasaron a ser parte de C++. Las clases y métodos de esta librerÃa forman parte de C++ al igual que la función strcpy forma parte de C. Esto quiere decir que un compilador de C++ que se precie deberÃa dar soporte a estas librerÃas.
Uso un conjunto limitado de funcionalidades de la librerÃa, a saber: vectores, iteradores, mapas y algún algoritmo. El vector funciona como un array dinámico donde podemos ir metiendo datos de acceso secuencial. Definiriamos un vector de enteros como:
vector ids;
…..
ids.push_back(100); // Añade al final del vector
ids.push_back(10);
ids.push_back(100);
El vector sobrecarga el operador [] de tal forma que es posible acceder de esta manera:
int suma = 0;
for(int n = 0; n < ids.size(); n++)
suma += ids[n];
Eso no estaria bien del todo. Aunque parezca que el bucle es correcto en realidad deberia ser:
int suma = 0;
for(vector::size_type n = 0; n < ids.size(); n++)
suma += ids[n];
El método size devuelve realmente una variable del tipo vector::size_type . El Visual 2005 se limita a dar un warning si ponemos la variable int directamente pero si lo ponemos de la manera correcta, el código tiende a hacerse mas y mas complicado.
STL propone usar iteradores para recorrer los contenedores (vector en este caso pero que podria ser un mapa o una cola y la forma de recorrerlo seria equivalente). Seria algo asi como:
vector::iterator it;
int suma = 0;
for(it = ids.begin(); it != ids.end(); it++)
suma += *it;
una vez mas hay que usar nombres (vector::iterator) de tipos un tanto crÃpticos.
La solución a este ‘pequeño’ problema probablemete venga de la mano de la próxima versión del lenguaje. Esta versión (cuyo nombre clave es C++ 0x) tiene previsto usar la palabra reservada auto (que nadie usa) de la siguiente manera.
int suma = 0;
for(auto it = ids.begin(); it != ids.end(); it++)
suma += *it;
Dado que el compilador ’sabe’ en tiempo de compilación el tipo que devuelve ids.begin() asigna este tipo a la variable destino (it en este caso) y ahorra el trabajo al pobre programador.
Por desgracia parece que la nueva revisión del lenguaje C++ no llegará hasta el 2010, por lo que habrá que esperar con paciencia…. o usar Visual C++.NET 2005 que se ha sacado de la manga una construcción muy usada en otros lenguajes.
int suma = 0;
for each(int element in ids)
suma += element;
Sin duda la mejor solución… pero poco estandard.
Encuentro que existe una compañia (Webaroo) que se ha dedicado a comprimir las búsquedas más usuales de internet en 40 Gigas para poder seguir realizando búsquedas incluso sin conexión a internet. Al parecer hay portátiles con este software instalado que te permitirÃan seguir buscando sin conexión a la red.
El software se descarga en:
http://www.webaroo.com/rooDownload.html
Hacia tiempo que no se actualizaba el google Talk (la aplicación de mensajerÃa instantánea de google) y lo hace ahora introduciendo avatares en su producto. Los mismos avatares que han hecho tan populares otros sistemas de mensajerÃa como yahoo y el messenger de Microsoft.
Uso GoogleTalk desde hace tiempo y si uso este y no otro fué porque uso gmail como correo web (antes usaba yahoo, pero me sedujo la aplicación Ajax del correo de google). Esperemos que en un próximo paso google incorpore a su cliente la posibilidad de chatear con gente de yahoo y messenger (aunque existen otros productos que lo permiten).
El otro dÃa di con este enlace:
En el un tipo asegura haber ganado 1.000.000$ en tres meses con AdSense…. y parece que es cierto que hay peña que se hace rica con este invento. Con el vManager, no espero ganar tanto pero si ayudar a su economÃa.
El sitio principal de adsense es www.google.com/adsense ahà te das de alta y el programa te da unas lÃneas javascript a incluir en tu página web. Esas lineas de javascript se ejecutan cada vez que alguien carga tu página y le piden a google anuncios. Si google no sabe de que va la página puede emitir anuncios de interés general. Google puede enviar un robot a la página para ver de que va y asà a la próxima tener una idea clara de lo que va la página. Si ya sabe de lo que va la página, google emite anuncio relacionados con el contenido.
Lo complicado es atraer anuncios jugosos y que la gente clicke en ellos. Este punto exige algo de investigación. Es posible que google ‘lea’ la página entera y extraiga el contenido o que lea los tags de la página o ambas cosas…
Investigando un poco más he encontrado google sitemaps
que te da una idea de qué palabras te posicionan mejor en la red. En mi caso obviamente ‘virtuamanager’ me coloca en el número uno, pero me ha extrañado encontrar que soy el septimo o noveno con ‘amaral dias de verano tabs’ que mezcla palabras de dos apuntes de este blog (supongo que el ponerlo de nuevo como acabo de hacer refuerza mi posición…(?) )
De momento he puesto tanto el sitio matriz como el foro con anuncios (discretos, eso si) de google a ver por donde tira el tema. Veremos.
He encontrado esto a ver si vale (realmente no sé ni lo que es):

My blog is worth $564.54.
How much is your blog worth?
Como leà en una ocasón:
La loterÃa es el impuesto especial para la gente que no estudió/aprobó estadÃstica
a lo que yo añadirÃa:
La loterÃa de Navidad es ese sorteo que cada 10 años te toca el reintegro
Y es que cuando llegan estas fechas y el calvo de la loterÃa (al que ya muchos empiezan a confundir con el mismÃsimo niño Jesus) aparece en nuestros televisores, es hora de rascarse los bolsillos.
Y es que ¿qué hace que gente que no juega a la loterÃa en todo el año compre de manera compulsiva para el sorteo de Navidad? Me atreverÃa a decir que no es más que la envidia la que mueve los bombos con las bolas.
¿Y si toca aqui? reza el eslogan de la loterÃa de Navidad que cada verano martillea al veraneante en cualquier punto de nuestra geografÃa.
- ¡¿Y si toca aqu�! ¡¡ Dios mio tengo que comprar !!
Y asÃ, el veraneante de turno que no soporta el hecho de que la suerte se pose en el mismo sitio donde él, a su vez, posó sus posaderas, compra el décimo de marras.
Pero la mayor parte de culpa del gasto loteril la tienen las empresas. El maldito número que juega toda una empresa es el que nos empuja a comprar. La sóla idea de que les toque a tus compañeros y a ti no (con la consecuente cara de …. ) es insoportable para el empleado medio. Y asà se lanza a la compra de loterÃa de la empresa.
- “Este año tenemos loterÃa de nuestras delegaciones provinciales ¿alguien quiere?” - dijo el encargado de personal
En cuanto alguien dice “¡¡ YO !! (no soportarÃa que les tocase a los de Barcelona)” el pescado está vendido.
Luego te llega la llamada del ex-compañero de la empresa que dejaste hace años (que curiosamente él también dejo hace tiempo):
- Oye, tengo loterÃa de _________________ ¿quieres compartir?
- Eeehhhh….. bueno
Y para colmo los que dicen:
- Voy a pillar loterÃa del bar donde desayunamos todos los dÃas
- Hay otro bar al lado ¿y si toca en ese?
- Ya, pero yo desayuno en el otro ¿quieres ir a medias?
- No…. bueno si
En fin, que tengo un montón de números equiprobables y estaré atento al sorteo del 22 porque….
¿Y si toca aqui?
PD: Otro dÃa hablaré de por qué toca siempre la loterÃa en La Bruixa D’Or
Ha salido por fin la nueva versión de Firefox la 1.5… Incorpora pequeños cambios con respecto a la versión anterior del, cada vez más, popular navegador. El más sustancial, a mi juicio, es que ahora puedes reorganizar los tabs de navegación simplemente pulsando y arrastrándolos a la posición que deseas. Cuando te acostumbras a usar los tabs para navegar, el poder organizarlos es una mejora sustancial. Como ya apunté en un post anterior, la próxima versión de explorer traerá la navegación con tabs ‘de serie’ y es que una vez que los pruebas no puedes dejar de usarlos. De vez en cuando uso el iexplorer (para debug y esas cosas) y se me va la combinación de teclas para crear un nuevo tab (Ctrl+T) y me doy de bruces con la realidad. El iexplorer no tiene tabs.
Mientras llega iexplorer recomiendo usar firefox que hoy por hoy y a mi juicio es el mejor exploredor para internet.
Esta es la vista desde la terraza de mi casa…

No tendrÃa nada de particular si no fuera porque está tomada hoy dÃa 4 de Diciembre. A menos de un mes para el inicio del invierno los árboles de todo Madrid están llenos de hojas aún. Y eso que ya ha habido algunos dÃas de frÃo en la ciudad… ¿qué está pasando?