Cómo se hace…

Índice

1 Debian Linux

1.1 Replicar la instalación de paquetes de una máquina en otra.

Si lista contiene los paquetes instalados en la primera máquina que queremos instalar en la segunda, podríamos hacer:

cat lista | dpkg --set-selection && apt-get --yes dselect-upgrade

El fichero lista podría obtenerse en la primera máquina con, por ejemplo,

dpkg --get-selections | grep "emacs" | sed -e 's/install/purge/' | ...

si lo que queremos es limitarnos a los paquetes con emacs en el nombre.

1.2 Wake-on-LAN

Detalladamente explicado aquí. Esta caracteristica permite, si el hardware colabora, encender la máquina del despacho desde casa o cualquier otro lugar, trabajar con ella y luego apagarla también remotamente.

2 Uso de Emacs (General)

2.1 Vídeos sobre Emacs

Hay una serie de vídeos tutoriales describiendo diversas operaciones con Emacs en EmacsMovies.org.

2.2 Ver el contenido de una variable

Mediante C-h v que esta ligada a la función describe-variable.

2.3 Ver los paquetes que se cargan y ocluyen a otros

ESC-x list-load-path-shadows

2.4 Uso de git desde Emacs

Hay varias alternativas. Una descripción bastante completa y actual puede verse en el blog de Alex Ott.

2.5 Fechado y automatización de un diario

Puede verse un posible modo de hacerlo en Emacs Notepad en Ftrain.com

2.6 Uso de marcadores para poner puntos de retorno en Emacs

The set-mark-command (bound to [Ctrl+Space]) sets the mark at the point´s position. The normal way of invoking it to remember locations is to type [Ctrl+Space Ctrl+Space]. The first [Ctrl+Space] sets the mark and the second deactivates it so that no region is highlighted. Emacs also pushes the mark onto the buffer´s mark ring and onto the global mark ring.

This is useful because we can use the marks recorded on the mark rings to return to a remembered location. If we want to return to a previous mark in the same buffer, we type [Ctrl+u Ctrl+Space] We can move back several locations by repeating the [Ctrl+u Ctrl+Space].

If we want to return to a mark which may be in another buffer we can type [Ctrl+x Ctrl+Space]. This can also be repeated to move back several marks.

This may seem confusing but it boils down to just three key sequences:

[Ctrl+Space Ctrl+Space]

to push the current position onto the mark rings.

[Ctrl+u Ctrl+Space]

to return to a previous position in the same buffer.

[Ctrl+x Ctrl+Space]

to return to the previous position, which may or may not be in the same buffer.

2.7 Cómo designar el fin de línea en una sustitución

No es \n, ni \\n, ni nada parecido, sino

C-q C-j

2.8 Edición de un fichero remoto

Si el fichero que queremos editar se llama, por ejemplo, turkey.gms y esta en el directorio /home/etptupaf de la máquina u107499, lo abriremos desde Emacs desplegando el menu File -> Open File (o, alternativamente, tecleando C-x C-f) y daremos como nombre de fichero:

/ssh:etptupaf@u107499.bs.ehu.es:/home/etptupaf/turkey.gms

Conviene tener ssh configurado, de manera que no sea preciso teclear passwords.

Alternativamente podemos emplear la sintaxis

/u107499.bs.ehu.es:/home/etptupaf/turkey.gms

siempre después de un C-x C-f.

2.9 Ejecución de código R desde Emacs en una sesión remota

Utilizando ESS ESS (Emacs Speaks Statistics) podemos abrir un fichero conteniendo código en R en Emacs y ejecutarlo con la misma facilidad sobre una sesión de R corriendo en la máquina local o en otra remota.

2.9.1 Ejecución en la máquina local

Teclear

ESC-x R

para abrir la sesión local; la ventana de Emacs se dividirá en dos, y en una de las mitades tendremos la sesión R interactiva.

A continuación, utilizando atajos de teclado o los iconos en la barra de ayuda podemos enviar líneal, bloques de líneas, etc. de código de la ventana que lo contiene a la sesión interactiva.

2.9.2 Ejecución sobre una máquina remota

El procedimiento es similar, pero para abrir una sesión R en la máquina remota daremos los siguientes pasos. Primero, abrir una conexión con la máquina remota tecleando:

ESC-x ssh

e iniciar sobre la máquina remota R:

R

A continuación, con el cursor dentro de esta sesión interactiva sobre la máquina remota teclearemos:

ESC-x ess-remote

lo cual hará la sesión de R recién iniciada conocida a ESS. A partir de aquí todo sucede como si la sesión de R corriera sobre la máquina local. ESS gestiona el envío de código R a la sesión remota y la recuperación de los resultados. Si Emacs core bajo X, los gráficos se muestran en la máquina local sin necesidad de hacer nada.

Se supone que Emacs tiene instalado ssh.el; es el caso en las máquinas del LEC y del Grupo. Si no se dispone de dicho módulo, puede obtenerse de ftp://ftp.splode.com/pub/users/friedman/emacs-lisp/ssh.el e instalarse siguiendo las indicaciones en el manual de ESS.

2.10 Visualización de ficheros .csv

Pueden verse encolumnaods mediante el siguiente procedimiento:

  • Cargar el fichero en Emacs.
  • Invocar org-mode:
ESC-x org-mode
  • Seleccionar la tabla entera, y teclear:
C-u C-c |

2.11 Codificación de caracteres en Emacs

  • Para ver (o cambiar) el código:
Ctr-x RET f
  • Para obtener ayuda:
Ctr-x RET Ctr-h
  • Para obtener información sobre la codificación de un carácter, podemos situarnos sobre él y teclear:
Ctr-u Ctr-x =
  • Para obtener información sobre los códigos disponibles:
Ctr-h C
  • Para cambiar el código de un buffer:
Ctr-x RET r
  • Para forzar a que un fichedro se lea con una cierta codificación, sea cual fuere el default del sistema, podemos poner en primera línea lo siguiente:
-*-  coding: iso-8859-15 *-*

sustituyendo, en su caso, iso-8859-15 por lo que se desee.

2.12 Recodificación selectiva de regiones

  • Marcar la región donde aparecen los caracteres raros.
  • Teclear
ESC-x recode-region

2.13 Numerar las líneas de un buffer (sólo en Emacs => 24)

  • Mediante
ESC-x rectangle-number-lines

también disponible vía C-x r N. Si se utiliza el comando de prefijo C-u, pide un número a partir del cual numerar:

C-u C-x r N
  • Hay modos alternativos para Emacs 23 e inferiores; véase por ejemplo

la siguiente entrada del blog Emacs-Fu.

2.14 Ordenar líneas (y seleccionar únicas)

2.14.1 Para solo ordenar, CTRL-x sort-lines.

2.14.2 Para ordenar y seleccionar únicas, marcar región y teclear:

CTRL-u ESC- | sort -u RETURN

2.15 Uso de doxygen

Para tener acceso a la documentación automática de doxygen cada vez que se carga una fuente en C++, basta incluir las siguiente líneas en el fichero .emacs.el:

(require 'doxymacs)
(add-hook 'c-mode-common-hook'doxymacs-mode)
 (defun my-doxymacs-font-lock-hook ()
    (if (or (eq major-mode 'c-mode) (eq major-mode 'c++-mode))
	(doxymacs-font-lock)))
  (add-hook 'font-lock-mode-hook 'my-doxymacs-font-lock-hook)

Previamente hay que tener instalado doxygen lo que en Debian, por ejemplo, requiere el paquete doxygen y (opcionalmente) doxygen-doc y doxymacs.

2.16 Recetas varias con Emacs

Hay varias muy útiles en blog ErgoEmacs.

2.17 Edición recursiva

A veces se tiene un proceso corriendo (como un spell checking) que detecta algún fallo y deseamos corregirlo sin abortar el proceso. Podemos recurrir a una edición "anidada" tecleando,

CTRL-r        Edición recursiva

hacer los cambios que sea preciso, y volver al punto en que nos encontrábamos con un

ESC CTRL-c    Reanudar proceso

3 Uso de Emacs (Org-mode)

3.1 Añadir un fichero a la agenda de Org

Basta teclear

C-c [

Para eliminarlo,

C-c ]

3.2 Figuras "in line" en Org-Mode

3.3 Creación de proyectables vía Org + GoogleViz + Slidify

Puede verse una descripción en el blog de Greg Tucker-Kellogg.

3.4 Evitar peticiones de confirmación al ejecutar código en Org mode

Basta incluir en cabecera del fichero:

# -*- org-confirm-babel-evaluate: nil -*-

4 Uso de Emacs (Workgroups)

4.1 Resumen de comandos

C-z i Cambia al workgroup i-ésimo  
C-z n Cambia al workgroup siguiente  
C-z p Cambia al workgroup previo  
C-z v Pregunta un nombre y va al workgroup correspondiente  
C-z A Renombra un workgroup  
C-z r Revierte la configuración de ventanas de un workgroup  
  a la configuración base  
C-z C-s Guarda los workgroups definidos  
C-z C-l Carga los workgroups definidos  
C-z c Crea un workgroup  
C-z k Mata un workgroup  
C-z C Clona un workgroup en otro  
C-z , Desplaza un grupo en la lista hacia la derecha  
C-z . Desplaza un grupo en la lista hacia la izquierda  
C-z C-x Intercambia posiciones del grupo actual y el previo  
C-z R Revertir a las configuraciones base  
C-z U Actualizar las configuraciones base  

4.2 Uso de workgroups.el

El objetivo es que cada vez que se abre Emacs tengamos la configuración de ventanas, ficheros abiertos, etc. que deseamos (de entre varias que podemos tener definidas).

El fichero workgroups.el (que puede obtenerse de tlh/workgroups.el en GitHub) ha de hacerse accesible a Emacs, en lugar donde un

(require 'workgroups)

lo encuentre. En el fichero .emacs.el incluiremos,

(require 'workgroups)
;; (setq wg-prefix-key (kbd "C-c a")) ;; para cambiar el "prefijo",
				      ;; por defecto C-z

(fset 'wg-mode-line-add-display (lambda () nil))
(fset 'wg-mode-line-remove-display (lambda () nil))
(workgroups-mode 1)
(wg-load "/home/etptupaf/ft/wg")      ;; Fichero donde se salvaguardan
				      ;; las configuraciones. Cambiar a
				      ;; algo conveniente.

Hecho esto, tenemos disponibles, entre otros, los siguientes comandos:

CTRL-z c        Crear una nueva configuración ("create")
CTRL-z u        Actualizar una configuración ("update")
CTRL-z r        Volver a una configuración ("revert")
CTRL-z v        Cambiar a una configuración ("switch")
CTRL-u CTR-s    Guardar una configuración ("save")
CTRL-u CTR-l    Cargar una configuración ("load")

El modus operandi es: a) Crear una nueva configuración, b) Disponer las ventanas y ficheros abiertos a nuestro antojo, c) IMPORTANTE Actualizar la configuración creada con CTR-z u para obtener una instantánea de la situación actual, y d) Guardar CTRL-u CTR-s la configuración.

Las configuraciones son nombradas, y se puede tener muchas. Se carga por defecto la primera de la lista, las restantes son accesibles mediante CTRL-z v.

5 Shell, programas auxiliares en la línea de comandos

5.1 Alineación mediante expresiones regulares

The simplest, and probably most common, use case is to align on a particular character. The canonical example is a telephone number list. We just mark the region to align, type [Meta+x] align-regexp, and then ( when prompted for the regular expression

That´s not quite what we want, though, because Alexandra´s number doesn´t have an area code so there is no open parenthesis to align on. To fix this, we have to use the more complicated version of align-regexp by giving the invocation a prefix tag: [Ctrl+u Meta+x] align-regexp. This time we specify

.*?\( +\).*

as the regular expression, choose 1 as the group to modify, 1 as the amount of spacing, and no as to whether we should repeat the rule throughout the line. The result is:

Joe       (555) 111-2222
Mary      (555) 222-1212
Alexandra 123-456
Francis   (555) 333-2121

That´s better but what we really want is to align on the -. If we do that directly using the simple case, we get

Joe (555) 111     -2222
Mary  (555) 222   -1212
Alexandra 123     -4567
Francis (555) 333 -2121

which is definitely not what we want. Instead we use the regular expression

.+? +\(.*\)

and specify -1 as the group to modify or justify. That gives us

Joe        (555) 111-2222
Mary       (555) 222-1212
Alexandra        123-4567
Francis    (555) 333-2121

which is just what we want.

5.2 Transferencia de árboles de directorios completos

Queremos trasladar todo el contenido por debajo de

/path/dir/origen

a

/path/dir/destino

Para ello podemos hacer (en la línea de comandos)

cd /path/dir/origen
tar cf - . | ( cd /path/dir/destino ; tar xvf - )

5.3 Obtener información sobre la geometría de una ventana

Para obtener información sobre las coordenadas de una venta que hemos redimensionado y situado a nuestro gusto sobre el escritorio, podemos invocar el programa xvininfo, hacer click sobre la venta que nos interesa, y leer los resultados.

5.4 Borrar mediante find todos los ficheros de un cierto nombre en un directorio

Puede hacerse por ejemplo así:

find /LEC/b012526/home -name .templates -exec rm -rf '{}' \;

Una referencia útil sobre uso del comando find es http://content.hccfl.edu/pollock/Unix/FindCmd.htm

5.5 Generar un fichero gráfico con texto arbitrario

Es en general un riesgo poner direcciones de correo electrónico en páginas web; más tarde o más temprano algún rastreador las localiza y comienzas a recibir tneladas de "spam".

Una alternativa es incluirlas como un gráfico. Puede hacerse algo como esto:

echo "fulano.de.tal@ehu.es" | convert -size 200x17  -fill '#004080'  text:- -trim ft.png

Esto requiere disponer de la utilidad convert. En Linux Debian reside ne /usr/bin/convert y está en el paquete graphicsmagick-imagemagick-compat. En distribuciones derivadas de Debian (como Ubuntu) probablemente esté en el mismo o similar lugar. La talla en pixels (200x17) y el color (#004080) pueden sustituirse por lo qque convenga. La salida puede ser en otros formatos además de PNG, sin más que variar la extensión del fichero de destino.

5.6 Determinar la codificación de un documento

Puede hacerse lo siguiente (en Unix/Linux):

file -bi nombrefichero.txt

5.7 Encontrar caracteres no ASCII en un documento

Puede probarse el siguiente conjuro (en Unix/Linux):

grep --color='auto' -P -n "[\x80-\xFF]" fichero

5.8 División de un fichero de texto en los lugares donde aparece una cadena de caracteres

Supongamos que se desea procesar un fichero conteniendo múltiples mensajes de correo, una a continuación de otro, para recuperar cada mensaje en un fichero independiente. Podríamos hacerlo así:

awk '/^To: fernando.tusell/{n++}{print > "mensaje" n ".txt"}' fichero.mbox

5.9 Reemplazar todos los enlaces simbólicos en un directorio por los ficheros a los que apuntan

Teclear,

shopt -s globstar

para activar la opción golbstar de bash. A continuación,

sed -i '' **/*

La explicación puede verse en Stack Overflow. Es una receta muy poderos, pero sólo vale para ficheros, no para directorios. Una receta alternativa más fácil de entender es:

#!/usr/bin/bash

for link in $(find /symdir -type l)
do
  loc="$(dirname "$link")"
  dir="$(readlink "$link")"
  mv "$dir" "$loc"
  rm "$link"
done

En este caso el problema es que podría fallar para nombres de fichero con blancos intercalados. Adicionalmente,

readlink "$link"

proporciona el siguiente enlace, si hay varios encadenados. Si se desea el objetivo final de la cadena ded enlaces, hay que sustituir por:

readlink -e "$link"

La procedencia es la misma página de Stack Overflow enlazada más arriba, que ofrece también otras soluciones alternativas.

6 Herramientas diversas (ssh, java, Evolution…)

6.1 Instalación de ssh

Primero hemos de generar una clave (y opcionalmente protegerla con una frase de paso) mediante:

ssh-keygen

A continuación, podemos transferir la clave pública a la máquina host remota a la que en lo sucesivo deseamos conectarnos con ssh tecleando:

ssh-copy-id host

6.2 Tunelado de conexiones

En ocasiones, desde una máquina A podemos acceder a una máquina B, pero no al revés. Por ejemplo, A podría ser un portátil en una red doméstica, detrás por tanto de un router que le ha asignado una dirección en el rango 192.168.x.x, mientras que B podría ser una máquina en la universidad, accesible desde cualquier sitio con una dirección IP fija.

Si desde B necesitamos acceder a A, podemos recurrir al tunelado a través de una conexión SSH así:

Dejamos establecida una conexión SSH de A a B así:

ssh -R  7900:localhost:22  usuario@B

Esto "empalma" la puerta 7900 en la máquina B a la puerta 22 en la máquina A, de manera que si ahora hacemos login en la máquina B y tecleamos:

ssh localhost -p 7900

estaremos abriendo transparentemente una sesión SSH (puerta 22) sobre la máquina A.

No hay nada mágico con las puertas 7900 y 22. Podemos empalmar puertas libres (> 1024) a cualquier servicio, y no sólo a sesiones ssh sobre la puerta 22. Por ejemplo,

ssh -R  7900:localhost:80  usuario@B

nos permitiría abrir desde B una sesión http (puerta 80) sobre A tecleando en la ventana de nuestro navegador

localhost:7900

6.3 Instalación en Debian de Java "pata negra" en lugar de OpenJDK.

Hay que bajar de la web de Oracle, o cualquier otro lugar, el binario .tgz de la versión que se desee. A continuación, del repositorio de paquetes de Debian (preferiblemente debian-backports) se baja e instala el paquete java-package, lo que permite ejecutar, e.g.

fakeroot make-jpkg jdk-8u5-linux-x64.tar.gz

Esto crea un paquete Debian a partir de jdk-8u5-linux-x64.tar.gz que a continuación se instala de la forma habitual.

6.4 Migración del correo de Evolution de una máquina Linux a otra

Se supone que ambas corren Gnome. El procedimiento está descrito en la documentación oficial de Ubuntuentre otros lugares.

7 R y herramientas relacionadas con R

7.1 Creación de bibliografías para RMarkdown

Pueden insertarse las referencias en el preámbulo, en un formato particular, o aprovecharse las que se tengan generadas por BibTeX. Si se hace ésto último, en el preámbulo pondremos una referencia a la bibliografía. Por ejemplo,

---
title: "Análisis de datos y componentes principales"
date: "`r Sys.Date()`"
author: "F. Tusell"
output:
  rmdformats::readthedown:
    highlight: kate
bibliography: Descrip.bib
---

En el mismo directorio que el documento RMarkdown debemos tener el fichero Descrip.bib. Para generarlo, lo más sencillo es emplear un pequeño documento LaTeX como reflist.tex a continuación:

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{url}
\begin{document}
\cite{Gilbert:06}
\cite{gilbert:93}
\bibliographystyle{plain}
\bibliography{abrev,conjunta}
\end{document}

En él, las referencias deseadas se han incluído con \cite. Basta correr LaTeX + BibTeX sobre este documento para obtener un fichero .aux sobre el que ejecutaremos:

bibexport -o Descrip.bib reflist.aux

bibexport busca en reflist.aux las referencias que han sido citadas en reflist.tex, las saca de el fichero maestro de bibliografía (que debe estar configurado, por ejemplo mediante una variable de entorno BIBINPUTS) y las deja en Descrip.bib.

7.2 Creación de paquetes en R (I)

7.2.1 Crear los objetos que formarán parte del paquete

Se puede hacer en una sesión de R, o "sourcearlos" desde un fichero de texto con la instrucción source(). Invocar,

library(utils)
package.skeleton("nombre-paquete")

Se creará un subdirectorio "nombre-paquete" en el directorio corriente con la estructura adecuada, en cada uno de cuyos subdirectorios estará la fuente en R, documentación, etc.

7.2.2 Completar la preparación del paquete

Básicamente, se trata borrar el fichero

Read-and-delete-me

y ejecutar

R CMD build nombre-paquete

para ultimar la preparación del paquete.

7.3 Creación de paquetes en R (II)

Una descripción de un posible modus operandi puede verse en este post de Ulrich Matter. En uno de los comentarios, Barry Rowlingson propone la siguiente rutina de trabajo:

7.3.1 Crear un paquete:

create("foo")

7.3.2 Editar el código en el directorio R y cargarlo,

load_all("foo")

7.3.3 Reiterar el ciclo carg-edición-carga-…

No es preciso un build externo cada vez.

7.4 Algunas recomendaciones para crear paquetes en R

Una lista útil de recomendaciones puede verse en Tips for R package creation.

7.5 Uso de roxygen+ESS para documentar paquetes en R

7.5.1 Modus operandi

Se carga roxygen,

library(roxygen)

Para documentar una función, situando el cursos sobre ella en Emacs con ESS cargado, se escoge en el menú ESS el submenú Roxygen y dentro de él Update/Generate template lo que automáticamente genera, como comentarios, campos que luego serán traducidos a páginas .Rd standard. Para crear un paquete, se sigue el procedimiento habitual y luego se teclea

R CMD roxygen nombre-paquete

o bien, desde el interior de R,

> roxygenize("nombre-paquete")

lo que traduce los comentarios a páginas .Rd. El resultado queda en un directorio de nombre nombre-paquete.roxygen.

Si se quiere utilizar los mandatos en línea de comando de Roxygen, hay que teclear en Emacs ESC-x ess-roxy-mode. Eso da acceso a todos los atajos de teclado con tal de que una sesión ESS esté activa, lo que requiere iniciar R (ESC-x R).

7.6 Mapas de llamadas entre funciones en R

Cargando el paquete

library(mvbutils)

y a continuación el paquete que deseamos "mapear",

library(mipaquete)

teclearemos

foodweb()

lo que proporciona de forma gráfica las dependencias entre funciones.

7.7 Eliminar filas duplicadas en una dataframe

Si la dataframe original con (quizás) filas duplicadas se llama

dfr

se puede depurar así

sel <- duplicated(do.call("paste",c(dfr,sep="\r")))
dfr <- dfr[!sel,]

7.9 Tamaño de un objeto en R

Puede obtenerse mediatne la función object.size().

7.10 Obtener todos los fragmentos de un texto con una condición

Este ejemplo (que proviene de este enlace) utiliza expresiones regulares para obtener todas las palabras que están entre paréntesis en una frase. Adaptaciones obvias permiten resolver problemas similares. Consideremos el texto:

> j <- "What kind of cheese isn't your cheese? (wonder) Nacho cheese!
  (groan) (Laugh)"

Entonces, en el fragmento siguiente, gregexpr obtiene los lugares en que una expresión regular concuerda con el texto, regmatches extrae dichas coincidencias, y el gsub externo elimina los paréntesis.

> gsub("[\\(\\)]", "", regmatches(j, gregexpr("\\(.*?\\)", j))[[1]])
[1] "wonder" "groan"  "Laugh"

7.11 Obtener gráficos de series temporales apiladas

Puede usarse la función stackpoly en el paquete plotrix.

7.12 Poner "tags" para editar fuente en R

Puede hacerse mediante la instrucción

rtags(src=fichero.R,ofile="TAGS")

Los "tags" son leídos por Emacs, y hacen aparecer un menú (I-menu) que permite navegar rápidamente a cualquier función.

7.13 Depurar programas con Emacs + ESS

Puede hacerse con ayuda del ess-tracebug, disponible en versiones de ESS posteriores a 5.14 (e instalable en las precedentes). Véase información en ess-tracebug.

7.14 Utilizar fuentes cualesquiera en gráficos de R

Puede hacerse siguiendo las instrucciones en este post de Winston Chang. Una alternativa es la propuesta por Greg Tucker-Kellog en su blog.

7.15 Elección de una paleta en R

Es algo que viene muy facilitado por el paquete colorspace (una referencia para la "teoría" es: Achim Zeileis, Kurt Hornik, Paul Murrell (2009). Escaping RGBland: Selecting Colors for Statistical Graphics. Computational Statistics & Data Analysis, 53, 3259-3270. 10.1016/j.csda.2008.11.033). Es fácil probar y visualizar paletas alternativas haciendo uso de la función choose_palete, que abre un menu interactivo en el que probar cambios de color, saturación, etc. Puede verse su funcionamiento con un

example(choose_palette)

7.16 Cómo ver una función invisible (con asterisco al hacer ls()).

Puede hacerse mediante #+BEGINSRC r getAnywhere(nombre-función) #+ENDSRC r

7.17 Lectura de metadatos en R (genéricos, SAS, SPSS)

Los ficheros de datos llevan frecuentemente asociados metadatos en un formato más o menos parecido. La función parse.codebook (no disponible en CRAN; ver más abajo dónde encontrarla) permite leer y "parsear" tales metadatos. El modus operandi está descrito en el blog de Jason Bryer (entrada del 10 de enero de 2013).

En ocasiones, los metadatos se facilitan en forma de código para leer un fichero desde SAS. En este caso, el paquete SAScii puede interpretar dicho código y producir el necesario para leer desde R los mismos datos. Es interesante a este respecto la entrada de 10-julio-2012 en el blog de Revolution Analytics.

Otras veces los metadatos vienen en forma de una cabecera con código interpretable por SPSS: es el caso, por ejemplo, de los ficheros de microdatos que proporciona el CIS. Típicamente disponemos de dos ficheros, como ES3034 de metadatos y DA3034 de datos. Podemos leer el primero mediante PSPP (un clon gratuito de parte de SPSS) y guardarlos en el formato propio de SPSS:

pspp
> include 'ES3034'.
> save outfile 'da3034.sav'.

A continuación, cargamos R y el paquete memisc, y leemos el fichero .sav en nuestro espacio de trabajo:

R
> library(memisc)
> da3034 <- spss.system.file("da3034.sav")

El objeto da3034 NO incluye todavía los datos, sino información sobre ellos. Podemos ver las variabvles disponibles mediante un

> description(da3034)

Si decidimos que queremos las variables rama09 y status haremos:

> datos    <- subset(da3034, select=c(rama09,status))
> datos.df <- as.data.frame(datos.df)

La segunda línea convierte a data frame, que es lo que normalmente desearemos hacer.

7.18 Generación de tablas para incluir en documentos LaTeX

7.18.1 Tablas de datos

  1. Uso de xtable (+ opcionalmente (LaTeX) booktabs).

    La forma "canónica" y que ha existido por más tiempo consiste en utilizar el paquete xtable. El uso del formato standard de tabla en LaTeX no es tipográficamente muy atractivo, pero puede mejorarse con ayuda del paquete (de LaTeX) booktabs.

  2. Uso de stargazer (+ opcionalmente (LaTeX) booktabs).

    El uso es muy sencillo.

    library(stargazer)
    a <- data.frame(Talla=c(30,40,40,50),
    		Edad=c(4,5,6,5),
    		Peso=c(34,35.4,36.5,33.5)
    	       )
    stargazer(a)
    stargazer(a,summary=FALSE)
    
    
    % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
    % Date and time: jue, jun 25, 2020 - 11:32:42
    \begin{table}[!htbp] \centering
      \caption{}
      \label{}
    \begin{tabular}{@{\extracolsep{5pt}}lccccccc}
    \\[-1.8ex]\hline
    \hline \\[-1.8ex]
    Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Pctl(25)} & \multicolumn{1}{c}{Pctl(75)} & \multicolumn{1}{c}{Max} \\
    \hline \\[-1.8ex]
    Talla & 4 & 40.000 & 8.165 & 30 & 37.5 & 42.5 & 50 \\
    Edad & 4 & 5.000 & 0.816 & 4 & 4.8 & 5.2 & 6 \\
    Peso & 4 & 34.850 & 1.363 & 34 & 33.9 & 35.7 & 36 \\
    \hline \\[-1.8ex]
    \end{tabular}
    \end{table}
    
    % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
    % Date and time: jue, jun 25, 2020 - 11:32:42
    \begin{table}[!htbp] \centering
      \caption{}
      \label{}
    \begin{tabular}{@{\extracolsep{5pt}} cccc}
    \\[-1.8ex]\hline
    \hline \\[-1.8ex]
     & Talla & Edad & Peso \\
    \hline \\[-1.8ex]
    1 & $30$ & $4$ & $34$ \\
    2 & $40$ & $5$ & $35.400$ \\
    3 & $40$ & $6$ & $36.500$ \\
    4 & $50$ & $5$ & $33.500$ \\
    \hline \\[-1.8ex]
    \end{tabular}
    \end{table}
    

7.18.2 Resultados de estimación de modelos

Hay también varias alternativas: el paquete stargazer (mencionado en el apartado anterior) y el paquete texreg.

7.19 Uso de gdb con R

Las notas que siguen reproducen un ejemplo en Rcpp-devel. Sea la fuente,

#include <Rcpp.h>
using namespace Rcpp;

// This next routine is guaranteed to cause an invalid pointer access
// error (e.g. an access violation in Windows, or a segmentation
// violation on a UNIX box.)  Calling it will crash R.
//
// [[Rcpp::export]]

double CrashMe() {
  return *((double *) NULL);
}

que proporciona un cuelgue garantizado. Podemos ejecutar así:

R -q -d gdb

y obtenemos

GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/local32/lib/R/bin/exec/R...done.
(gdb)

Tecleando r en el "prompt" (gdb) obtenemos:

Starting program: /usr/local32/lib/R/bin/exec/R -q
[Thread debugging using libthread_db enabled]

Si a continuación hacemos

library(Rcpp)
sourceCpp("zero_ref.cc")
CrashMe()

obtenemos:

Program received signal SIGSEGV, Segmentation fault.
CrashMe () at zero_ref.cc:12
12	}
Current language:  auto
The current source language is "auto; currently c++".
(gdb)

y tecleando l en el prompt,

(gdb) l
7	//
8	// [[Rcpp::export]]
9
10	double CrashMe() {
11        return *((double *) NULL);
12	}
13
14
15	#include <Rcpp.h>
16
(gdb)

7.20 Ver cuanto espacio ocupa un objeto en el workspace

Puede recurrirse a la función object.size(). Hay alternativas para todos los objetos del workspace: las funciones ll() en el paquete R.oo y ll() en el paquete gdata.

7.21 Creación de presentaciones con R

Hay un tutorial sobre Mastering R presentations en la web del Coding Club UC3M.

7.22 Correr scripts en Rmarkdown en batch

Primero hay que exportar la variable que indica dónde se encuentra pandoc.

export  RSTUDIO_PANDOC=/usr/lib/rstudio/bin/pandoc

Luego se puede invocar el script .Rmd así:

Rscript -e "rmarkdown::render('script.Rmd')"

8 LaTeX, formatos DVI, PDF

8.1 Compresión ficheros PDF

Dado un fichero PDF a comprimir en

input.pdf

la instrucción

qpdf --stream-data=compress input.pdf output.pdf

dejara en la salida

output.pdf

una versión comprimida de la entrada.

8.2 Extracción de páginas de un PDF

Puede hacerse de diversas maneras. En Unix/Linux es útil pdftk, que permite extraer el rango de páginas, por ejemplo, 2 a 23 del fichero viejo.pdf para crear un nuevo fichero new.pdf así:

pdftk viejo.pdf cat 2-23 output new.pdf

8.3 Combinación de varios ficheros PDF en uno sólo

Puede hacerse con Adobe Acrobat, pero si se quiere hacerlo con herramientas de fuente libre, hay al menos dos vías.

8.3.1 Utilizando ghostscript

Situar todos los ficheros a fundir en un directorio; supongamos que sus nombre sean 1.pdf y 2.pdf. A continuación teclear:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=res.pdf 1.pdf 2.pdf

tras de lo cual tendremos el fichero fusionado en res.pdf.

8.3.2 Utilizando pdftk

Este programa está disponible en muchas distribuciones Linux. Para fusionar los ficheros 1.pdf y 2.pdf, teclearíamos:

pdftk 1.pdf 2.pdf  cat output res.pdf

La utilidad de pdftk no acaba aquí; para una somera descripción de sus posibilidades, puede verse How to Combine Multiple PDF Files With pdftk.

8.4 Añadir un gráfico (firma, membrete…) a un PDF

Puede hacerse en los siguientes pasos:

  1. Se "scannea" la imagen y se lee con GIMP.
  2. En GIMP, seleccionar: "Imagen -> Recortar a la selección".
  3. En GIMP, "Colores -> Niveles" y manipular hasta que el fondo sea realmente blanco.
  4. En GIMP, "Capa -> Transparencia -> Añadir canal alfa"
  5. En GIMP, "Colores -> Color a alfa" para hacer el fondo blanco transparente.
  6. Guardar como .xcf

Hecho esto, se abre el PDF en el que se quiere pegar y se inserta el .xcf en el lugar apropiado (para arrastrarlo, Shift+Herramienta de mover). A continuación "Capas -> Combinar hacia abajo".

8.5 Añadir números de página a un PDF

Después de buscar y compilar pspdftool puede hacerse:

pspdftool 'number(start=1, size=20, x=550 pt, y=10 pt)' input.pdf output.pdf

El resultado a veces no es muy bueno. Para ficheros pequeños (< 15Mb) he encontrado como mejor solución hacer uso del servicio en ilovepdf.com.

8.6 Ejemplos de gráficos LaTeX en TikZ

Una buena fuente de ejemplos con el código fuente disponible es TeXample.net

8.7 Gráficas en "landscape"

\usepackage{lscape}
\begin{landscape}
% La gráfica aquí
\end{landscape}

Si se hace en un documento a procesar mediante Sweave, conviene además insertar

\SweaveOpts{width=12,height=7}
\setkeys{Gin}{width=1.5\textwidth}

antes de la gráfica, y volver a los valores estándar inmediatametne después.

8.8 Creación de tablas en modo Org

Para crear tablas en modo Org mientras se está editando un documento el LaTeX, se puede:

  • Invocar el modo Org tecleando

    ESC-x orgtbl-mode RETURN
    
  • Editar la tabla, simplemente separando columnas mediante la barra vertical |. Cada línea debe empezar por una barra vertical.
  • Separadores horizontales pueden ponerse como |- (al comienzo de la línea).
  • Un ejemplo de tabla así editada sería:

    | Ejemplo | de | tabla |
    |---------+----+-------|
    |       1 | 34 |    34 |
    
  • Para realinear las columnas, basta teclear TAB al comienzo de la tabla.
  • Resaltar mediante el cursor la tabla a convertir.
  • Teclear

    ESC-x org-table-export RETURN
    

    Nos preguntará un nombre de fichero al que se quiere exportar la tabla; démosle uno cualquiera, e.g. scratch.tex.

  • Nos preguntará el formato de exportación que deseamos (por omisión es orgtbl-to-tsv). Si queremos exportar a LaTeX, teclearemos orgtbl-to-latex.
  • Realizada la exportación, podemos insertar la tabla en formato LaTeX en nuestro documento insertando el fichero scratch.tex (desde el manú, File->Insert File).
  • Podemos entoces comentar el "original" de la tabla en formato Org, por si es preciso repetir el proceso en el futuro.

8.9 Edición de transparencias con Beamer de una en una

Es muy costoso formatear un documento largo en formato Beamer. Cuando se añade una transparencia, es útil probar su formato aisladamente sin formatear todo el documento. Para ello, suponiendo que se tienen definidas las funciones necesrias en el fichero .emacs.el se puede recurrir a los siguientes atajos de teclado. Para crear un esqueleto de nueva transparencia,

CTRL-c f

Es importante que empiece por \begin{frame} y no por \frametitle{}.

Para formatear la transparencia, una vez editada:

CTRL-c l

Para visualizar la transparencia (con un visor PDF)

CTRL-c p

En el fichero .emacs.el necesitamos tener:

;; de http://www.damtp.cam.ac.uk/user/sje30/emacs/beamer.txt
;; (con modificaciones)

 (eval-after-load "tex"
   '(TeX-add-style-hook "beamer" 'my-beamer-mode))

 (defun tex-frame ()
   "Run pdflatex on current frame.
    Frame must be declared as an environment."
   (interactive)
   (let (beg)
     (save-excursion
       (search-backward "\\begin{frame}")
       (setq beg (point))
       (forward-char 1)
       (LaTeX-find-matching-end)
       (TeX-pin-region beg (point))
       (letf (( (symbol-function 'TeX-command-query) (lambda (x) "LaTeX")))
	(TeX-command-region))
	)
       ))

 (defun beamer-template-frame ()
   "Create a simple template and move point to after \\frametitle."
   (interactive)
   (LaTeX-environment-menu "frame")
   (insert "\\frametitle{}")
   (backward-char 1))

 (defun beamer-viewPDF ()
    "Ver transparencia en PDF."
    (interactive)
    (setq my-command-string (concat "wxpdf " "frag.pdf & "))
    (shell-command my-command-string)
 )

 (setq TeX-region "frag")

 (defun my-beamer-mode ()
   "My adds on for when in beamer."

   ;; when in a Beamer file I want to use pdflatex.
   ;; Thanks to Ralf Angeli for this.
   (TeX-PDF-mode 1)                     ;turn on PDF mode.

   ;; Tell reftex to treat \lecture and \frametitle as section commands
   ;; so that C-c = gives you a list of frametitles and you can easily
   ;; navigate around the list of frames.
   ;; If you change reftex-section-level, reftex needs to be reset so that
   ;; reftex-section-regexp is correctly remade.

   (require 'reftex)
   (set (make-local-variable 'reftex-section-levels)
	'(("lecture" . 1) ("frametitle" . 2)))
   (reftex-reset-mode))

(define-key noweb-minor-mode-map "\C-cf" 'beamer-template-frame)
(define-key noweb-minor-mode-map "\C-cl" 'tex-frame)
(define-key noweb-minor-mode-map "\C-cp" 'beamer-viewPDF)

8.10 Extraer imágenes de un fichero PDF

Puede hacerse en linux mediante el comando pdfimages.

8.11 Inclusión de esquemas hechos en Inkscape en LaTeX

Vease el procedimiento en el blog The Endeavour

8.12 Anotación en LaTeX de esquemas hechos en Inkscape

Vease el procedimiento en el blog The Endeavour

8.13 Inclusión selectiva de líneas de un documento multilingüe

La técnica que algunos empleamos para generar documentos multilingües es crear un único fichero por página, en que muchas partes son comunes (enlaces, fórmulas matemáticas, etc.) y otras están escritas en uno de varios idiomas.

Para poder generar a partir de este único fichero las versiones en cada idioma, se requiere seleccionar en cada caso la parte común y la correspondiente al idioma de interés, eliminando el resto. Una técnica que puede seguirse es:

  • Comenzar cada línea en un idioma por un identificador, por ejemplo EN- para inglés, ES- para español y EU para euskera. Un fragmento de texto con este convenio sería algo como:
\section{
EN- The Poisson distribution
ES- La distribución de Poisson
${\cal P}(\lambda)$
}

\subsection{
EN- Definition and first properties
ES- Definición y primeras propiedades
}
  • Sobre el fichero así construido (en este caso, un fichero .tex), si queremos seleccionar la versión inglesa, ejecutar el mandato:
grep -v "^ES-" $1  | grep -v "^EU-" | sed s/^EN-// > EN.$1
  • Si ha de hacerse esto con frecuencia, se puede crear y guardar un fichero con los mandatos precisos para el "filtrado".
#!/bin/bash
#
#  Procesar ficheros multilingues eliminando las líneas en euskera y
#  castellano, y reteniendo las comunes y las de inglés.
#
grep -v "^ES-" $1  | grep -v "^EU-" | sed s/^EN-// > EN.$1
  • Hay que hacer ejecutable dicho fichero (al que habremos nombrado, por ejemplo, versionEN.sh).
chmod 755 versionEN.sh
  • Ya está; podemos guardarlo en lugar adecuado e invocarlo cada vez que necesitemos seleccionar de un documento multimingüe una de las versiones.

8.14 Conversión de formatos

Un buen programa de fuente libre que soporta multitud de conversiones es pandoc.

8.15 Uso de fuentes adicionales

Una opción que suministra Garamond, BitStream Charter y Adobe-Utopia (con fuentes mátemáticas de estilos congruentes) es el paquete mathdesign, disponible en CTAN.

8.16 Generación de tablas para incluir en documentos LaTeX

Ver la entrada con este mismo título en R y herramientas relacionadas con R.

8.17 Eliminación de espacio en PDF's para incluir en LaTeX

Puede verse el el post de Rob Hyndman sobre remoción de espacio blanco en los gráficos generados por R.

8.18 Generadores de citas en formato BibTeX

Hay diversos servicios on-line, que facilitando el DOI o ISBN proporcionan una cita en formato BibTeX correctamente formateada:

8.18.2 OttoBib proporciona formatos MLA, APA y Chicago/Turbian, además de

BibTeX.

8.18.3 doi2bib es similar, pero sólo admite como input el DOI.

8.19 Firma digital de ficheros (por ej. PDF).

Hay que instalar AutoFirma, disponible en https://firmaelectronica.gob.es/Home/Ciudadanos/Aplicaciones-Firma.html. Hecho ésto, se inserta el DNIe y se teclea:

AutoFirma sign -i fichero.pdf -o fichero.firmado.pdf -certgui

Esto invoca un diálogo gráfico que nos permite seleccionar el certificado para la firma del DNIe y genera el documento firmado. Para verificar la firma, puede acudirse a un servicio on-line como https://valide.redsara.es/valide/?

9 Procesado de información espacial

9.1 Generar un mapa de relieve a partir de datos DEM

  1. Obtener los datos de elevación. Por ejemplo, de

    GeoEuskadi

    (ficheros MDT* ).

  2. Descomprimir el fichero de que se trate para obtener un .asc
  3. Abrir QGIS–>Raster–>MDT (modelos de terreno). Se obtiene una ventana en la que reemplazar los nombres de ficheros de entrada, salida, etc.
  4. Escoger entre Hillsade, releive de color y demás opciones.
  5. El resultado es un fichero raster.

9.2 Obtener distancias por carretera entre dos puntos identificados por coordenadas GPS

9.2.1 Obtener una API key de Google Maps

9.2.3 Parsear la respuesta, que viene dada en formato JSON

{
   "destination_addresses" : [ "Larrinbe Entitatea, 8, 01468 Amurrio, Araba, Spain" ],
   "origin_addresses" : [ "Unnamed Road, Dulantzi, Araba, Spain" ],
   "rows" : [
      {
	 "elements" : [
	    {
	       "distance" : {
		  "text" : "55.6 km",
		  "value" : 55640
	       },
	       "duration" : {
		  "text" : "47 mins",
		  "value" : 2793
	       },
	       "status" : "OK"
	    }
	 ]
      }
   ],
   "status" : "OK"
}

10 E-books: suministradores, manipulaciones

10.1 Diversos suministradores de e-books

La Web del e-book

Feedbooks

ManyBooks.net

MobileRead

MobiPocket.com

Todo-ebook

Papyrefb2.net: libros sobre todo en castellano, con predominio de narrativa, y en formatos .epub y .mobi (directamente utilizables en Kindle el último).

10.2 Creación de libros electrónicos

El formato ePUB puede generarse, por ejemplo, mediante el programa de fuente libre pandoc. Para generar el formato del Kindle, puede recurrirse a [[http://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000234621][KindleG

11 Fuentes de datos

11.1 Quandl

Quandl es una fuente de datos "parseados" directamente de los suministradores, y que pueden ser obtenidos en variedad de formatos. En particular, en .csv, JSON y R. En este útimo formato, lo que se obtiene es un fragmento de código que, insertado en unprograma R, lee los datos de Quandl

12 Uso de git

Es de utilidad el tutorial de Lars Vogel. También es de utilidad la página base de GIT, ofreciendo entre otras cosas descargas del software para varios sistemas operativos.

12.1 Cómo instalar GIT en Windows

Obtener el ejecutable de git-scm.com, por ejemplo. Instalar el ejecutable de la manera habitual.

12.2 Cómo crear claves públicas

No son necesarias, pero sí muy convenientes para acceder a repositorios públicos en Internet sin tener que teclear cada vez nuestro login y password. Se general tecleando ssh-keygen en el directorio de usuario. Esto genera ficheros tales como id_rsa e id_rsa.pub. Este último se ha de hacer conocer al servidor al que queremos conectarnos, normalmente añadiéndolo a un fichero de nombre authorized_keys en el directorio .ssh (Linux).

12.3 Cómo crear un repositorio

En el directorio en el que se guardan los ficheros de interés, teclear

git init

A continuación añadir los ficheros de interés:

git add *.tex
git add *.Rnw

Hacer un commit:

git commit -m "Versión inicial."

12.4 Cómo subirlo a Bitbucket

12.4.1 Hay primero que crear el repositorio allí.

12.4.2 Una vez hecho esto, podemos importar el repositorio que hemos creado en nuestro ordenador mediante comandos tales como:

git remote add origin https://etptupaf@bitbucket.org/etptupaf/eae.git
git push -u origin --all

Si accedemos como en la línea anterior, deberemos proporcionar un password cada vez; si configuramos el acceso SSH, nos evitaremos el tener que teclearlo cada vez.

12.5 Cómo clonar un repositorio en BitBucket en la máquina local

Conviene definir en BitBucket la clave pública SSH; hay instrucciones en su página web.

Hecho esto,

git clone git@bitbucket.org:etptupaf/eae.git

en que etptupaf ha de sustituirse por el nombre de usuario, y eae por el nombre del repositorio, que se sufija con .git.

Esto es algo que se hace inicialmente.

12.6 Cómo sincronizar un repositorio en BitBucket bajándolo a la máquina local

Podemos hacer

git fetch origin

y a continuación "mergear" las posibles ramas aque existan en el directorio remoto con las nuestras. Por ejemplo,

git merge origin/master

12.7 Cómo sincronizar un fork con el repositorio original e incorporar los cambios en éste

Nos situamos en el directorio en que tenemos nuestra copia local y tecleamos:

git fetch upstream
git merge upstream/master
git push origin master

12.8 Cómo borrar toda la historia y convertir la versión actual en el origen de una nueva: solución bestia

rm -rf .git
git init
git add .
git commit -m "Version inicial"
git remote add origin git@github.com:<cuenta>/<nombre-repositorio>.git
git push -u --force origin master

12.9 Cómo borrar toda la historia y convertir la versión actual en el origen de una nueva: solución elaborada

Borrar el directorio .git y recrearlo es una solución muy bestia. Se pierde el enlace con un repositorio externo, si es que se estaba usando, que hay que borrar también. La siguiente solución (procede de StackOverflow) funciona mejor. Crear una nueva rama,

git checkout --orphan nuevaRama

Añadir todos los ficheros en el proyecto en su estado actual:

git add -A

Hacer un commit:

git commit -m 'Nueva versión inicial'

Borrar todas las ramas viejas; supondremos que hay dos, master y experimento.

git branch -D master
git branch -D experimento

Renombrar la rama que hemos creado al comienzo de manera que sea la nueva master:

git branch -m master

Ya está; si estábamos utilizando un repositorio externo podemos ahora hacer algo como

git push -f origin master

12.10 Cómo incorporar las modificaciones en la rama "cambios" a "master"

git checkout master
git merge cambios

12.11 Lista breve de mandatos

Mandato Para            
git init Inicializar un directorio para que sea controlado por git            
git add fichero Poner fichero bajo control de git            
  "Stage" fichero si no lo está            
git status Muestro lo modificado y no "staged"            
git diff Diferencias entre lo modificado y lo "staged"            
git diff --staged Id.            
git -a commit Hacer un commit            
git rm Elimina un fichero del git y directorio actual            
git rm --cached fichero Eliminar fichero accidentalmente commited            
git mv fichero.txt fichero Equivalente a:            
  mv fichero.txt fichero            
  git rm fichero.txt            
  git add fichero            
git log Log del repositorio            
git log -p Muestra diferencias            
git log -p --word-diff Muestra cambios no de líneas sino de palabras            
git log --stat Muestra estadísticas cambios            
git log --pretty=format:"%h - %an, %ar : %s" Estadísticas cambios, breves            
               
gitk Un interface g´rafico            
git commit --ammend Corregir último commit            
git checkout -- fichero Abandonar cambios fichero y reemplazarlo por la última vesion commited.            
git reset --hard 0d00dfc32 Abandonar todo lo hecho y recuperar el estado del commit 0d00dfc32            
git remote              
git remote -v Ver repositorios remotos definidos            
git push -u origin master Empujar la rama master al repositorio remoto origin            
git fetch origin Recoger lo que hay en origin, la rama master por defecto            
git pull origin Obtiene la rama master por defecto, y la "mergea" con la local            
git push origin master Empuja a origin la rama master; sólo funciona si nadie ha pusheado en el intervalo            
git branch testing Para cxrear una rama            
git checkout testing Para posicionarse en una rama            
git reset --hard HEAD\~1 Eliminar el último commit            
               
git checkout master Colocarse en master…            
git merge testing …y fusionar la rama testing.            
git fetch --all Recuperar la rama master del repositorio y obliterar los            
git reset --hard origin/master cambios locales            
git branch -d testing Eliminar la raman testing una vez que la hemos utilizado            

Fecha: 2016-10-16

Created: 2020-06-25 jue 11:32

Validate