Elementary 01: Cambio de color

El primer post de Elementary. Esto es muy sencillo, simplemente un poco de javascript. Es una página web con un listado desordenado html.

El listado contiene alguno de los colores que están predefinidos en todos los navegadores

El funcionamiento es simple; en la página hay un elemento p con un identificador llamado message, al pulsar sobre alguno de los elementos de la lista se llama (por medio del evento onclick)a una función javascript llamada changeColor y se le pasa el color en el que se ha pulsado como argumento de la función.

La función se encarga de cambiar el color al elemento p por medio de su identificador.

Y ya está.

Pinceladas

La función javascript

1
2
3
4
5
<script type="text/javascript">
        function changeColor(c) {
            message.style.color = c;
        }
</script>

El elemento que cambia de color

<p id="message">
        Welcome!</p>

El listado con los elementos que indican el color

?Download list.html
1
2
3
4
5
6
<ul id="color">
        <li onclick="changeColor(this.innerText);">Black</li>
        <li onclick="changeColor(this.innerText);">Red</li>
        <li onclick="changeColor(this.innerText);">Aqua</li>
        <li onclick="changeColor(this.innerText);">Fuchsia</li>
    </ul>

La página aunque es muy sencilla la he podido probar sin problemas en IE9, Google Chrome 18.0.1025.168 m, pero no funciona en Firefox 12, avisados quedais.

Puedes descargarte la página web completa de aquí:

O probarla aquí

Update
Gracias @davidmatas,
aquí la descarga:

O probar aquí
Y porque no hay dos sin tres, la versión jQuery a petición de @albertofs
Descarga:

Probar aquí

Comments (2)

Elementary Category

He creado una nueva categoría en el blog. ¡Déjate de crear categorías y a ver si escribes algo más!, si, bueno, eso también.

Ando un poco liado y la verdad es que no saco tiempo para casi nada. Pero preparando una certificación he visto que podría hacer unas entradas cortas, básicas, elementary :) sobre desarrollo web.

En principio y echando un vistazo por encima a lo que voy viendo serian de javascript, jquery, css, asp.net, .net, algo muy básico, como pequeñas píldoras, rápido y sencillo.

Espero que las disfruteis.

Leave a Comment

Web User Controls, ViewState y otras cosas del querer

La verdad es que trabajar con Controles de usuario es una gozada. Pero puedes encontrarte dos casos, aquellos controles de usuario que simplemente pintan algo, los cargas al principio y se ven en la página, fácil y rápido. El otro caso es cuando utilizas controles de usuario con los que después quieres trabajar en las idas y venidas de la página, la cosa es fácil, pero con orden y buena letra.

Trabajando con WebForms de ASP.NET, hay que tener en cuenta el ciclo de vida de la página, o te pasarás horas viendo como los controles que pusiste en un contenedor (Panel, PlaceHolder…) cuando vienen de un PostBack han desaparecido y no sabes por qué.

Vamos por pasos.

  1. Crea un Sitio Web WebForm vacio, yo le he puesto como nombre WebSiteWithControls
  2. Crea una carpeta para meter los Controles, que utilizaremos en el WebSite (hay que ser ordenado), por ejemplo MyWebSiteControls
  3. Añade al sitio una página index.aspx.
  4. Botón derecho sobre la carpeta MyWebSiteControls y añade un nuevo Elemento Web User Control, ponle como nombre MyControl
  5. Añade un label, una caja de texto y un salto de línea (br) al control
  6. Vamos a crear las propiedades con las cuales nos vamos a poner en contacto con el control. Esto nos ayudará tanto para modificar el Label como insertar o recuperar una cadena en la caja de texto. Crearemos dos propiedades, LabelText y TextBoxText
  7. El objetivo es hacer como una agenda diaria, la página nos mostrará una hora del día y una caja de texto para introducir la tarea que tenemos que hacer. Es importante no solo pintar un conjunto de hora-tarea, sino cuando pulsemos sobre guardar, recuperar lo que se haya escrito para por ejemplo guardarlo en una base de datos.
  8. Vamos a la página index, y en el código debemos hacer referencia al control de usuario, esto se hace escribiendo justamente después de la línea de directiva <% Page… una línea como esta <%@ Reference Control=”~/MyWebSiteControls/MyControl.ascx” %>
  9. Vamos a añadir a nuestra página un contenedor para insertar todos los controles que crearemos a continuación: <asp:PlaceHolder ID=”PlaceHolder1″ runat=”server” />
  10. La madre del cordero. Los controles hay que crearlos en el Page_Init de la página, con ello conseguimos que los controles esten listos antes de que se produzca la gestión de ViewState de la página. Haremos un for desde las 9 de la mañana hasta las 5 de la tarde (17), para nuestra agenda y añadiremos cada control a la colección de controles del PlaceHolder.
  11. Ya se puede ver la página, y veremos como se crea para cada hora su caja de texto. Si es que quisiesemos escribir algo en las cajas de texto (imagina que recuperamos el horario de una base de datos), sería igula de fácil, accediendo a la propiedad TextBoxText.
  12. Vamos a añadir un botón de Guardar a la página web, <asp:Button ID=”Button1″ runat=”server” Text=”Guardar” /> , en la vista diseño pulsamos sobre el botón dos veces para que se genere el evento Click del botón, y programamos como vamos a recoger los datos que están contenidos en el contenedor PlaceHolder1. Simplemente vamos a escribir en la página de nuevo la información que nos llega (datos que haya puesto el visitante en las cajas de texto).

 

Propiedades del Control

public string LabelText {
get { return Label1.Text; }
set { Label1.Text = value; }
}

public string TextBoxText
{
get { return TextBox1.Text; }
set { TextBox1.Text = value; }
}

Creación de los controles y añadirlos al contenedor (PlaceHolder1)

protected void Page_Init(object sender, EventArgs e)
{
for (int i = 9; i {
MyWebSiteControls_MyControl mc = (MyWebSiteControls_MyControl)LoadControl("~/MyWebSiteControls/MyControl.ascx");
mc.LabelText = i.ToString() + ":00h"; //para que aparezca 9:00h, 10:00h
hPlaceHolder1.Controls.Add(mc); //añadimos el control a la colección de controles del contenedor PlaceHolder
}

Evento Click del botón Guardar

protected void Button1_Click(object sender, EventArgs e)
{
foreach (var item in PlaceHolder1.Controls)
{
MyWebSiteControls_MyControl mc = (MyWebSiteControls_MyControl)item;
Response.Write(mc.LabelText + "-->" + mc.TextBoxText + "
");
}
}

Puedes bajarte el código del ejemplo desde aquí. La carpeta se llama WebSiteWithControls
Hay otra carpeta llamada ControlsControls, utiliza Páginas Maestras, pero con el mismo objetivo.

Leave a Comment

110

Si, el nuevo límite de velocidad en las carreteras españolas. Ayer noche volvía a Granada desde Baza, faltaban unas horas para que entrada en vigor la nueva norma de circulación, pero quise hacer la prueba de los 110 Km/h.
Tengo que decir, y muchos conocidos pueden certificarlo, que no suelo ir muy rápido con el coche; suelo disfrutar de los viajes, de los kilómetros, de la radio, de la música… y quizás lo que menos me llama la atención es el cuentakilómetros, los piques en carretera, ir más deprisa que o ir menos deprisa que (quien), así que esta norma como que tampoco me ha alborotado mucho. Retomando mi vuelta desde Baza y la prueba del algodón, tras conducir unos kilómetros con la nueva velocidad, miré a mi esposa y le dije, ‘esta norma me va a costar hasta a mí cumplirla’.
Si a una persona como a mí, que no he sido amante de la velocidad, le causa un sinsabor la nueva norma, no quiero pensar en aquellas personas que tienen el zapato más pesado, comerciales que van contra reloj todo el día…
¿Que qué pienso?
Pues que al igual que algunas de las señales que han tenido que cambiar, esta medida es una pegatina, un juego, un quita y pon. Si el objetivo primordial de esta medida era reducir el gasto energético, se me ocurren cien cosas que hacer antes de reducir la velocidad de los automóviles.

Leave a Comment

El signo +

La verdad es que ha sido curioso encontrarme con esto. El error surge al tener una url que tenga query strings, en el que uno de los parámetros, el valor tenga el signo ‘+’. Para reproducir el error, simplemente create una página en asp.net que se llame Default.aspx y métele un enlace a la misma página, el enlace será

<a href="Default.aspx?code=FMNEKFKS+FMDKE">Probar parámetro de Query String con signo mas</a>

Ahora vamos a programar el evento Page_Load, recuperar el parámetro code e imprimir su valor en la página

protected void Page_Load(object sender, EventArgs e)
{
    if (!String.IsNullOrEmpty(Request.QueryString["code"]))
        Response.Write("code: " + Request.QueryString["code"] + "");
}

Echa un vistazo a esta imagen:

Como vemos, si ponemos el cursor encima del enlace vemos que el signo mas está dentro del valor del parámetro code.
Si pulsamos en en enlace (recuperamos el valor de code y lo imprimimos), pasa lo siguiente:

El signo de suma ha desaparecido, el motor de asp.net, más especificamente el objeto HttpRequest, cuando se accede al valor de un parámetro cambia los signos + por un carácter en blanco.
Lo he estado buscando por Google pero no he visto una solución, así que cruzo los dedos porque el dichoso HttpRequest no cambie otros símbolos por espacios en blanco y solo me queda hacer lo siguiente al recuperar un parámetro

string code = Request.QueryString["code"];
code = code.Replace(' ', '+');

Comments (2)

Pide tu lector de DNIe

Por solo dos euros podrás tener un lector de dni-e en tu casa. Este cacharrito podrás utilizarlo para interactura con la administración pública identificándote por medio de tu dni-e. Simplemente pídelo en en enlace que hay a continuación. Solo tendrás que pagar 2€ de gastos de envío.

Leave a Comment

Crear proyecto Symfony con Doctrine

Vamos a ver como configurar un proyecto symfony estableciendo como ORM Doctine.

Lo primero que vamos a hacer es un directorio en nuestro directorio de usuario de linux con el nombre del proyecto; vamos a llamar a nuestro proyecto mosacio. Yo suelo poner todos los proyectos que desarrollo con symfony bajo un directorio llamado sfproyects, por lo tanto

?Download download.txt
1
2
3
4
5
$ cd
$ mkdir sfprojects
$ cd sfprojects
$ mkdir mosaico
$ cd mosaico

Bueno, estamo en el directorio que contendrá todos los ficheros y directorio de nuestro proyecto symfony. Ahora vamos a crear dos directorio, en el directorio vendor estará symfony que descargaremos y configuraremos después. Estando en el directorio de trabajo (mosaico), lanzamos el siguiente comando para crear los directorios comentados

?Download download.txt
1
$ mkdir -p lib/vendor

Nos movemos al reciente directorio creado:

?Download download.txt
1
$ cd lib/vendor

Ahora debemos descargar symfony, vamos a trabajar con la versión 1.2, por lo tanto vamos a la página y lo descargamos guardando el archivo symfony-1.2.8.tgz en el recien creado directorio vendor. Vamos a descomprimir y cambiamo el directorio descomprimido al nombre de symfony, borrando el fichero descargado después

?Download download.txt
1
2
3
$ tar zxpf symfony-1.2.8.tgz
$ mv symfony-1.2.8 symfony
$ rm symfony-1.2.8.tgz

Vamos a comprobar la configuración, llamaremos a un archivo php que se va a encargar de decirnos que fallos contiene nuestro sistema para el desarrollo normal con symfony. Nos movemos al directorio mosaico y llamamos a un archivo que se encargará de hacer esa comprobación.

?Download download.txt
1
2
$ cd ../..
$ php lib/vendor/symfony/data/bin/check_configuration.php

Otra forma es coger ese fichero, el check_configuration.php y ponerlo en tu servidor web y llamarlo.
Deberiamos obtener algo así

?Download download.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
********************************
*                              *
*  symfony requirements check  *
*                              *
********************************
 
php.ini used by PHP: /etc/php5/cli/php.ini
 
** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **
 
** Mandatory requirements **
 
  OK        PHP version is at least 5.2.4
  OK        php.ini has zend.ze1_compatibility_mode set to off
 
** Optional checks **
 
  OK        PDO is installed
  OK        PDO has some drivers installed: mysql
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
  OK        A PHP accelerator is installed
  OK        php.ini has short_open_tag set to off
  OK        php.ini has magic_quotes_gpc set to off
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9

Algunas cosas que quizás te salgan como warning serán php.ini has short_open_tag, php.ini has magic_quotes_gpc, esto se soluciona buscando esas palabras en el fichero de configuración php.ini y poniendo su valor a Off.

Un proyecto de symfony se divide en aplicaciones y estas en módulos. Las aplicaciones más importantes para un proyecto suelen ser el frontend, esto es, lo que será público para cuando se accede a nuestra aplicación y otra aplicación, el backend, zona restringida al público y desde donde controlaremos nuestra página web. Vamos a crear nuestro frontend; antes crearemos el proyecto:

?Download download.txt
1
$ php lib/vendor/symfony/data/bin/symfony generate:project mosaico

No, eso no ha sido matrix, simplemente la creación de directorios y ficheros de un proyecto symfony. Vamos ahora a crear la aplicación:

?Download download.txt
1
$ php lib/vendor/symfony/data/bin/symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend

si haceis un ls vereis algunas carpetas como apps, cache, config, data, doc, lib, log, plugins, test, web, dentro de la carpeta apps contiene la aplicación recién creada frontend. Además de las carpetas que ha creado ha puesto un enlace simbólico al comando symfony, por lo tanto de aquí en adelante nos olvidamos de php lib/vendor/symfony/data/bin/symfony y como estamos en un sistema tipo Unix podemos simplemente llamar al comando symfony como ./symfony en vez de php symfony si lo haceis vereis todos los comandos que podemos lanzar.

Vamos a cambiar un fichero de configuración del proyecto, para eso editamos el fichero que está en la carpeta config/ y el fihcero se llama ProjectConfiguration.class.php

?Download download.txt
1
$ gedit config/ProjectConfiguration.class.php

Cambiamos esta línea:

?Download download.txt
1
require_once '/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

por esta otra:

?Download download.txt
1
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

¿Qué conseguimos con esto?, pues simplemente quitarle la rigidez al buscar el archivo sfCoreAutoload.php predefinido con la ruta absoluta y decirle que lo busque desde donde esté el archivo ProjectConfiguration.class.php. Ahora podrás llevarte la carpeta del proyecto a cualquier ubicación y el proyecto seguirá funcionando perfectamente.

El proyecto y la aplicación están ok, vamos a meterle mano a doctrine. Cuando se crea el proyecto se utiliza un ORM que se está utilizando desde que nació symfony, Propel, por lo tanto hay cosas de propel desperdigadas por los directorios que nos vamos a encargar de borrar y modificar para que sea Doctrine el ORM que vamos a utilizar.

Vamos a entrar de nuevo al fichero de configuración ProjectConfiguration.class.php y vamos a hacer algunas modificaciones

?Download download.txt
1
$ gedit config/ProjectConfiguration.class.php

El fihcero ProjectConfiguration.class.php

1
2
3
4
5
6
7
8
9
10
11
<?php
  require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
  sfCoreAutoload::register();
  class ProjectConfiguration extends sfProjectConfiguration
  {
     public function setup()
    {
       // for compatibility / remove and enable only the plugins you want
       $this->enableAllPluginsExcept(array('sfDoctrinePlugin', 'sfCompat10Plugin'));
    }
  }

nos tiene que quedar así:

1
2
3
4
5
6
7
8
9
10
11
<?php
  require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
  sfCoreAutoload::register();
  class ProjectConfiguration extends sfProjectConfiguration
  {
     public function setup()
    {
       // for compatibility / remove and enable only the plugins you want
       $this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
    }
  }

Con esto lo que indicamos es que en vez de cargar el plugin de Propel cargue el de Doctrine.
Después de este cambio vamos a borrar la cache:

1
$ ./symfony cc

Tras instalar cualquier plugin o habilitarlo debemos tenemos que llamar a la siguiente función:

1
$ ./symfony plugin:publish-assets

Vamos a borrar ficheros que hubiera de Propel:

1
2
3
$ rm web/sfPropelPlugin
$ rm config/propel.ini
$ rm config/schema.yml

Y creamos un directorio para Doctrine:

1
$ mkdir config/doctrine

Vale, el proyecto symfony para que utilice doctrine como ORM está listo, vamos a configurar apache para que pueda ver el proyecto. Para esto nos puede venir bien algo que no se comenta mucho en la documentación, pero es un fichero que nos ayudaría a crear el directorio virtual de apache, tenemos un fichero llamado vhost.sample dentro de config, este es el fichero:

?Download vhost.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    # Be sure to only have this line once in your configuration
    NameVirtualHost 127.0.0.1:80
 
    # This is the configuration for mosaico
    Listen 127.0.0.1:80
 
    <VirtualHost 127.0.0.1:80>
      ServerName mosaico.localhost
      DocumentRoot "/home/jfrank/sfprojects/mosaico/web"
      DirectoryIndex index.php
      <Directory "/home/jfrank/sfprojects/mosaico/web">
        AllowOverride All
        Allow from All
      </Directory>
 
      Alias /sf "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf"
      <Directory "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf">
        AllowOverride All
        Allow from All
      </Directory>
    </VirtualHost>

Como nuestra intención es que se pueda acceder por medio de http://mosaico.localhost y no utilizar puertos vamos a borrar las 4 primeras lineas y lo vamos a añadir a httpd.conf
Vamos a editar el httpd.conf de apache para insertarlo allí.
Editamos httpd.conf:

1
$ sudo gedit /etc/apache2/httpd.conf

y añadimos:

?Download httpd.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# This is the configuration for mosaico
<VirtualHost 127.0.0.1:80>
      ServerName mosaico.localhost
      DocumentRoot "/home/jfrank/sfprojects/mosaico/web"
      DirectoryIndex index.php
      <Directory "/home/jfrank/sfprojects/mosaico/web">
        AllowOverride All
        Allow from All
      </Directory>
 
      Alias /sf "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf"
      <Directory "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf">
        AllowOverride All
        Allow from All
      </Directory>
    </VirtualHost>

También tendremos que añadir el nuevo host, para ello editamos hosts

1
$ sudo gedit /etc/hosts

y añadimos 127.0.0.1 mosaico.localhost
Reiniciamos apache

1
$ sudo /etc/init.d/apache restart

Si teneis varios proyectos puestos por directorio virtual, al reiniciar os puede decir algo como VirtualHost overlaps, esto es porque se utiliza siempre el 127.0.0.1, no pasa nada, seguirá funcionando igual, para solucionarlo puedes cambiar la ip de cada proyecto, por ejemplo para el primero 127.0.0.1, para el segundo 127.0.0.2 y asi sucesivamente.
Accedemos a nuestra aplicación: http://mosaico.localhost

Proyecto configurado

Proyecto configurado


Este sería el proyecto en producción, lo que vería el público, pero podemos acceder al proyecto en entorno de desarrollo donde podremos acceder a un montón de variables que nos ayudarán en el proceso de desarrollo, para acceder al entorno de desarrollo, entonces tendremos que ir a http://mosaico.localhost/frontend_dev.php, en la parte superior derecha podemos ver una barra con todos los datos que se manejan.
Proyecto en entorno de desarrollo

Proyecto en entorno de desarrollo


Hasta aquí, veremos en futuros post como crear nuestra base de datos, configurarla en el proyecto, cargar la base de datos por medio de un fichero de texto (fixtures) y como cambiar esa pantalla que es la que da por defecto symfony por nuestra aplicación en sí

Leave a Comment

Cosas que simplemente no se pueden controlar

Sería interesante saber si nuestro programa cuando se queda “colgado” es porque se ha quedado colgado o simplemente sigue trabajando… sería muy interesante, pero podemos demostrar con todo rigor que no existe ningún algoritmo que pueda determinar en general, dado otro algoritmo cualquiera, si éste se detendrá en algún momento o no.

Cosas que no se pueden controlar, simplemente, o ¿alguien pensó que en un ordenador todo es controlable?

Leave a Comment

Instalar VMware Tools en Ubuntu 8.10

He empezado un proyecto con un par de amigos, Alberto y David. Se trata de una aplicación web, una red social un poco peculiar con la que seguro nos vamos a hacer ricos ;) y bueno si hay alguien que quiera poner un poco de dinero, que tenga unos cuantos euros para invertir en una start-up, pues que se ponga en contacto con nosotros que estaremos encantados de escucharlo.

Alberto se encargará del diseño web y David de maquetar el asunto, la parte de desarrollo irá toda enterita para el menda. Empezamos a planear la tecnología a utilizar y en un primer momento pensé en ASP.NET 2.0 con base de datos SQL Server 2005, son ya algunos años los que llevo utilizando la plataforma .NET y me veo mas suelto en ella, pero las cosas cambiaron cuando yo encontré un curro que me da un poco de aire fresco y con ello tomar el asunto como un hobby (como si me sobraba mucho tiempo con el curro, la casa, el niño que no para…), pero bueno siempre estoy dispuesto a aprender cosas, así que desde que supe de Symfony siempre quise aprenderlo y la verdad es que hay una comunidad muy grande y es una delicia de framework.

Mi intención era montar en mi Windows XP una máquina virtual de Ubuntu 8.10 y trabajar en ella. Los que sepan algo de Symfony sabrán que se puede desarrollar igual en Linux como en Windows, pero me siento mucho más cómodo utilizando Apache, MySQL, php y la línea de comandos en Linux, opté por Ubuntu y monté la máquina virtual. Fenomenal con una resolución 800×600, así que mi odisea empezó el día que quise instalar las VMware Tools y poder cambiar la resolución además de una mejora de rendimiento por tener las herramientas instaladas. Imposible instalarlas, así que empecé a indagar y la cosa tiene su guasa para instalarlas en Ubuntu 8.10, con lo fácil que es instalarlas en una máquiva virtual Windows… Este es el resultado de estar mirando foros y foros e intantarlo hasta que lo conseguí, es un poco largo así que paciencia, empecemos:

Mi configuración: Windows XP SP3, VMware WorkStation ACE Edition versión 6.0.0 build-45731. Creo una máquina virtual con Ubuntu 8.10 la cual actualizo hasta el día 31 de diciembre, con dicha actualización se instala un nuevo kernel el 2.6.27-9, lo digo porque vamos a necesitar los headers del kernel para compilar lo que vamos a necesitar.

Abrimos una terminal y creamos un directorio que llamaremos vmwaretools y entramos en el:

$mkdir vmwaretools
$cd vmwaretools

Vamos a necesitar las Open VM Tools, por lo tanto vamos a su web y las descargamos en el directorio que acabamos de crear, en el momento que hice este artículo corria la versión 2008.12.23-137496. Con esto obtenemos las fuentes de las Open VM Tools en un archivo tar.gz. Extraemos el contenido del archivo:

$tar xvfz open-vm-tools-2008.12.23-137496.tar.gz

Ahora vamos a instalar las VMware Tools que nos proporciona VMWare. Vamos al menú de VMWare Workstation a la opción VM y seleccioamos Install VMware Tools…, seleccioamos Install en el mensaje que nos dan y VMware nos monta una unidad a la que podemos acceder por medio de un enlace que nos ha puesto en el escritorio. Vamos a extraer el contenido de VMware Tools en nuestro directorio, por lo tanto escribimos lo siguiente:

$tar xvfz /media/cdrom/VMwareTools-6.0.0-45731.tar.gz

Bueno, con eso ya tenemos dos directorios dentro del directorio primero que hicimos uno con las open vm tools y otro con las vmware-tools.

Ahora necesitamos instalar algunos paquetes que nos van a hacer falta para compilar todo eso, así que al lio, antes de instalar los paquetes pedir un uname -r para saber que versión de kernel tenemos, pues vamos a descargar los headers de nuestro kernel, el mio es 2.6.27-9-generic, con este dado lanzamos el siguiente comando

$sudo apt-get install build-essential libproc-dev libicu-dev libdumbnet-dev linux-headers-2.6.27-9-generic

Ya vamos por la mitad, no desesperes. Vamos a ver, para compliar las open vm tools, necesitamos las liburiparser, pero la versión que hay en los repositorios de ubuntu no es una versión actualizada y necesaria para compliar las citadas open herramientas, así que tendremos que ir a su página web y descargarlas,en el momento de escribir esto, la ersión era la 0.7.4. Las descargamos en el directorio que creamos al principio y otra vez a nuestra magnífica terminal y escribimos:

$tar xvfz uriparser-0.7.4.tar.gz
$cd uriparser-0.7.4

Vale, ahora estamos dentro del directorio que contiene las fuentes de uriparser, así que vamos a compilar todo esto

$./configure && make
$sudo make install

Para la compilación de las open vm tools, necesitamos cambiar algunas variables de entorno, así que escribe esto, la última instrucción es para salir del directorio uriparser

$export CFLAGS="-I /usr/local/include/uriparser"
$export CPPFLAGS="-I /usr/local/include/uriparser"
$cd ..

Unos últimos paquetes,

$sudo apt-get install libgtk2.0-dev xorg-dev

Si, lo se, son unos pocos de paquetes, pero si quieres, avisa a VMware y le dices que arreglen su paquete de VMware Tools…

Creo que con esto, ya está todo preparado para complilar las Open VM Tools, así que entramos en su directorio

$cd open-vm-tools-2008.12.23-137496
$./configure
$make

Si, puedes levantarte e ir al servicio, va a tardar un poco, tambien puedes intentar ver Matrix.

Ahora debemos empaquetar la compilacion de las vmware tools y reemplazar los paquetes que traia las VMware Tools, para ello lo primero es irnos al directorio de la salida de la compilacion

$cd modules/linux

Ahora lo mejor es hacer un script que haga el trabajo sucio asi que
gedit script
e insertamos el siguiente codigo

#!/bin/bash
for i in *; do
if [ -d ${i} ]; then
rm -rf ${i}-only
cp -R ${i} ${i}-only
tar cf ${i}.tar ${i}-only
fi
done

Cerramos el gedit salvando el archivo y le damos permiso de ejecucion con sudo chmod 777 script
y ahora ejecutamos el script

$./script

Salimos de aqui:

$cd ../../..

Ahora

$mv -f open-vm-tools-2008.12.23-137496/modules/linux/*.tar vmware-tools-distrib/lib/modules/source/

Ya hemos reemplazado parte de las VMware Tools por unas un poco mas fresquitas, asi que ahora si:

$cd vmware-tools-distrib
$sudo ./vmware-install.pl

Ahora es simplemente ve aceptando todas las opciones que te de, son unas respuestas validas para casi todo el mundo. Cuando te pida compilar un modulo para tu sistema dile que si, en el proceso perderas la conexion de red, pero luego se restaura.

Lo mejor de esto, es que todo este trabajo esta realizado para un headers concreto y que si ubuntu cambia el kernel en la proxima actuazliacion habra que hacer esto de nuevo, es lo que he leido por ahi, hasta que no ocurra esto, yo ya disfruto de mi maquina virtual a 1024×768.

Comments (8)

Salvar a Mobuzz – Save the children


Salvar Mobuzz from Anil de Mello on Vimeo.

A ver si tienen suerte.
pd. No sigo yo a mobuzz, pero cualquier buena idea habría que conservarla. Yo ya hice mi aportación.

Leave a Comment