Archivo

Archivo para Abril, 2010

Abbrev mode para EMACS (utiliza abreviaturas)

Martes, 13 de Abril de 2010 Gaspar Fernández Sin comentarios

perritoCuando estamos programando, normalmente hay palabras o bloques de texto que tenemos que repetir varias veces. Por ejemplo:

  • Cuando creo una función, tengo un bloque grande de comentarios para Doxygen. Crear esos comentarios, cuando lo haces 20 ó 30 veces ya resulta pesado.
  • Cuando creo una clase, pasa exactamente lo mismo que antes.
  • Suelo escribir los nombres y los mails de las personas que intervienen en el proyecto, uso atajos: “Gaspar@” devolverá mi nombre y mi mail.
  • Mientras documentamos el código hay muchas palabras/frases que repetiremos y algunas muy largas.
  • A medida que vayamos escribiendo código nos vamos dando cuenta de las cosas que repetimos y queremos hacerlo con menos pulsaciones de teclado (lo que nos ahorrará mucho tiempo).

Aunque este modo tiene unos atajos de teclado algo complicados (aunque con cierta lógica), tenemos que tener en cuenta que tenemos dos formas de añadir una abreviatura: global, y asociada al modo actual (más o menos es el lenguaje en el que estamos escribiendo). Por tanto si queremos añadir una abreviatura a un texto que tenemos escrito:

  1. Lo seleccionamos.
  2. Si queremos que sea una abreviatura global pulsamos (C-x a g) o M-x add-global-abbrev
  3. Si queremos que sea una abreviatura local asociada al modo actual pulsamos (C-x a l) o M-x add-mode-abbrev

De todas formas yo prefiero escribirlas directamente de la siguiente manera:

  • M-x edit-abbrevs
  • Debajo del modo que escoja escribo:
    “palabracorta” 0 “expansión que deseo que salga después de la palabra corta”
  • C-x C-s (Lo de siempre para salvar)

El cero que he puesto entre la palabra corta y la expansión es el número de veces que la he utilizado. Si después de un día de trabajo acudimos a las abreviaturas con M-x list-abbrevs veremos cómo ese número va variando, es el número de veces que hemos utilizado cada abreviatura, esto nos permite saber cuáles son las más usadas, y podremos borrar si queremos las que no hayamos utilizado.

Por otra parte, tenemos el autocompletado de las palabras, y esto es que, pulsando una combinación de teclas (normalmente M-/, un poco incómodo sobre todo en portátiles), la palabra que tenemos escrita parcialmente se completará con alguna coincidencia de palabras escritas en el buffer actual.

Si queremos mapear ese autocompletado con otra combinación de teclas (Yo tengo C-_) podemos escribir lo siguiente en nuestro archivo .emacs:

(global-set-key (kbd “C-_”) ‘dabbrev-expand)

Foto: exfordy (Flickr)

Documentando el código con Doxygen

Domingo, 11 de Abril de 2010 Gaspar Fernández Sin comentarios

librosssTanto o más importante que tirarse horas programando una aplicación es su documentación, y debemos hacerlo aunque nosotros seamos los únicos que intervengamos en su desarrollo.
Algo que siempre digo en mis clases de programación es que a poco que compliquemos el código si no comentamos lo que estamos haciendo, en séis meses cuando toque hacer una siguiente versión no tendremos ni idea de lo que hace; y esto conlleva pasar más tiempo para hacer las modificaciones que necesitamos, que al final se traducen en dinero.

Doxygen es una de esas herramientas que nos hacen la vida más fácil, ya que analizará los comentarios de nuestros archivos fuente y generará un documento (html, latex…) con todas las clases, funciones, métodos, variables globales, definiciones, etc que contenga nuestro código; se generará un documento muy valioso para hacer futuras modificaciones.

Este programa tiene multitud de opciones y palabras clave que podemos ver en su documentación. Pero yo comentaré lo justo para empezar, ya que no queremos perder mucho tiempo y queremos empezar a documentar código. Hay muchos lenguajes soportados, pero tanto para C, C++, PHP y algunos otros podemos hacer comentarios con /* …. */ o //, pues bien, Doxygen leerá los comentarios que comiencen por /** (barra, asterisco, asterisco) o /// (tres barras). Lo que situemos como comentario será la descripción de la función, clase, método, o lo que sea que pongamos detrás; así como la descripción del propio fichero que pondremos como primer comentario al principio de nuestro código.

Para Doxygen existen algunas palabras clave como por ejemplo:

  1. @file : Especifica el propio fichero que editamos, útil para la descripción del fichero.
  2. @brief : Breve descripcion de la función, método, clase, variable… que estamos describiendo.
  3. @date : Fecha
  4. @author : Autor
  5. @version : Versión
  6. @param : Parámetro (en caso de funciones y métodos)
  7. @return : Valor de la salida (en caso de funciones y métodos)

Propongo un pequeño código en PHP que no hace nada, pero que se documentará bien:

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
58
59
60
61
62
63
64
<?php
 /**
******************************************************
*  @file test.php
*  @brief Breve descripción
* Pequeña documentación del archivo
* @author Gaspar
* @version 2.0
* @date Marzo 2010
*
*
*******************************************************/


/**
* Variable global
*/

$var_global='VALOR';

/** Ahora me da por definir cosas */
define('defino_algo', 'DEFINICION');
/*
* Description: Esta función algo hará
*
* @param $cadena
* Esto es una cadena graciosa
* @param $vector
* Esto es un vestor gracioso
*
* @return string
* Cadena resultante

*/

function estoyprobando($cadena, $vector)
{
}

/**
******************************************************
* @brief Clase para hacer pruebas
*
******************************************************/

class TestingPHP
{
/**
*************************************************************
* @brief Constructor
*************************************************************/

function __construct()
{
}

/**
*************************************************************
* @brief Metodo 1
* @param $par Primer parametro de entrada
*
* @return Genero una salida
*************************************************************/

function metodo1($par)
{

}
};
?>;

Para documentarlo con Doxygen, tendremos que hacer lo siguiente:

$ doxygen -g testing.cfg

Generaremos un archivo de configuración de la documentación de ejemplo, sólo tendremos que cambiar unas cuantas cosas para generar la documentación como nosotros queramos:

  • PROJECT_NAME=Miproyecto (una sóla palabra)
  • PROJECT_NUMBER=0.2 (la versión)
  • OUTPUT_DIRECTORY=doc (Directorio donde irá la documentación)
  • OUTPUT_LANGUAGE=Spanish (Queremos documentación en español
  • EXTRACT_ALL= YES (Incluso lo que no esté documentado aparecerá en la documentación
  • EXTRACT_PRIVATE=YES (Extraeremos los métodos públicos)
  • EXTRACT_STATIC= YES (Extraeremos los métodos estáticos)
  • RECURSIVE= YES (Extracción recursiva, incluiremos los subdirectorios)
  • CREATE_SUBDIRS=YES (Creará subdirectorios a la hora de documentar, es importante si tenemos muchas líneas de código fuente (muchas funciones, clases, archivos….) ya que de otra forma situará todos los archivos de la salida en el mismo directorio, y pueden ser muchos.)
  • FILE_PATTERNS = *.php3 *.php *.c *.cpp (Todas las extensiones de nuestros archivos fuente)
  • PDF_HYPERLINKS= YES (Crearemos una salida LaTeX con enlaces que se exportarán a PDF)
  • HAVE_DOT=YES (Crearemos mejores gráficos de clases)

Tras ello hacemos:

$ doxygen testing.cfg

Tendremos en el directorio doc toda la documentación de nuestra aplicación.

Foto: br1dotcom (Flickr)

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)

Monitoriza las aplicaciones con las que trabajas

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

dtracks Lo leí hace tiempo en Genbeta pero hasta hace unos días no me decidí a probarlo (lo dejé medio olvidado en la lista de cosas por hacer), pero me ha gustado bastante.
Sirve para saber con qué programas pasas el tiempo en el ordenador, y así podemos ver lo productivos que somos, según esto mi productividad puede mejorar.
Es un programa pequeño pero muy útil. Se puede descargar el código fuente desde aquí, pero podéis probar a ver si vuestra distribución lo trae en sus repositorios.

Extraer una copia de seguridad de Plesk

Martes, 6 de Abril de 2010 Gaspar Fernández Sin comentarios

discoduroMuchos proveedores utilizan Plesk como panel de control, y en ocasiones, es necesario extraer dichas copias de seguridad, no sólo restaurarlas automáticamente vía Plesk.

Necesitamos el paquete munpack (la mayoría de las distribuciones lo traen en sus repositorios, si no, siempre podemos compilarlo desde el código fuente ( ftp://ftp.andrew.cmu.edu/pub/mpack/ ).

Si el fichero de copia de seguridad es copia_plesk, hacemos lo siguiente:

$ zcat copia_plesk > copia_plesk_descomprimida
$ cat copia_plesk_descomprimida | munpack

En este punto tendremos muchos ficheros tar (tal vez el correo, las páginas web que tengamos, los logs y demás servicios que tengamos contratados), sólo tendremos que extraer los archivos:

$ tar xvf [archivo_tar_a_extraer]

Debemos procurar que los archivos generados por plesk no sean de más de 2Gb (el panel de control tiene la opción de fragmentar los archivos), ya que munpack se quejará en este caso, tendríamos que recortar el fichero descomprimido.

Foto: shkumbin (Flickr)

Categories: Bash, General Tags: , , , ,

Conocer la posición de un objeto (Javascript)

Domingo, 4 de Abril de 2010 Gaspar Fernández Sin comentarios

Posteo un par de funciones para saber la posición absoluta (x,y) de un objeto en Javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getX( oElement )
{
  var iReturnValue = 0;
  while( oElement != null ) {
    iReturnValue += oElement.offsetLeft;
    oElement = oElement.offsetParent;
  }
  return iReturnValue;
}

function getY( oElement )
{
  var iReturnValue = 0;
  while( oElement != null ) {
    iReturnValue += oElement.offsetTop;
    oElement = oElement.offsetParent;
  }
  return iReturnValue;
}

Encontré la función getY en este foro.

Con estas funciones podremos saber la posición de los objetos con respecto a la ventana del navegador.

Categories: Javascript Tags: , , ,

Visita otras webs de la red