sábado, 17 de abril de 2021

Maven (4) y Eclipse: Usar symblinks como alternativa a maven multi-module. Pros y contras

 0. Introducción

Una de las alternativas a no repetir código es utilizar los symblinks o enlaces simbólicos de ficheros.

En principio, vamos a hacer enlaces simbolóicos de carpetas, y se van a hacer de forma relativa es decir, en vez de utilizar

ln -s /home/ximodante/WORKSPACE/Project01/src/main/java/package01 /home/ximodante/WORKSPACE/Project02/src/main/java/package01

se utilizará


cd /home/ximodante/WORKSPACE/Project02/src/main/java

ln -s ../../../../Project01/src/main/java/package01 package01

#para deshace el link, utilizar unlink package01

PROS:

  • No se duplica el código, con los problemas de incongruencias que puede haber por duplicidades de código
CONTRAS:
  • Para hacer las copias de seguridad hay que hacerlas de todo el workspace y no de cada proyecto por separado
  • Los vínculos no pueden hacerse fuera del workspace
  • Si recuperamos la copia de seguridfad en Windows, lo mas seguro es que no reconozca  los vínculos y al revés también pasa.
  • Para tener la ventaja, debemos tener todos los proyectos en un mismo workspace, con lo que al abrir el workspace se vuelve mas pesado 
  • Si cambiamos el nombre de alguna carpeta o proyecto, la liamos parda
  • Eclipse marca los paquetes que son vinculos, pero NO MARCA como vínculos los paquetes HIJOS. Por lo tanto hay que tener cuidado
PRECAUCIONES:
  1. Hacer la copia de seguridad siempre de todo el Workspace
  2. No hacer referencias con symblinks a otros workspaces
  3. Rediseñar el proceso de copia de seguridad
  4. Darse cuenta que estamos trabajando con archivos vinculados, y cualquier cambio en uno de ellos afecta a todos los elementos del proyecto
  5. Hacer copias de seguridad frecuentes.
  6. Ir con cuidado con renombrar los paquetes y proyectos

viernes, 16 de abril de 2021

Postgres reparación de la base de datos

 0. Introducción

A veces una BD postgres puede dar problemas varios, como por ejemplo que haya discrepancias con los datos de las consultas debido a la cache etc.

Lo que primero se recomienda es NO HACER un pg_dump en el wiki de postgres, pues muchas veces se destruye la información trantando de recuperarla .

1. Pasos a seguir

1. Localizar donde se guardan los ficheros fisicos de la BD. Normalmente se guardan en el caso de la version 12 en

/var/lib/postgresql/12/main

Si no se sabe donse se guarda, y tenemos la suerte que la BD todavía funciona se ejecuta este comando en la consola pg_admin, y situandonos en nuestra base de datos

show data_directory

2. Copiar este directorio a otro (para ello creamos el directorio postgres_copy

sudo cp -avr /var/lib/postgresql/12/main /home/myUser/postgres_copy

observar que hay que acceder mediante sudo

3. Cambiar los permisos a la copia y copiarlo a otro servidor con ftp (FileZilla)

chmod -R 777 /home/myUser/postgres_copy




viernes, 9 de abril de 2021

PDF con PDFBOX (5) Rediseñando con la libreria de Apache

0. Introducción

A mi las librerias de Apache siempre me han dado confianza... pero a veces se quedan anticuadas y las nuevas versiones tardan en salir.

Es por ello que cuando estas dan problemas se recurre a librerías alternativas.

En este caso PDF Box ha sacado una nueva versión que parece ser que va muy bien

Por tanto se adjunta una clase de utilizades que entre otras cosas:

  1. Trocea un pdf en grupos de "n" páginas
  2. Extraer todo el texto de un pdf
  3. Extraer el texto que hay dentro de una región rectangular
Todo esto ya estaba hecho en post anteriores pero con la libreria itext

Veamos la clase java


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package openadmin.utils;

import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

import org.apache.pdfbox.multipdf.Splitter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;

/**
 * @author FJGimeno 09/04/2021
 *
 */
public class PDFUtils {
	
	/**
	 * Split a pdf file into groups of nPages and
	 * @param file
	 * @param nPages
	 */
	public static void splitPdf(File file, int nPages) {
		try {
			PDDocument sourceDoc;
			sourceDoc = PDDocument.load(file);
			int start = 0, end = 0;
			if (sourceDoc.getNumberOfPages() > nPages) {
				try {
					Splitter splitter = new Splitter();
					// Indicates how many pages each "cut" from the document will have .
					// (if you have a document of 500 pages and split it in documents of 5 pages
					// each, you will have 250 documents of 2 pages).
					splitter.setSplitAtPage(nPages);
					List<PDDocument> splittedList = splitter.split(sourceDoc);
					start = 1;
					end = nPages;
					for (PDDocument doc : splittedList) {
						/*
						 * Saves the document with the added route and name, it is best to give it an
						 * absolute route, in this example, i've used the source file to get the parent
						 * folder's route, also, generates a name for the new file based on the name of
						 * the original name removing it's extension
						 * ("file.getName().substring(0, file.getName().length() - 4)"), then, gives it
						 * a number to differenciate each document, and lastly, gives it an extension.
						 */
						doc.save(file.getParent() + System.getProperty("file.separator")
								+ file.getName().substring(0, file.getName().length() - 4) + "_" + start + "-"
								+ (start + (doc.getNumberOfPages() - 1)) + ".pdf");
						// this variables are used to give each generated file a proper name (Ex:
						// document_1-5.pdf, where 1 is "start" and 5 is "end")
						// they will increase their value each time the loop does on cycle.
						start = end + 1;
						end = end + nPages;
						// Closes the document once each pdf is saved
						doc.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	/**
	 * Reads the text included within an area in the pdf
	 * @param file the file to read
	 * @param page the page in the document
	 * @param x coordinate x
	 * @param y coordinate y
	 * @param width
	 * @param height
	 * @return The text (not formatted)
	 */
	public static String readPDFArea(File file, int page, int x, int y, int width, int height) {
		PDDocument document;
		try {
			document = PDDocument.load(file);
			PDFTextStripperByArea textStripper = new PDFTextStripperByArea();
	        Rectangle2D rect = new java.awt.geom.Rectangle2D.Float(x, y, width, height);
	        textStripper.addRegion("region", rect);
	        PDPage docPage = document.getPage(page);

	        textStripper.extractRegions(docPage);
	        String textForRegion = textStripper.getTextForRegion("region");

	        return textForRegion;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			return e.toString();
		}
	}

	/**
	 * Read all the document and get the text 
	 * @param file To read
	 * @return The text (not formatted)
	 */
	public static String readPDF(File file) {
		PDDocument document;
		String text = "Initial Value";
		try {
			document = PDDocument.load(file);
			PDFTextStripper pdfStripper = new PDFTextStripper();
			text = pdfStripper.getText(document);
			document.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return text;
	}

	
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		JFileChooser fc = new JFileChooser();

		fc.setFileFilter(new FileNameExtensionFilter("Documento (PDF)", "pdf"));
		int returnVal = fc.showOpenDialog(null);

		if (returnVal == JFileChooser.APPROVE_OPTION) {
			// Step 1
			File file = fc.getSelectedFile();
			if (!file.getName().contains(".pdf")) {
				throw new Exception("Selected incorrect file type!");
			} else {
				System.out.println(readPDF(file));
				System.out.println("\n-------------------------------------------------------------\n");
				
				//Crida per conseguir DNI i NOM
				// NIF
				System.out.println("NIF: " + readPDFArea(file, 0, 30, 75, 110, 10));
				// Name
				System.out.println("Name: " + readPDFArea(file, 0, 90, 75, 600, 10));
				
				
				splitPdf(file, 2);
				
				
			}
		} else {
			System.out.println("Operation canceled by the user");
		}
	}

}

miércoles, 7 de abril de 2021

Ubuntu Workstation FTP 505 Permission denied. Apache vsf no puede conectarse

1. Introducción

Existen 2 errores a solucionar:
  1. Se ha instalado el vsftp en Ubuntu pero no deja copiar ficheros AL SERVIDOR, dando el error 505 permission denied.
  2. No me deja transferir ficheros desde a hacia el servidor en java con apache vsf

1. Solución al 1er error:

He modificado el fichero /etc/vsftpd.conf como sudo y he visto que no estaba activados: 
write_enable=YES 
allow_writeable_chroot=YES 
He rearrancado el sevicio con 
sudo service vsftpd restart 
y a funcionar

2.Solución al segundo error

Vemos si está instalado el ssh server:
systemctl restart ssh
y contesta que no está instalado, por tanto toca instalarlo con
sudo apt update
sudo apt install openssh-server
y comprobamos si el servicio está en marcha
 sudo systemctl status ssh

Ahora comprobamos que tanto el FileZilla (con sftp)  y el apache vsf con java permite copir ficheros en ambos sentidos
Pero tambien hay que darle estas dependencias
1, com.jcraft-jsch
2. apache-commons-lang3