jueves, 1 de agosto de 2013

Menú desplegable simple (HTML/CSS)


Esta mañana, un cliente me pedía un menú desplegable (dropdown menu) para su sitio web (hecho en HTML puro). Cosa muy sencilla, que va de ocultar/mostrar elementos con la propiedad display de CSS.

En code-tricks tienen un excelente ejemplo de menú desplegable, hecho con listas. El menú de mi cliente está hecho con tablas, así que para modificar su código lo menos posible, adapté el ejemplo de code-tricks para tablas. Por supuesto, siendo obsoleto el uso de tablas para maquetación, recomiendo utilizar listas, pero por si acaso se presenta el caso, les muestro el código.

El HTML:

<table cellpadding="0" cellspacing="0" style="text-align:center">
  <tr>
    <td class="menu" width="120">
   <a href="#">Item 1</a>
   <ul class="sub-menu">
        <li><a href="sub1-1.htm">Sub Menu 1-1</a></li>
  <li><a href="sub1-2.htm">Sub Menu 1-2</a></li>
  <li><a href="sub1-3.htm">Sub Menu 1-3</a></li>
  <li><a href="sub1-4.htm">Sub Menu 1-4</a></li>
   </ul>
 </td>
    <td class="menu" width="120">
   <a href="#">Item 2</a>
   <ul class="sub-menu">
        <li><a href="sub2-1.htm">Sub Menu 2-1</a></li>
  <li><a href="sub2-2.htm">Sub Menu 2-2</a></li>
  <li><a href="sub2-3.htm">Sub Menu 2-3</a></li>
   </ul>
 </td>
    <td class="menu" width="120">
   <a href="#">Item 3</a>
   <ul class="sub-menu">
        <li><a href="sub3-1.htm">Sub Menu 3-1</a></li>
  <li><a href="sub3-2.htm">Sub Menu 3-2</a></li>
  <li><a href="sub3-3.htm">Sub Menu 3-3</a></li>
   </ul>
 </td>
    </tr>
</table>

El CSS:

.menu, .menu ul.sub-menu {
    padding:0;
    margin: 0;
}
.menu ul.sub-menu li {
    list-style-type: none;
    display: inline-block;
    background: url(../images/nav-bar.png) center left repeat-x;
}
.menu a, .menu ul.sub-menu li a {
    text-decoration: none;
    padding: 5px;
    display:inline-block;
}
.menu {
    position: relative;
}
/*sub menu*/
.menu ul.sub-menu {
    display:none;
    position: absolute;
    top: 40px;
    width: 100px;
}
.menu:hover ul.sub-menu {
    display:block;
}

Y el resultado es este:



Por supuesto necesitaremos darle formato para adaptarlo a las necesidades del momento. Este ejemplo es sólo una base para ello.

jueves, 25 de julio de 2013

ndiswrapper y Ubuntu 13.04

En un artículo anterior describí como logré hacer funcionar mi tarjeta Encore ENLWI-NX2 en Ubuntu 10.10, utilizando ndiswrapper para utilizar el driver de Windows, ya que no existía un driver nativo para Linux. Posteriormente conté qué tuve que hacer cuando mi tarjeta dejó de funcionar tras un upgrade a Ubuntu 12.04.

Bien, hoy realicé una instalación limpia de Ubuntu 13.04, y esto fue lo que tuve que hacer para que mi ENLWI-NX2 funcionara.


1) Descargar e instalar dkms

Asumiendo que no tenemos otra forma de conexión a Internet, toca descargar los paquetes desde otra máquina y llevarlos en una memoria flash, o algo así.

El paquete se puede descargar desde aquí: dkms y luego lo instalamos con:
sudo dpkg -i dkms.deb //usar el nombre específico del .deb descargado


2) Descargar, compilar e instalar ndiswrapper

En algún foro recomendaban instalar directamente el paquete ndiswrapper-dkms (junto con ndiswrapper-common). A mí no me funcionó (Linux no reconocía el módulo, no investigué mucho por qué), por lo cual opté por bajar el código fuente desde aquí, y luego compilarlo e instalarlo con:
make
sudo make install


3) Descargar e instalar ndiswrapper-dkms

Bajar desde aquí e instalar con:
sudo dpkg -i ndiswrapper-dkms.deb //usar el nombre específico del .deb descargado


4) Instalar el controlador de la tarjeta

sudo ndiswrapper -i DRIVERNAME.inf //logicamente debemos tener el .inf


5) Cargar el módulo ndiswrapper
depmode -a
modprobe ndiswrapper


6) Agregar ndiswrapper a /etc/modules
Para que ndiswrapper se cargue cada vez que arranque el sistema, agregar ndiswrapper a
/etc/modules.


Eso es todo, ya podremos conectarnos a nuestra red Wi-Fi favorita :)






lunes, 24 de junio de 2013

Creación de Imágenes ISO en Ubuntu con Brasero

Brasero es probablemente la aplicación para creación de discos más usada en Linux, y es además realmente sencilla. A continuación, muestro dos ejemplos de uso para la creación de imágenes (ISO en este caso).


Caso 1: ISO a partir de CD/DVD

Insertamos el disco del que queremos extraer la imagen, abrimos Brasero y seleccionamos Disc Copy. A continuación seleccionamos la unidad donde insertamos el disco y escogemos Image File.

Por omisión, Brasero graba las imágenes en formato .toc, por lo que debemos hacer click en Properties y seleccionar .iso (también acá podemos seleccionar la ruta donde se guardará el archivo).


Finalmente hacemos Create Image y esperamos que se genere nuestro archivo.





Caso 2: ISO a partir de archivos/directorios

Si lo que tenemos es un conjunto de directorios y archivos en nuestro ordenador, a partir del cual queremos hacer un archivo ISO, debemos seleccionar Data Project, y añadir todos los archivos/directores que deben ir a la imagen, tal como si fueramos a crear una copia física.

Seleccionamos Image File y luego hacemos clic en Burn (Si brasero no detecta un disco virgen en la unidad, mostrará un breve mensaje y seleccionará Image File por omisión).


Al hacer clic en Burn, Brasero nos pedirá el nombre y ubicación del archivo.


Para terminar, hacemos clic en Create Image y comenzará el proceso de creación de la imagen.



jueves, 7 de marzo de 2013

Marca de agua con GIMP

Conozco 2 opciones a la hora de crear una marca de agua para nuestras fotografías: guardarla como PNG (o nuestro formato de preferencia) y luego pegarla sobre cada fotografía, o guardarla como un pincel/brush. Guardar nuestra marca como imagen, permite que la podamos usar en prácticamente cualquier editor de imágenes, mientras que los brushes son relativos a la aplicación que usemos (generalmente). Sin embargo, si utilizamos siempre una misma herramienta de edición, es más fácil crear un brush una vez y usarlo luego utilizarlo, además de que seguramente así tendremos muchas más opciones.

Bien, la herramienta que yo uso es GIMP, y a continuación describo cómo guardar (y cómo usar luego) nuestras marcas de agua como archivos GBR (Gimp Brush).

Comenzamos creando un nuevo archivo fondo transparente, como se ve en la siguiente imagen.



Las dimensiones no tienen que ser exactamente esas, pueden ser mucho más pequeñas si va a ser una marca simple. Todo depende de la calidad de imágenes que vayamos a firmar, si son muy grandes, nuestra firma también debería serlo.

El siguiente paso es crear la firma... Allí es donde entran los gustos y la creatividad de cada quien. Bien, yo hice una simple para este ejemplo que es sólo el texto '@marcocamejo'.

Si hemos usado varias capas, antes de guardar, debemos mezclarlas (Image > Merge visible layers). También es muy recomendable eliminar el espacio que sobre (Image > Autocrop image).

Bien, una vez terminada la firma, guardamos con extensión .gbr. GIMP mostrará el siguiente cuadro.



Luego, para que GIMP reconozca el brush, debemos copiar el archivo gbr al directorio de brushes de GIMP. En esta máquina (con Ubuntu 12.10 y GIMP 2.6), ese directorio es $HOME/gimp-2.6/brushes.

Y eso es todo. Cada vez que queramos firmar una fotografía, sólo debemos usar la herramienta paintbrush y escoger nuestro pincel.



Como ven, y como comentaba al comienzo, de esta forma tenemos algunas opciones para configurar nuestra firma (escala, opacidad, etc).






martes, 12 de febrero de 2013

Creando parches para el kernel de Linux


Como parte del producto de mi trabajo de maestría en Computación, he requerido generar un parche para el kernel de Linux. El proceso es muy sencillo, y no es muy diferente al crear un parche de cualquier archivo o directorio común y corriente, utilizando el comando diff. Resumo el proceso en 3 pasos.

1. Preparar los directorios

Debes tener un directorio con el kernel vanilla y otro directorio con el kernel modificado. Por supuesto, deben corresponder a la misma versión. En mi caso, estoy trabajando con la versión 3.2.1, y he nombrado linux-3.2.1 a mi kernel modificado y linux-vanilla-3.2.1 al kernel vanilla.

Ambos kernels los tengo en el directorio /usr/src, pero esto no es necesario, pueden estar en un directorio cualquiera.

2. Limpiar ambos directorios

Asumiendo que los kernels se encuentran en /usr/src, basta con ejecutar:
cd /usr/src/linux-3.2.1
make mrproper
make clean
cd ../linux-vanilla-3.2.1
make mrproper
make clean

3. Generar el parche

Finalmente, usamos el comando diff para generar el parche:
cd /usr/src/
diff -Nur linux-vanilla-3.2.1 linux-3.2.1 > patch-3.2.1

¡Y eso es todo! El archivo patch-3-2.1 es nuestro parche.

NOTA: al usar el comando diff, el orden es importante, primero va el kernel vanilla y luego el modificado, no al revés.

lunes, 17 de septiembre de 2012

Impriendo data selectivamente con Gnuplot

Gnuplot es una muy buena herramienta (de línea de comandos) de graficado 2D/3D que funciona en los Sistemas Operativos más comunes. Me es particularmente útil para hacer gráficas de datos tabulados.

Eventualmente recibimos alguna data tabulada para graficar, pero de la que no nos interesa más que una parte. Por ejemplo, nos dan un archivo en el que cada fila representa ciertos indicadores económicos desde el año 1960 hasta 2012, y sólo queremos graficar los indicadores desde 1980 hasta 2000. Otro ejemplo podría ser que tengamos que graficar muchos archivos que tienen una o más líneas de cabecera y lógicamente debemos omitirlas. Otro caso, podría ser que, volviendo al primer ejemplo, quisieramos graficar los datos de cada 5 años y no todos (1965, 1970, 1975, etc).

Para estos casos y muchos más, tenemos la opción every, cuya sintaxis es la siguiente:

every I:J:K:L:M:N

En donde:

  • I: incremento de línea
  • J: incremento de bloque de datos
  • K: primera línea (empezando en 0)
  • L: primer bloque de datos (empezando en 1). Se consideran bloques de datos, los separados por líneas en blanco en el archivo
  • M: última línea
  • N: último bloque de datos

Por ejemplo, si tenemos un archivo con la siguiente estructura:

#year #var1 #var2 #var3
1960 120 80 90
1961 125 85 91
1962 124 79 91
1963 121 81 88
...

y queremos graficar year Vs. var3,  omitiendo la primera línea (cabecera) y sólo tomando en cuenta los primero 100 valores:

plot "archivo.in" every ::1::100 using 1:4 with lp


Observe que sólo se especifica hasta el índice que estemos utilizando (no se colocan ":"s de relleno al final). Por ejemplo, si quisieramos imprimir todos los datos, sólo omitiendo los primeros 3, sería:

plot "archivo.in" every ::3 using 1:4 with lp

Combinando los índices, tenemos muchas posibilidades.

miércoles, 12 de septiembre de 2012

ndiswrapper y Ubuntu 12.04

Hace un rato hice el upgrade a Ubuntu 12.04 (sí, ya sé que está casi listo el 12.10), desde Ubuntu 11.10, en una PC de escritorio que se conecta a Internet a través de una tarjeta wifi encore ENLWI-NX2, que como conté hace algún tiempo, no es soportada por Ubuntu, así que uso ndiswrapper para cargar el driver de Windows.

El punto es que luego de terminado el upgrade no tenía acceso a Internet. En el menú de redes de Ubuntu no me aparecía ninguna red inalámbrica. Para diagnosticar el problema, lo primero que hago es revisar si el driver estaba cargado:
sudo lshw -C network

Y me aparece como UNCLAIMED la interfaz de la tarjeta inalámbrica, es decir, como si no hubiese ningun driver cargado. Sin embargo, luego pruebo:
sudo ndiswrapper -l

y me doy cuenta que el driver SÍ estaba instalado. Aquí fue donde comencé a googlear, y me econtré con esta pregunta. Allí la primera sugerencia era instalar ndiswrapper-dkms, y con ello resolví el problema.

Si la única forma de acceso a Internet de esa máquina es mediante la red inalámbrica, tocará llevarse el paquete en un disco o memoria usb. Se puede descargar de acá:

Además, este paquete depende de dkms, que probablemente no esté instalado, así que hay que llevarlo también:

Luego instalamos los paquetes y cargamos el módulo:
sudo modprobe ndiswrapper

Y recordar que si queremos que el módulo se cargue cada vez que se arranca el sistema, debemos agregarlo a /etc/modules.