Feed a
Entradas
Comentarios

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.

2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.

3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.

4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.

5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.

6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.

7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.

8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.

9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.

10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Si quieres sumarte a él, difúndelo por Internet.

Desde aquí el pequeño granito de arena a intentar hacer un poco de ruido sobre este tema, que ya de por sí es ruidoso y desagradable. Lo que nos faltaba, vamos. Queremos migrar de la industria del ladrillazo al I+D+i y lo hacemos… ¡recortando presupuestos en I+D+i! Cuanto menos, contraproducente.

Un extracto bastante explicativo de la iniciativa surgida en La aldea irreductible

“Decir que España es un país de Ciencia es hacer verdaderos contorsionismos con las palabras… Decir que en España hay grandes científicos es obviar su precaria realidad, pero decir que se busca un modelo productivo basado en la Innovación y reducir a la vez el presupuesto del Ministerio de Ciencia en hasta un 37% podría ser tildado perfectamente de tomadura de pelo. Finalmente, el Tijeretazo estará en torno a un 15%… Inquietante, incluso para miembros del propio Gobierno…”

Leo en el blog Manzana Mecánica esta sorprendente noticia que quería compartir con todo el que desarrolla documentos en LaTeX:

LaTeX es un lenguaje para creación de documentos tremendamente poderoso y ampliamente usado en la academia para escribir artículos científicos, particularmente por lo fácil que es escribir símbolos matemáticos. Sin embargo, la gran variedad de comandos también hace que a veces uno no recuerde cómo describir ciertos símbolos. Detexify te permite que dibujes un símbolo y te indica posibles comandos en LaTeX que describen ese símbolo. ¡Muy útil y totalmente recomendado!

Esta es una imagen de como funciona el tinglado:

detexify

Puedes acceder a Detexify haciendo clic aquí

Fuente: Manzana Mecánica

Ha sido especialmente tedioso conseguir que para un iframe, se me redimensionara la altura dependiendo del contenido que se cargara dentro de éste. Firefox lo realizaba a la perfección, pero no así Internet Explorer. Tomando un par de referencias me he construido la solución que quiero compartir.

En el archivo que declara el iframe:

JAVASCRIPT:
  1. <script language="javascript">
  2. function grand(h)
  3. {
  4.   iframe=document.getElementById("mi_iframe")
  5.   iframe.height=h;
  6. }
  7. function reSize(h)
  8. { 
  9.     try
  10.   { 
  11.     var oBody =    mi_iframe.document.body;
  12.     var oFrame    =   document.all("mi_iframe");
  13.      
  14.         oFrame.style.height = oBody.scrollHeight + (oBody.offsetHeight - oBody.clientHeight);
  15.         oFrame.style.width = oBody.scrollWidth + (oBody.offsetWidth - oBody.clientWidth);
  16.     }
  17.     catch(e) //An error is raised if the IFrame domain != its container's domain
  18.     {
  19.      window.status =    'Error: ' + e.number + '; ' + e.description;
  20.     }
  21. }
  22. </script>

En el mismo fichero, declaramos el iframe y colocamos esto en el body para IE:

HTML:
  1. <body onLoad="reSize(0)"><iframe id="mi_iframe" src="iframe.php" width="100%" frameborder="0" height="100%"></iframe></body>

En el contenido del iframe (iframe.php en el ejemplo):

JAVASCRIPT:
  1. <script language="javascript">
  2.      function redimensiona()
  3.      {
  4.       var navegador = navigator.appName
  5.       if (navegador == "Microsoft Internet Explorer")
  6.       {
  7.         top.reSize(0);
  8.       }
  9.       else
  10.       {
  11.         principal=document.getElementById("div_principal");
  12.         top.grand(principal.scrollHeight+40);
  13.       }     
  14.      }
  15. </script>

El código HTML del contenido de este iframe sería algo así como:

HTML:
  1. <html><body onLoad="redimensiona()"><table id="div_principal"><tr><td>Incluir contenido de la pagina</td></tr></table></body></html>

Referencias:

Siguiendo con el meme que proponía CrowDat en este post, hago referencia aquí a uno de los temas que más me marcaron en mi adolescencia, en este caso me alejo de mi vertiente metalera y escojo el tema Principles of Lust de Enigma (grande Michael Cretu).

Y como me recuerda CrowDat, un buen meme que se precie tiene que ser pasado, así que me gustaría que Piponazo recogiera el testigo.

Para los que usamos Lampp y reconocemos como un fastidio usar PHPMyAdmin, existe una solución para que cada vez que se arranca Lampp, se inicie también un socket al demonio de mysql que permita la ejecución de MySQL Query Browser.

Para crear el socket sería necesario hacer esto cada vez que se quiere iniciar Lampp:

$ sudo mkdir /var/run/mysqld
$ cd /var/run/mysqld
$ sudo ln -s /opt/lampp/var/mysql/mysql.sock mysqld.sock

Podemos automatizar este proceso de forma que sólo sería necesario realizarlo una sola vez. Abrimos el archivo /opt/lampp/lampp como root, buscamos el case startmysql y añadimos las tres líneas anteriores al último else, tal y como sigue a continuación:

"startmysql")
if testrun /opt/lampp/var/mysql/`/bin/hostname`.pid mysqld
then
$de && echo "XAMPP: XAMPP-MySQL laeuft bereits."
$de || echo "XAMPP: XAMPP-MySQL is already running."
else
if testport 3306
then
$de && echo "XAMPP: Ein anderer MySQL daemon laeuft bereits."
$de || echo "XAMPP: Another MySQL daemon is already running."
else
/opt/lampp/bin/mysql.server start > /dev/null &
$de && echo "XAMPP: Starte MySQL..."
$de || echo "XAMPP: Starting MySQL..."
sudo mkdir /var/run/mysqld
cd /var/run/mysqld
sudo ln -s /opt/lampp/var/mysql/mysql.sock mysqld.sock
fi
fi

Fuente: Ubuntu Forums

Muy adecuado para mi momento actual. De obligada lectura.

¿Alguna vez habéis querido hacer algo, pero simplemente no estabais suficientemente motivados para hacerlo? Este es siempre mi primer motivo para no pasar a la acción, y estoy seguro de que probablemente también será el vuestro. Si no estáis motivados, simplemente no tenéis la energía o el impulso para hacer lo que tenéis que hacer, ¿verdad? Bastante simple.

Pero aquí hay tres de los mayores problemas que surgen por pretender estar altamente motivados todo el tiempo:

  1. Quizá no te importa realmente lo que estás haciendo. Quizá no importa en realidad y te estás forzando a hacer algo que no quieres hacer. En este caso, tu falta de motivación es tu subconsciente que te dice “esto no es importante” o “esto no se alinea con mis valores.”
  2. La energía llega en oleadas. Y del mismo modo que cada ola tiene su cresta, también tiene una depresión. A veces tu nivel de motivación será como un tsunami arrollador. En otras ocasiones, será un flujo estable. Son ritmos naturales y seguir estos ritmos es importante, porque si no lo haces, te quemarás.
  3. A veces no te animarás antes de pasar a la acción, pero te sentirás bien después de haberlo hecho. Pongamos por ejemplo hacer ejercicio. Mucha gente teme o aborrece hacer el esfuerzo de sudar la camiseta. No están motivados a priori, al menos no lo suficiente para romper la resistencia mental ante el trabajo. Pero se sienten sensacionales cuando han terminado el ejercicio. Por lo tanto, a veces no puedes confiar en tener una alta motivación a priori, a veces hay que confiar en que la motivación llegará después.

¿Quiere esto decir que la motivación no es importante? No, sigue siendo importante y juega su papel. Pero demasiado a menudo resulta fácil caer en la trampa de pensar que hay que estar totalmente entusiasmados por algo antes de hacerlo. No vas a tener siempre un entusiasmo total. Y está bien. Es lo que se llama seguir tu ritmo natural.

El motivo por el cual empecé a considerar este modo diferente de abordar mis objetivos fue porque las soluciones típicas de motivación no funcionaban para mí. A veces funcionaban y otras no. A veces visualizar el éxito era muy motivante y otras simplemente fracasaba tontamente. Sólo cuando me permití dejarme ir, el éxito me llegó de forma más fácil. Lo admito, esto puede parecer difícil al principio, pero es cuestión de confianza. Tienes que confiar en tu auténtico ser para decirte cuando es hora de pasar a la acción y cuando lo es para sólo estar.

Aquí tenemos algunos ejemplos para practicar este modo no-competitivo de manifestar tus deseos:

  1. Practica escuchar tu intuición. Muchos de nosotros tendemos a cuestionar la validez de nuestra intuición. Favorecemos nuestra mente racional y su método de explicación seguro y lógico. Nuestra mente intuitiva, sin embargo es igual de válida. Tal como dijo Einstein una vez “La mente intuitiva es un don sagrado y la mente racional es un sirviente fiel. Hemos creado una sociedad que honra al sirviente y ha olvidado el don.” Aprende a honrar tu don intuitivo practicando el hacerte preguntas y escuchando la respuesta que te das sin intentar deducir la respuesta lógicamente.
  2. Tómate el tiempo de preguntarte qué quieres realmente. A menudo queremos adherirnos a la consecución de nuestros objetivos y olvidamos escuchar lo que realmente queremos. En lugar de crear objetivos como medio de satisfacer nuestros deseos, nos convertimos en esclavos de ellos. Siempre que sientas que tu objetivo te está frenando, pregúntate “¿Qué quiero en realidad?” y escucha en silencio la respuesta que recibes.
  3. Acepta que no estarás siempre locamente motivado. Si esperas a estar increíblemente motivado para pasar a la acción estás poniendo mucha presión en ti mismo. Es mejor aligerar la presión permitiéndote estar medianamente interesado o incluso en un estado de temor. Al permitirte estar en este estado haces que sea más fácil moverte y continuar porque ya no te estás resistiendo. Cuando te resistes al estado en que estás, lo perpetúas.
  4. Conéctate a tu flujo. Todos tenemos momentos en que somos más creativos o tenemos más energía, y todos tenemos momentos en que nos apetece descansar o recargar. Para algunos de nosotros, esos recesos y flujos pueden darse en ciertos momentos del día, para otros se darán de forma totalmente aleatoria. La clave está en poner atención y explotar esos flujos de energía. Cuando pasas a la acción volcándote totalmente estás lleno de energía y al permitirte relajarte cuando estás en un estado de calma, te respetas y te honras a ti mismo. Cumplirás más cosas siguiendo tus ritmos naturales que tratando de forzarte a ti mismo.

Hay un momento para ser productivo y hay un momento para descansar. Del mismo modo que en la naturaleza hay un momento para la actividad y la vida nueva en primavera, y hay un momento para descansar y retraerse al interior en invierno. Igual que la naturaleza sabe que su crecimiento perpetuo es insostenible, nosotros tenemos que darnos cuenta de que esperar ser productivos todo el tiempo nos puede llevar a quemarnos o a ser menos productivos.

Puede que sea hora de que empecemos a escuchar nuestros cuerpos. Pienso que cuanto más seguimos el modo de actuar de la naturaleza, más inteligentemente vivimos.

Fuente: Yoriento

Ante las preguntas de ana y GG en este post, me he decidido a liberar el código de un proyecto que estaba desarrollando y que desafortunadamente, por falta de tiempo, he tenido que cancelar.

Se trata de un generador y parser de ficheros XMI, uno de los tantos estándares de XML, concretando, una especificación para el intercambio de diagramas que fue escrita para proveer una manera de compartir modelos UML entre diferentes herramientas de modelado.

La forma tanto de utilizar el serializer (escritura en fichero XMI) como la de utilizar el parser es muy sencilla y parecida. Por ejemplo, para el serializer basta con:

JAVA:
  1. KXmlSerializer serializer = new KXmlSerializer();
  2. serializer.startTag(null, "packagedElement");
  3. serializer.attribute(NAMESPACE_XMI, "xmi:id", pClassID);
  4. serializer.attribute(null, "name", pClassName);
  5. serializer.attribute(null, "visibility", "public");
  6. serializer.attribute(null, "isAbstract", "true");
  7. serializer.endTag(null, "packagedElement");

Lo que da lugar a un XMI del tipo:

XML:
  1. <packagedElement xmi:type="uml:Class" name="Jam" xmi:id="BOUML_0x1f883_4" visibility="public" isAbstract="true">
  2. </packagedElement>

Espero que le sirva a alguien el código desarrollado. Podéis descargarlo de aquí.

La vida es riesgo

Via El blog de Crowdat

Tener un hijo, plantar un árbol y escribir un libro. Las tres cosas que se supone debemos completar antes de diñarla. El mecanismo de la primera no necesita mucha explicación. Para la segunda bastan unas pocas semillas y eso que, lejos de las pantallas, se le sigue llamando "el campo". Y para la tercera, lejos de editoriales planetarias y anagramas con el símbolo del euro, resulta que hace ya un año que existe Bubok. Una especie de Lulu a la española. Pues vaya, que después de un año me entere de proyectos como este, como lector (al menos) empedernido que me considero...

Os dejo con la descripción bastante exacta que hacen del servicio en IncubaWeb.

Bubok es un servicio web a través del cual puedes preparar y publicar tus libros para su difusión en formato impreso o PDF. Pero no solo eso.

En realidad es toda una plataforma de venta de libros online pues una vez te registras en la página (genial el sistema, muy impactante) dispones de tu dirección personal del tipo tunombre.bubok.com en la que ofrecer tu perfil de escritor y acceso a la tienda segura donde adquirir los libros en formato físico o en descarga de PDF. Si quieres ver un ejemplo, tienes la página de Alberto Vázquez-Figueroa, que dicho sea de paso es una obligación visitar y poder descargar material de este gran autor de forma gratuita.

La tienda virtual es también digna de mención, pues no solo es sencillísima de usar sino que su aspecto y velocidad es impresionante, y además incluso puedes personalizar tu copia del libro impreso. La verdad es que el funcionamiento de todo Bubok es impresionante, merece la pena solo visitar sus secciones, la visita virtual, incluso la ayuda online es una gozada.

En cuanto al modelo de negocio, Bubok no te cobra nada por el alojamiento de tu espacio, ni siquiera por la elaboración de tus libros, solo gana cuando tu ganas, en una relación de 80% del precio de la venta para ti y el 20% para Bubok, y no es mal intercambio por disponer de una plataforma de esta calidad.

Más información aquí y aquí.

Yo tengo una pregunta para ustedes:

¿Por qué la ingeniería informática no es una profesión regulada en España, al igual que la prostitución?

escudo_informatica

hp2133

La verdad que no ha sido un camino de rosas instalar Ubuntu 8.10 Intrepid Ibex en mi nuevo y flamante HP 2133 (gracias Morty!).

Al final lo conseguí instalar en una ocasión con un CD Ubuntu 8.10 versión alternate y en otra ocasión con la versión Desktop.

Vamos a ver la instalación con la versión Alternate y seguidamente comentaré más o menos los cambios para instalar la Desktop.

Requisitos para este tutorial:

  • Un mini Notebook HP 2133, por supuesto.
  • ISO de Ubuntu 8.10 alternate.
  • Conexión por cable Ethernet disponible.
  • Un pc de escritorio con Ubuntu o Windows XP instalado.
  • Un pendrive USB. Como nota importante, reseño que utilizando un MP4 de Saytes todo eran problemas y que, sin embargo, utilizando un pendrive de 8gb de la marca Kingston la velocidad de lectura / escritura aumenta y el proceso transcurre sin errores.

Pasos para la instalación:

  • Formatear el pendrive. Desmontarlo y desde una terminal escribir:

    sudo mkfs.vfat /dev/sdX1

    donde X es la letra de la unidad USB, en mi caso es sdb1.

  • Para hacer el pendrive bootable, vamos a Ubuntu en nuestro PC de escritorio, y buscamos en el menú Sistema => Administración la opción Create a USB Startup Disk.
  • Una vez finalizado el proceso, debemos eliminar las referencias al CD-ROM en los ficheros que ha grabado la utilidad de autoarranque del pendrive. Esto evita que te pida montar el CD en uno de los pasos. En una de las carpetas hay una serie de archivos con extensión cfg que habrá que modificar de la siguiente forma:
    • En text.cfg, modificar la linea 5:

      append  noprompt cdrom-detect/try-usb=true persistent file=/cdrom/preseed/ubuntu.seed initrd=/install/initrd.gz quiet --

      por esta

      append  noprompt cdrom-detect/try-usb=true persistent file=/preseed/ubuntu.seed initrd=/install/initrd.gz quiet --
    • En adtext.cfg, modificar la linea 4:
      append  file=/cdrom/preseed/ubuntu.seed priority=low initrd=/install/initrd.gz --

      por esta

      append  file=/preseed/ubuntu.seed priority=low initrd=/install/initrd.gz --
    • En gfxboot.cfg, modificar la linea 8:
      replace cli=file=/cdrom/preseed/cli.seed

      por esta

      replace cli=file=/preseed/cli.seed

      y la linea 11:

      replace ltsp=file=/cdrom/preseed/ltsp.seed

      por esta

      replace ltsp=file=/preseed/ltsp.seed
  • Desmontar el pendrive del equipo de escritorio e insertarlo en el HP 2133. Arrancar el equipo y pulsar F9 para escoger el dispositivo USB como el que arrancará primero.
  • Seguir los pasos de la instalación de forma normal teniendo en cuenta que, al menos en mi caso, en el paso Seleccionar e instalar programas no puedes elegir nada, porque si lo haces, el sistema te dice que no se puede descargar (a pesar de estar conectado vía cable). Al no elegir nada se instala el sistema base.
  • Cuando termina la instalación te suelta en un terminal. Inicias sesión e instalas gdm:
    sudo apt-get install gdm
  • ANTES DE REINICIAR vamos a hacer uso de los pasos que nos ofrece Daniel Alberto Rodríguez Méndez, para dejar la tarjeta gráfica instalada y que al reiniciar podamos ver el entorno gráfico.

    Lo que yo he hecho, guiándome por esta referencia, ha sido lo siguiente:

    • Bajarme el driver correspondiente a nuestra tarjeta gráfica de este enlace.
    • Descomprimir el fichero descargado con el siguiente comando:
      tar xvzf 85a-43862-u810-2d-bin.tar.gz
    • Nos colamos en el directorio que se ha extraído del archivo:
      cd 85a-43862-u810-2d-bin/

    • Copiamos el driver al directorio que nos comentan en el Readme:
      cp via_drv.so /usr/lib/xorg/modules/drivers/
    • Nos descargamos el magnífico xorg.conf.chi ya preparado en el sitio de dabeto en este enlace.
    • Lo renombramos a xorg.conf:
      mv xorg.conf.chi xorg.conf
    • Y lo copiamos, sobrescribiendo el xorg.conf original:
      mv xorg.conf /etc/X11/
    • Listo el tema gráfico. Ahora ya podemos reiniciar y, al volver a Ubuntu, deberíamos ver la pantalla de bienvenida. Pero podemos observar que no tenemos WiFi. Para cargar el driver, he encontrado tres formas válidas. La primera, sirve para todos los kernels y no la he encontrado en ninguna referencia. Simplemente observando los errores que me "chillaba" Ubuntu, me di cuenta de que se "casi" se reconocían los drivers del chipset WiFi, pero se informaba que había que bajarse e instalar la última versión. Las otras dos formaron parte de instalaciones anteriores y, o bien no funcionaban en el kernel 2.6.27-11-generic, o bien la WiFi se iba y volvía de vez en cuando.
      • Se trata de seguir los pasos indicados en este enlace, que son los siguientes:
      • wget http://bu3sch.de/b43/fwcutter/b43-fwcutter-011.tar.bz2
        tar xjf b43-fwcutter-011.tar.bz2
        cd b43-fwcutter-011
        make
        cd ..
        export FIRMWARE_INSTALL_DIR="/lib/firmware"
        wget http://downloads.openwrt.org/sources/broadcom-wl-4.80.53.0.tar.bz2
        tar xjf broadcom-wl-4.80.53.0.tar.bz2
        cd broadcom-wl-4.80.53.0/kmod
        sudo ../../b43-fwcutter-011/b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta.o

        Esta solución, al ser los drivers oficiales, funciona hasta en el kernel 2.6.27-11, al contrario que las dos soluciones que vienen a continuación.

      • La segunda solución, que no funciona en el kernel 2.6.27-11, trata de seguir los pasos de este enlace. Básicamente se traduce en ejecutar los siguientes comandos:
        sudo su
        wget docnielsen.dk/linux/hp2133-wlan-`uname -r`-wl.ko.gz
        mv hp2133-wlan-`uname -r`-wl.ko.gz wl.ko.gz
        gzip -d wl.ko.gz
        mv wl.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/
        depmod -a
        rmmod ndiswrapper
        rmmod wl
        insmod /lib/modules/`uname -r`/kernel/drivers/net/wireless/wl.ko
        reboot
      • Otra solución es seguir los pasos de este otro enlace, que dan en la sección "To install wireless". Esta solución trata de usar ndiswrapper, para instalar los drivers disponibles para Windows. Básicamente, se traduce en:
        • Ir a este enlace.

        • Seguir el Paso 1: All BCM43XX - Install NDISWrapper and Blacklist Native Driver.
        • Seguir el Paso 2a: SP34152 Driver Download / Extraction
        • Seguir el Paso 3: All BCM43xx - Configure NDISWrapper (and WPA Supplicant).
        • Una vez finalizados los pasos anteriores, seguir el paso HARDY BUG FIX.
        • Reiniciar Ubuntu.

Con esto, ya tenemos las dos cosas más importantes configuradas, que son la tarjeta gráfica y el chip WiFi. Es bueno seguir los consejos de una de las páginas que he dado para ajustar configuraciones como habilitar el escalado de la CPU o deshabilitar los altavoces externos cuando se enchufan unos auriculares.

Todo esto ha sido probado, como ya se ha dicho, con el CD de instalación Alternate. Recientemente he conseguido instalar de nuevo Ubuntu pero con el CD de instalación en su versión Desktop y realizando la instalación desde un lector de DVD externo conectado al puerto USB. Como contrapartida a lo que se puede leer en el 90% de los foros, a mi no me ha funcionado con el CD de instalación Desktop el incluir la opcion xforcevesa en los parámetros del kernel, ni tampoco arrancando directamente el CD con la orden live xforcevesa.

Lo que a mi me funcionó fue pulsar F4 y escoger la opción "Modo gráfico seguro" para la instalación. El único inconveniente es que no se veían los botones de aceptar y cancelar y tuve que ir jugando con la tecla Tab.

Felicidad…

Un saludo a la gente de Aicor ;)

En un proyecto en el que estoy trabajando necesitaba seleccionar ciertos datos dependiendo de si el usuario escogía un artículo o bien un pack de artículos.

En la siguiente tabla puede verse que cada fila o bien apunta a la id de un artículo o bien a la ide de un pack.
bd-listaboda

Para conseguir mi propósito y obtener o los datos del artículo o los datos del pack directamente con una sola consulta, desarrollé la siguiente:

SQL:
  1. SELECT DISTINCT
  2. IF (lb.id_articulo <> '', f.id_categoria, '') AS id_categoria,
  3. IF (lb.id_articulo <> '', f.parent_id_categoria, '') AS parent_id_categoria,
  4. IF (lb.id_articulo <> '', concat('arti',a.id_articulo), concat('pack', p.id_pack)) AS id_articulo,
  5. IF (lb.id_articulo <> '', a.nombre, p.nombre) AS nombre,
  6. IF (lb.id_articulo <> '', a.descripcion, p.descripcion) AS descripcion,
  7. IF (lb.id_articulo <> '', a.unidades, '') AS unidades,
  8. IF (lb.id_articulo <> '', a.PVP, p.PVP_pack) AS PVP, lb.cantidad,
  9. e.id_enlaces_novios AS enlaces_novios
  10. FROM
  11. articulo a,
  12. categoria f,
  13. packs p,
  14. enlaces_novios e
  15. INNER JOIN listaboda lb ON (lb.id_enlaces_novios = e.id_enlaces_novios AND e.id_enlaces_novios = 10)
  16. WHERE
  17. f.id_categoria = a.id_categoria
  18. AND (lb.id_articulo = a.id_articulo AND lb.id_articulo <> '') OR (lb.id_pack = p.id_pack AND lb.id_pack <> '')
  19. AND a.visible = 1

Podemos ver la sintaxis en su esplendor en la línea 4:

IF (lb.id_articulo <> '', concat('arti',a.id_articulo), concat('pack', p.id_pack)) AS id_articulo

Lo que viene a decir algo así como "si en la tabla listaboda (la que se ha mostrado en la imagen) el id del artículo NO es nulo, concatenar la frase 'arti' con el id del artículo (por ejemplo: arti128), en otro caso concatenar 'pack' con el id del pack. Asignar el resultado al campo 'id_articulo'".

Por tanto, al recuperar el campo 'id_articulo' tendremos o bien 'arti128' o 'pack3', con lo cual sabemos el tipo de artículo que hemos recuperado, su ID y el resto de los datos asociados.

Vamos a aprovechar el código Javascript creado en el post anterior para crear un campo <select> dinámico que contendrá una serie de artículos recuperados de la base de datos. Muy útil para la selección de varios articulos en varias listas desplegables.

Como siempre el código habla por sí solo:

PHP:
  1. <html>
  2. <!-- Importamos del port de php a javascript>
  3. <script language="javascript" src="php.js"></script>
  4. <!-- Importamos el js creado en el post anterior>
  5. <script language="javascript" src="generar_fila.js"></script>
  6. <body>
  7. <?php
  8.     // Si se ha pulsado el submit, procesamos datos que nos llegan
  9.     if ($_POST)
  10.     {
  11.       echo var_dump($_POST);
  12.       echo "<br/>";
  13.       echo "<br/>";
  14.       echo "<b>Articulos recibidos:</b><br/>";
  15.       for ($i=0;$i<count($_POST['articulos']);$i++)
  16.         echo "id del articulo: " . $_POST['articulos'][$i] . "<br/>";
  17.      
  18.       echo "<br/>";
  19.     }
  20. ?>
  21.  
  22. <!-- Formulario principal de la pagina -->
  23. <form name="formulario" id="formulario" action="listas.php" method="post" enctype="multipart/form-data">
  24. <?php
  25.  
  26. // imaginemos que esto lo sacamos de la base de datos,
  27. // pero ahora vamos a hacer un array de prueba
  28. $articulos_bd[] = array('id_articulo' => '1', 'nombre' => 'Powered')
  29. $articulos_bd[] = array('id_articulo' => '2', 'nombre' => 'by')
  30. $articulos_bd[] = array('id_articulo' => '3', 'nombre' => 'Linux')
  31.  
  32. // creamos dos listas, una con los ids de los articulos recogidos presuntamente de la BD ($ids),
  33. // y otra lista con los nombres de dichos articulos ($array)
  34. $lista_articulos = '<select id="articulos_0" name="articulos[]">
  35.   <option selected value="">-Seleccione un art&iacute;culo-</option>';
  36.   $ids[] = "";
  37.   $ids[] = "-Seleccione un art&iacute;culo-";
  38.   $array[] = "";
  39.   $array[] = "-Seleccione un art&iacute;culo-";
  40.  
  41.   // recorremos la lista de articulos del array supuestamente extraido de la BD
  42.   for ($i=0;$i<count($articulos_bd);$i++)
  43.   {
  44.     // montamos un elemento <select></select> normal de HTML con los datos
  45.     // de los articulos recogidos de la BD
  46.     $lista_articulos.='<option id="'.$articulos_bd[$i]['id_articulo'].'" name="'.$articulos_bd[$i]['id_articulo'].'"  value="'.$articulos_bd[$i]['id_articulo'].'">'.$articulos_bd[$i]['nombre'].'</option>';
  47.     $ids[] = $articulos_bd[$i]['id_articulo'];
  48.     $array[] = $articulos_bd[$i]['nombre'];
  49.   }
  50.   $lista_articulos.='</select>'
  51.  
  52. // creamos un div que contendra los diferentes campos <select></select>
  53. // con todos los productos y sus datos asociados 
  54.    <div id="tabla">
  55.    <b>Art&iacute;culo relacionado:</b>
  56.    '.
  57.    $lista_articulos;
  58.    ?>
  59.    <!-- A la funcion addCampo le voy a pasar el evento originado,
  60.         una cadena con los nombres de los articulos separados por comas,
  61.         y otra cadena con los ids de los articulos tambien separados por comas -->
  62.    <input type="button" class="boton" value="Añadir" onClick="addCampo(event,'<?php echo implode(",", $array); ?>', '<?php echo implode(",", $ids); ?>')" alt="Insertar">&nbsp;
  63.  
  64.   <!-- continuamos la generacion del formulario -->
  65.    <?php echo '         
  66.    </div>
  67.    <br/>
  68.    <input type="submit" value="Submit"/>
  69. </form>
  70. </body>
  71. </html>';

Y como siempre, para estas cosas es necesaria una demostración

La lista de referencias utilizadas ha sido la siguiente:
http://www.trans4mind.com/personal_development/JavaScript2/createSelectDynamically.htm
http://www.cristalab.com/tips/32381/subir-multiples-archivos-con-php.html

Os pongo en situación. Quería pasar desde PHP un array a una función Javascript. En esa función Javascript necesitaba hacer un bucle que me recorriera desde el primer elemento hasta el último, por lo que necesitaba conocer el número total de elementos.

Sin percatarme de los sabios consejos de Moisés acerca de la existencia de la propiedad length existente también para arrays, busco funciones como sizeof o count (existentes en PHP) para desarrollar en Javascript de forma más cómoda.

Por curiosidad busqué referencia sobre el asunto y me topé con el sitio Web de Kevin Vanzonneveld, en el que ofrecen un archivo php.js que contiene una serie de funciones PHP portadas a Javascript de manera impecable. En el sitio de Kevin se relatan las 212 funciones portadas hasta ahora.

En mi caso, sólo tuve que descargar el mencionado fichero php.js, enlazarlo con una etiqueta script y utilizar la función count como si lo hiciera con PHP de forma normal para contar el número de elementos de un array o descomponer cadenas en array seccionando según un carácter. Os dejo con un ejemplo que completaré en una próxima entrada. Lógicamente se podrían haber utilizado las propiedades nativas de Javascript length y split para desarrollar el ejemplo, pero así vemos una prueba para otras funciones de esta librería que no estén desarrolladas de forma nativa en Javascript.

JAVASCRIPT:
  1. var numero = 0;
  2.  
  3. // esta funcion añade un nuevo 'dd' al div principal con el contenido especificado
  4. // recibe el evento disparado y dos arrays: el primero con las IDs de los campos
  5. // select y el segundo con las IDs de las opciones que irán dentro de cada select
  6.  
  7. function addCampo(evento, array, ids) {
  8.   newID = 'articulos_' + (++numero) // genero una nueva ID
  9.   nDD = document.createElement('dd')
  10.   nDD.id = 'dd_' + numero
  11.   bold = document.createElement('b') // creo una etiqueta en negrita
  12.   bold.innerHTML = "Artículo relacionado: "
  13.  
  14.   myselect = document.createElement("select") // creo un elemento <select>
  15.   myselect.name = "articulos[]" // le pongo de nombre el de un array previamente inicializado en PHP
  16.   myselect.id = newID
  17.  
  18.  // aquí puedo utilizar la función explode al haber importado php.js, obteniendo los mismos
  19.  // resultados que en PHP, es decir, me separará en un array el resultado de descomponer
  20.  // la cadena separada por comas
  21.   var newArray = explode(',', array)
  22.   var newIDs = explode(',', ids)
  23.  
  24.  // aquí puedo utilizar la función count de forma normal porque he incluido en el archivo .php
  25.  // correspondiente la importación de php.js. Como puede verse, puedo recorrer de forma normal
  26.  // el array incluyendo la funcion count dentro de mi for de Javascript
  27.   for (i=0;i<count(newArray);i++)
  28.   {
  29.     if (newArray[i] != ',' && newArray[i] != '')
  30.     {
  31.      // voy creando dinamicamente las opciones (<option>) para el <select>
  32.      // en base a los datos que he recibido como parámetros de la función
  33.       theOption = document.createElement("OPTION")
  34.       theText = document.createTextNode(newArray[i])
  35.       theOption.appendChild(theText)
  36.       theOption.id = newIDs[i]
  37.       theOption.name = newIDs[i]
  38.       theOption.value = newIDs[i]
  39.       myselect.appendChild(theOption)
  40.     }
  41.   }
  42.  
  43.  // creo un enlace que me servirá para eliminar elementos <select>
  44.  // incluidos dentro de un DD
  45.   a = document.createElement('a')
  46.   a.name = nDD.id
  47.   a.href = '#'
  48.   a.onclick = elimCamp
  49.   a.innerHTML = ' Eliminar'
  50.  
  51.  // adjunto todos los elementos al DD
  52.   nDD.appendChild(bold)
  53.   nDD.appendChild(myselect)
  54.   nDD.appendChild(a)
  55.  
  56.  // al contenedor que tengo en la página PHP le adjunto el DD creado
  57.   container = document.getElementById('tabla')
  58.   container.appendChild(nDD)
  59. }
  60.  
  61. //con esta función eliminamos el campo cuyo link de eliminación sea presionado
  62. function elimCamp(evt){
  63.    evt = evento(evt)
  64.    nCampo = rObj(evt)
  65.    div = document.getElementById(nCampo.name)
  66.    div.parentNode.removeChild(div)
  67. }
  68.  
  69. //con esta función recuperamos una instancia del objeto que disparo el evento
  70. rObj = function (evt) {
  71.    return evt.srcElement ?  evt.srcElement : evt.target;
  72. }
  73.  
  74. //esta funcion nos devuelve el tipo de evento disparado
  75. evento = function (evt) {
  76.    return (!evt) ? event : evt;
  77. }

Algunos habréis notado que al actualizar de forma automática con la nueva herramienta que nos ofrece Wordpress 2.7 nos aparece un error Cannot redeclare pclziputilpathreduction, justo al intentar desempaquetar la nueva versión de Wordpress.

La solucion es bien sencilla. Hay que desactivar el plugin Wordpress Automatic Upgrade, con el que ya disfrutábamos de esta características que ahora Wordpress integra de forma interna.

Os ofrezco 3 referencias que me han venido muy bien a la hora de reactivar mis neuronas para que recordasen el manejo correcto de expresiones regulares.

En la web txt2re podemos escribir la cadena de texto que deseemos y, en un segundo paso, elegir para cada ítem cómo queremos procesarlo. Por ejemplo, podemos elegir que algo empiece por la subcadena "blog" o podemos elegir que empiece por 4 letras.

Continuando con el repaso, os hago referencia a una página perteneciente a la Universidad de Oviedo, en la que podemos validar una cadena de texto cualquiera frente a un patrón determinado por el usuario. Se nos indican alrededor de la página algunos ejemplos útiles de patrones.

Terminamos el repaso con una librería bastante extensa de expresiones regulares, con prácticamente todos los tipos de patrones utilizados más frecuentemente: urls a páginas Web, direcciones de correo electrónico, nombrado de ficheros de imagen, etc. La única pega es que todo el contenido se encuentra en el idioma de Shakespeare.

Al intentar meter una nueva opción del box Clientes,


me he encontrado con un problema que me resultaba familiar y para el que no recordaba la solución:

se soluciona incluyendo el fichero que integra la nueva opción (en mi caso requests.php) en el array $aADMPages del fichero /admin/includes/functions/administrators.php, diciéndole cuál es su fichero superior (en mi caso customers.php, porque estoy dentro del box de clientes).

En un post anterior os hablaba de cómo crear un upload múltiple de ficheros en HTML. Ahora rizamos el rizo y lo metemos todo dentro de una página PHP, en la que recogeremos en variables PHP los valores de los elementos que vamos a subir a un hipotético servidor, teniendo así terminado el uploader de ficheros.

Os dejo el código, igualmente comentado:

HTML:
  1. <script language="javascript">
  2. var numero = 0;
  3.  
  4. function addNewRow()
  5. {
  6.   // obtenemos acceso a la tabla por su ID
  7.   var TABLE = document.getElementById("tabla");
  8.   // obtenemos acceso a la fila maestra por su ID
  9.   var TROW = document.getElementById("celda");
  10.  
  11.   // tomamos la celda
  12.   var content = TROW.getElementsByTagName("td");
  13.  
  14.   // creamos una nueva fila
  15.   var newRow = TABLE.insertRow(-1);
  16.   newRow.className = TROW.attributes['class'].value;
  17.  
  18.   // creamos una nueva celda
  19.   var newCell = newRow.insertCell(newRow.cells.length)
  20.  
  21.   // creamos una nueva ID para el examinador
  22.   newID = 'file_' + (++numero);
  23.  
  24.   // creamos un nuevo control
  25.   txt = '<input type="file" id="' + newID  + '" name="files[]" size="40"/>'
  26.  
  27.   // y lo asignamos a la celda
  28.   newCell.innerHTML = txt
  29.  
  30.   // aviso ;)
  31.   //alert(txt)
  32.  
  33.   // creamos una nueva celda
  34.   var newCell = newRow.insertCell(newRow.cells.length)
  35.  
  36.   // creamos un nuevo campo de descripcion
  37.   txt = '<input type="text" name="description[]" size="40""/>';
  38.  
  39.   // y lo asignamos a la celda
  40.   newCell.innerHTML = txt
  41.  
  42.   // creamos una nueva celda
  43.   var newCell = newRow.insertCell(newRow.cells.length)
  44.  
  45.   // creamos un nuevo boton que eliminara una fila en concreto!
  46.   txt = '<input type="button" name="button[]" value="eliminar" onClick="removeRow(this)"/>';
  47.  
  48.   // y lo asignamos a la celda
  49.   newCell.innerHTML = txt
  50. }
  51.  
  52. function removeRow(r)
  53. {
  54.   // recogemos el indice de la fila donde esta situado el boton
  55.   var i = r.parentNode.parentNode.rowIndex;
  56.  
  57.   // eliminamos esa fila de la tabla utilizando el indice recogido
  58.   document.getElementById("tabla").deleteRow(i); 
  59. }
  60.  
  61. function verElementos(evento)
  62. {
  63.   for (i=0; i<=numero; i++)
  64.   {
  65.     var my_id = "file_" + i;
  66.     var my_file = document.getElementById(my_id);
  67.     alert ("id: " + my_id + " value: " + my_file.value);
  68.   }
  69. }
  70. </script>
  71. <body>
  72. <?php
  73.    //Preguntamos si nuetro arreglo 'files' fue definido
  74.    //$_FILES es para los input type="file" y $_POST normal para los
  75.    // input type="text" de toda la vida ;)
  76.     if (isset ($_FILES["files"]) && isset ($_POST["description"])) {
  77.       //obtenemos la cantidad de elementos que tiene el arreglo files
  78.       $total = count($_FILES["files"]["name"]);
  79.       // construimos una tabla para presentar los datos     
  80.       echo "<table>";     
  81.      
  82.       //este for recorre el arreglo
  83.       //hacemos una impresion tabulada de los datos que recibimos
  84.       for ($i = 0; $i <$total; $i++)
  85.       {
  86.         //con el indice $i, podemos obtener la propiedad que deseemos de cada archivo
  87.         $name = $_FILES["files"]["name"][$i];
  88.         $description = $_POST["description"][$i];
  89.         echo("<tr>");
  90.         echo("<td><b>Archivo: </b>");
  91.         echo($name);
  92.         echo("</td><td width=\"5px\"></td>");
  93.         echo("<td><b>Descripcion: </b>");
  94.         echo($description);
  95.         echo("</td>");
  96.         echo("</tr>");
  97.       }
  98.      
  99.       // terminamos la construccion de la tabla
  100.       echo "</table>";
  101.     }     
  102. ?>
  103.  
  104. <form name="formulario" id="formulario" action="upload_multiple.php" method="post" enctype="multipart/form-data">
  105. <table border="0" id="tabla" width="90%">
  106. <tr class="celda">
  107. <td colspan="3">Pulse [+] para añadir un examinador de archivos<br/>
  108. Desarrolladores => Pulse [v] para ver el contenido de los examinadores<br/>
  109. Desarrolladores => Pulse [s] para ejecutar el submit del formulario y recoger las variables con PHP
  110. </td>
  111. <td>
  112. <input type="button" class="boton" value="[+]" onClick="addNewRow(event)" alt="Insertar">&nbsp;
  113. <input type="button" class="boton" value="[v]" onClick="verElementos(event)" alt="Ver elementos">
  114. <input type="submit" class="boton" value="[s]" alt="Hacer submit">
  115. </td>
  116. </tr>
  117. <tr id="celda" class="celda">
  118. <td>
  119. <input id="file_0" name="files[]" type="file" size="40">
  120. </td>
  121. <td>
  122. <input name="description[]" type="text" size="40""/>
  123. </td>
  124. </tr>
  125. </table>
  126. </form>
  127. </body>
  128. </html>

Y aquí una demo, que no puede faltar con este tipo de cosas.

Me ha ocurrido que no tenia sonido en Youtube una vez instalado Ubuntu Intrepid Ibex, a pesar de que había instalado el Flash Player desde el mismo Firefox 3. La solución ha sido cerrar Firefox y escribir en consola:

neonigma@neonigma-laptop:~$ sudo apt-get install flashplugin-nonfree-extrasound

Este comando instalará una versión del plugin de Flash para Firefox 3 en la que sí me funciona el sonido.

Conviene también revisar los complementos haciendo clic en Herramientas => Complementos en Firefox 3.

Como puede verse en la imagen, se me han quedado dos complementos Shockwave Flash, así que pulsé el botón Desactivar del segundo y reinicié Firefox 3 para evitar problemas.

Estoy trabajando en una empresa de desarrollador Web. Sí. Lo he hecho. Así que me toca enfrentarme a mi querido Javascript. Y lo he hecho haciendo una pequeña página para crear controles de subida de ficheros de forma dinámica, al estilo gmail, pero pulsando en un botoncito.

Sin más os lo dejo, el código está muy comentado así que no es necesario decir mucho más ;) .

HTML:
  1. <script language="javascript">
  2. var numero = 0;
  3.  
  4. function addNewRow()
  5. {
  6.   // obtenemos acceso a la tabla por su ID
  7.   var TABLE = document.getElementById("tabla");
  8.   // obtenemos acceso a la fila maestra por su ID
  9.   var TROW = document.getElementById("celda");
  10.  
  11.   // tomamos la celda
  12.   var content = TROW.getElementsByTagName("td");
  13.  
  14.   // creamos una nueva fila
  15.   var newRow = TABLE.insertRow(-1);
  16.   newRow.className = TROW.attributes['class'].value;
  17.  
  18.   // creamos una nueva celda
  19.   var newCell = newRow.insertCell(newRow.cells.length)
  20.  
  21.   // creamos una nueva ID para el examinador
  22.   newID = 'file_' + (++numero);
  23.  
  24.   // creamos un nuevo control
  25.   txt = '<input type="file" id="' + newID  + '" size="50" />'
  26.  
  27.   // y lo asignamos a la celda
  28.   newCell.innerHTML = txt
  29.  
  30.   // aviso ;)
  31.   alert(txt)
  32. }
  33.  
  34. function removeLastRow()
  35. {
  36.   // obtenemos la tabla
  37.   var TABLE = document.getElementById("tabla");
  38.  
  39.   // si tenemos mas de una fila, borramos
  40.   if(TABLE.rows.length> 2)
  41.   {
  42.   TABLE.deleteRow(TABLE.rows.length-1);
  43.   --numero;
  44.   }
  45. }
  46.  
  47. function verElementos(evento)
  48. {
  49.   for (i=0; i<=numero; i++)
  50.   {
  51.     var my_id = "file_" + i;
  52.     var my_file = document.getElementById(my_id);
  53.     alert ("id: " + my_id + " value: " + my_file.value);
  54.   }
  55. }
  56. </script>
  57.  
  58. <table border="0" id="tabla" width="100%">
  59. <tr class="celda">
  60. <td colspan="3">Pulse [+] para añadir un examinador de archivos<br/>
  61. Pulse [-] para eliminar un examinador de archivos<br/>
  62. Desarrolladores => Pulse [v] para ver el contenido de los examinadores<br/>
  63. </td>
  64. <input type="button" class="boton" value="[+]" onClick="addNewRow(event)" alt="Adicionar">&nbsp;
  65. <input type="button" class="boton" value="[-]" onClick="removeLastRow(event)" alt="Remover">
  66. <input type="button" class="boton" value="[v]" onClick="verElementos(event)" alt="Ver elementos">
  67. </td>
  68. </tr>
  69. <tr id="celda" class="celda">
  70. <input id="file_0" name="files" type="file" size="50">
  71. </td>
  72. </tr>
  73. </table>
  74. </body>
  75. </html>

Y aquí una demo, que molesta no tenerlas para este tipo de ocasiones.

Más tarde pondré las referencias que he utilizado, que las tengo en favoritos en otro equipo que no está ahora a mi alcance.

Lo siento Ender pero tenía que ponerla. Lo resume todo muy bien.

Más tiras del creador en: Sinergia sin control

Esta noticia lleva ya un tiempo por la blogosfera, aún así la comento por mi especial interés por la miniaturización de la informática en general y de las comunicaciones.

Ni más ni menos que las famosas librerías QT de Trolltech han visto la luz en versión Symbian S60. Esto se debe en parte a que Qt Software (que así se llama ahora Trolltech) ha sido adquirida por el gigante finlandés Nokia. Las librerías salen con soporte extendido para Linux, aunque también han sido portadas a ¡Windows Mobile! justo antes de la mencionada adquisición de Nokia.

Sobran el resto de palabras al ver el video...

Hoy al seguir con el desarrollo de mi PFC me encuentro con esta curiosa imagen al ejecutar el mismo:

Tras un buen rato devanándome los sesos, recuerdo que algunas veces las actualizaciones automáticas de Ubuntu instalan nuevas versiones del JRE de Java, el cual tengo instalado por los repositorios. Pero no sólo eso, además, actualizan el JRE a utilizar, lo que podemos ver con el siguiente comando:

neonigma@neonigma-laptop:~/netbeans-6.1/mobility8/WTK2.5.2/bin$ sudo update-alternatives --config java
[sudo] password for neonigma:

Hay 3 alternativas que proveen `java'.

  Selección     Alternativa
-----------------------------------------------
          1    /usr/bin/gij-4.2
*+        2    /usr/lib/jvm/java-gcj/jre/bin/java
          3    /usr/lib/jvm/java-6-sun/jre/bin/java

Pulse  para mantener el valor por omisión [*] o pulse un número de selección: 3
Se utiliza `/usr/lib/jvm/java-6-sun/jre/bin/java' para proporcionar `java'.

Como se indica, se ha establecido por defecto de forma automática el JRE java-gcj, con lo cual no funciona WTK al necesitar Java 6. Pulsando la tecla 3, estaremos usando la versión correcta del JRE.

En mi caso, he necesitado reconfigurar Netbeans. Accediendo a las propiedades del proyecto Netbeans (en File -> "proyecto" Properties). En el menú de la izquierda pulsamos en Platform y en la zona de la derecha hacemos clic en el botón Manage emulators. En la imagen siguiente podemos ver que el JDK por defecto apunta ahora a una ruta de un Java 6 que no es el que tengo activado por defecto (que está en /usr/lib/jvm/java-6-sun y no en /usr/lib/jvm/java-6-sun-1.6.0.07).

La solución está en pulsar el botón Add platform... y añadir una nueva plataforma Java Standard Edition e indicar como ruta /usr/lib/jvm/java-6-sun. Se nos añade una nueva plataforma que es la correcta que Netbeans utilizará a partir de ahora.

Older Posts »