Cada vez que retomo la programación en C después de haberme dado más de un mes para oxidarme, hay algo que, por más que lo utilice, siempre tengo que volver a consultar: las structs. Una struct nos permite tener un registro con varios campos en una sola variable, pero no voy a explicar mucho más aquí. Voy a hablar de las distintas formas en las que se pueden declarar, que es lo que siempre olvido.
La declaración de una struct tiene la forma struct nombre_opcional { campos };. La forma más usual, al menos en mi caso, de declarar una struct y luego definir una variable con ese tipo es esta:
C:
-
struct complejo {
-
float real, imaginario;
-
};
-
-
struct complejo n;
En ella creo una struct simple con dos campos, que son la parte real e imaginaria de un número complejo, y declaro la variable n como complejo. Aquí puede verse como el uso de una struct es similar al de un tipo, pero hay que recordar que es necesario que la declaración de la variable esté precedida de la palabra struct, como se ve en el ejemplo, pues los nombres de las structs no se incluyen de forma independiente en la tabla de símbolos del compilador, sólo asociados al modificador struct.
Leer el resto de este post »
20 de Abril de 2007
10:53 pm
Tips
Gmail ofrece a sus usuarios la posibilidad de recibir su correo aún cuando se han aplicado algunas modificaciones a la dirección. La opción más conocida es la de usar el signo de la suma '+', para añadir cualquier cosa a la parte de usuario de la dirección. Por ejemplo, si mi dirección de correo es pipo@gmail.com, el correo enviado a pipo+loquesea@gmail.com me llegará también a mí. Esto resulta especialmente útil para mejorar la clasificación del correo mediante filtros.
Otra de estas opciones, que descubrí hoy por casualidad, es la de añadir puntos:
Gmail no reconoce los puntos (.) como caracteres en un nombre de usuario. De este modo, puedes añadir y eliminar puntos de tu nombre de usuario con el fin de variar la dirección de correo electrónico. Los mensajes enviados a tu.nombredeusuario@gmail.com y a t.u.n.o.m.b.r.e.d.e.u.s.u.a.r.i.o@gmail.com se recibirán en la misma bandeja de entrada, ya que los caracteres del nombre de usuario son los mismos.
Esto puede ser muy útil para los usuarios, aunque en mi caso quien más se ha beneficiado de esto son los spammers que me han seguido desde mis viejas cuentas de correo, que tenían un punto, a la de Gmail, que no lo tiene. Por fortuna, el filtro antispam que incorpora Gmail es lo suficientemente bueno como para que no sea una molestia.
En Windows se puede ejecutar un programa escrito en Python haciendo doble clic sobre él, pues se asocian los archivos de extensión .py al intérprete durante la instalación de éste. Aún cuando el programa que se ejecuta es una aplicación gráfica, se abre una ventana de DOS, que está ahí para dejar disponibles la entrada y salida estándar y la salida de errores. Sin embargo, muchas veces no interesa que aparezca, pues puede resultar molesta, o incluso confundir a usuarios poco avanzados que usen la aplicación.
La forma más sencilla que he encontrado para evitar que aparezca esta ventana de DOS con los programas Python es cambiar la extensión del ejecutable principal de .py a .pyw, con esto en vez de abrirse con python.exe, se abrirá con pythonw.exe, que está pensado especialmente para estos casos
2 de Febrero de 2007
5:35 pm
Linux
Esta es una de esas entradas que pongo aquí sobre todo para evitar olvidarme si me enfrento de nuevo al mismo problema.
Ayer estaba en la biblioteca estudiando para un examen de control digital y necesitaba usar octave para hacer algunas pruebas. Descubrí con horror que iba mal cuando se quedó colgado al pedirle las raíces de un polinomio:
octave:1> v = roots([1 3 2 0 2])
Tuve que interrumpir la operación con el típico Ctrl+C porque, además, el octave estaba usando en ese momento el 100% de CPU según top. Lo sorprendente es que al volver a intentar la misma operación, en vez de colgarse, me mostró este error:
octave:1> v = roots([1 3 2 0 2])
error: dgeev failed to converge
error: evaluating assignment expression near line 65, column 9
error: evaluating if command near line 62, column 5
error: evaluating if command near line 59, column 3
error: called from `roots' in file `/usr/share/octave/2.1.73/m/polynomial/roots.m'
error: evaluating assignment expression near line 1, column 3
El problema no sólo aparecía con la función roots, sino con muchas otra de las que necesitaba, que quizá usaban ésta en su código. Un poco de investigación al llegar a casa me hizo saber que el problema estaba en que había compilado la versión de octave ofrecida como estaba por Gentoo sin Blas entre sus uses. En el Changelog de octave decía que en la versión más reciente (2.1.73-r2), Blas había dejado de ser opcional.
Desenmascaré entonces esta versión de octave y comenzó la instalación de blas-atlas, que es una de las implementaciones de ¡Blas disponibles. Pero duró poco, la instalación se detuvo con un mensaje en pantalla que decía que tenía que ejecutar la instalación en modo interactivo. Seguí los pasos indicados pero, independientemente de las opciones que escogiese en el proceso, la compilación fallaba.
En un hilo del foro de Gentoo donde había un usuario quejándose del mismo problema que yo, el desarrollador encargado del ebuild de octave en Gentoo aconsejaba desenmascarar las últimas versiones de blas-atlas y blas-lapack (además de dos de sus dependencias que también estaban enmascaradas). Hecho esto repetí el intento de instalación y esta vez no sólo me hizo menos preguntas que antes sino que aparentemente estaba funcionando.
El proceso de compilación de blas-atlas es largo, y por la salida que ofrece en ocasiones parece que ha entrado en un ciclo infinito. Pero no pierdas la calma, que no es así; cada iteración es diferente y no se ciclan, así que resiste la tentación de cancelar. No puedo decir cuanto tardó porque me fui a dormir, pero esta mañana, cuando le pregunté a octave de nuevo por las raíces del mismo polinomio de ayer, me respondió esto rápidamente:
octave:1> v = roots([1 3 2 0 2])
v =
-1.79051 + 0.55231i
-1.79051 - 0.55231i
0.29051 + 0.69660i
0.29051 - 0.69660i
Una advertencia, aunque aparece en pantalla antes de empezar: Si tienes un procesador que ajusta su velocidad a las necesidades del software, desactiva esta opción y deja una velocidad fija de procesador durante la compilación, porque blas-atlas hace pruebas de rendimiento para optimizarse y una velocidad variable del procesador puede traer resultados no deseados.
Eso es todo, Jake out.
Cuando escribimos un script en Python y éste contiene cadenas de caracteres que no están escritas en inglés, es posible que éstas contengan caracteres que no se encuentran entre los definidos por el ASCII. En este caso, si no se le dice a Python cómo debe tratarlas, éste se queja.
Tomemos, por ejemplo, este script que tan sólo muestra en pantalla una cadena de texto:
PYTHON:
-
#!/usr/bin/env python
-
-
# Las tildes no están a salvo en los comentarios
-
print "Las tildes no están a salvo en las cadenas de texto"
Si ejecutamos este script tal como está ahora, tendremos una desagradable sorpresa:
jake@aurora /tmp $ chmod u+x encoding.py
jake@aurora /tmp $ ./encoding.py
sys:1: DeprecationWarning: Non-ASCII character '\xc3' in file ./encoding.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Las tildes no están a salvo en las cadenas de texto
La URL que devuelve el intérprete corresponde a una propuesta de extensión de Python (PEP), aceptada hace tiempo, que indica cómo especificar la codificación de caracteres no ASCII.
Básicamente, lo que dice es que Python interpreta todo como ASCII a menos que se le indique lo contrario con un comentario especial que tiene que estar en la primera o la segunda línea y debe casar con la expresión regular: coding[:=]\s*([-\w.]+). Esto significa que si usas Vim o emacs para editar el código python puedes utilizar la sintaxis propia de cada uno para indicarle al editor la codificación del archivo y así matar dos pájaros de un tiro. Además, como bien dice el artículo, se puede usar incluso el lenguaje natural; podría escribir:
PYTHON:
-
#!/usr/bin/env python
-
# Este archivo usa el encoding: utf-8
-
-
# Las tildes no están a salvo en los comentarios
-
print "Las tildes no están a salvo en las cadenas de texto"
Aunque yo prefiero usar la sintaxis de Vim, que es, dicho sea de paso, mi editor favorito
PYTHON:
-
#!/usr/bin/env python
-
# vim: set fileencoding=utf-8 :
-
-
# Las tildes no están a salvo en los comentarios
-
print "Las tildes no están a salvo en las cadenas de texto"
Y si ejecutamos esta nueva versión vemos que ahora no hay quejas:
jake@aurora /tmp $ ./encoding.py
Las tildes no están a salvo en las cadenas de texto
20 de Diciembre de 2006
2:58 am
Linux
Resulta muy molesto, y más en un portátil, que las comprobaciones de las particiones ext3 se hagan en Linux (al menos en Ubuntu) automáticamente durante el arranque. En muchas ocasiones enciendo el ordenador con prisa, con la única intención de consultar algún detalle rápido. Y entonces se programa una comprobación de una de las particiones de mi disco duro. Es una situación dificil, pues la operación no puede cancelarse ni tampoco reiniciar resuelve el problema. En estas ocasiones no parece quedar más remedio que esperar.
No obstante, la frecuencia de estas comprobaciones puede configurarse. Pueden incluso ser desactivadas. Una rápida lectura a la página de manual del programa tune2fs me llevó a la solución:
jake@aurora:~$ sudo tune2fs -i 100d -c 100 /dev/sda5
tune2fs 1.39 (29-May-2006)
Se pone la cuenta de montajes máxima a 100
Setting interval between checks to 8640000 seconds
Con esto, las comprobaciones sobre la partición /dev/sda se harán cada 100 veces que se reinicie el ordenador (antes estaba a 20) o bien cada 180 días, lo que ocurra antes.
12 de Diciembre de 2006
1:13 am
Linux
La semana pasada tuve un momento de crisis. Cuando fui a encender a Aurora (Dell Inspiron 640m) me encontré con una pantalla negra que únicamente tenía este texto:
Time-of-day clock stopped
Al reiniciar volvía a aparecer la misma pantalla y no podía tan siquiera acceder a la BIOS.
El servicio de atención al cliente de Dell no era una opción, pues no está operativo los sábados. Un poco de investigación me llevó a un informe de errores con título Ubuntu corrompe el reloj de tiempo real en algunos portátiles Dell. Allí decía que quitando la pila de la BIOS y volviendo a ponerla se resolvía el problema. Esta me pareció una solución interesante, pero eso fue antes de saber que la pila está debajo del teclado y que tenía que desarmar medio portátil para llegar a ella. Por suerte, Dell pone a disposición de sus clientes una fabulosas instrucciones, con fotos y detalles de cuidado, para desmontar cada modelo de portátil de la marca e identificar las distintas partes (son los llamados manuales de servicio, que sólo están disponibles en inglés). En mi caso, seguí las instrucciones específicas para cambiar la pila de la BIOS del Inspiron 640m. Claro que, después de efectuar esta operación, tuve que volver a configurar todos los parámetros de la BIOS para dejarlos como los tenía antes de la crisis.
Esta fotografía la tomé durante el proceso, justo después de haberle quitado la pila a Aurora. El rectángulo azul indica la posición de la pila.
Esta experiencia ha servido con creces para que me plantee probar otras distribuciones. Tengo ahora Gentoo en el punto de mira, y es más que probable que sea la próxima.
6 de Diciembre de 2006
3:27 am
Linux
Uno de los problemas que tuve al actualizar la distribución de Ubuntu Linux de Asimov de Dapper Drake a Edgy Eft tenía que ver con el sonido.
Asimov tiene una tarjeta de sonido incluida en la placa, que nunca uso, porque tengo una Sound Blaster 128 PCI que sí uso. Dapper nunca reconoció la primera, pero Edgy sí, y ahora había tomado el control del sonido del sistema. Yo quería poner la Sound Blaster como principal, pero teniendo ambas disponibles.
Encontré la solución en este hilo del foro de Ubuntu. Ejecuté:
jake@asimov:~$ cat /proc/asound/modules
0 snd_via82xx
1 snd_ens1371
Como puede verse, la tarjeta VIA, incluida en la placa base, estaba la primera.
Edité entonces la configuración de Alsa en /etc/modprobe.d/alsa-base. Ojo aquí, pues, por alguna razón que desconozco, en el foro se indica otro nombre de archivo que en mi caso no existía, y la configuración de Alsa la encontré en /etc/modprobe.d/alsa-base, como he dicho.
jake@asimov:~$ sudo vi /etc/modprobe.d/alsa-base
Añadí estas dos líneas al final:
options snd-ens1371 index=0
options snd-via82xx index=1
Fíjate en que el guión bajo (_) de antes se sustituye aquí por un guión (-). El parámetro index indica en el orden en que se tomarán las tarjetas en el sistema (empezando por cero). Para que estos cambios se hiciesen efectivos en el sistema, ejecuté:
$ sudo update-modules
Y reinicié la máquina. Al volver a entrar, mi tarjeta principal ya era la Sound Blaster:
jake@asimov:~$ cat /proc/asound/modules
0 snd_ens1371
1 snd_via82xx
6 de Diciembre de 2006
1:23 am
Linux
Asimov tiene instalado Windows 2000 Professional y Ubuntu Linux. A finales de octubre se publicó una nueva versión de Ubuntu: Edgy Eft. Una semana después tuve tiempo de actualizar mi Dapper Drake. Aunque podría haber hecho una actualización por red, decidí descargar el CD de instalación. Entre los disponibles para descarga, escogí ubuntu-6.10-alternate-i386.iso, ahora no recuerdo por qué (estos olvidos son los que quiero evitar con este blog
)
Normalmente no grabo estas isos hasta que necesito llevarlas a algún otro lugar, y no era el caso. De modo que seguí estos pasos para evitar grabar el CD.
Primero copié la imagen iso en /media
$ sudo cp ubuntu-6.10-alternate-i386.iso /media
Luego creé el directorio /media/edgycd y añadí esta línea al /etc/ftab
/media/ubuntu-6.10-alternate-i386.iso /media/edgycd iso9660 loop
De este modo puedo montar la iso como si estuviese poniendo el CD con solo hacer:
$ sudo mount /media/edgycd
Siguiendo las instrucciones de Este comentario hice esto una vez montado:
$ gksu sh /media/edgycd/cdromupgrade
Y ahí comenzó directamente la actualización, preguntándome si quería descargar de la red los paquetes que no estuviesen en el CD-ROM. Por supuesto, respondí que sí.
Pasó un buen rato descargando e instalando paquetes. Acepté todas las modificaciones que me mostró y al final reinicié.
Leer el resto de este post »
Comienzo este proyecto con el más que conocido «¡Hola Mundo!» que tanto hemos visto al dar los primeros pasos en un nuevo lenguaje de programación. No voy a describir en este post el propósito de este weblog, pues ya lo he hecho en la sección Acerca de.
Tan sólo quiero hacer dos cosas en esta entrada.
La primera es darte la bienvenida, y transmitirte mi deseo de que encuentres razones para acompañarme un largo tiempo.
La segunda es, para ir entrando en calor, presentarte mis máquinas.
En la foto puedes ver, de izquierda a derecha a Aurora, Asimov y Nostromo. He puesto la foto en flickr y le he añadido notas, así que si sigues el enlace podrás ver con más exactitud qué es cada cosa (pasa el ratón sobre la imagen en la página de flickr y saldrán las notas)

- Aurora es un Dell Inspiron 640m con un procesador Centrino Duo a 2GHz y 2GB de RAM
- Asimov es un sin marca con un procesador AMD Sempron 2600 (1,6 GHz) y 512 MB de RAM
- Nostromo es un Dell Optiplex GX240 con un procesador Intel Pentium IV a 1.50GHz, y 512 MB de RAM
Sé que no es entrar mucho en detalle, pero supongo que con el tiempo te iré contando un poco más de cada uno (probablemente cuando me den problemas).