Blog Territorio Linux

Página personal de Heliogabalo, sobre Linux Server.

Aplicar parches

Todo el mundo habla de los parches, los mods, plugins y, addons. ¿Pero qué son? Hoy nos ocuparemos de los parches y cómo aplicarlos sobre un código existente.

Los parches son modificaciones que se han hecho sobre archivos de código, para cambiar el comportamiento de una aplicación. Consiste en una variación del código original, guardada en un archivo a parte.

Es habitual encontrar en sistemas tipo Unix, aplicaciones para gestionar estos parches. Comandos como patch y diff resultan útiles para un uso generalizado, sobre aplicaciones de todo tipo, escritas en multitud de lenguajes de código.

nota: un DVCS(sistema de control de versión distribuido) como git, es otro ejemplo de aplicacion, que usa sus própios comandos, para llevar a cabo estas mismas tareas!


El comando patch toma un archivo de parche patchfile conteniendo una lista de diferencias producidas por el comando diff, aplicando estas diferencias sobre uno o más archivos originales, produciendo las versiones de parche. Normalmente estas versiones de parche, reemplazan a los archivos originales.


$ git diff test.md
diff --git a/Trash/test.md b/Trash/test.md
index d9aaaea..3122702 100644
--- a/Trash/test.md
+++ b/Trash/test.md
@@ -1 +1 @@
-#esto es una prueba
+### esto es una prueba

Nomenclatura

Son ejemplos escritos sobre una shell, en nuetro caso una bash:

$ patch < patch.file
$ patch foo.c < patch.diff
$ patch -pNum < /ruta/al/archivo

En el primer ejemplo es aplicado el parche patch.file, escribiendo la instrucción tal cual, sobre la cónsola. El segundo ejemplo muestra como aplicar una diferencias anteriormente creada, sobre el código original; en este caso foo.c. La última línea de ejemplo determina la ruta que seguirá el comando patch para llegar hasta el archivo objetivo.

nota: ver página de manual.


Igualmente, los cambios pueden revertirse. Aunque será necesario en todo caso, ambos archivos. Esto es: archivo original y parche.

$ patch -R < /ruta/a/mi_archivo

En esta línea, nos encontramos dentro del directorio que contiene el parche que se ha aplicado a mi_archivo y explicitando la ruta que seguirá el comando hasta mi_archivo, se deshacen los cambios realizados con la bandera -R.


Crear parches

Para crear un parche puede utilizarse el siguiente comando:

$ diff -u archivo-original nuevo > patch.diff

Aplicar parche a Hola-mundo.c

Comenzamos creando el archivo hola.c


#include<stdio.h>

main(){
  printf("Hello, world!\n");
}

A continuación se copia el archivo, con el comado cp situaremos ésta copia del archivo en el lugar conveniente, puede ser cualquier directorio -siempre que lo tengamos en cuenta.

$ cp hola.c hola-nuevo.c

Editando el archivo hola-nuevo.c y añadiendo la línea return 0, evitaremos algunas advertencias por parte del compilador.


#include<stdio.h>

int main(void){
  printf("Hello, world!\n");
  return 0;
}

Ahora mediante la siguiente línea, será creado el archivo de parche, unificando las diferencias entre ambos archivos:

$ diff -u hola.c hola-nuevo.c > hola.patch
$ cat hola.patch

Volcamos el contenido del archivo con cat sobre fd1, o lo que es lo mismo: por pantalla! La salida es algo así:


--- hello.c  2014-04-29 17:59:49.000000000 +0530
+++ hello-new.c  2014-04-29 18:00:43.000000000 +0530
@@ -1,5 +1,6 @@
 #include<stdio.h>

-main(){
+int main(void){
  printf("Hello, world!\n");
+  return 0;
 }

... y aplicamos el parche:

### el archivo hola.patch conoce el nombre del archivo a ser parcheado ##
$ patch < hola.patch

La salida es algo así:


patching file hola.c

Nuevamente con un cat hola.c imprimimos por pantalla, el contenido del archivo:


#include<stdio.h>

int main(void){
  printf("Hello, world!\n");
  return 0;
}

Trabajo sobre directorios

Conviene hacer una copia del directorio, antes de realizar ningún cambio.

$ cp -R mi-dir/ mi-nuevo-dir/

Una vez hecha la copia recursiva del directorio...


$ pwd
yes, this is: mi-nuevo-dir, the directory you  
are searching for, but if not! -> cd /to/it

Finalmente creamos el parche para todo eldirectorio, de la siguiente manera:

$ diff -rupN mi-dir/ mi-nuevo-dir/ > my-dir.patch

Listo para parchear el directorio original sobre la misma máquina, o sobre cualquier otra que contenga mi-dir:

patch -p1 < my-dir.patch


Fuente:Vivek Gite

Links Gnome

Hace varios años, leí un artículo sobre como crear enlaces de escritorio, para una aplicación que al instalarla, no lo crea. Dado que el mérito no es mio, he decidido colgar al final del post, el enlace a mi fuente.

Como de costumbre, aquí en Territorio Linux, tomamos un enfoque de cónsola, para resolver problemas; aunque leyendo el artículo original, aquellos que sólo usen ratón también podrán conseguir lo mismo.

Lo primero es abrir una terminal. Típico alt + F2para llamar al lanzador de gnome y el comando gnome-terminal, a continuación pulsamos retorno de carro.

Aquí el que prefiera Gedit, desde la ventana que acaba de abrirse pude lanzarlo igualmente. De cualquier otra forma, nano es una alternativa disponible en cualquier máquina Linux.

Empezamos creando un archivo al que llamaremos por el nombre del binario y, añadiendo el .desktop:

$nano mozilla.desktop

Las siguientes líneas deben escribirse tal cuál. No es necesario modificar ninguna. Obviamente para la versión del binario habrá que comprovarla antes. Con la bandera de ayuda, obtendremos el formato adecuado para el comando que buscamos, habitualmente -h.

[Desktop Entry]
Version=1.0
Type=Aplication
Terminal=false

n.d.e: si lo intentais com Mega(el directorio de 50Gb gratis en la nube), el lanzador es un desastre de proporciones cósmicas. Por lo general, cualquier aplicación de cónsola, por muy pequeña que sea, guarda un pequeño resumen de comandos, accedido desde la cónsola con -h o --help. Por lo que si no sale nada o no funciona esto, hay que sospechar. De la aplicación, del lanzador y, del sitio web desde fue descargado. En nuestro caso la aplicación parece ser que guarda la clabe, en una caché que no se borra ni siquiera reiniciando sistema.

...Continuamos con el archivo:

Name=mozilla
Categories=Network;
Exec=/path/to/binary-file
Comment=Este es mi comentario/algo
Icon=/path/to/imagen.ico

Habrá que guardar el archivo. Las buenas prácticas, dictan hacer estas operaciones sobre un directorio temporal! Continuamos habilitando permisos de ejecución:

$ chmod +x mozilla.desktop

Como es lógico, es innecesario correr según que aplicaciones con permisos de administrador. En función de esto, colocaremos el archivo donde toque. Hay dos directorios donde podrá colocarse nuestro archivo: 1. /usr/sahre/applications. Esta nunca es la primera opción, porque hay que ser un poco mas meticuloso, ya que habrá que escribir sobre el directorio, con los permisos oportunos. Y Después, comprobar que tanto los permisos de operación, como los usuarios vinculados al archivo, son los correctos. Así que lo ideal, es hacerlo en el directorio de usuario: $HOME/.local/share/applications

$ mv mozilla.desktop $HOME/.local/share/applications

Tabla de categorias usuales:

Categorias Variable
Accesorios Categories=Utility;
Gráficos Categories=Graphics;
Herramientas de sistema Categories=System;
Internet Categories=Network;
Juegos Categories=Game;
Oficina Categories=Office;
Sonido y video Categories=AudioVideo;

El archivo completo quedaría algo así:

[Desktop Entry]
Version=1.0
Type=Aplication
Terminal=false
Name=mozilla
Categories=Network;
Exec=/path/to/binary-file
Comment=Este es mi comentario/algo
Icon=/path/to/imagen.ico

Fuente: eldebiandepepe

Aplicaciones

  • Package: wnpp

    Severity: wishlist

    Owner: Andreas Tille

    Package name : r-cran-cairo

    Version : 1.5-9

    Upstream Author : Simon Urbanek

    URL : http://cran.r-project.org/web/packages/Cairo

    License : GPL

    Programming Lang: GNU R

    Description :

Librería del dispositivo gráfico de GNU R, de alta calidad, para el desarrollo de mapa de bits (PNG, JPEG, TIFF), vector (PDF, SVG, PostScript) y salida visual por (X11 y Win32).

El dispositivo gráfico Cairo, puede ser usado para crear imágenes de alta calidad, en formato de vector (PDF, PostScriipt y SVG) salidas en mapa de bits(PNG, JPEG, TIFF) y renderización de imágenes con (X11 y Win32). Es utilizado el mismo marco de trabajo, para todas las salidas y, usa la tecnología WYSYWYG para la copia entre formatos.

Los archivos son creados sin dependencias sobre X11 o cualquier otro programa externo.
El dispositivo soporta el canal alfa(dibujo semi transparente), como resultado las imágenes pueden contener regiones transparentes o semi transparentes. Es ideal para su uso dentro de entornos de servidor(salida de archivo) y como reemplazo a otros dispositivos sin las capacidades de Cairo. Esto es el canal alfa o anti-aliasing. El marco de trabajo es modular, soportando otras aplicaciones compatibles.



N.D.T: WYSYWYG; What you see is what you get. Lo que ves es lo que hay.