Archivo

Entradas Etiquetadas ‘Emacs’

5 Aplicaciones que me salvan día a día

Domingo, 15 de Enero de 2012 Gaspar Fernández 3 comentarios

Son pequeñas aplicaciones sin las cuales no podría salir adelante día a día. Aunque a veces no las mime demasiado y no les haga mucho caso, deberían saber que son importantes para mí, para mi vida online y yo informático. He intentado establecer un orden, pero todas ellas son muy importantes, por lo que ocuparían todas la primera posición:

  1. Keepnote

    Es un software muy completo y ligero para tomar notas, clasificarlas y buscar dentro de ellas. De todos los que he probado es el que mejor sensación me ha dejado con respecto a su facilidad de uso, velocidad y características. Disponible en Linux, Mac y Windows

  2. KeepassX

    Es un gran programa para anotar nuestras contraseñas y anotaciones para cualquier tipo de identificación electrónica (webs, banca online, routers, etc). Puedes ordenar las contraseñas por categorías, asignarles iconos, buscarlas, etc. Es muy fácil de utilizar, y guarda la información cifrada para que nadie más que tú pueda verla. Disponible para Linux, Mac y Windows

  3. Grisbi

    Un software para organizar mi economía personal, saber cuánto dinero tengo en la cartera y en el banco, quién me debe y a quién le debo. Es muy completo y funciona en Linux, Mac y Windows.

  4. Emacs

    Llamadme friki, pero es mi editor de texto / IDE favorito para programar. Con multitud de opciones, automatizable, personalizable y todo a mano, aunque para aprender fue algo difícil en principio, una vez que sabes las cuatro cosas básicas, todo va sobre ruedas, y cada día me gusta más (excepto la opción deshacer, pero bueno, nadie es perfecto). Funciona en Linux, Mac, Windows, *BSD, Solaris y algunos más

  5. Hotot

    Un cliente para Twitter muy ligero, cómodo e intuitivo. Hay muchos clientes para microbloguear, pero con éste es con el que me siento más cómodo. Disponible para Linux, Mac, Windows y Chrome, aunque para Windows y Mac es bastante inestable aún.

En algunos de estos proyectos, y en otros más intento colaborar de diferentes formas, aunque a veces no en la medida que me gustaría, por falta de tiempo, como pasa siempre:

  • Clicks en la publicidad de sus webs oficiales
  • Perfeccionamiento de traducciones
  • Haciendo que más gente los utilice
  • Reportando bugs
  • Sugiriendo características

Y vosotros, ¿cómo colaboráis con vuestros proyectos preferidos? ¿Cuáles son esos 5 programas sin los que no podríais vivir?

C.I. XIII: Tutorial Emacs, Taza VIM, supercomputador 10 petaflops, OSWC, Ubuntu ya no es el rey, IE baja y Chrome sube

Domingo, 27 de Noviembre de 2011 Gaspar Fernández Sin comentarios

Hace mucho que no recopilo enlaces, y es que a veces, por trabajo, ni puedo leer las noticias, ni el twitter a gusto, y mucho menos profundizar en algunos temas.

  • Curso intensivo de EMACS por parte de IBM. Me entero desde el blog MuyLinux y ya que es mi entorno de desarrollo preferido, tengo que promocionarlo un poco.
  • Aunque la noticia tiene un mes (K-Computer superó la barrera de los 10 petaflops). Vamos, ¡ una verdadera máquina para hacer raíces cuadradas ! Recuerdo cuando hacía simulaciones en los ordenadores de la facultad y nos tirábamos 2 ó 3 minutos a que salieran los resultados. Con uno como estos para todo el aula, hubiéramos terminado las prácticas en 20 minutos. Bueno, el paralelismo cuenta, hubiéramos aprendido algo muy interesante.
  • Conferencia Internacional de Open Source: Han cambiado de sede, y de fechas, ahora anuncian la Open Source World Conference para Granada, los días 12 y 13 de Enero. Aunque ya está en curso de forma anual la Libre Software World Conference, todos estos eventos son necesarios para el avance del Software Libre. ¿La cancelarán los políticos dos semanas antes de abrir sus puertas? ¿Invertirán menos dinero en las jornadas? ¿ Se meterá algún patrocinador que nada tenga que ver con el software libre?¿Predicarán con el ejemplo?  Se supone que deberían usar este tipo de software para que sea creíble que funciona.
  • Ubuntu, ya sí que no es la distribución más popular. Hace tiempo Ubuntu era la que más gustaba a la gente, aunque personalmente nunca me atrajo bastante, hace un par de años alcanzó un grado de estabilidad importante, y no estaba mal. Pero no quisieron (ni deben) quedarse estancados, pero parece que muchas decisiones que han tomado les han pasado factura.
  • Taza Vim. Si antes ponía un tutorial para Emacs, ahora es una cheatsheet en forma de taza de desayuno para aquellos que utilizáis Vim !

Bueno, también quiero compartir el gráfico de las últimas estadísticas de StatCounter, donde vemos la pérdida de cuota de mercado de Internet Explorer, que va por el 40%, y aunque sigue siendo el más usado (que tenga cuidado en Europa), muchos usuarios han preferido prescindir de una aplicación que viene instalada en su ordenador y han instalado otra mejor. También podemos ver que Chrome ha crecido mucho estos meses, y ya le planta cara seriamente a Firefox, llegando a superarle en algunos lugares:

112011stc 112011stc_eu 201111stdes
En todo el mundo En Europa En España

C.I. VIII: Leyes de programación, SL candidata a los Príncipe de Asturias, ruido de discos duros, llaves al programar

Sábado, 5 de Marzo de 2011 Gaspar Fernández 2 comentarios

Tenía muchos enlaces atrasados para compartir, aunque al no haber escrito demasiado estos días, he decidido, para calentar motores, compartir con vosotros algunos enlaces relacionados con la programación, la informática y el software libre.

Sustituyendo texto con expresiones regulares en EMACS

Domingo, 18 de Julio de 2010 Gaspar Fernández Sin comentarios

regular_expression

Una de las herramientas más utilizadas (por mí al menos) es la de reemplazar texto. En EMACS la podemos encontrar con:

M-x replace-string

Con esta orden podemos cambiar un texto por otro dentro de un buffer o una selección. Hasta aquí bien. Pero alguna vez nos podemos encontrar con un texto que debemos reemplazar por otro, y aunque no es exactamente igual en todos los reemplazos que tenemos que hacer sigue una cierta lógica.

Imaginemos que tenemos este código en PHP (Gracias Antonio):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
switch ($pregunta) {
    case 0: $preg="<br><br>¿Qué significa PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Power H Processor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHP: Hypertext Preprocessor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Para Hacer Poco</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. PHP: Harvard Preprocessor</a><br>";
            break;

    case 1: $preg="<br><br>¿Dónde se ejecuta PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. En el Cliente</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. En algún lugar de la Mancha...</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. En el Servidor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Ninguna de las anteriores</a><br>";
            break;

    case 2: $preg="<br><br>¿Cuál de las siguientes variables NO existe como predefinida en PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. PTTS_BOOK</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHPSESSID</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. REQUEST_METHOD</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. REMOTE_ADDR</a><br>";
            break;

    case 3: $preg="<br><br>¿Quién creó PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Rasmus Lerdorf</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Obi One Kenobi</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Bill Gates</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Andrew S. Tanenbaum</a><br>";
            break;

    case 4: $preg="<br><br>¿Con qué <i>marca</i> habrá un salto de línea en el código fuente?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. \\t</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. \\n</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. &lt;br&gt;</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. \\g</a><br>";
            break;

    case 5: $preg="<br><br>¿Cuál de las siguientes funciones NO se puede acceder al servidor de datos MySQL?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. mysql_query</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. mysql_connect</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. mssql_connect</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. mysql_pconnect</a><br>";
            break;

    case 6: $preg="<br><br>¿Cuál es la frase correcta?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. setcookie() puede ser llamada desde cualquier parte del documento HTML</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Las cookies sólo se pueden mandar antes de mandar cualquier otra cabecera</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Las cookies no son parte de la cabecera HTTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. El perro de San Roque no tiene rabo, porque el Chiquito se lo ha robado</a><br>";
            break;

    case 7: $preg="<br><br>¿La función ftp_get?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Sube un fichero al servidor FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Establece una conexión FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Descarga un fichero del servidor FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Devuelve el nombre del directorio actual</a><br>";
            break;
}

Y queremos sustituirlo por este otro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
addPregunta($pregresp, "¿Qué significa PHP?", "a. Power H Processor", "b. PHP: Hypertext Preprocessor", "c. Para Hacer Poco", "d. PHP: Harvard Preprocessor");

    addPregunta($pregresp, "¿Dónde se ejecuta PHP?", "a. En el Cliente", "b. En algún lugar de la Mancha...", "c. En el Servidor", "d. Ninguna de las anteriores");

    addPregunta($pregresp, "¿Cuál de las siguientes variables NO existe como predefinida en PHP?", "a. PTTS_BOOK", "b. PHPSESSID", "c. REQUEST_METHOD", "d. REMOTE_ADDR");

    addPregunta($pregresp, "¿Quién creó PHP?", "a. Rasmus Lerdorf", "b. Obi One Kenobi", "c. Bill Gates", "d. Andrew S. Tanenbaum");

    addPregunta($pregresp, "¿Con qué <i>marca</i> habrá un salto de línea en el código fuente?", "a. \\t", "b. \\n", "c. &lt;br&gt;", "d. \\g");

    addPregunta($pregresp, "¿Cuál de las siguientes funciones NO se puede acceder al servidor de datos MySQL?", "a. mysql_query", "b. mysql_connect", "c. mssql_connect", "d. mysql_pconnect");

    addPregunta($pregresp, "¿Cuál es la frase correcta?", "a. setcookie() puede ser llamada desde cualquier parte del documento HTML", "b. Las cookies sólo se pueden mandar antes de mandar cualquier otra cabecera", "c. Las cookies no son parte de la cabecera HTTP", "d. El perro de San Roque no tiene rabo, porque el Chiquito se lo ha robado");

    addPregunta($pregresp, "¿La función ftp_get?", "a. Sube un fichero al servidor FTP", "b. Establece una conexión FTP", "c. Descarga un fichero del servidor FTP", "d. Devuelve el nombre del directorio actual");

    addPregunta($pregresp, "¿Con qué función se puede eliminar una variable de sesión?", "a. session_unregister", "b. session_destroy", "c. session_register", "d. jam_session");

    addPregunta($pregresp, "¿Con que harías un buen bocadillo...?", "a. Con pavo de ese que tiene trozos de colores", "b. Con un milagro", "c. Con habichuelas", "d. Con las manos");

El switch podemos quitarlo a mano, y en este ejemplo, tal vez para 7 preguntas, podríamos hacerlo a mano, aunque si fuera alguna más, nos pensaríamos este nuevo método.

Bien, en EMACS, tenemos la siguiente herramienta:

M-x regexp-builder

Que nos seleccionará el texto que corresponde con la expresión regular que estemos construyendo, y nos ayudará a generar una expresión más compleja, en definitiva queremos que la expresión cubra todos los cases, para continuar la lectura del post, nos fijamos en el primero:

1
2
3
4
5
6
case 0: $preg="<br><br>¿Qué significa PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Power H Processor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHP: Hypertext Preprocessor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Para Hacer Poco</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. PHP: Harvard Preprocessor</a><br>";
            break;

Para construir la expresión, hay mucho copy-paste, además, desde Linux podemos seleccionar texto y pegarlo con el botón central del ratón, lo que nos facilita mucho la vida. Por otra parte, hay que tener en cuenta que tenemos que escapar muchos caracteres (como “, [, (, ), ], ?), de todas formas, nos vamos dando cuenta de eso al construir la expresión, si EMACS no selecciona un carácter como correspondiente a la expresión, lo más normal es que tengamos que escaparlo, también, tenemos que tener en cuenta que un espacio en blanco se representa aquí como [:space:]. Con todo esto, construimos la siguiente expresión:

“case [0-9]: $preg=\”

[a-zA-Z_.\<\>\/\¿\?áéíóú[:space:]]*
\”;
[[:space:]]*$resp=\”[\\_()a-zA-Z,\:áéíóú&;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*break;

Se seleccionarán todos los case, ahora copiamos la expresión para luego pegarla para reemplazarla. Aunque antes, tenemos que fijarnos en una cosa, en cada línea que queremos sustituir hay fragmentos de texto que queremos que figuren en la cadena sustituida, queremos hacerlo también automáticamente, eso lo conseguimos poniendo entre paréntesis en la expresión anterior las cadenas que vamos a aprovechar del texto que vamos a sustituir. La dejamos así:

case [0-9]: $preg=\”

\([a-zA-Z_.\<\>\/\¿\?áéíóú[:space:]]*\)
\”;
[[:space:]]*$resp=\”\([\\_()a-zA-Z,\:áéíóú&;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*break;

Ahora llamamos a la siguiente orden:

M-x replace-regexp

Introducimos como expresión la última que hemos hecho (la de los paréntesis, marqué en negrita los textos que queremos conservar). Y la sustituimos por lo siguiente:

addPregunta($pregresp, “\1″, “\2″, “\3″, “\4″, “\5″);

Vemos que es una función a la que le pasamos una variable y después cinco textos, el primer texto (\1), coincidirá con la pregunta (en el código de los cases), y desde el segundo (\2) hasta el quinto (\5) coincidirá con cada una de las cuatro posibles respuestas.

Una vez hecho esto se sustituirán todo el código de los cases, por el de la función addPregunta() con los textos correspondientes.

Tal vez este ejemplo haya sido un poco grande, pero las expresiones regulares son muy útiles, seguro que casi a diario encontráis la necesidad de hacer algo parecido a esto en vuestro editor de texto.

Referencias:
Text Pattern Matching in EMACS
Regexp Replace - GNU Emacs

Foto: fdecomite (Flickr)

EMACS: Cambiando la codificación

Miércoles, 12 de Mayo de 2010 Gaspar Fernández Sin comentarios

Es muy común, sobre todo en trabajos colaborativos, que cada persona trabaje en una codificación diferente (casi siempre porque se usan programas diferentes para editar, y poca gente se para a cambiar la codificación por defecto). Por ejemplo, hay quienes guardan todos sus archivos en iso-8859-1 o iso-8859-15, incluso utf-8. Pero llega el momento en que se edita el archivo de otra persona, y esas codificaciones producen extraños comportamientos en la ejecución.

Una solución desde EMACS sería:
M-x set-buffer-line-coding-system RET [codificación, TAB para ver opciones] RET

O también podemos utilizar la recla rápida:
C-x RET f [codificación] RET

Ya podemos salvar el archivo (C-x C-s) y seguir trabajando.

Contar letras (caracteres) en EMACS

Miércoles, 14 de Abril de 2010 Gaspar Fernández Sin comentarios

letrasHay ocasiones en las que, cuando estamos escribiendo en nuestro editor de texto, necesitamos saber cuántas letras tiene un texto seleccionado.

Podemos hacerlo a la antigua usanza (la mayoría de los editores nos dicen el número de línea y carácter donde está el cursor, pues miramos al final del texto y al comienzo y restamos. Aunque emacs tiene un comando específico que nos hará esa tarea más fácil.

M-x count-lines-region

Nos devolverá el número de líneas y caracteres que tiene un texto seleccionado, como carácter se cuenta también el retorno de carro.

Por cierto, también dispone de tecla rápida: M-=

Foto: Laineys Repertoire (Flickr)

Categories: Emacs Tags: , , , ,

Plantillas en EMACS

Viernes, 9 de Abril de 2010 Gaspar Fernández Sin comentarios

pie-grandeEs la primera entrada de mi editor de texto favorito.

Cuando pasas gran parte del día editando archivos, es muy útil que al empezar un fichero nuevo haya algo escrito, algo que siempre toca escribir a mano, unos pocos comentarios donde dices más o menos de qué va lo que hay en el fichero y poco más.

Casi todos los editores modernos disponen de esa característica y emacs no iba a ser menos, sólo que hay que instalar una extensión (se puede hacer sin necesidad de extensiones, pero hace falta programar un poco y lo que queremos es una solución rápida que nos permita seguir trabajando en lo realmente importante), después de probar dos o tres, me quedo con emacs-template, es fácil de instalar y de configurar. Sólo hay que hacer lo siguiente:

  1. Descargar de la página oficial de emacs-template.
  2. Descomprimir en un directorio (yo lo hice en ~/.emacs_loadpath/
  3. Compilar template.el (recomendable), para ello dentro de emacs hacemos: M-x byte-compile-file y luego buscamos el archivo template.el; generaremos template.elc
  4. Copiamos template.elc a ~/.emacs_loadpath/
  5. Copiamos el contenido de templates a ~/.templates/ ; al descomprimir el archivo habrá un directorio templates con algunos archivos, tendremos que copiarlas al nuevo directorio.
  6. Editar .emacs para cargar la extensión:

Dentro de ~/.emacs debemos escribir lo siguiente:

(add-to-list ‘load-path “~/.emacs_loadpath/”)

Para buscar en el directorio donde hemos copiado template.elc

(template-initialize)

Para cargar la extensión. A partir de este punto, cuando creemos un archivo: C-x C-f archivo.c (por ejemplo) habrá algunas líneas pre-escritas.

Las plantillas las encontramos en ~/.templates/ y aunque vienen pocas, podemos crear todas las que queramos situándolas en ese directorio. Por otra parte, tenemos la posibilidad de introducir palabras clave dentro de la plantilla que se traducirán por el valor correspondiente como por ejemplo:

  • (>>>DATE<<<) : La fecha actual
  • (>>>AUTHOR<<<) : Tu nombre e email
  • (>>>FILE<<<) : El fichero que estamos editando
  • (>>>POINT<<<) : El punto donde el usuario empezará a editar, muy útil por ejemplo para archivos HTML donde escribimos todas las cabeceras, los pies, y tenemos que situarnos en medio para empezar; aunque lo podemos extender a todos los lenguajes.
  • Y muchos más. Ver documentación.

Os dejo aquí una pequeña plantilla para PHP.

Pero aún hay más, podemos definir puntos en los que movernos rápidamente para editar, tal vez campos en los que debamos introducir texto y en los que queramos entrar de forma fácil, para ello se definen puntos (>>>0<<<) al (>>>9<<<) y nos podremos ir ahí rápidamente con el comando M-x jump-to-register ( ). (C-x r j), aunque el atajo de teclado no ataja mucho y es algo complicado, yo lo he cambiado por C-a (a porque es una tecla que pilla muy cerca de Control) editando .emacs:

(global-set-key (kbd “C-a”) ‘jump-to-register)

Un detalle más, emacs no cogía bien mi nombre y dirección de correo para usar (>>>AUTHOR<<<), por lo que tuve que hacer una pequeña modificación más a .emacs:

(setq user-mail-address “Gaspar Fernández “)

De esta forma, además, puedo personalizar la dirección de correo, para que a la hora de publicar mis trabajos no me llegue demasiado spam.
Foto: hoyasmeg (Flickr)

Visita otras webs de la red