viernes, 29 de diciembre de 2017

Java 9 con Eclipse: Morir en el intento!

1. Instalar Java 9

Me decanté a probar Java porqué quería hacer una bitácora (log) donde saliera la traza de los programas que llaman a un último método de la clase y en caso de error saber que había pasado.

Tras leer en Stack Overflow la manera de recuperar toda la traza de clases y metodos encadenados que apuntan a un método concreto, me recomiendan utilizar StackWalking API de Java 9 por un tema de rendimiento.

Me pongo a instalar java 9 en Ubuntu tal y como dice Shahrukh Aslam siguiendo sus pasos:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#download repository
sudo add-apt-repository ppa:webupd8team/java

#update reposotory
sudo apt-get update

#install
sudo apt install oracle-java9-installer

#make this java version default
sudo apt install oracle-java9-set-default

pero cuando hago java -version me llevo la sorpresa de que todavía se apunta a Java 1.8

Para ello recurro a la respuesta de SkyWalker de Stack Overflow.

OJO: Hay que tomar estas precauciones:

1. Crear un usuario nuevo por si os equivocais al manipular las variables de entorno y no se cargan, poder acceder al sistema mediante este usuario.

2. Cambiar solo el .bashrc    Para ello indicar


export JAVA_HOME=/usr/lib/jvm/java-9-oracle
export PATH=$JAVA_HOME/bin:$PATH

3. No tocar el etc/enviroment



Por desgracia toqué el etc/environment y cuando hacía login al sistema no entraba. Creia que se había cargado el teclado inglés pero no aparecía ninguna indicación. Tuve que entrar en ALT-F1 en una tty a modo caracter donde no reconocía ningun path y tuve que teclear 

/usr/bin/vi /etc/environment

Dejar el fichero tal como estaba antes y guardar con Mayuscula zz

Y pude entrar de nuevo al sistema

UFFFFFFF que alivio.

2. Que pasa con Eclipse?


Parece ser que las versiones ya instaladas de Eclipse no funcionan o funcionana a medias según de donde se las llama.

Para que funcionen las versiones antiguas hay que apuntar a la JDK de versión anterior.

Parece ser que la nueva versión de Eclipse Oxygen v2, si que funciona... pero...

1. Hay que instalar previamente el JDK 9 antes que el Eclipse.

2. Como se te ocurra ejecutar eclipse antes de instalar java 9 estás perdido. Si lo jaces hay que borrar el directorio donde has descomprimido el jar y volverlo a crear mediante la descompresión del jar (de eclipse), una vez ya haya sido instalado el jdk 9.

3. En el caso anterior, el error que salía decía "an error has occurred. See log null" o algo parecido.

4. Boton drecho sobre el proyecto -> Propiedades->Project facets y Java Compiler->Verificar que haga referencia a java 9

5. JDK 9 no muestra las librerias que pueden podrían pertenecer a JEE :
  - java.xml.ws ( SAAj, Web Services Metadata) ,
  - java.xml.bind (jAXB), java.activation (jAF),
  - java.xml.ws.annotation (Common Annotations),
  - java.corba (CORBA),
  - java.transaction (jTA),
  - java.se.ee (aggregator module for last 6 modoules),
  - jdk.xml.ws (Tools for jAX-WS, wsgen, wsimport),
  - jdk.xml.bind (Tools for jAXB, schemagen, xjc),
  - java.corba (idlj, orbd, servertoo, tnamesrv).

Por ello se habla de las siguientes RIs o implementaciónes de referencia que se encuentran en Maven:

    - com.sun.xml.ws: jaxws-ri (para jAX-WS. SAAj y Web Services Metadata) que en Maven es:
    - com.sun.xml.bind : jax-ri (JAXB)
    - javax.transaction : javax.transaction-api

Que en definitiva se pueden indicar en el pom.xml como:
    
    <properties>
       <jax.version>2.3.0</jax.version>
    </properties>

    <dependency>
      <groupId>com.sun.xml.ws</groupId>
      <artifactId>jaxws-ri</artifactId>
      <version>${jax.version}</version>
      <type>pom</type>
    </dependency>
    
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-ri</artifactId>
      <version>${jax.version}</version>
      <type>pom</type>
    </dependency>
    
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>javax.transaction-api</artifactId>
      <version>1.2</version>
    </dependency>
    
     <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.2</version>
    </dependency>


Hemos puesto la versión 2.3.0 en propiedades para que la cosa quede mas bonita.

Pero ....

1. Hay que tener en cuenta que estas referencias apuntan a

http://repo1.maven.org/maven2

Pero no hace falta añadirlo, ya que tambien están en el repositorio de Maven que apunta eclipse.

Si se quiesiera añadir este repositori se podría también añadir . Para ello se puede ver lo que se dice en StackOverflow y darle esta entrada al pom.xml anadada en <project>

  <repositories>
    <repository>
        <id>maven-central-repo1</id>
        <name>Maven Centra Repo1 Repository</name>
        <url>http://repo1.maven.org/maven2</url>
    </repository>

  </repositories>

2. Observar  <type>pom</type>, en su ausencia NO encuentra la dependencia !!!


3. Lombok no me funciona..

He bajado la version "cutting-edge" v1.16.19 "Edgy Guinea Pig". He ejecutado:

sudo java -jar lombok-edge.jar 

y lo he reinnstalado al Eclipse Oxygen 2. Y ... parece ser que ya lo coge!


4. Apache CXF no funciona...

De momento no tengo solución para esto. Tendré que volver a la java 1.8

Para ello la cambio con

sudo update-alternatives --config java

jueves, 21 de diciembre de 2017

A repasar Inglés (palabras nuevas sacadas de stack overflow)



A


ado: lío, alboroto, jaleo, mucho ruido y pocas nueces
ailing: enfermo, descompuesto
ain't: contranción de "am not" o "is not"
allotted: assignado, distribuido.

B

badge: distintivo, insignia, emblema
ballot: votación, encuesta. Votar, encuestar.
beet: remolacha
beetle: escarabajo
bespoke: confeccionado a medida (bespoke solution)
bias for, bias against, biased: ser partidario de, estar en contra de, tener predilcción o perjuicios por, 
blanket: frazada, cubierta
bloated: inflado, desmesurado, (the good, the bad and the bloated ?)
bloom: floración.
blur: empañar, desdibujarse.
buddy: colega, camarada.

C

cheat: trampa engaño, hacer trampa engañar. OJO: cheatsheet es guia de instruciones rápida
cluster: grupo, racimo (cluster de servidores)
clutter: follón, desbarajuste, desorden.
clutter up: Enfollonar, desbarajustar

currying: Currificar o proceso mediante el cual se descompone una función de n variables en n composiciones de funciones ( o secuencia de funciones) de una variable. Por ejemplo: una función que recibe 2 parámetros y devuelve otro: F(x,y) ->z se currifica como Una función que toma un parámetro x, y devuelve una función que toma el parámetro y y devuelve z. 
Es decir Curry(F)=F'(x)->(G'(y)->z) 


D

dagger: daga, puñal
dangling: colgante, que cuelga
disguise (in disguise) : disfrazado, camuflado
docker: estibador, cargador

E

eschew: evitar, renunciar

F

filthy: sucio, asqueroso, indedente.
flush: descarga
flyby: vuelo de reconocimiento, preliminares
foe: enemigo, oponente

G

get away with: salirse de rositas de algo
gnat: mosquito.
godsend: don de Dios, bendición, regalo de Dios.
growl: gruñido, graznido

H

havoc: lío, caos, confusion
heal: curarse
hood: capucha, toldo. Under the hood (intrínsecamente). Mirar el interior
hype: bombo publicitario, despliegue publicitario. Promocionar, publicitar

I

impingement: impacto
inapt: inapropiado

L

limb: extremidad, miembro, rama

M

meandering: serpenteante, disperso o divagante (en un discurso)
mod : complementos (de un juego). Persona nacido en los 60 y es elegante.
mood: humor (bad mood)
mud: cieno, lodo

N

nifty: genial, excelente.

O

onset: comienzo, arranque
opinionated: obstinado, terco, testarudo.
outage: corte de luz (o cualquier otro suministro)
outrageous: indignante, cabreante. escandaloso.
overhead: gastos generales, precauciones (take you overhead to copy the information)

P

patchy: desigual, disperso
portmanteau: palabra compuesta (qubit is a portmanteau or quantum anf bit), equipaje.
probe: rastrear indagar
probing: investigación, sondeo
pull up: frenar, parar, reprender (pull a service up)

Q

quandary: dilema, disyuntiva (in a quandary)

R

rave about: alabar con entusiasmo, delirar.
realm: dominio, reino.
recap: resumen, recapitulación (recap and cheat sheet:  is a concise set of notes used for quick reference)
reel: carrete. Tambalearse
robin: petirrojo
round-robin: carta en cadena, cadena de cartas, mensaje circular.

S

scale: escalar, balancear (un servicio)
spin up: poner al dia, poner a punto, sincronizar
stage: escenario, paso (multi-stage, en muchos pasos o fases)
           montar, manipular, preparar. (this stages your files locally for commit: prepara/monta los ficheros locales para el commit
staging: preparación, puesta en escena.
starch: almidón. (no confundir con stash)
start over: volver a empezar.
stash: reserva oculta, alijo. Ahorrar, guardar almacenar (stash some money away for holidays)
stem: tallo, tija
stunt: escena peligrosa, acrobacia. Artimaña, estrategia. Atrofiar, impedir, dificultar.
sucrose: sacarosa
surveillance: vigilancia
swarm: nube, enjambre, plaga (en docker swarm es una nube)

T

take down: Desmontar, desmantelar (take down an application: Desmontar una aplicacion (en ejecución))
tear down: Derribar, parar (tear down a service: parar un servicio).
tenant: Arrendatario, inquilino. Se usa en Oracle que dice que "Multitenant" 
tuck smth away: empaquetar, zamparse, endiñar.
tweak: pellizcar, modificar. Pellizco, modificaciones

V

vanquish: derrotar, vencer
venue: lugar, sitio, campo, estadio

W

wasp: avispa
weep out: eliminar, barrer del mapa
whim: antojo, capricho: ( this can be deleted at a whim )
whoop: hurras, vivas. Gritar de alegría.

jueves, 14 de diciembre de 2017

Reducir el tamaño de imagenes JPG de los móviles a 250K sin perder casi información en Ubuntu


0. Instrucciones Generales

NOTA a Noviembre de 2019: Si se convierten las imágenes desde PDF a jpg, puede haber problemas ya que algunas no se coinvierten bien con este método.
Para tratamiento de PDF se pueden obtener buenos resultados en I Love PDF


1. Para instalar en Ubuntu:

sudo apt-get install jpegoptim

2. Descargar las fotos del movil u otro sitio y realizar una copia de seguridad de los ficheros que se van a tratar, por si no sale bien la cosa. Ir a la carpeta donde estan las imágenes y para convertirlas a 256 K que da resultados aceptables si son documentos (No da buenos resutados en fotografías), teclear

jpegoptim --size=256 *.jpg  para todos los ficheros de la carpeta o

jpegoptim --size=256 image01.jpg  solo para el fichero image01.jpg



También se puede probar con 512 ó 1024 en caso que no se vean bien.


4. Si se quieren convetitr a PDF,se tendrá que instalar

sudo apt-get install imagemagick

5. Este programa comprime todas las imágenes que le indicamos en un único fichero

convert file01.jpg, file02.jpg file.pdf

convert *.jpg file.pdf


6. Se puede utilizar la opción de rotar

convert -rotate 90 file01.jpg, file02.jpg file.pdf

7. Se pueden aplicar mas opciones. Ver imagemagick


8. Pueden haber problemas al convertir a pdf. Si aparece:

convert: not authorized `Selection.pdf' @ error/constitute.c/WriteImage/1028.

Entonces en askubuntu recomiendan modificar el fichero:

/etc/ImageMagick-6/policy.xml

y cambiar

PDF rights desde none a read|write


9. También se puede cambiar de formato:

Para convertir pdf a jpg :  convert pantalla.pdf pantalla.jpg
Para convertir jpg a png : convert pantalla.jpg pantalla.png


10. Para no tener problemas con los ficheros con un caracter en blanco en el nombre, se pueden cambiar los espacios en blanco por un guión "-" en un  directorio y sus hijos, situandose en el directorio y ejecutando

rename 's/ /-/g' *


1. Ejemplo

Se me ha dado un pen drive con algunos ficheros PDF, y se quiere reducir de tamaño. Para ello se realizan los siguientes cambios:

1. Hacer una copia de seguridad de los ficheros por si acaso.

2. Sustituir los espacios en blanco por guiones en el nombre de los ficheros

rename 's/ /-/g' *

3. Convertir los ficheros con extensión pdf a jpg con una resolución de 300 ppp. Para ello se ejecuta

for f in *.pdf ; do convert -density 300 "$f" "${f%%.*}".jpg; done

donde:
  "$f" es el nombre del fichero
  "${f%%.*}" es el basename del fichero o nombre del fichero sin extensión
 -density 300 aplica una densidad de 300 ppp

Con ello ha convertido cada PDF a varios JPG, uno por cada página

4. Reducir el tamaño perdiendo algo de calidad para todos los JPG. Para ello tecleamos

jpegoptim --size=256 *.jpg

5. Observamos como se quedan, y volvemos a convertir a PDF, para ello agrupamos todos los ficheros con JPG y el basename del fichero PDF
 anterior y le añadimos -CONV al basename

for f in *.pdf ; do convert "${f%%.*}"*.jpg "${f%%.*}"-CONV.pdf; done



martes, 12 de diciembre de 2017

La API de JPA 2.1 (V) Programaticamente actualizar la conexion a la BD

Se pueden crear persistence units programaticamente en estas condiciones:

  1. Utilizando Spring (ver stack overflow)
  2. Utilizando Hibernate (ver el mismo link en  stack overflow)
  3. Implementando la interface PersistenceProvider (ver el mismo link en stack overflow y JPA API

  • En principio voy a descartar Spring pues mete muchas jars que no necesitamos.
  • También voy a descartar usar Hibernate cuando se desmarca de la JPA API
  • El tercer método parece un poco laborioso ya que hay que implementar la interface PersistenceProvider.
Lo que he pensado, es tener una persistence unit (o varias) definidas en el persistencel.xml y modificar la conexión a la BD.

Para ello podemos tener un persistence.xml como este


 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
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
        <persistence-unit name="sqlserver-jtds" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

          <properties>
            <!-- Configuring JDBC properties -->
            <!-- -->
            <!-- -->
            
             
            <property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://111.111.11.11:1433/DB2017" /> 
            <property name="javax.persistence.jdbc.user" value="myuser" />
            <property name="javax.persistence.jdbc.password" value="mypassword" />
            <property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver" />

            <!-- Hibernate properties -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />
            <property name="hibernate.hbm2ddl.auto" value="none" />  <!-- update -->

            <!-- Configuring Connection Pool -->
            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="500" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.idle_test_period" value="2000" />
          </properties>
    </persistence-unit>  
          
</persistence>

la idea es seleccionar esta persistence unit "sqlserver-jtds" y cambiarle la propieded "javax-persistence.jdbc.url" a "jdbc:jtds:sqlserver://111.111.11.11:1433/DB2018".

Para ello, basandonos en stack overflow ejecutamos este código java:


1
2
3
Properties props = new Properties();
props.setProperty("javax.persistence.jdbc.url", "jdbc:jtds:sqlserver://111.111.11.11:1433/DB2018");
EntityManagerFactory emf=javax.persistence.Persistence.createEntityManagerFactory("sqlserver-jtds", props);

Con lo que hemos aprovechado el persistence.xml que había y le hemos cambiado la conexión programáticamente.

Esto viene bien cuando se cambia de año y hay que trabajar en otra base de datos correspondiente a ese año. Para ello se puede utilizar un fichero de propiedades para guardar el nombre de la BD.

En fin chapucillas que vienen bien y no complican el código.