Instalar Ubuntu 12.04 Precise Pangolin en Virtual Box

Si eres usuario de Virtual Box y has intentado instalar la versión i386 de Ubuntu 12.04 (o en mi caso Kubuntu) en una máquina virtual te habrás encontrado con que «El kernel necesita algunas características que no están presentes en el CPU: pae…» ¿cómo solucionar esto? (tranquilo no va a ser una entrada larga):

En la versión de 32 bits de Ubuntu 12.04 se usa por defecto el Kernel PAE, por eso te está puteando la máquina vritual, porque en Virtual Box viene deshabilitado en principio. Ya puedes respirar tranquilo, se soluciona, y sin ningún problema: Te vas a la configuración de la máquina virtual, al apartado Sistema. Allí seleccionas la pestaña Procesador y en ella buscas el checkbox llamado Características Extendidas y marcas Habilitar PAE/NX.

Sólo con esto ya debería funcionar, así que ahora disfruta de tus pruebas con Linux, trasteando con máquinas virtuales.

Magento vs PrestaSHOP

Aunque mi experiencia con CMS para tiendas on-line no es muy amplio es habitual tener la duda a la hora de desarrollar una sobre cual utilizar, por lo que creo interesante hablar de estos dos gestores: Magento y PrestaSHOP. De OSCommerce no he visto mucho, pero algún camarada me lo ha puesto a parir por ser demasiado farragoso.

Así que toca hablar de los puntos fuertes de los dos:

Magento: Magento es el Rolls Royce de las tiendas on-line: permite versión para teléfono móvil (no se si PrestaSHOP ya lo permite, pero cuando yo lo utilicé todavía no), organizar nuestra tienda online en varias vistas y sitios web (se decía que PrestaSHOP 1.5 ya integraría esto, pero tampoco lo trabajé con esa versión), tiene una gestión de los atributos de los productos cojonuda, una cantidad de módulos impresionante (eso sí, la mayoría de pago y algunos muy caros) y su integración con ERP’s es muy buena.

PrestaSHOP: Su gestión de estadísticas es muy completa, incorpora infinidad de herramientas de marketing (que en Magento son módulos de pago), es más usable para el usuario (bueno, aquí no necesariamente, pero suele serlo), permite una mejor comunicación entre administradores y usuarios por su CRM ligero y tiene una comunidad de usuarios mayor (clave a la hora de solucionar problemas).

Claro, dicho así uno se pregunta ¿por qué voy a usar PrestaSHOP si Magento es más potente? Ahora llegamos al punto principal. Sí, Magento es mucho más potente pero tiene los siguientes handicaps:

  • Desarrollo: Magento tiene una estructura compleja, requiere «tocar» muchas cosas para hacer modificaciones, tiene una curva de aprendizaje muy pronunciada y requiere que el programador conozca bastante bien el modelo EAV y Zend Framework, y puede llevarle un par de meses dominar Magento. En cambio, cualquier programador PHP puede estar trabajando con PrestaSHOP sólo en un par de semanas.
  • Rendimiento: Si tienes los creo que 15.000 $ que cuesta la licencia de pago de Magento, lograrás que este no le envidie nada a PrestaSHOP en agilidad. Pero como hablamos de las versiones gratuitas, en este campo también barre PrestaSHOP. Se recomienda tener el back office de Magento en un servidor distinto al del resto de la tienda para lograr un rendimiento decente… con esto te digo todo. El cambio, cualquier hosting profesional mueve PrestaSHOP sin problemas.
  • Administración: Ya hemos dicho que Magento tiene más módulos y más opciones en su back office. Pero claro ¿qué implica esto? Mayor dificultad a la hora de aprender a utilizar la tienda. La curva de aprendizaje para el administrador es más pronunciada que en PrestaSHOP.

Entonces ¿cual es la mejor opción? Pues si tienes una tienda pequeña y no esperas que el negocio crezca mucho lo normal, suponiendo que esto implicará que no quieres/puedes invertir mucho en la tienda, tu opción es PrestaSHOP. Si tu negocio ya es muy grande (hablamos de tiendas que oferten una cantidad muy grande de productos y con varios miles de visites al día) entonces tendrás que meter más pasta e invertir en Magento.

Número aleatorios en C

No es tan extraño verse en la situacion de tener que generar números aleatorios en C. Mi primer programa en C no «académico» era un programilla de consola que generaba fichas de PNJ’s aletorios para Runequest. Elegías una criatura y un «nivel» (criatura flojilla, del montón, poderosa y fuckin’ master) y te mostraba sus características mediante números aleatorios. No es muy habitual que en un programa corporativo o una aplicación del sistema tengamos que usar números aleatorios, pero sí lo puede ser a la hora de programar un juego, una aplicación de sonido (lista de reproducción aleatoria, algún efecto se sonido psicodélico) o una para tratar imágenes (para un filtro artístico).

La función rand() nos devuelve un número entre 0 y el número más alto que pueda generar el sistema. Como lo habitual es que no queramos un rango tan alto, podemos reducirlo utilizando la operación de módulo. Por ejemplo, para obtener un número entre 0 y 10 haríamos x = rand() % 11, y para uno entre 0 y 100 x = rand() % 101.

Si te estás parando a leer esto supongo que tienes ciertas inquietudes al respecto de la programación, por lo que ya sabes que el ordenador no puede inventarse un número al azar. Hasta la actualidad (y por suerte, como sabemos todos los amantes del género cyberpunk) los ordenadores no pueden crear por si mismos. Para la generación de valores aleatorios se necesita pasarle un valor a la función rand() que funcione como semilla, un primer número que permita generar el resto a partir de él. Usando un valor constante el programa siempre generaría los mismos valores, así que la raíz tiene que ser algo cambiante. Una opción suele ser coger el número de proceso del sistema (tiene un fallo, porque si haces varias llamadas a la función principal sin cerrar el programa será como usar una constante), aunque lo mejor suele ser coger los datos del reloj del sistema, ya que al ir ajustado hasta la milésima de segundo es muy poco probable que se coja el mismo valor dos veces seguidas. Para definir la semilla utilizaremos la función srand(), pasándole como parámetro la función time().

Para usar las funciones rand() y srand() debes incluir la librería stdlib en la cabecera de tu proyecto, y para time() la librería time. En el siguiente ejemplo podréis ver cómo generar aleatoriamente un número entre 6 y 12.

#include stdio.h
#include stdlib.h
#include time.h

main(){
int numero; // el número a imprimir

srand(time(0));
numero = (rand() % 7)+6;

printf("El número a imprimir es %d\n",numero);

}

Punteros en C

Uno de los conceptos más complejos del lenguaje C, por lo abstracto de los mismos, es el de los punteros. Su principal utlidad está en que nos permiten hacer una asignación dinámica de memoria.

Un puntero realmente no es más que una dirección de memoria, que normalmente lleva asociado un tipo de datos. Por ejemplo un puntero a entero, que será una dirección de memoria donde podemos almacenar un entero. Para designar un puntero sólo tenemos que poner, en la declaración, un asterisco (*) entre el nombre de la variable y el tipo de datos, tal que así:

int *primero; //declaramos un puntero a entero
int* segundo; //el asterisco puede ir en cualquiera de los dos lados
float *tercero; //y podemos declarar flotantes, caracteres, ficheros...

Para reservar la memoria necesaria utilizaremos la función malloc, abreviatura de memory allocation, pasando como parámetros el tamaño que queremos reservar. La función sizeof() nos puede ayudar mucho, ya que por ejemplo sizeof(int) nos devolverá el tamaño de un entero. Ojea este ejemplo, donde decimos que en la dirección apuntada por el puntero primero vamos a guardar la cantidad de enteros definida en la variable cantidadX:

primero = (*int) malloc(cantidadX*sizeof(int));

Para usar malloc debemos incluir la librería stdlib.h al principio del código. Después de usar malloc se debe usar free para liberar la memoria asignada dinámicamente.

El siguiente es un ejemplo del manual de introducción a C de Nacho Cabanes que ilustra un poco todo esto:

/*---------------------------*/ 
/*  Ejemplo en C nº 73:      */ 
/*  c073.c                   */ 
/*                           */ 
/*  Manejo básico de         */ 
/*  punteros                 */ 
/*                           */ 
/*  Curso de C,              */ 
/*    Nacho Cabanes          */ 
/*---------------------------*/ 
 
#include <stdio.h> 
#include <stdlib.h> 
 
main() { 
  float n1;           /* Primer número, estático */ 
  float *n2, *suma;   /* Los otros dos números */       
   
  n1 = 5.0;           /* Damos un valor prefijado a n1 (real) */ 
  n2 = (float *) malloc (sizeof(float)); /* Reservamos espacio para n2 */ 
  *n2 = 6.7;          /* Valor prefijado para n2 (puntero a real) */ 
   
  suma = (float *) malloc (sizeof(float)); /* Reservamos espacio para suma */ 
  *suma = n1 + *n2;   /* Calculamos la suma */ 
   
  printf("El valor prefijado para la suma era %4.2f\n", 
    *suma); 

printf("Ahora es tu turno: Introduce el primer número "); 
  scanf("%f",&n1);   /* Leemos valor para n1 (real) */ 
   
  printf("Introduce el segundo número "); 
  scanf("%f",n2);    /* Valor para n2 (puntero a real) */   
 
  *suma = n1 + *n2;  /* Calculamos nuevamente la suma */ 
   
  printf("Ahora la suma es %4.2f\n", *suma); 
 
  free(n2);          /* Liberamos la memoria reservada */ 
  free(suma); 
} 

A la hora de meternos en la aritmética de punteros cabe destacar que, en estos casos, los operadores unarios de incremento y decremento no funcionan como una variable estática. Por ejemplo, si tenemos un puntero i y ejecutamos i++, el valor de i no se incrementará en uno, lo que ocurrirá es que la dirección a la que apunta el puntero se incrementará, apuntando hacia el siguiente elemento (Por ejemplo, si i es un entero y apunta a la posición 1000, i++ le hará apuntar a la posición 1004 en un sistema de 32bits, donde un entero ocupa 4bytes). Si queremos incrementar el valor almacenado en el puntero i debemos acceder a él, por lo que deberíamos haber usado (*i)++. Hay que tener cuidado con esto, porque si movemos accidentalmente la posición del puntero podríamos apuntar a una posición de memoria sin reservar que haga romper el programa.

En la página de Nacho Cabanes que os cité antes, y de la que saqué el ejemplo, tenéis un manual muy bueno y claro de introducción a C. No dudéis en descargarlo o en consultarlo on-line cuando lo necesitéis, porque es muy bueno.

Creando un menú de navegación con jQueryMobile

Crear un menú de navegación con jQueryMobile, adaptando la web para una mayor usabiliad en dispositivos móviles, no es complicado.

El primer paso consiste en declarar el atributo data-role del div como navbar. Dentro de este metemos una lista desordenada (ul) y en cada elemento (li) de la misma añadimos un enlace, apuntando a la página a la que tiene que ir. A los enlaces no hay que definirles data-role.

Para cambiar el color de los botones usaremos el atributo data-theme (en el ejemplo data-theme=b para ponerlos de color azul), si no lo hacemos serán del mismo color que la cabecera. Una de las ventajas de jQueryMobile es que definiendo la clase ui-btn-active se un estilo más claro al botón seleccionado, sin que tengamos que currarnos un CSS para ello.

Recuerda también definir el data-icon para que el botón quede más bonito.

<header data-role="header"> 
    <h1>SJV Town Hall</h1>
    <div data-role="navbar">
        <ul>
             <li>
                 <a href="#inicio" class="ui-btn-active" data-icon="home" data-theme="b">Inicio</a>
             </li>

             <li>
                 <a href="#favourites" data-icon="star" data-theme="b">Favoritos</a>
             </li>

             <li>
                 <a href="#contactos data-icon="grid" data-theme="b">Contactos</a>
             </li>
         </ul>
       </div>
</header>

En el ejemplo puedes ver un poco de todo lo que hemos comentado arriba.

Nuevas etiquetas en HTML5

No nuevas que se hayan añadido ahora, me refiero a nuevas en en el sentido que son las que aporta respecto a HTML 4. La lista es la que sigue


<article></article>
<aside></aside>
<audio></audio>
<canvas></canvas>
<command></command>
<datalist></datalist>
<details></details>
<dialog></dialog>

<figure></figure>
<footer></footer>
<header></header>
<hgroup></hgroup>
<mark></mark>
<meter></meter>
<nav></nav>
<output></output>
<progress></progress>
<ruby></ruby>
<rp></rp>
<rt></rt>
<section></section>
<source></source>
<time></time>
<video></video>

Las etiquetas audio y vídeo ya fueron explicadas en este blog, como también lo fue canvas y otras varias en el artículo sobre estructura en HTML5.

Convertir fechas de formato MySQL a español en PHP

Uno de los problemas al recuperar una fecha desde MySQL es que te la devuelve en formato aaaa-mm-dd, el cual tiene su lógica a la hora de hacer comparaciones de fechas, pero es un pelín engorroso y raro mostrarlo así en pantalla. Antaño usaríamos una expresión regular para arreglarlo pero en PHP 5 hay una solución mejor, por lo que he actualizado el artículo (por eso y porque en la solución antigua usaba ereg que actualmente es una función obsoleta), ya que con un objeto DateTime se acaba el mamoneo:

/////////////////////////////////////////////////// 
//Convierte fecha de mysql a español 
//////////////////////////////////////////////////// 
function cambiaf_mysql($fechadb){
//vamos a suponer que recibmos el formato MySQL básico de YYYY-MM-DD
//lo primero es separar cada elemento en una variable
   	list($yy,$mm,$dd)=explode("-",$fechadb);
//si viniera en otro formato, adaptad el explode y el orden de las variables a lo que necesitéis
//creamos un objeto DateTime (existe desde PHP 5.2)
   	$fecha = new DateTime();
//definimos la fecha pasándole las variabes antes extraídas
        $fecha->setDate($yy, $mm, $dd);
//y ahora el propio objeto nos permite definir el formato de fecha para imprimir que queramos       
   	echo $fecha->format('d-m-Y');
}

Como podéis ver la cosa es sencilla. Sobre todo para el tema de insertar fechas desde PHP a MySQL. Porque si vuestra cuita es mostrar en pantalla la fecha formateada, también podéis pedir que MySQL os la devuelva con el formato que queráis. Basta con usar la función date_format() en la query de la select. En el ejemplo vamos a pedir que nos devuelva la fecha con el formato español ya:

SELECT DATE_FORMAT(campo_fecha,'%d/%m/%Y') FROM tabla

Ale, artículo actualizado para vuestro gozo y disfrute.

URI schemes en HTML 5

Al hablar de URI schemes hablamos de recursos que invocan aplicaciones ya instaladas en un dispositivo móvil y que nos permiten volcar ciertas funcionalidades en ellas, haciendo así más natural y fluída la navegación para el usuario. Aquí vamos a ver el uso de dos de las más básicas: hacer uso del sistema de SMS del teléfono y llamar a un número de teléfono.

  • SMS: Permite enviar rápidamente un mensaje de texto, indicando en el enlace un número e incluso el cuerpo del mensaje. Recuerda que debes poner el código del país antes del ńúmero, por aquello de la internacionalización. El marcado html sería:
    <a href="sms:666777888">Cuerpo del mensaje</a>
    
  • Teléfono: En este caso el enlace nos permitirá hacer una llamada a un número. Como en el anterior acuérdate del código del país antes del número. El marcado sería:
    <a href="tel:666777888">666777888</a>

Esto son ejemplos muy básicos, pero hay gran variedad de opciones: schemes para Facebook, Twitter, Pinterest… Existen múltiples schemes ya creados para iPhone, Android o HTML5 que podéis buscar en la web.

En fin, espero que os sirva de ayuda a los que como yo os estéis iniciando en la programación para dispositivos móviles

Algunos apuntes para el Draft de la NBA 2012

Una pequeña serie de apuntes para este draft:

  1. El número 1 está clarísimo, Anthony Davis, de quien se dice que será el próximo Garnett
  2. Mientras que el año pasado hubo un draft plagado de internacionales, este año en cambio la mayor parte de los previstos para primera ronda serán americanos.
  3. Un potencial robo puede ser Tomas Satoransky en segunda ronda, su temporada ACB ha sido magnífica, pero en un equipo pequeño no ha hecho mucho ruido.
  4. Meyes Leonard podría estar en el top 10 de un draft con pocos pivots. No confío en él, podría ser el próximo pivot bluff, aunque también pienso que podría ser un jugador interesante en Europa, pero para la NBA lo veo blando para defender aunque es muy ágil y rápido, puede que simplemente me lo parezca porque esté verde, pero me reitero en que no me convence. Es más, diría que Tyler Zeller, que en principio apuestan a que saldrá elegido por debajo en el draft, tiene mejor proyección.
  5. Ojo a Austin Rivers, parece que no se confía mucho en él, pero tiene un enorme potencial si supera sus caprichos de niño mimado.
  6. Parece que Jeremy Lamb puede ir a Toronto, pero si finalmente se hacen con Rudy Gay o André Iguodala podría formar parte de algún traspaso.
  7. Los Nets no tienen elecciones en la zona alta por su política de fichajes, a pesar de su mala campaña. Ojo porque podrían ser una de las franquicias que estén metidas en alguna operación grande.
  8. New Orleans tienen el 1 y el 10, pueden salir muy reforzados y ser un equipo peligroso a dos años vista, como pasó con Oklahoma, que en cuatro años han pasado de perdedores a finalista de la NBA.
  9. Portland tienen el 6 y el 11, y están en pleno proceso de reconstrucción. Dicen que Andre Drummond y Austin Rivers (dos de mis apuestas personales) podrían ser esos elegidos. Pero ¿seguirá Drummond la maldición de los pivots de Portland?
  10. Kostas Papanikolau será probablemente segunda ronda. Todavía no tiene mucho nombre pero su actuación en la final de la liga griega y la final de la Euroliga le han convertido en una de las grandes revelaciones europeas del año. Podría ser una buena apuesta para un equipo con visión.
  11. Josep Franch podría ser elegido por San Antonio en las últimas plazas de la segunda ronda. Tras todo lo que prometía en la Penya y  con la selección sub-20 su año en Murcia no ha sido tan bueno como podría esperarse. No creo que de el salto este año, pero nunca se sabe. Es un base de la vieja escuela, y podría foguearse siendo el relevo de Tony Parker.
  12. Michael Kidd Gilchrist podría ser el número 4 o 5. Uno de los jugadores universitarios más completos, muy similar a Gerald Wallace. Si acaba en Cleveland pude ser un gran complemento para Kyre Irving.

Cinco inmortales clásicos de los videojuegos

De mi serie «Cinco… indispensables» hoy toca hablar de videojuegos clásicos, y recalco lo de clásicos. Ya hablamos por aquí de juegos para Linux o de juegos Indie, pero hoy toca homenajear a cinco clásicos del noveno arte. Juegos que han marcado a mucha gente y que son a este género lo que El Padrino al cine, Watchmen al tebeo o British Steel al heavy metal.

  • La Abadía del Crimen: Hace poco, realizando un trabajo de documentación para un proyecto personal, leía que España en los 80 fue uno de los países de Europa donde la producción de videojuegos generaba más puestos de trabajo. Parece que antes del ladrillo y la especulación la gente era capaz de lanzarse a proyectos arriesgados y ambiciosos. Opera Soft fue una de las empresas surgidas en esa vorágina que, en 1987, lanzó esta aventura inspirada en El Nombre de la Rosa de Humberto Eco. Como no tenían los derechos del libro modificaron un poco los nombres, pero la idea es la misma: investigar los asesinatos acaecidos en un monasterio mientras realizas las diarias labores monacales. El juego estaba disponible para Amstrad, Spectrum, PC y MSX. Como curiosidad, un fan hace un par de años hizo un remake en Java para Windows (no se si lo habrán portado también a Linux) que podréis encontrar en este enlace. Si queréis volver a disfrutar del clásico, con la opción de hacerlo con los gráficos a 4 colores originales o con 256 colores, es vuestra oportunidad.
  • Super Mario Bros: A pesar de que soy un defensor de los galápagos, nunca tuve piedad con las tortugas en este emblema de Nintendo. El Super Mario original sigue siendo uno de los vieojuegos más divertidos y adictivos, que te puede dar horas de diversión (o acabarse en minutos como en este vídeo) si eres un amante de los plataformas clásicos. Un monstruo reptiliano secuestra a una princesa y un fontanero stalinista adicto a las setas la rescata… Así salimos los que nos viciamos a este juego en nuestra infancia, claro.
  • Donkey Kong: Un clásico, no en vano fue el primer videojuego al que pude jugar, en el Amstrad de mi primo. El mismo fontanero stalinista de antes, pero en este caso ascenciendo una suerte de andamio para salvar a otra princesa (no es la misma que la del Mario Bros) de un gorila que lanza barriles. Este juego provocó un juicio contra Nintendo por los derechos de autor sobre King Kong, donde se llegó a la conclusión de que el personaje ya había pasado al dominio público. Diversión sencilla pero adictiva en un juego que marcó una época. Donkey Kong Comodore.
  • Tetris: Algo tan simple y tan efectivo sólo podía venir de la URSS. Caen piezas, tienes que formar líneas para que se destruyan, si llegan a la parte de arriba de la pantalla pierdes… Se creó el 6 de juno de 1984, de la mano de Alkséi Pázhitnov, y fue Nintendo quien lo patentó dos años después. Su original música junto a su mecánica simple, pero con una dificultad que crece nivel tras nivel, planteando al usuario el reto de superar no sólo a otro jugador, sino su propia capacidad, le hacen uno de los juegos más populares de la historia. Todavía a día de hoy muchos programadores noveles hacen versiones de este juego para aprender a programar entornos gráficos interactivos, siendo el juego más versionado de la historia y vendiéndose aun a día de hoy muchas imitaciones del mismo.Imitación del Tetris
  • Manic Miner: Aunque parecía que lo propio sería meter al Pac-Man o al Pong en esta lista… pues me salgo por la tangente y recupero el olvidado Manic Miner. Conozco a un tío que dice haber quemado la recreativa del juego a base de jugar horas y horas (y conociéndolo, me lo creo). Originalmente editado para ZX Spectrum, fue el primer juego donde el desarrollo de la partida estaba acompañado de una melodía. Nos pone en la piel de un minero que tiene que recorrer 20 niveles en un entrono muy colorista, toda una revolución para su época. Puro vicio, puro y duro.

Una lista más ochentera que la banda sonora de Rock of Ages con juegos que han enganchado a más gente que alguna droga de diseño. Está claro que no hay grandes gráficos, no hay sesudos argumentos en la mayoría (exceptuando La Abadía del Crimen, claro) pero… ¿quién se resiste a unas partiditas?