31 diciembre 2007

Feliz ASCII nuevo



.. ..........
.OMMMMMMMMMM$=
MMMMMMMMMMMMMMMMM$=.. .$MMMM
.~MMMMMMMMMMMMMMMMMMMMMMMMM8$I+?==~~~~~. NMMMMMM.
=MMM=:,::=======7MMMMMMMMMMMMMMMMMMMMM: MMMMMMM.
=MMM,. ..,?ONMMMMMMMMMNNO?=:~,,,,,,,. IMMMMMM.
DMMMMMMMMMMMMM$+......... ..,=:...
..=ODDDO?=....
.....
......
.,DMMMMMMM8?..
NMMMMMMMMMMMMMMMN7~... .7MMMN..
.=MMMMMMMMMMMMMMMMMMMMMMMMNZ?=::,,...... NMMMMMM.
=MMMMNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: MMMMMMM.
.=MMM.. ...?ONMMMMMMMMMNNO?=::,,,,,,,. ?MMMMMM.
NMMMMMMMMMMMMMMM$?.... .,NMM$..
..=ONNNO?~....

......
..DMMMMMMM8?.... .....
OMMMMMMMMMMMMMM8~..... ..DMN=..
.=MMMMMMMMMMMMMMMMMMMMMMMMNZ?=::,,...... NMMMMMM.
=MMMMNDNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: MMMMMMM.
.=MMM........:+I8MMMMMMMMNMDOZ$$7777777, OMMMMMM.
MMMMMMMMMMMMMMMM$?.... ,DMN$..
.?NMMMMMMM7~.


















7$$ $$=
MMM MMI
MMM MMI
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MMM..........................................MMI
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MMM,,,,,,,,,,,,,,,MMO,,,,,,,,,,,,,,,,,,,,,,,,MMI
MMM MMO MMI
$$$ MMO MMI
.MMM. MMI
......MMMM?...... MMI
MMMMMMMMMMMMMMMM .,MMI
????????????????.. .ZMMMI
.........:MMMMMI .
.MMMMMMMMMMMMMMM..
.MMMMMMMMMMMMMMM..

...
....,:,,....
.,MMMMMMMMMM,..
.MMMM$...+NMMMM..
.MMM,:?ODO?=.$MMM.
.MMMMMMMMMMMMMMMMMM
.MMMMMMMO$MMMMMMMMM$.
MMMMO. ...MM..,ZMMMM
MMM,. MM ...MMM
MMM MM. .MMM
MM. MMM8ONMMM,.
OMM MM$NMMMMM
.MMZ. MMMMMMMM.
..MMD. MMMMMM?..
..MM. MMMMZ...
. ....

OZ. OO.
MM MM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$MM.
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI
MM$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=
MM
ZZ.


... ...
MM MM
MM...............MM
MMMMMMMMMMMMMMMMMMM.......:~.
MMNDDDDDDDDDDDDDDMMIDMMMMMMM
MMMMMMMMMMMMMMMMMMMM~$DMMMMM.
MMMMMMMMMMMMMMMMMMMM..... ..
MM==================.
MM...................
$$.



MMM?.
MMMMM7.. .MMMMMMMMM.
MM.8MMMMN, ....,NMMM..
MM?..$MMMMM:. .MMM
MMMMN~..IMMMMD=. .MM
MMMMMMMN,.:MMMMMZ.MM
MM=NMMMMMM~..?NMMMMM
MM ..?MMMMMMN+..$MMM
MMM ...8MMMMMMO..MM
MMMN. ..:8MMMMMMMM
.NMMMMMNNN ..:MMMMMM
.MMMMMMMMM ..DMMM.
......... .....
















. ....... .. ..................
MMMMMMMMMMNO?~.. . .MMMMMMMMMMMMMMM..
MMMMMMMMMMMMMMMN. MMMMMMMMMMMMMMM
....MMMMM?...OMMMM. ..........:MMMM...
.MMMMMM ...OMMM:. ..MMM.
.MMM.MM. ..~MMMZ. .MM?
..MMMM.MM ..MMMM MMI
.MMMM$MMM. ..MMMM,. MMI
.$MMMM.MM= .NMMMM, .8MMI
.MMMM.MMM. .MMMMMN~.. ...:MMMMMI
MMMMM.MM~. ?MMMMMMMMM8O$$O8MMMMMMMMMM.
MMMMM,NMM. .:MMMM,$NMMMMMMMMMN?:NMMMM.
MMMMM..MMD. .~MMMMM?..........OMMMMM..
,MMMMM.?MMZ.. ..MMMMMMMNNNNNMMMMMMMM.
.,:MMMMMM=MMMM:::::. ..DMMMMMMMMMMMMMMMMM..
$MMMMMMMMMMMMMMMMM. ..~NMMMMMMMMMMMMM7..
.................... ..INMMMMM$=...

......
....?ONMMMMMMMMMMN$+...
.,+DMMMMMMMMMNNNNMMMMMMMMMZ~.
..NMMMMMM?...............,7MMMMMMZ..
..MMMMMD.,=8MMMMMMMMMMMMMMM8?:..OMMMMM...
.$MMMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM7.
..MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.
..MMMMMMMZ=.. ..,+OMMMMMMMM..
.MMMM?.. ..ZMMMM.
.MMM. .MMM.
MMM.. MMI
MMM MMI
MMM. .MMI
MMMN.. ...DMMI
.MMMZ... ...MMMM.
.MMMMM?.. ........ .. ...... ...,?MMMMM.
..MMMMMMMMMN$?~::,,.........,,:=?$DNMMMMMMMMMM..
..MMMMMDDMMMMMMMMMMMMMMMMMMMMMMMMMMMNDMMMMMM.
.,MMMMMM$......................:$MMMMMMM..
..OMMMMMMMMMO?=:,.....,:?$DMMMMMMMMMMO...
..=DMMMMMMMMMMMMMMMMMMMMMMMMMMMMD=..
...?NMMMMMMMMMMMMMMMMMMMMN?...
...,?ZDMMMMMMMMD$?....
.............

..~?$8DDNNNDD8O$+:..
..=DMMMMMMMMMMMMMMMMMMMMMM$:.
.,DMMMMMM$=...........,=8MMMMMMD,.
.NMMMMM,,~ZNNMNMMMMMMMMNNNZ+:.:OMMMMN.
.+MMMMMDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM~.
..NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.
.MMMMMMM$=........................,=ZMMMMMMMM
.MMMMM=. ...:NMMMM.
.MMM,. ..MMM.
MMM.. ..MMI
MMM MMI
MMM MMI
MMM.. .,MMI
.MMM+. ..IMMM.
.MMMMM?... ....?MMMMM.
.MMMMMMMM$7=~:,,.............,,~=?IOMMMMMMMMM
.MMMMMNDMMMMMMMMMMMMMMMMMMMMMMMMMMMMDMMMMMM.
.OMMMMM+....,:=?IZ$$$$$$??=:,....?MMMMMM$.
,8MMMMMMMND7=:,.......,=?ZDMMMMMMMMMD.
..?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?..
.ZMMMMMMMMMMMMMMMMMMMMMMMM7.
,?ZDMMMMMMMMD$?.
... ....
........ .
. .,7ONNZ?..... .. .
.$MMMMMMMMMMMM+.. ..,::::.....
.NMMMMMMMMMMMMMMMMO .~MMMMMMMMMMMM+.
..MMMMMMN=:.,:7NMMMMMM. .:MMMMZ=..,MMMMMMMM,
.MMMM7... ...=NMMM.+MMD~.+NMMMMMMMMMMMM8
.MMMO.. ..:MMMMN..NMMMMMMMMOONMMMMMM.
.MMM. ..MMN.,MMMMMMN?......?MMMM.
MMM.. $MM$.DMMMMMZ.. ..MMMI
MMM ~MMD..MMMMM=.. ..MMI
MMM ~MM$.:MMMMM.. MMI
.MM=. .DMM:.=MMMMM. .MMI
.MMM. ,MMMZ.OMMMMMMO. .MMM.
..MMM7.. .,MMMM.:MMMMMM.MMM8.. ..NMMMM.
..MMMMM?:=$DMMMM~.DMMMMMM:..MMMMM$~:.:$MMMMMM..
.$MMMMMMMMM?~NMMMMMMMM,. .:MMMMMMMMMMMMMZ.
..:MMMMMMMMMMMMMMMMM?.. ..?MMMMMMMMMZ..
.:MMMMMMMMMMMMM?.. ...... .
...,=???=....

















... ........
,?NMMMMMMMM:
.NMMMM. .:7DMMMMMMMMMN$==OMMMM.
MMMMMMM. .??????$$ZDNMMMMMMMMMMM$=:.........MMM.
MMMMMMM. MMMMMMMMMMMMMMMMMMMMMMNNN8888888NMMMM
?MMMMMM. ...........,~?OMMMMMMMMMMMMMMMMMMMMMMM
.:MMMO.. . ....~$NMMMMMMMMMMMMMM=.
..... .....=78NMMMN8?.
... .

...:$NMMMM$~.
..,?=, ....+DMMMMMMMMMMMMM,.
=MMMMMM. ..........,:=IONNMMMMMMMMN7=......~MMM.
MMMMMMM. .MMMMMMMMMMMMMMMMMMMMMN:,,.......,?MMM
MMMMMMM. .MMMMMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMM
.NMMMM:. ........,=$NMMMMMMMMMMMMMMMMM.
. ... ...=DMMMMMMMMMMZ
..........

....,:,....
...... .....,?DMMMMMMMMMMD.
.NMMMM,. ........:7DMMMMMMMMMN$==ZMMMM.
MMMMMMM. .ZZZZZZ88DNMMMMMMMMMMMD+:,.........MMM
MMMMMMM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
?MMMMMM. ...,=?ONMMMMMMMMMMMMMMMMMMMMMM.
..~$$. ..~OMMMMMMMMMMMMM..
.~$DMMMN$,






Nota: hay montones de generadores ASCII a partir de imágenes; yo he usado:

http://www.glassgiant.com/ascii/

23 diciembre 2007

Jugando con Notepad++

Para cualquier usuario que manipule fuentes en distintos lenguajes de programación, es interesante tener un editor de texto avanzado.

Yo he probado varios, y por ahora el que más me ha convencido es Notepad++. Voy a indicar algunas de las características que mas me gustan, junto con algunas de las pulsaciones de teclas más cómodas para mi uso diario:

- Como primer punto a su favor, se instala en el idioma del sistema (entre ellos, español).

- Además es Open Source (de código abierto), lo que supone que aunque el autor "oficial" abandonara el proyecto, se podrían seguir corrigiendo errores.

- Por supuesto, es multidocumento, pero además también es "multivista" (se pueden ver dos vistas distintas de un mismo documento a la vez).

- En cuanto al uso normal, detecta automáticamente el lenguaje de programación que se está empleando (entre más de 40), y adapta el coloreado de la sintaxis.

- Marca los paréntesis cerrados correspondientes a otros paréntesis abiertos y viceversa, para permitirnos localizar errores de sintaxis si estamos tecleando fuentes en algún lenguaje de programación (ocurre lo mismo con los corchetes y con las llaves).

- Tiene "autocompletado": cuando empezamos a teclear el nombre de una orden en un lenguaje de programación, pulsamos Ctrl+Espacio para que la complete, o nos muestre sugerencias. También permite usar "abreviaturas", que se reemplazan por todo un texto al pulsar Ctrl+Intro.

- Permite trabajar con distintas codificaciones, como ANSI y UTF-8.

- Incluye un editor hexadecimal.

- La búsqueda en el documento permite emplear expresiones regulares, y se puede hacer en todos los documentos abiertos a la vez. Se puede incluso buscar y reemplazar en todos los abiertos o buscar los ficheros que contengan un cierto texto dentro de un directorio.

- Incluye teclas rápidas para buscar la palabra del cursor en Google (Alt+F3), en la Wikipedia (Alt+F3) y en el manual online de PHP (Alt+F1).

- Puede unir varias líneas en una (Ctrl+Mays+L) o dividir un párrafo en varias líneas (Ctrl+L)

- La mayoría de los atajos de teclado se pueden redefinir.

- Un añadido llamado "TextFX" tiene muchísimas posibilidades de manipulación de texto, como: convertir tabuladores a espacios y viceversa, eliminar espacios redundantes al final de las líneas, convertir a mayúsculas, minúsculas o formato de frase, eliminar etiquetas HTML, etc.

- Tiene un "Light Explorer", que permite tener al lado del editor los iconos de MiPc, y así poder abrir ficheros con más comodidad que a través del típico Archivo/Abrir.

- Uno de los Plugins habituales es "Explorer", una ampliación del "Light Explorer", que además permite tener favoritos, para acceder más rápidamente a las carpetas que usamos con frecuencia.

- Otro Plugin interesante es el "HTML Tag", que permite comprobar dónde abren y cierran las "etiquetas" como <p> y </p> (pulsando Ctrl+T), además de convertir de símbolos internacionales a "entidades", como "á" a "&aacute;" (pulsando Crl+E).

- Para los que trabajamos con retroproyector, es útil poder cambiar con rapidez el tamaño de la letra en pantalla. Se puede conseguir manteniendo pulsado Ctrl mientras se gira la rueda del ratón (también hay dos botones en la barra de herramientas).


Carencias o limitaciones (alguna hay, claro):

- No permite (todavía) indicar UTF-8 como codificación por defecto. Se puede hacer para documentos nuevos, pero no para documentos ya creados, en los que lo detecta el editor o (si él no consigue acertar) hay que indicárselo manualmente (algo que suele ocurrir en los ficheros sin caracteres internacionales, que él siempre considera como ANSI).

- No permite exportar a HTML con la sintaxis coloreada, algo que resulta muy cómodo para los que publicamos fuentes como parte de páginas Web. Para esto utilizo PsPad, que también es un buen editor gratuito pero con alguna limitación (es gratuito pero no OpenSource, es un poco inestable y se "vuelve loco" en algunas ocasiones...). Scite, que es mucho más sobrio que Notepad++ y PsPad, también es útil para esto.

- El menú de Plugins y de TextFx contiene muchas opciones... tantas que a veces es difícil encontrar lo que uno busca.

21 diciembre 2007

Redescubriendo el Amstrad CPC

Yo me introduje en el mundo de la programación a mediados de los 80, hace ya unos 23 años, con un Amstrad CPC 664. Existen varios foros en español en los que usuarios o aficionados a estos sistemas comentan, todavía hoy en día, formas de crear y optimizar programas para estos equipos, de ampliar su hardware, de conectarlos a un PC...

En parte por nostalgia y en parte por desenterrar conocimientos ya casi olvidados, voy escribiendo a ratos libres una introducción a la programación de Basic para estos ordenadores.

Si te pica la curiosidad...

www.nachocabanes.com/amstrad/curso

19 diciembre 2007

Windows la ha vuelto a fastidiar

Ha vuelto a ocurrir.

Estaba grabando una interesante película que emitían en televisión. Cine independiente, actores de prestigio... una película con buena pinta, que nunca había visto, y que además me temo que es difícil que vuelvan a repetir...

Pongo el ordenador de sobremesa en marcha, espero a que comience la película para que no quede ningún anuncio al principio de la grabación. Todo correcto. La dejo grabando y salgo al salón, a trabajar con el portátil.

Cuando termina la película, me acerco al ordenador de sobremesa a parar la grabación... ¡¡¡pero ya no había grabación!!!

Mi querido Windows ha descargado una actualización, se ha reiniciado y me ha fastidiado la grabación. Supongo que habrá aparecido uno de esos preciosos avisos de "el sistema se reiniciará en 5 minutos"... pero... ¿y si el ordenador está realizando cualquier proceso (como en este caso) sin una persona delante? Proceso perdido.

¿No habrá nadie en una macroempresa como Microsoft que sea capaz de ponerse en el lugar del usuario? ¿A nadie se le ha ocurrido que la opción por defecto debería ser NO reiniciar el equipo? Y no es la única cagada (sí, así, con todas las letras) relacionada con reiniciar el ordenador en Windows: también es totalmente absurdo que una opción tan crítica aparezca de repente en una ventana de diálogo, de forma que es muy posible que el usuario esté tecleando y confirme el reinicio sin darse cuenta... ¿tan difícil será para Microsoft hacer que el diálogo no esté activo durante 3 segundos, como hace Firefox?

Pero la situación es como es. La serie Windows es software cerrado, privativo, y con creadores que son reacios a escuchar a los usuarios. Y si la aplicación que necesitas sólo existe para Windows, o tu hardware sólo tiene drivers para Windows... estás vendido. Es fácil que los señores de Microsoft hagan que te enfades más de una vez, pero en muchas ocasiones no hay alternativa. O tragas o no trabajas.

Esperemos que la situación cambie. Y no me refiero a que la gente de Microsoft escuche, porque no lo van a hacer hasta que la presión del mercado sea insoportable. Me refiero a que Linux (o cualquier otro sistema operativo libre) tenga cada vez más drivers, porque los desarrolladores de la mayoría de versiones de Linux SÍ escuchan a los usuarios, y si aun así encuentras una carencia, siempre está la opción de corregirla. Y esto no quiere decir necesariamente que la corrijas tú mismo, porque quizá no tengas los conocimientos necesarios, sino que puedas conseguir que se haga, bien sea porque alguien se encargue de forma altruista, o bien incluso porque pagues para que te lo haga alguien ajeno al sistema. Porque para modificaciones importantes, es preferible poder contratar a alguien que las haga, antes que depender de un sistema cerrado que ni tú ni nadie podría modificar (salvo Microsoft, que claramente NO lo va a hacer "sólo" porque un particular lo pida).

Y volviendo al problema de los reinicios del sistema sin el consentimiento del usuario... quizá algún gurú de Windows sepa como evitar este tipo de fallos de Windows modificando alguna oculta opción del registro de Windows. Quizá. Por cierto... mientras que en Linux todo está documentado, en Windows muy poca gente es capaz de exprimir medianamente el registro... ¿quien dijo que Linux era difícil...?


(A efectos estadísticos, y a quien pueda interesar: el delicioso sistema operativo que me ha hecho esta pifia es Windows XP Profesional, segunda edición. Por supuesto con licencia y al día. Quizá Vista, a cambio de ser menos productivo y mucho más caro, al menos corrija esta cagada... quizá...)

06 diciembre 2007

Dos tipos de programadores

Me apetecía opinar (y en parte traducir) un nuevo artículo de Jeff Atwood en su blog Coding Horror, que se apoya a su vez en un post de Ben Collins-Sussman sobre "los dos tipos de programadores".

Habla de que existen 2 tipos de programadores en el mundo, los que llama el 20% y el 80%:
  • La gente "del 20%" son lo que algunos llaman "programadores alfa", el tipo de gente que sitios como Google se obsesionan por contratar. Gente que fueron los primeros en instalarse Linux en casa en los 90, gente que escribe compiladores de Lisp y aprende Haskell los fines de semana "sólo por diversión", que participan en algún proyecto de software libre y que están a la última en cuanto a programación y herramientas.
  • El "otro 80%" es la masa de la industria del software: gente que fue a un centro de estudios, aprendió C++, C# o Java, y encontró trabajo en un banco, gobierno , agencia de viajes... Habitualmente el mundo no llega a conocer sus programas. Usan las herramientas que Microsoft les imponga, nunca han usado Linux ni están interesados en él, nunca han usado herramientas de control de versiones... Saben exactamente qué hacer para terminar su trabajo, y cuando llega el fina de semana se van a casa y se olvidan de los ordenadores.

Además añade un par de "hechos impactantes":
  • Que la mayoría de la industria del software está formada por "programadores del 80%": pequeños desarrollos para Windows o pequeñas compañías que contratan a sus propios programadores.
  • Que la mayoría de los "geeks" olvidan el primer hecho, no se paran a pensar que exista "el otro 80%" y se sorprenden de que en su empresa no sean capaces de usar la última distribución de Linux que ellos acaban probar.

Pero, como suele ocurrir en los artículos en los que lee (y opina) gente con una cierta cultura, puede resultar todavía más interesante leer las opiniones de la gente que el propio artículo en sí. Se pueden encontrar cosas como:
  • Gente que dice que después de leerlo... tienen claro en qué lado se encuentran.
  • Hay quien piensa que la proporción es más cercana al 10/90, incluso quien dice que apenas son un 1% los que son capaces de marcar la diferencia.
  • Otros que dicen que muchos de los del 80% consideran que están dentro del 20%.
  • Hay quien dice que no es cierto eso de que el 80% sepa exactamente cómo hacer su trabajo.
  • También hay quien dice que al 80% no le preocupa lo más mínimo la industria del software, sino sólo su trabajo.
  • Hay quien dice formar parte de ese 80% y estar orgulloso de ello, porque así tiene tiempo libre para él y para su familia durante el fin de semana.
  • Mucha gente dice que las generalizaciones son demasiado simplistas, que no se puede clasificar todo en blanco o negro.
  • Por supuesto, también hay quien tacha a Jeff de clasista y/o arrogante... ;-)

¿A qué lado te acercas más? Si has leído esto y/o el artículo original, posiblemente es porque tienes inquietudes y quizá entonces no estés claramente entre ese 80% de gente que programa por trabajo, sino que te aproximes a los que lo toman como una pasión.

Aun así, yo creo que los extremos nunca son buenos. Procuro estar más cerca del 20%, pero no me obsesiona. Me gusta la programación e investigar cosas que no conozco, pero también está bien eso de tener tiempo libre de vez en cuando... ;-)

(Si hablas inglés, quizá te interese leer el artículo original).

27 noviembre 2007

No me sirve Fedora 8 ni Open Suse 10 3

Pues sí, pues sí... me he tomado el tiempo de probar dos de las distribuciones de Linux más prestigiosas... pero sin resultados que me convenzan.

Obviamente, las dos son buenas distribuciones, pero hay básicamente dos motivos que PUEDEN IMPEDIR por completo el migrar de un sistema operativo a otro:

  • Que emplees software que no esté disponible en el nuevo sistema operativo (o que ese software tenga un precio prohibitivo).
  • Que emplees hardware para el que no existan drivers en el nuevo sistema operativo.

Mi caso no es el primero. La gran mayoría de software que utilizo es (afortunadamente) no privativo, y existe tanto para Windows como para Linux y otros sistemas operativos. Uso muy pocas cosas de las que no haya versión para Linux, y son cosas poco importantes.

Pero el segundo caso SÍ refleja mi problema: uso un ordenador portátil de gama baja, para el que no es fácil encontrar drivers de un par de componentes. Y uno de ellos es crítico: una tarjeta WiFi Broadcom.

Así que cada vez que pruebo una distribución de Linux, la instalo con una conexión cableada a Internet, la pruebo un poco, veo qué aporta de interesante, y luego me peleo con el hardware para ver si es fácil de afinar.

Y la mayoría de distribuciones "de renombre" actuales ofrecen casi todo lo que se puede esperar: gratuidad, sencillez de instalación, facilidad de manejo, una enorme cantidad de software... pero casi todas están un poco "cojas" en cuanto a drivers. Así que miro en algún foro, pruebo el método de fw-cutter para la tarjeta WiFi, el de ndiswrapper, leo de alguna persona que lo ha conseguido, de unas cuantas más que están desesperadas... pero yo no me desespero. Nadie me obliga a usar un cierto sistema operativo. Tengo un Windows con licencia (XP, por supuesto) y también un Ubuntu 7.10 en el que funciona casi todo lo que necesito. Si otra distribución no me ofrece (en poco tiempo) lo que necesito, simplemente la descarto.

Y ese es el caso de Fedora 8 (que no detectaba mi tarjeta Wifi, y tampoco conseguí hacer funcionar con ninguno de los dos métodos "habituales") y de OpenSuse 10.3 (que sí parecía detectar la tarjeta... pero no llegaba a conectar a mi red inalámbrica). Así que sigo con mi Ubuntu 7.10, que avisaba de que el driver era privativo, se apoyaba en los drivers para Windows... pero hacía funcionar la tarjeta sin problemas.

Para que Linux pueda hacerse un hueco en los ordenadores "de casa", típicamente equipados con Windows, haría falta una serie de cosas:
  • Que la gente pueda utilizar programas como los que usa en Windows (no necesariamente iguales, pero sí razonablemente parecidos, porque la resistencia al cambio es grande).
  • Que se pueda emplear todos los dispositivos que incluye el ordenador (tarjetas WiFi, WinModems, scanners, dispositivos de juego, tarjetas sintonizadoras de televisión, webcams, ...)
  • Un poco de cultura de que lo que tiene un cierto precio no necesariamente es mejor que lo que tiene un precio inferior, e incluso algo "gratis" puede ser mejor que algo "de pago". A eso hay que añadir al hecho de que "atarse" a programas privativos puede ser una mala apuesta para el futuro, porque si desaparece la empresa que creó ese programa, no habrá forma de corregir fallos ni de añadir nuevas características.

En mi caso, estoy totalmente convencido de lo último, tengo suerte con lo primero... pero no tanto con los drivers, así que seguiré con la distribución que soporta mayor cantidad de mi hardware: ubuntu 7.10.

Pero también continuaré probando las nuevas distribuciones/sistemas operativos que me llamen la atención...

23 noviembre 2007

Impresiones sobre las jornadas COPLA 2007

Estos dos últimos días he asistido a tercera edición (2007) de las jornadas COPLA (Jornadas por el Conocimiento Abierto y el Software Libre -Coneixement Obert i Programari Lliure-) organizadas por la Universidad de Alicante.

Estas son mis impresiones.

La inauguración, la tarde del jueves 22 de noviembre, fue a cargo del rector de la universidad y el vicerrector de tecnología. Buenas intenciones en cuanto a fomentar el conocimiento abierto... en una universidad en la que al alumnado (y más aún a las terceras personas) le cuesta encontrar materiales accesibles públicamente, porque casi toda la información está "encerrada" en el Campus Virtual, y accesible sólo a los alumnos matriculados en cada asignatura. También buenas intenciones en cuanto a fomentar el software libre... en una universidad en la que he tenido que usar MatLab para cálculos matriciales sencillos, en vez de alternativas disponibles libremente como Octave. Mi experiencia personal es que hasta ahora la actitud del profesorado ha sido todo lo contrario a lo que estas jornadas pretenden. Esperemos que este sea realmente el punto de inflexión que marque un cambio de actitud del profesorado, aunque si son las terceras jornadas... ya ha habido dos años para implementar cambios... que todavía son poco evidentes.


La primera conferencia tenía por título "Obrint el coneixement des de la universitat", y trataba sobre iniciativas abiertas que existen en universidades, y su relación con las licencias CreativeCommons. El ponente, era Ignasi Labastida i Juan, de Creative Commons en España. Una conferencia muy interesante sobre las alternativas que tiene una universidad a la hora de dejar abiertos sus materiales, las licencias disponibles para permitir o no la modificación o no de estos materiales y su uso comercial, así como unas pinceladas legales. El único (pequeño) pero que se le podría poner a esta intervención fue (para mi gusto) que se diera en catalán, que supuso una dificultad para el alumnado extranjero o emigrante, y quizá para parte de los internautas que intentaran seguir la conferencia por Internet.

Después una sesión titulada "Redes tecnológicas de introducción de Software Libre en asignaturas", en la que se expusieron algunas de las iniciativas que se están realizando en asignaturas puntuales, como la introducción progresiva de OpenOffice Writer en sustitución de Word, de R en lugar de MatLab, el proyecto Collatinus para el aprendizaje de latín, o una plataforma libre para la realización de campeonatos en inteligencia artificial, que se usa para valorar e incentivar a los alumnos en las prácticas de la asignatura "Fundamentos de Inteligencia Artificial". Buenos ponentes todos ellos, y buenas iniciativas.

El viernes 23 comenzó con la conferencia "Una web en versiones: 1.0, 2.0, 3.0", por J.J. Merelo, de la Universidad de Granada, una interesante visión sobre cómo ha ido evolucionando la web, los servicios que ha ido ofreciendo, y hacia donde podría ir el futuro. No sólo interesante la visión, también estupenda la forma de exponerlo: una conferencia muy entretenida.

Siguió con la charla "Introducción al II Concurso Universitario de Software Libre", por Pablo Neira, de la Universidad de Sevilla. Una interesante iniciativa . Lástima que por ahora no esté abierta nada más que a universitarios, sería motivador también para alumnos de Ciclos Formativos, e incluso a autodidactas jóvenes, aunque es comprensible que los recursos de que disponen son muy limitados, y no pueden permitir un crecimiento muy rápido en el número de inscritos.

A continuación, la conferencia "CENATIC y la promoción de las tecnologías de fuentes abiertas", por Alberto Abella. Un buen ponente, e interesante saber que se hacen esfuerzos por centralizar relacionados con el software libre.

Para terminar, la conferencia "Open Solaris, un sistema Operativo para el futuro". Interesante conocer otra alternativa a los sistemas operativos libres, con alguna novedad que habrá que observar. Pero me temo que es un mercado en el que es difícil entrar con fuerza, tanto en universidades e instituciones educativas como en las casas de los alumnos u otros usuarios domésticos. La charla en sí no ha sido especialmente buena (siempre en mi opinión, claro), pero se dejaba escuchar.


¿Otras cosas a destacar? Me ha decepcionado la casi nula asistencia. Si exceptuamos a mis alumnos (que no son universitarios), debía haber menos de 10 profesores, y quizá la cantidad de alumnos universitarios asistentes fuera menor aún. A lo mejor había mucha gente que lo estuviera siguiendo desde Internet, pero los infructuosos intentos de uno de mis alumnos, que no ha sido capaz de seguir la conferencia que más le interesaba (a pesar de tener una conexión de 3 Mb) me hace pensar que tampoco habría mucha audiencia.

Esperemos que las conferencias o sus transcripciones pueden disponibles para descarga y así puedan llegar a más gente.

¿Y por qué tan poca asistencia? No lo sé, este año no estoy matriculado en esa universidad, así que no sé si las jornadas coincidían con algún otro evento. Quizá no se hayan dado a conocer lo suficiente. Quizá sea simplemente porque coincidían con horario de clases y muchos alumnos prefieran no faltar a clase (a veces para que no les "resten nota", no por falta de interés). Quizá confiaran en que la videoconferencia funcionara correctamente. Quizá no se haya incentivado dando al menos 1 crédito a cambio de las casi 10 horas de charlas. Quizá no haya despertado interés. Pero es una pena que conferenciantes de esta talla no tengan público, y sería deseable descubrir qué ha fallado si no se quiere que estas jornadas mueran prematuramente.

A cambio, entre el público sí me ha sorprendido gratamente una cosa: aportaciones interesantes en las mesas redondas por parte de un profesor (asistente como público) que en su día me pareció penoso. Se deduce que no es que fuera un mal profesional, sino que no estaba motivado en la asignatura que impartía. Es algo que se debería solucionar, pero indica que no está todo perdido. Parece que unos cuantos profesores no son gente incompetente, sino gente desaprovechada.


Puedes leer más de Ignasi Labastida aquí:
http://copyleft-contenidos-abiertos.blogspot.com/2006/05/espaa-es-el-pas-con-mayor-nmero-de.html

Y a JJ Melero aquí:
http://atalaya.blogalia.com/

Más sobre el concurso de software libre en:
http://concurso-softwarelibre.us.es/

Si quieres saber más sobre Cenatic:
http://www.cenatic.es/

El portal de OpenSolaris en español:
http://es.opensolaris.org/

Más fotos de las jornadas en:
http://www.flickr.com/photos/nachoalicante/tags/copla/

El programa de las jornadas se puede consultar en:
http://www.copla.ua.es/jornadas3/es/index.php?action=programa



13 noviembre 2007

Una pequeña mejora para PsPad

Yo solía usar el editor Notepad++ como sustituto del bloc de notas de Windows, que es muy cómodo y permite hacer casi de todo, pero tiene una carencia seria para mi trabajo habitual: no permite exportar en formato de HTML ni RTF los fuentes de programación con la sintaxis coloreada, algo que yo necesito hacer con frecuencia para mis clases y mis cursos online.

Para eso usaba Scite (que tiene muchas menos funciones, pero a cambio tiene un tamaño muy reducido) o preferiblemente PsPad, que además es ¿casi? tan potente como Notepad++.

Pero resulta que hay disponible una nueva versión de PsPad, y tiene poco (o nada) que envidiar a Notepad++. De hecho, yo sólo he echado una cosa en falta: convertir caracteres internacionales en entidades HTML: pasar de "á" a "á" y similares. Es algo que Notepad++ tampoco hace directamente (sí lo hacen editores "visuales" como Nvu o el más reciente Kompozer), pero tiene un plugin que permite conseguirlo con una pulsación de tecla. Así que he echado un vistazo a la estructura de carpetas de PsPad para ver si encontraba una forma sencilla de conseguirlo yo mismo y sí... es muy fácil añadirle ese tipo de facilidades...

Se puede hacer desde JavaScript: un pequeño programa que busque secuencias de caracteres y las reemplace por otro. Podría ser así (cuidado, quizá no se vean correctamente los caracteres internacionales; el original lo puedes descargar desde www.nachocabanes.com/utils/pspad_HTMLreplace.zip):

/*****************************************************************************
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it freely,
* subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a product,
* an acknowledgment in the product documentation would be appreciated but is
* not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* Original Code by: Nacho Cabanes
* www.nachocabanes.com
*
********************************************************************************/
var module_name = "HTMLreplace";
var module_ver = "1.00";

/* Function to replace multiple times
as seen in "http://lineadecodigo.com/2007/08/07/funcion-replace-en-javascript/"
*/

function nreplace(texto,s1,s2){
return texto.split(s1).join(s2);
}

/* Function to replace frequent international ANSI entities */
function HTMLreplaceANSI() {

var ed = newEditor();
ed.assignActiveEditor();

var sentence = ed.selText();
if(sentence=='') {
sentence = ed.Text();
}
sentence = nreplace(sentence, "á", "á");
sentence = nreplace(sentence, "é", "é");
sentence = nreplace(sentence, "í", "í");
sentence = nreplace(sentence, "ó", "ó");
sentence = nreplace(sentence, "ú", "ú");
sentence = nreplace(sentence, "Á", "Á");
sentence = nreplace(sentence, "É", "É");
sentence = nreplace(sentence, "Í", "Í");
sentence = nreplace(sentence, "Ó", "Ó");
sentence = nreplace(sentence, "Ú", "Ú");
sentence = nreplace(sentence, "ñ", "ñ");
sentence = nreplace(sentence, "Ñ", "Ñ");
sentence = nreplace(sentence, "ü", "ü");
sentence = nreplace(sentence, "Ü", "Ü");

var txt = ed.selText();
if(txt=='')
ed.text(sentence);
else
ed.selText(sentence);
}


/* Function to replace frequent international DOS ASCII entities */
function HTMLreplaceDOS() {

var ed = newEditor();
ed.assignActiveEditor();

var sentence = ed.selText();
if(sentence=='') {
sentence = ed.Text();
}

sentence = nreplace(sentence, " ", "á");
sentence = nreplace(sentence, "‚", "é");
sentence = nreplace(sentence, "¡", "í");
sentence = nreplace(sentence, "¢", "ó");
sentence = nreplace(sentence, "£", "ú");
sentence = nreplace(sentence, "µ", "Á");
sentence = nreplace(sentence, "", "É");
sentence = nreplace(sentence, "Ö", "Í");
sentence = nreplace(sentence, "à", "Ó");
sentence = nreplace(sentence, "é", "Ú");
sentence = nreplace(sentence, "¤", "ñ");
sentence = nreplace(sentence, "¥", "Ñ");
sentence = nreplace(sentence, "", "Ü");
sentence = nreplace(sentence, "š", "Ü");

var txt = ed.selText();
if(txt=='')
ed.text(sentence);
else
ed.selText(sentence);
}


function Init(){
addMenuItem("HTML replace ANSI chars", "HTML replace", "HTMLreplaceANSI");
addMenuItem("HTML replace DOS chars", "HTML replace", "HTMLreplaceDOS");
}



Basta copiarlo en la carpeta de PsPad (típicamente "c:/Archivos de Programa/PsPad editor"), dentro de la subcarpeta Script, y a su vez, dentro de JScript. Yo lo he llamado "HTMLreplace.js", pero el nombre no debería ser importante.

A partir de entonces, en cuanto vuelvas a entrar a PsPad, ya tienes una opción en el menú (en "Guiones", dentro "HTML repace") que permite escribir en español, con acentos y eñes, con la tranquilidad de que es fácil convertirlo a entidades HTML para que se vea correctamente en cualquier navegador y con cualquier codificación de caracteres.

09 noviembre 2007

Fedora 8 está en la calle

Ayer, 8 de noviembre, y tras varias "beta" públicas, se lanzó Fedora 8, la distribución libre de Linux recopilada por Red Hat. Es una distribución menos popular que Ubuntu, pero respaldada por la confianza que da saber que Red Hat está detrás y de que existen miles de paquetes RPM con los que poder ampliar el sistema. Además, se puede descargar un DVD de instalación, lo que permite instalar un sistema muy completo sin necesidad de contar con una conexión a Internet de alta velocidad (ese es el mayor fallo de Ubuntu en mi opinión: sólo se puede instalar desde Cd y actualizar a través de Internet; el DVD de instalación es de pago, y disponible sólo para Estados Unidos).

Fedora 8 incluye detalles como
  • Gnome 2.20
  • KDE 3.5.8 (la beta 4 es descargable desde lo los repositorios)
  • Compiz Fusion
  • OpenOffice 2.3
  • Kernel 2.6.23
  • CodecBuddy, para ayudar a la instalación de codecs alternativos a los codecs propietarios (MP3, DVD)
  • ...

Además del DVD de instalación, también se puede descargar un Live CD para probar sin necesidad de instalar. Existe un Live CD con Gnome como entorno de escritorio y otro con KDE.

Más información en su página (disponible en español):

fedoraproject.org

Novedades (en español) en:

docs.fedoraproject.org/release-notes/f8/es

Descargas en:

fedoraproject.org/get-fedora

08 noviembre 2007

Nuevas revisiones de OpenWatcom y Lazarus

Hace 15 días (el 23 de octubre), el compilador OpenWatcom C++ sufrió una pequeña revisión (1.7a) para corregir un par de defectos que se descubrieron tras el paso de la versión 1.6 a la 1.7.

El entorno de desarrollo es "feo", pero sigue siendo uno de los compiladores más robustos para Windows, y de los pocos que todavía incluyen una versión para OS/2, además de soportar la programación para DOS (incluso 16 bits) y de permitir generar ejecutables para Linux (todavía de forma experimental). El hecho de que la mayoría de los juegos de prestigio de mediados de los 90 se desarrollaran con él (Doom, Descent, Duke Nukem y otros muchos) da una idea de la potencia que tenía ya en aquellas fechas.



No permite programación visual al estilo que nos acostumbran herramientas como Visual C++ o Delphi/Lazarus, pero al menos sí incluye un editor de cuadros de diálogo para simplificar la creación de la parte visible de la aplicación:


Por otra parte, el día 5 de noviembre (hace apenas 2 días) se marcó como terminada la versión 0.9.24 de Lazarus, el entorno de desarrollo visual en lenguaje Pascal que imita a Delphi, pero con dos grandes diferencias: ser gratis (de código abierto, para ser más precisos) y existir para Windows y Linux. Eso quiere decir que ahora se deben estar completando los instaladores para los distintos sistemas operativos en los que funciona y en poquísimo tiempo debería estar disponible para descarga.

01 noviembre 2007

Reconvirtiendo video con MediaCoder

Para mí es relativamente frecuente necesitar convertir videos de formatos "extraños" a formatos "más habituales".

Generalmente el formato de destino es DivX o Xvid, que son formatos reconocidos por muchos reproductores domésticos, lo que me permite ver mis grabaciones en equipos que no necesariamente sean un ordenador.

El formato de origen es más variado. A veces son ficheros MPEG capturados de televisión o mediante cámara de video, que tienen un tamaño muy elevado y prefiero reducir

En alguna ocasión he tenido que pelear con un fichero que ya estaba en formato DivX, pero en alguna variante poco estándar, y que he preferido recomprimir.

En otras ocasiones se trata de videos interesantes que he encontrado en la red, en lugares como YouTube o Google Video, en formato FLV, y que prefiero conservar por si desaparecieran de su lugar de origen.

En todos esos casos, uso una herramienta gratuita para convertir de un formato a otro: se trata de MediaCoder, que se puede descargar de mediacoder.sourceforge.net.


Apenas hay que hacer dos configuraciones para que funcione correctamente y genere ficheros "razonablemente estándar":

En la pestaña "video" elijo como formato XviD, con una calidad media (800 kbps, por ejemplo), y como contenedor (container) AVI, así:


Como sonido, uso el formato MP3, generado por el decodificador "Lame", el mismo que se puede usar para generar salida MP3 desde Audacity. Para ello, descargué el fichero ZIP desde lame.buanzo.com.ar y copié a la carpeta de MediaCoder el fichero DLL que incluye.



Poco más que hacer: con el botón "Add" se añaden los ficheros a convertir (se puede convertir más de uno, en un lote), con el botón "Start" comienza la conversión, con el botón "Clear" se limpia la lista de ficheros, una vez terminado el proceso.


Antes de terminar, una pregunta frecuente: ¿Y cómo obtengo esos FLV de YouTube o Google Video?

La forma más sencilla: usar Firefox como navegador, e incluirle el plugin llamado "Download Helper" (desde el menú Herramientas / Complementos / Obtener extensiones). A partir de entonces, aparecerá un nuevo botón en la barra de herramientas que permite descargar de forma cómoda el video que estamos viendo.

Antes de usar ese plugin, yo lo hacía mirando los ficheros grandes y recientes que hay en la carpeta de Caché de Firefox:

C:\Documents and Settings\usuario\Configuración local\Datos de programa\Mozilla\Firefox\Profiles\???????.default\Cache

pero para los profanos (y que todavía no usen Firefox), puede ser más sencillo usar otras páginas que ayudan en la descarga, como "Onlive FLV converter" (convertdirect.com), que a mí no me funcionó correctamente como conversor, pero incluye un botón "Download FLV" que sí puede ayudar a conservar lo que nos parezca interesante.

29 octubre 2007

Apoya a ODF frente a OOXML

Microsoft intenta imponer un nuevo estándar, el OOXML (Office OpenXML), en contraposición al existente ISO26300, conocido como Open Document Format (ODF).

OOXML es un formato XML creado por Microsoft para especificar la información contenida en documentos como los creados por procesadores de texto, hojas de cálculo, presentaciones, etc. OOXML ya fue aceptado como estándar por ECMA (European Computer Manufacturers Association), en diciembre de 2006. Ahora Microsoft quiere que OOXML se convierta en un estándar ISO, en vez de emplear el existente ODF, algo que a más de uno nos parece absurdo.

La decisión final se tomará por parte de ISO en febrero de 2008.

Existe gente que recopila firmas para pedir a los miembros de ISO que voten "NO" a la aprobación de ISO DIS 29500 (Office OpenXML o OOXML) por las siguientes razones:

  1. Ya existe un estándar, el ISO26300, también llamado Open Document Format (ODF): un doble estándar añade costes, falta de certeza y confusión a la industria, los gobiernos y los ciudadanos.
  2. No hay certeza de que se vaya a implementar la especificación OOXML specification: Microsoft Office 2007 produce una versión especial de OOXML, en vez de ficheros que sigan la especificación OOXML.
  3. Falta información en la especificación, por ejemplo cómo hacer un autoSpaceLikeWord95 o un useWord97LineBreakRules;
  4. Más del 10% de los ejemplos mencionados en el estándar propuesto no validan correctamente como XML.
  5. No hay garantía de que nadie pueda escribir software que implemente completamente o parcialmente la especificación OOXML sin poder ser acusado de violar patentes de Microsoft (o tener que pagar por su uso).
  6. Este formato crea conflicto con otros estándares ISO existentes, como el ISO 8601 (Representación de fechas y horas), ISO 639 (Códigos para Representación de Nombres e Idiomas) o ISO/IEC 10118-3 (hash criptográfico);
  7. Existe un bug en el formato para hojas de cálculo, que no permite emplear fechas anteriores al año 1900: este fallo afecta a la especificación OOXML, así como a a aplicaciones como Microsoft Excel 2000, XP, 2003 y 2007.
  8. La propuesta de estándar no se ha creado tras recopilar la experiencia de todas las partes interesadas (como desarrolladores, vendedores, usuarios y reguladores), sino únicamente por Microsoft.
Si a ti también te parece absurda o incluso aberrante esta política de Microsoft de inventar nuevos estándares en vez de respetar los existentes, y de hacerlo sin contar con la aprobación de nadie más, e incluso con especificaciones incompletas y que contienen fallos, puedes firmar para solicitar que voten "NO". Quizá no sirva de nada (Microsoft es muy poderosa), pero por intentarlo, que no quede...

Más detalles (en inglés), y la casilla en la que firmar (se te enviará un correo electrónico de confirmación), en:

http://www.noooxml.org/petition

27 octubre 2007

El visor gráfico XnView sigue mejorando

El 24 de octubre estaba disponible para descarga una nueva versión del visor gráfico gratuito XnView, la 1.91.6. No se trata de grandes cambios, pero demuestra que el proyecto sigue vivo.

En esta entrega hay unas 19 pequeñas correcciones, junto con 4 características nuevas, alguna curiosa como el hecho de poder ver un imagen en Google Earth si la información EXIF incluye datos de GPS, o el que las imágenes transparentes se puedan ver con un fondo de cuadros para apreciar mejor la transparencia.

Pero lo importante no son estas pequeñas novedades, sino todo lo que esta herramienta viene ofreciendo desde hace mucho tiempo, y por lo que yo la empleo casi a diario, incluso para muchas tareas en las que me resulta más cómodo que programas "de peso" como The GIMP o incluso comerciales como Photoshop.

Entre sus características, yo destacaría:
  • Es gratuito
  • Está en español (y en otros muchos idiomas: detecta el idioma del sistema)
  • Permite visualizar imágenes en una ENORME cantidad de formatos (como pequeño ejemplo, se puede usar JPG -JPEG-, PNG, GIF, BMP, TIF -TIFF-, TGA, RAW, PSD -Photoshop-, PCX, PBM, PGM...)
  • Se puede ver las imágenes una a una o en forma de presentación continua
  • Se puede ver todas las miniaturas de las imágenes contenidas en una carpeta -directorio-, y elegir el tamaño que queremos para las miniaturas
  • Permite convertir imágenes de un formato a otro, a elegir entre la mayoría de los formatos que es capaz de mostrar
  • Permite hacer ajustes en las imágenes: brillo, contraste, curvas de nivel...
  • Se puede recortar una imagen
  • Se puede rotar una imagen o hallar su espejo (tanto horizontal como vertical)
  • Permite reducir la "profundidad de color" de una imagen (por ejemplo, de 256 colores a 16 colores), algo muy útil para que las imágenes lineales ocupen menos
  • Se puede añadir texto a una imagen, en cualquier posición, con cualquier color y cualquier tipo de letra
  • Permite ver la información EXIF de las cámaras digitales, con detalles como la fecha y hora del disparo, apertura del diafragma, velocidad de obturación, etc.
  • Se puede escanear (si tenemos scanner, claro) desde el propio XnView
  • Puede capturar la pantalla cuando pulsemos una cierta tecla o al cabo de un cierto tiempo, o capturar sólo la ventana activa, incluyendo el cursor o no, y guardar el resultado en una carpeta o mostrarlo en el propio visor
  • Puede renombrar varias imágenes siguiendo un mismo patrón (por ejemplo, "madrid-##" para crear la serie "madrid-01", "madrid-02", ...)
  • Puede crear "galerías" en formato de página web, con las miniaturas de las imágenes y enlaces a las imágenes en tamaño grande.
  • Permite crear "hojas de contacto", que resumen el contenido de una carpeta, incorporando varias imágenes reducidas (por ejemplo 5x5) en una única imagen resultante (nuevamente, el tamaño de las miniaturas y de la imagen resultado son ajustables)
  • Permite realizar tareas repetitivas, como convertir todas las imágenes de una carpeta de un formato a otra, o reducirlas todas ellas, o recortarlas, o añadirles un texto... ¡o todo ello a la vez!
  • En estas modificaciones repetitivas podemos hacer que se conserven los atributos originales de la imagen (por ejemplo, la fecha y hora de la imagen original)
  • Si hemos modificado una imagen con otra herramienta, quizá la fecha y hora de que nos muestra el sistema operativo no sean correctas; podemos corregirlo, haciendo que la fecha del fichero coincida con la fecha en que se tomó la fotografía
  • La gran mayoría de funciones se pueden realizar no sólo desde el menú, sino también con combinaciones de teclas
  • A pesar de tantas funcionalidades, no es complicado de manejar
  • Su tamaño es muy contenido (una descarga de unos 6 Mb)
  • Hay versión para Windows, claro ;-) ... pero también existe versión para Linux, para MacOS X y para otros sistemas operativos

Si lo quieres probar, puedes descargarlo (la versión para Windows) en

http://perso.orange.fr/pierre.g/xnview/endownloadwin32.html

Y su página oficial (en inglés, francés y alemán), por si quieres curiosear más, es

http://www.xnview.com/

19 octubre 2007

KUbuntu 7.10 funcionando y potenciado

Ubuntu 7.10 ya está en la calle. Y claro, también lo están KUbuntu (la distribución que yo uso actualmente) y XUbuntu.

Yo he optado por no actualizar "por software", sino hacer copia de seguridad de los datos que tenía y reinstalar desde cero, reformateando la partición, con la tranquilidad que da contar con un gestor de paquetes como Adept (o Synaptic, para Gnome, si se usa Ubuntu en vez de KUbuntu).

Como era de esperar, la instalación ha ido como la seda, sin problemas. Algún momento "muerto" después de seleccionar la distribución de teclado en el que no acabas de saber si se ha bloqueado o está comprobando cosas como las particiones, el software instalado o el existente en el Cd... pero basta con un poco de paciencia.

Eso sí, cuando termina "todavía faltan cosas". Al menos para mí. Yo necesito algo más que lo que ofrece la instalación típica, así que he entrado al gestor de paquetes Adept y le he indicado que quería más repositorios de software (desde el menú Adept): universe, restricted, multiverse...

Para que funcione correctamente la red inalámbrica con mi tarjeta WiFi Broadcomm no ha sido necesario usar el paquete ndiswrapper, sino poner en marcha el "restricted-manager-kde" para descargar e instalar drivers poco habituales apenas con un par de clics.

A partir de entonces, los paquetes que he añadido han sido:
  • El navegador Firefox y su traducción español (es-es).
  • El programa de mensajería aMsn, que me gusta más que Kopete.
  • El manejador de ficheros Midnight Commander (mc) para el modo consola y su equivalente Krusader en modo gráfico.
  • La suite ofimática KOffice, algo más ligera que OpenOffice, para casos puntuales.
  • El editor gráfico The Gimp para imágenes bitmap y el Inkscape para imágenes vectoriales.
  • El creador de diagramas Dia y el modelador UML Umbrello.
  • El compilador de C++, "g++".
  • El entorno de desarrollo Geany (no Anjuta, que es la versión 2, más incómoda para mi gusto que la 1).
  • El clásico editor "joe", que emplea las combinaciones de teclas del WordStar que yo usabé hace muuuchos años.
  • El emulador de Windows, "wine", por si necesito usar alguna aplicación propietaria de pequeño tamaño.

¿Un poco más de "fine tuning"? Sí, en mi caso el arranque es lento por la comprobación de las particiones de Windows, y la navegación por Internet es lenta, mucho más lenta que desde Windows. Las soluciones han sido:
  • Para el arranque, editar /etc/fstab y cambiar el 1 que aparece al final de los detalles de las particiones de Windows por un 0, para que no las compruebe cada vez que arranque.
  • Para la navegación por Internet, entrar a /etc/modprobe.d, crear allí un fichero "bad_list" que contuviera "alias net-pf-10 off" (todo ello sin las comillas, claro) para deshabilitar IPv6 por si mi router no lo permite y esa es la raíz del problema.
Además, el navegador de imágenes F-Spot (similar a Picasa) no quería funcionar desde el menú, si no se carga con "dbus-launch f-spot", así que he cambiado las propiedades del acceso directo.

Falta poco. El editor gráfico XnView, que me resulta muy cómodo pero no aparece en los repositorios y descargaré desde el sitio web de su autor o usaré desde Wine. Quizá también instale Free Pascal y Lazarus para mis pequeñas utilidades creadas en Pascal, tanto en modo consola como en modo gráfico. Posiblemente MySQL y PHP para las pruebas en local de desarrollo web... ¿Me falta algo interesante de lo que no me haya acordado? Se admiten sugerencias...

Creo que por ahora no necesitaré nada más. Mañana intentaré configurar la sincronización con mi PDA Palm, y con poco más que eso ya tengo un sistema totalmente utilizable. ¿Quién necesita Windows...?

09 octubre 2007

Jugando con Perl (8)

Se acaba el tiempo que puedo dedicar a experimentar con Perl.

Aun así, como pequeña muestra de alguna otra de las posibilidades que permite, voy a incluir una lista con algunas de las funciones que incorpora, por categorías. No daré detalles de su uso, pero si a alguien le interesa, al menos ya tiene un poco más fácil para encontrar el resto de la información que pueda necesitar:

Matemáticas
  • abs - valor absoluto
  • atan2 - arco tangente de Y/X en el rango -PI ... PI
  • cos - coseno
  • exp - eleva e a una cierta potencia
  • hex - convierte una cadena a número hexadecimal
  • int - parte entera de un número
  • log - logaritmo
  • oct - convierte una cadena a número octal
  • rand - devuelve un número pseudoaleatorio
  • sin - seno
  • sqrt - raíz cuadrada
  • srand - semilla para números aleatorios


Cadenas
  • chop - elimina el último carácter de una cadena
  • crypt - encriptación en un sentido, como en passwd
  • lc - devuelve una cadena convertida a minúsculas
  • lcfirst - devuelve una cadena con sólo la primera letra convertida a minúsculas
  • length - devuelve el número de bytes en una cadena
  • reverse - da la vuelta a una cadena o una lista
  • uc - devuelve una cadena convertida a mayúsculas
  • ucfirst - devuelve una cadena con sólo la primera letra convertida a mayúsculas

Sistema operativo y de ficheros
  • chdir - cambia el directorio de trabajo
  • chmod - cambia los permisos de una lista de ficheros
  • chown - cambia el propietario de una lista de ficheros
  • exec - abandona este programa para ejecutar otro
  • exit - termina este programa
  • fork - crea un nuevo proceso hijo, como el actual
  • getlogin - nombre del usuario activo
  • gmtime - convierte la hora de UNIX a un registro o cadena, usando la hora Greenwich
  • link - crea un enlace en el sistema de ficheros
  • localtime - convierte la hora de UNIX a un registro o cadena, usando la hora local
  • lock - bloquea un hilo en una variable, subrutina o método
  • mkdir - crea un directorio
  • readlink - determina dónde apunte un enlace simbólico
  • rename - cambia un nombre de fichero
  • rmdir - borra un directorio
  • sleep - espera un cierto número de segundos
  • system - ejecuta otro programa
  • time - número de segundos desde 1970
  • utime - cambia la fecha de acceso y modificación de un fichero
  • wait - espera a que cualquier proceso hijo termine
  • waitpid - espera a que un proceso hijo concreto termine

Manipulación de ficheros
  • close - cierra un fichero
  • closedir - cierra un directorio
  • eof - comprueba si un fichero ha llegado al final
  • getc - lee el siguiente carácter de un fichero
  • flock - bloquea todo un fichero
  • open - abre un fichero o un "pipe"
  • opendir - abre un directorio
  • print - envía una lista a un fichero
  • printf - envía una lista formateada a un fichero
  • read - lectura de datos de tamaño fijo mediante buffer desde un fichero
  • readdir - lee un directorio
  • readline - lee una línea de un fichero
  • seek - salta a otra posición de un fichero (acceso directo)
  • seekdir - salta a otra posición de un directorio
  • tell - devuelve la posición actual en un fichero
  • telldir - devuelve la posición actual en un directorio
  • truncate - trunca un fichero

Redes y comunicaciones
  • accept - acepta una conexión de socket entrante
  • connect - conecta a un socket remoto
  • gethostbyaddr - devuelve un host de red, dada su dirección
  • gethostbyname - devuelve un host de red, dado su nombre
  • msgrcv - recibe un mensaje SysV IPC de una cola de mensajes
  • msgsnd - envía un mensaje SysV IPC a una cola de mensajes
  • recv - recibe un mensaje sobre un socket
  • send - envía un mensaje sobre un socket

...

Pero quedan muchas más. Tienes una lista alfabética detallada -en inglés- en:

http://www.sunsite.ualberta.ca/Documentation/Misc/perl-5.6.1/pod/perlfunc.html

Y si prefieres una versión en formato PDF de estos 8 apartados, la tienes en

www.nachocabanes.com/perl/

08 octubre 2007

Jugando con Perl (7)

Ahora vamos a ver cómo crear funciones en Perl.


La forma de declararlas es usando la palabra "sub" seguida del nombre:

sub suma { ... }

Los parámetros se leen a través del array "@_", que podemos recorrer de varias formas:
  • Accediendo a cada elemento: el primer parámetro sería @_[0], el segundo @_[1], el tercero @_[2] y así sucesivamente.
  • Usando la orden "foreach", que lee cada valor del array y lo guarda en una variable: foreach (&variable) (@array)
  • Usando la orden "shift" para acceder al primer valor y "desplazar" los demás valores, de modo que el que antes era el segundo pase a ser el nuevo primero.

Las variables locales se preceden con "my":

my $valorTemporal = 0;


Si queremos devolver un valor se usa "return".


En la forma "clásica" de declarar la función, no se usan paréntesis, y la llamada se precede con un símbolo "&", así:

sub suma { ... }
&suma(3,4);

En la forma "moderna" (utilizable a partir de Perl 5) se puede declarar con paréntesis (e indicar el número de parámetros con símbolos "$") y llamar sin paréntesis:

sub suma ($) { ... }
suma(3,4);


Vamos a agrupar todo esto en un ejemplo:


# Función para saludar a varios, al antiguo estilo
sub saludo
{
print "Esto es un saludo para: ";
foreach $actual (@_) {
print $actual . " ";
}
print "\n";
}

# Función para elevar al cuadrado, al antiguo estilo
sub cuadrado {
my $numero = shift;
$numero **= 2;
return $numero;
}

# Función para sumar dos números, al modo moderno, 2 parámetros
sub suma($$)
{
return $_[0] + $_[1];
}


# Cuerpo del programa

# Primero llamamos a la función saludo, al antiguo estilo
&saludo("Nacho", "Juan");

#Luego, elevamos 3 al cuadrado
print "3 al cuadrado es : " . &cuadrado(3) ."\n";

#Finalmente, sumamos 4 y 6
print "4 + 6 = " . suma(4,6) ."\n";


El resultado de este programa sería

Esto es un saludo para: Nacho Juan
3 al cuadrado es : 9
4 + 6 = 10

29 septiembre 2007

Jugando con Perl (6)

Otra de las novedades de Perl frente a otros lenguajes "clásicos" es el soporte de "tablas hash", una estructura de datos parecida a los "arrays", pero en la que para acceder a cada elemento no usaremos un número, sino una palabra asociada.

Las variables de tipo "hash" se declaran precediendo su nombre por un símbolo de porcentaje (%). Una primera forma de definirlas, bastante compacta, es ésta:

%edad = ('Juan', 23, 'Pedro', 31);

Para ver la edad de Pedro haríamos

print "La edad de Juan es " . $edad{'Juan'} . "\n";

(cuidado: para acceder a cada dato individual sí se emplea $, y la referencia que buscamos se encierra entre llaves).

Existe otra forma de declarar este tipo de variables, que ocupa más espacio pero puede resultar más legible:

%estatura = (
Juan => 182,
Pedro => 178
);

Así se ve más claramente que son dos pares de datos.

En este caso, también se accedería a cada dato de la misma forma

print "La estatura de Pedro es " . $estatura{'Pedro'} . "\n";

Se puede modificar el valor de una variable de tipo hash así:

$estatura{'Juan'} = 183;

Si usamos este mismo formato con una referencia que no existe, se añadirá a la tabla hash:

$estatura{'Alberto'} = 169;

Podemos borrar un dato con delete:

delete $estatura{'Juan'};

O eliminar todo el hash con "undef":

undef %estatura;


Finalmente, podemos juntar todo esto en un pequeño programa de prueba:

%edad = ('Juan', 23, 'Pedro', 31);
print "La edad de Juan es " . $edad{'Juan'} . "\n";
%estatura = (
Juan => 182,
Pedro => 178
);
print "La estatura de Pedro es " . $estatura{'Pedro'} . "\n";
$estatura{'Juan'} = 183;
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";
$estatura{'Alberto'} = 169;
delete $estatura{'Juan'};
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";
undef %estatura;
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";


En este ejemplo, los dos últimos "print" muestran "La estatura de Juan es" y nada más, porque no hay definido ningún valor que mostrar.

28 septiembre 2007

Presentaciones desde Google Docs

A Google Docs todavía le falta mucho para ser perfecto. Ya va siendo razonablemente utilizable, pero me fastidia , más que la carencia de ciertas posibilidades, el que aún tenga malos detalles en algunas de las soportadas.

Por ejemplo, no me gusta que el documento que ves en pantalla y el PDF que generas a partir de él sean "tan distintos". Los grandes espacios entre párrafos típicos de HTML no se ven en pantalla pero sí en el PDF, por lo que cuesta afinar para conseguir la apariencia que buscas.

En cualquier caso, la herramienta no para de crecer. Hoy me ha sorprendido ver propaganda de Google Docs en una búsqueda normal en Google, he seguido el enlace y he visto que ya incluyen una herramienta para crear presentaciones (supongo que desde hace poco tiempo, o al menos yo lo había pasado por alto hasta ahora... y me imagino que no soy el único, o no lo anunciarían):



Como era de esperar, está a años luz de las últimas versiones de Powerpoint en cuanto a funcionalidades: no existen animaciones, no se pueden poner notas, las posibilidades de ajuste de la apariencia son muy limitadas...

Pero para un usuario básico, lo fundamental sí está: crear diapositivas (desde cero o duplicando una anterior), usar varios temas (diseños) distintos, incluir recuadros de texto, cambiar la apariencia del texto, incluir imágenes...

Y para ciertos tipos de usuarios concretos: varias personas pueden editar la presentación a la vez... pero también varias personas (a través de Internet) pueden ver la presentación en el mismo momento.

Curiosamente, permite importar ficheros PPT (Powerpoint), pero no exportarlos (al menos no todavía). Eso sí, tiene una "vista imprimible" por si queremos volcar a papel o a PDF (con una utilidad de terceros), y también una opción "Guardar como .zip", que crea una página web (con sus ficheros auxiliares) que podríamos ver desde nuestro ordenador, sin conexión a Internet.

Claramente, esta herramienta no apunta exactamente al mismo sector que Powerpoint. Los "power users" de las presentaciones requerirán mucho más. Pero quien necesite una herramienta colaborativa, puede tener aquí un gran aliado.

27 septiembre 2007

Jugando con Perl (5)

Una de las grandes ventajas de Perl sobre otros lenguajes "más antiguos" como C es el manejo más sencillo de cosas frecuentes, como las cadenas de texto. Otro es la enorme cantidad de funciones incorporadas, que permiten hacer gran cantidad de cosas con una cierta sencillez. Otro es el uso de expresiones regulares directamente desde el lenguaje. Eso es lo que vamos a ver hoy: las expresiones regulares, y de paso, algo más sobre el manejo de cadenas.

En C, para ver si una cadena empieza por "a", haríamos algo como

if (texto[0] == 'a') ...


Si queremos ver si empieza por "ab", la cosa se va haciendo más engorrosa

if ((texto[0] == 'a') && (texto[1] == 'b')) ...

Esto, además de ser más largo y más difícil, tiene "problemas menores": ¿si mi cadena tiene sólo longitud 1, debería yo acceder a la segunda posición? La mayoría de los compiladores, si no se cumple la primera parte de una condición unida por &&, no se molestarían en seguir comprobando, pero... ¿y si mi cadena es "a"? Podría ir afinando un poco la comparación haciendo

if ((strlen(texto) >=2) && (texto[0] == 'a') && (texto[1] == 'b')) ...

Está claro que apenas una comparación tan sencilla como "empieza por ab en minúsculas" ya va siendo engorrosa de programar en C.

En Perl todo esto es mucho más sencillo, gracias al uso de expresiones regulares. Vamos a ver cómo se haría y luego detallamos qué hemos hecho:

$frase1 = "abcde";

if ($frase1 =~ m/ab.*/) {
print "La frase 1 contiene ab y quizá algo más\n";
}


Cosas a tener en cuenta para empezar:
  • Para comparar una cadena con una expresión regular usaremos =~ (si queremos ver si cumple la condición) o !~ (para comprobar si NO se cumple).
  • La expresión regular se indica entre / y /
  • La operación más sencilla con cadenas es comparar ("match"), así que antes de la primera barra añadiríamos una m.
  • Un punto (.) quiere decir "cualquier carácter".
  • Un asterisco (*) quiere decir "el carácter anterior, repetido 0 o más veces".

(luego en la expresión anterior estamos buscando: a, b, 0 o más veces cualquier carácter).

Si eso queda claro, sigamos...

Para ver si se ha tecleado en mayúsculas o en minúsculas, usaríamos corchetes. Los corchetes indican opcionalidad, es decir, que nos sirve cualquiera de los elementos que indicamos entre ellos:

$frase2 = "aBcde";

if ($frase2 =~ m/[aA][bB].*/) {
print "La frase 2 contiene ab (mayúscula o minúscula) y quizá algo más\n";
}


Si se trata de un rango de valores, podemos usar un guión. Por ejemplo, podríamos comprobar si se ha tecleado un número, haciendo

$numeroEntero = "12345";

if ($numeroEntero =~ /[0-9]*/) {
print "El número entero sólo contiene cifras\n";
}


(0 o más cifras del 0 al 9)

Pero siendo estrictos, eso daría una cadena vacía como número válido, y eso es un tanto discutible. Si queremos que al menos haya una cifra, en vez de usar el asterisco (0 o más), usaríamos el símbolo de la suma (+), que indica "1 o más veces":

if ($numeroEntero =~ /[0-9]+/) {
print "El número entero sólo contiene cifras\n";
}


(1 o más cifras del 0 al 9)

Realmente, esto aceptaría cualquier cadena que contenga un número entero. Si queremos que SÓLO sea una número entero, podemos indicar el principio de la cadena con ^ y el final de la cadena con $, de modo que haríamos

if ($numeroEntero =~ m/^[0-9]+$/) {
print "El número entero sólo contiene cifras\n";
}

(la cadena contiene sólo 1 o más cifras del 0 al 9)


¿Cómo lo haríamos para un número real? 1 o más cifras del 0 al 9, seguidas quizás por un punto decimal (pero sólo 1) y, en ese caso, seguidas también por 1 o más cifras del 0 al 9.

Para eso necesitamos saber alguna cosa más:
  • El "." es un comodín, de modo que si queremos buscar si aparece un punto dentro de nuestra cadena, deberemos indicar que no nos referimos al comodín, sino al símbolo del punto ("."), y para eso lo precedemos con la barra invertida: \
  • Si queremos que algo se repita como mucho una vez (0 o 1 veces), añadiremos una interrogación ("?") a continuación.
  • Si necesitamos agrupar cosas (que se repita "el punto y una secuencia de cifras") lo haremos usando paréntesis antes del símbolo "?" (o el que nos interese en nuestra comprobación).

Con esas consideraciones, lo podríamos escribir así:

if ($numeroReal1 =~ m/^[0-9]+(\.[0-9]+)?$/) {
print "El número real 1 parece correcto\n";
}


Un ejemplo que agrupe todo esto:

------

$frase1 = "abcde";
$frase2 = "aBcde";
$numeroEntero = "12345";
$numeroEnteroFalso = "123a45";
$numeroReal1 = "123.45";
$numeroReal2 = "123.4.5";
$numeroReal3 = "123.";

if ($frase1 =~ m/ab.*/) {
print "La frase 1 contiene ab y quizá algo más\n";
} else {
print "La frase 1 no contiene ab\n";
}

if ($frase2 =~ m/ab.*/) {
print "La frase 2 contiene ab y quizá algo más\n";
} else {
print "La frase 2 no contiene ab\n";
}

if ($frase2 =~ m/[aA][bB].*/) {
print "La frase 2 contiene ab (mayúscula o minúscula) y quizá algo más\n";
} else {
print "La frase 2 no contiene por ab (mayúscula o minúscula)\n";
}

if ($numeroEntero =~ m/^[0-9]+$/) {
print "El número entero sólo contiene cifras\n";
} else {
print "El número entero no sólo contiene cifras\n";
}

if ($numeroEnteroFalso =~ m/^[0-9]+$/) {
print "El falso número entero sólo contiene cifras\n";
} else {
print "El falso número entero no sólo contiene cifras\n";
}

if ($numeroReal1 =~ m/^[0-9]+(\.[0-9]+)?$/) {
print "El número real 1 parece correcto\n";
} else {
print "El número real 1 no parece correcto\n";
}

if ($numeroReal2 =~ m/^[0-9]+(\.[0-9]+)?$/) {
print "El número real 2 parece correcto\n";
} else {
print "El número real 2 no parece correcto\n";
}

if ($numeroReal3 =~ m/^[0-9]+(\.[0-9]+)?$/) {
print "El número real 3 parece correcto\n";
} else {
print "El número real 3 no parece correcto\n";
}


-----

que daría como resultado:

La frase 1 contiene ab y quizá algo más
La frase 2 no contiene ab
La frase 2 contiene ab (mayúscula o minúscula) y quizá algo más
El número entero sólo contiene cifras
El falso número entero no sólo contiene cifras
El número real 1 parece correcto
El número real 2 no parece correcto
El número real 3 no parece correcto


Otras posibilidades que no hemos comentado (los ejemplos, más abajo):
  • Si queremos que la búsqueda no distinga entre mayúsculas y minúsculas, añadiremos una "i" a continuación de la segunda barra,
  • Para expresar que algo debe repetirse un número concreto de veces, lo indicamos entre llaves: {2,4} querría decir "un mínimo de 2 veces y un máximo de 4 veces"; {3} sería "exactamente 3 veces"; {7,} indicaría "7 o más veces".
  • Una barra vertical ("|") indica opcionalidad.
  • Un acento circunflejo ("^") nada más comenzar un corchete indica que buscamos el caso contrario.


Algunos ejemplos más, para poner casi todo a prueba:

  • Una secuencia de una o más letras "a": /a+/
  • Una secuencia enre 3 y 5 "a": /a{3,5}/
  • Cualquier letra: /[a-zA-z]/
  • Una secuencia de cero o más puntos: /\.*/
  • Una secuencia de letras "a" o "b": /[a|b]+/
  • Las palabras "Jorge" o "Jorgito": /Jorg(e|ito)/
  • Las palabras "Pedro", "pedro", "Juan", "juan": /[Pp]edro|[Jj]uan/
  • Las palabras "Pedro" o "Juan", en mayúsculas o minúsculas: /Pedro|Juan/i
  • Cualquier cosa que no sea una cifra: /[^0-9]/

Finalmente, quizá sea interesante comentar que para ahorrarnos trabajo en cosas frecuentes como "cualquier cifra" tenemos abreviaturas similares a "\d". Estas son las más habituales:

\d  Un dígito numérico
\D un carácter que no sea un dígito numérico
\w Un carácter "de palabra" (alfanuméricos y "_")
\W Un carácter "no de palabra" (opuesto al anterior)
\s Un carácter de espacio en blanco
\S Un carácter que no sea de espacio en blanco
\t Un tabulador
\n Un avance de línea
\r Un retorno de carro
\043 Un carácter indicado en octal (en este caso, 43 octal = 35 decimal)
\x3f Un carácter hexadecimal (éste es 3f hexadecimal = 63 decimal)

(Se puede hacer más cosas aún, pero como introducción es bastante...)