Cómo se hace…
Índice
- 1. Debian Linux
- 2. Uso de Emacs (General)
- 2.1. Vídeos sobre Emacs
- 2.2. Ver el contenido de una variable
- 2.3. Ver los paquetes que se cargan y ocluyen a otros
- 2.4. Uso de git desde Emacs
- 2.5. Fechado y automatización de un diario
- 2.6. Uso de marcadores para poner puntos de retorno en Emacs
- 2.7. Cómo designar el fin de línea en una sustitución
- 2.8. Edición de un fichero remoto
- 2.9. Ejecución de código R desde Emacs en una sesión remota
- 2.10. Visualización de ficheros .csv
- 2.11. Codificación de caracteres en Emacs
- 2.12. Recodificación selectiva de regiones
- 2.13. Numerar las líneas de un buffer (sólo en Emacs => 24)
- 2.14. Ordenar líneas (y seleccionar únicas)
- 2.15. Uso de doxygen
- 2.16. Recetas varias con Emacs
- 2.17. Edición recursiva
- 3. Uso de Emacs (Org-mode)
- 4. Uso de Emacs (Workgroups)
- 5. Shell, programas auxiliares en la línea de comandos
- 5.1. Alineación mediante expresiones regulares
- 5.2. Transferencia de árboles de directorios completos
- 5.3. Obtener información sobre la geometría de una ventana
- 5.4. Borrar mediante find todos los ficheros de un cierto nombre en un directorio
- 5.5. Generar un fichero gráfico con texto arbitrario
- 5.6. Determinar la codificación de un documento
- 5.7. Encontrar caracteres no ASCII en un documento
- 5.8. División de un fichero de texto en los lugares donde aparece una cadena de caracteres
- 5.9. Reemplazar todos los enlaces simbólicos en un directorio por los ficheros a los que apuntan
- 6. Herramientas diversas (ssh, java, Evolution…)
- 7. R y herramientas relacionadas con R
- 7.1. Creación de bibliografías para RMarkdown
- 7.2. Creación de paquetes en R (I)
- 7.3. Creación de paquetes en R (II)
- 7.4. Algunas recomendaciones para crear paquetes en R
- 7.5. Uso de roxygen+ESS para documentar paquetes en R
- 7.6. Mapas de llamadas entre funciones en R
- 7.7. Eliminar filas duplicadas en una dataframe
- 7.8. Visualización en R
- 7.9. Tamaño de un objeto en R
- 7.10. Obtener todos los fragmentos de un texto con una condición
- 7.11. Obtener gráficos de series temporales apiladas
- 7.12. Poner "tags" para editar fuente en R
- 7.13. Depurar programas con Emacs + ESS
- 7.14. Utilizar fuentes cualesquiera en gráficos de R
- 7.15. Elección de una paleta en R
- 7.16. Cómo ver una función invisible (con asterisco al hacer ls()).
- 7.17. Lectura de metadatos en R (genéricos, SAS, SPSS)
- 7.18. Generación de tablas para incluir en documentos LaTeX
- 7.19. Uso de gdb con R
- 7.20. Ver cuanto espacio ocupa un objeto en el workspace
- 7.21. Creación de presentaciones con R
- 7.22. Correr scripts en Rmarkdown en batch
- 8. LaTeX, formatos DVI, PDF
- 8.1. Compresión ficheros PDF
- 8.2. Extracción de páginas de un PDF
- 8.3. Combinación de varios ficheros PDF en uno sólo
- 8.4. Añadir un gráfico (firma, membrete…) a un PDF
- 8.5. Añadir números de página a un PDF
- 8.6. Ejemplos de gráficos LaTeX en TikZ
- 8.7. Gráficas en "landscape"
- 8.8. Creación de tablas en modo Org
- 8.9. Edición de transparencias con Beamer de una en una
- 8.10. Extraer imágenes de un fichero PDF
- 8.11. Inclusión de esquemas hechos en Inkscape en LaTeX
- 8.12. Anotación en LaTeX de esquemas hechos en Inkscape
- 8.13. Inclusión selectiva de líneas de un documento multilingüe
- 8.14. Conversión de formatos
- 8.15. Uso de fuentes adicionales
- 8.16. Generación de tablas para incluir en documentos LaTeX
- 8.17. Eliminación de espacio en PDF's para incluir en LaTeX
- 8.18. Generadores de citas en formato BibTeX
- 8.19. Firma digital de ficheros (por ej. PDF).
- 9. Procesado de información espacial
- 10. E-books: suministradores, manipulaciones
- 11. Fuentes de datos
- 12. Uso de git
- 12.1. Cómo instalar GIT en Windows
- 12.2. Cómo crear claves públicas
- 12.3. Cómo crear un repositorio
- 12.4. Cómo subirlo a Bitbucket
- 12.5. Cómo clonar un repositorio en BitBucket en la máquina local
- 12.6. Cómo sincronizar un repositorio en BitBucket bajándolo a la máquina local
- 12.7. Cómo sincronizar un fork con el repositorio original e incorporar los cambios en éste
- 12.8. Cómo borrar toda la historia y convertir la versión actual en el origen de una nueva: solución bestia
- 12.9. Cómo borrar toda la historia y convertir la versión actual en el origen de una nueva: solución elaborada
- 12.10. Cómo incorporar las modificaciones en la rama "cambios" a "master"
- 12.11. Lista breve de mandatos
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
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.5.2 Referencias útiles
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.8 Visualización en R
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
- Uso de
xtable
(+ opcionalmente (LaTeX)booktabs
).
- 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:
- Se "scannea" la imagen y se lee con GIMP.
- En GIMP, seleccionar: "Imagen -> Recortar a la selección".
- En GIMP, "Colores -> Niveles" y manipular hasta que el fondo sea realmente blanco.
- En GIMP, "Capa -> Transparencia -> Añadir canal alfa"
- En GIMP, "Colores -> Color a alfa" para hacer el fondo blanco transparente.
- 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, teclearemosorgtbl-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 yEU
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.1 ISBN to BibTeX converter
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
- Obtener los datos de elevación. Por ejemplo, de
(ficheros MDT* ).
- Descomprimir el fichero de que se trate para obtener un .asc
- Abrir QGIS–>Raster–>MDT (modelos de terreno). Se obtiene una ventana en la que reemplazar los nombres de ficheros de entrada, salida, etc.
- Escoger entre Hillsade, releive de color y demás opciones.
- 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
Ver el modo de hacerlo en https://developers.google.com/maps/documentation/distance-matrix/intro#DistanceMatrixRequests
9.2.2 Emitir una query
Por ejemplo, https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=42.806028,-2.509361&destinations=43.044333,-2.989111&key=AIzaSyCxi1SWb3JcytSlja-58ivmq-UmII6_3zs en que la API es la obtenida en el paso anterior.
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
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 |