Librerías GIS de escritorio con Java

En el curro casi todas nuestras aplicaciones son de escritorio, con javax.swing y casi todas llevan algún mapa donde pintamos «cosas». Habitualmente símbolos que representan barcos, aviones, helicópteros, pero también polígonos, líneas etc.

Por ello, hemos ido probando y pasando de unas librerías Java de mapas (GIS o Geographical Information Service) a otras.

logo nasaUna de las que seguimos usando, gratuita, es WorldWind. Escrita por la NASA, muy completa, pero que ya no tiene soporte y está discontinuada. En la Categoría WorldWind de la Chuwiki tengo algunos ejemplos que hice en su día.

Otra que miramos en su momento, es la de ESRI (ArcGis). El SDK de desarrollo de Java es gratuito, aunque viene con algunas limitaciones. Sólo es necesario el pago si vas a instalar tu aplicación en clientes o si tu aplicación necesita acceder a determinadas funciones que están hospedadas en los servidores de ESRI, como el trazado de rutas entre dos puntos siguiendo los caminos o el acceso a ficheros de mapas que tengan ellos. Una ventaja grande de ESRI es que no sólo tiene SDK de Java, sino que lo tiene en varios lenguajes, para web, para móvil, etc. WorldWind también lo tiene, pero algunas de esas opciones están un poco «a medias».

En plan gratuito también miré Geotools. pero era, cuando lo miré, claramente más cutre y me encontré con fallos gordos. Así que no la miré mucho más. De esto hace ya 8 años y Geotools sigue viva y con actualizaciones, es posible que haya mejorado mucho.

Y finalmente, ya de pago total, pero como paga la empresa nos «da un poco igual», tenemos Luciad LightSpeed. Es una librería cara, sin posiblidad de desarrollo gratuito salvo que contactes con ellos y te concedan una licencia de demo, pero es muy muy completa. Es la que conozco que soporta más formatos de ficheros de mapas (cartas náuticas, simbología militar completa, ficheros meteorológicos, de CAD, etc, etc). Tiene también versión para el lado del servidor en una aplicación Web, Luciad Fusion. Y la parte del navegador, en TypeScript, Luciad RIA. LightSpeed viene también con Lucy, todo un framework para que hagas tu aplicación con menús, docking de paneles, salvado/recuperación del workspace por usuarios, etc, etc.

Tengo algunos ejemplos en github, pero al ser de pago, no he escrito ningún tutorial. Me gusta que la gente que sigue mis tutoriales pueda hacer y jugar con el código, cosa que aquí no es posible.

Mi relación con Luciad es de amor/odio. Amor porque como comento, es muy completo y nos soluciona prácticamente todos los problemas que tenemos relativos a mapas, esos sí, codificando. Odio por el tema de precio sobre todo, aunque paga la empresa, me toca «convencer» a los que pagan que el precio merece la pena. A veces no es fácil.

Publicado en Herramientas | Etiquetado , , , , , , , , | Deja un comentario

Una pequeña buena costumbre de programación

En algunos lenguajes de programación, cuando tenemos que hacer una operación con un literal, como un String o una constante, y una variable, suele ser buena costumbre poner en el lado izquierdo el literal.

Por ejemplo, si en un if ponemos a==11 o bien 11==a, ambas cosas funcionarán correctamente, sin embargo, la segunda forma tiene una ventaja. Imagina que te equivocas y en vez de == pones sólo un =.  De la primera forma, asignas a la variable a el valor 11 y luego ponte a buscar el error. La segunda forma normalmente da un error de sintaxis en cualquier lenguaje de programación que use esta expresión. Según lo escribes, verás el error. Esto sucede en C++. En Java ambas expresiones darían error al escribir si ponemos un solo =. Depende del lenguaje.

En Java, si en una variable de tipo String tenemos un valor y queremos compararlo con una cadena fija, podemos también de dos formas, bien variable.equals(«Hola»), bien «Hola».equals(variable). Nuevamente, la segunda opción tiene una ventaja. Si variable es null, la primera forma falla en ejecución, mientras que la segunda lo hará correctamente.

Lo mismo sucede con los boolean. Boolean.TRUE.equals(variable) siempre funciona, mientas que variable.equals(Boolean.TRUE) puede dar error si variable es null.

Publicado en C++, java | Etiquetado , , | Deja un comentario

GitHub Copilot

Icono GitHubNo hace mucho descubrí GitHub Copilot. Solo he leído sobre ello, no he experimentado. Es de pago 🙁

GitHub tiene una base de datos de código de miles de desarrolladores y miles de proyectos, por lo que se han decidido a «explotarla». GitHub Copilot es el «experimento».

Si usas GitHub Copilot, cuando haces tu propio programa, sólo tienes que poner el comentario de la función, su prototipo … y GitHub Copilot intenta hacer el resto, es decir, rellenarla. Busca por todo el código almacenado en GitHub algo que se parezca  a lo que quieras hacer y te sugiere el código para rellenarla. Puedes aceptarla o pedir siguiente sugerencia. Cuando aceptes alguna, luego puedes modificarla.

Se monta como un plugin en tu IDE favorito y puedes configurar cosas, como por ejemplo, lenguajes de programación en los que quieres las sugerencias.

No sé qué éxito tendrá o si realmente será útil, no la he probado, pero como idea es interesante y es algo que no se me había ocurrido pensar.

Publicado en git | Etiquetado , , | Deja un comentario

escapeSyntaxCallMode en PostgreSQL v11 y superiores

java jdbcA partir de la entrada anterior sobre CallableStatement, he estado jugueteando, con PostgreSQL 12. Y ¿cómo no? problemas

Resulta que usando la sintaxis especial de CallableStatement, llamada JDBC scape syntax, no me funcionaba la llamada a procedimientos desde Java. Es decir, esto

connection.prepareCall("{call insert_data(?,?,?)}")

no me funcionaba, daba error de que insert_data es un procedure y que hay que usar «call». Mientras que esta

connection.prepareCall("{? = call add(?,?)}")

si funcionaba sin problemas. Así que tras mucho darle vueltas y googlear, me encuentro que lo de que el driver Java de postgreSQL haga caso a este tipo de sintaxis o no, depende de una variable escapeSyntaxCallMode, que puede tener tres valores

public enum EscapeSyntaxCallMode {
    SELECT("select"),
    CALL_IF_NO_RETURN("callIfNoReturn"),
    CALL("call");

Por defecto y compatibilidad hacia atrás está en SELECT, que NO funciona para las llamadas a PROCEDURES con CallableStatement. Hay que cambiarlo para su correcto funcionamiento a callIfNoReturn.

Así que la URL de conexión desde Java a través del driver quedaría así

"jdbc:postgresql://localhost/chuidiang-examples?escapeSyntaxCallMode=callIfNoReturn"

o bien usando las properties de conexión.

Todo facilidades.

Publicado en java | Etiquetado , , | Deja un comentario

Statement, PreparedStatement y CallableStatement

java jdbcEn Java JDBC me entró la duda entre Statement, PreparedStatement y CallableStatement. Entre los dos primeros lo tenía claro, pero no tenía muy clara la diferencia entre los dos segundos. Asi que aquí va un resumen de los tres, ventajas e inconvenientes de cada uno y cuando deben usarse.

Statement es la base. Pones la sentencia SQL y la ejecutas. Tiene varias pegas:

  • Cada vez que ejecutas la sentencia, tiene que «compilarla», es decir, revisar la sintaxis que es correcta y ejecutarla. Por ello, no es eficiente si vas a ejecutar la misma sentencia SQL varias veces.
  • La cadena SQL se compone como un String normal. Si usas variables para componer la cadena, tienes que revisar el contenido de esas variables para evitar la SQL injection. Dicho de otra forma, si en tu SQL vas a insertar una columna tipo String con un valor que ha introducido un usuario a mano, tendras en tu código java algo como esto
    «INSERT INTO tabla (nombre) VALUES (‘ » + variable +» ‘)»
    bien así, bien con cualquier otro mecanismo de concatenación de cadenas. ¿Qué pasa si la variable contiene una comilla sencilla igual a la que se usa para delimitar los String en SQL. Pues sí, error al canto, la cadena se cierra antes de lo esperado y el resto de la sentencia SQL no tiene sentido
  • Con este tipo de composición con String de java, no se puede o es muy difícil meter bytes en una columna tipo BLOB o similar.

¿Cuando es útil entonces Statement?. Para sentencias sencillas que solo vamos a usar una vez. Ejemplo típico son la creación o update de las tablas cuando arrancamos nuestra aplicación o algún SELECT al inicio de la aplicación para verificar algo, como el número de versión de las tablas.

PreparedStatement hereda de Statement y le añade ciertas ventajas.

  • Compila el SQL que le pasamos. Así que si lo ejecutamos varias veces, es más eficiente.
  • La SQL se escribe con un String, pero poniendo ? en el lugar donde van las variables. Algo como
    «INSERT INTO tabla(nombre) VALUES (?)»
    no ponemos comillas simples en ningún caso, sea el tipo que sea la columna. Luego PreparedStatement tiene métodos para rellenar esos valores y se encarga él de «escapar» los posibles caracters extraños, por lo que no es posible la SQL injection.
  • Sí se pueden meter arrays de bytes o incluso «flujos» (Stream) de bytes, para no tener que tener todos los bytes todos cargados en memoria y pasarlos de golpe.

Así que PreparedStatement debe ser nuestra opción por defecto salvo quizás los casos que hemos comentado arriba en que Statement es útil. Y los casos que comentarmos a continuación para un CallableStatement.

CallableStatement hereda de PreparedStatement, por lo que tiene todas sus ventajas, pero añade una ventaja adicional

  • Tiene una sintaxis propia, no SQL, para la llamada a procedimientos y funciones de base de datos. Para que sepa que estamos usando esa sintaxis especial y no la específica del SQL de la base de datos concreta que estemos usando, debemos ponerlo entre llaves, así
    «{call un_procedimiento (?,?) }»
    «{? = call una_funcion (?,?,?}»
    por supuesto, con los parámetros que necesitemos puestos como interrogantes. Si no hay parámetros, no hace falta el paréntesis

Así que CallableStatement tiene todas las ventajas de PreparedStatement, pero además nos aisla de la sintaxis específica de nuestra base de datos para la llamada a procedimientos o funciones. Es adecuado por tanto para este tipo de llamadas.

Publicado en java | Etiquetado , | Deja un comentario

JDBC4 y Class.forName()

Solo una curiosidad con la que me he tropezado hace poco. Hay veces que las cosas se hacen inicialmente por necesidad, pero cuando la cosa deja de ser necesaria, se sigue haciendo por costumbre.

Tradicionalmente, cuando se quería establecer una conexión desde Java contra una base de datos, era necesario provocar que el driver de conexión a la base de datos se registrara de alguna forma en el sistema. Esto se hacía con una llamada a Class.forName()

Class.forName("com.mysql.jdbc.Driver");

y esto a día de hoy sigue viéndose en el código.

Pues bien, a partir de jdbc4 que está disponible ya desde java 6, hay un mecanismo alternativo, el de ServiceLoader. Con este mecanismo, un fichero dentro del jar con un nombre, ubicación y contenido concreto permite que al cargar el jar se registre el driver de base de datos (o cualquier otro servicio) de forma automática.

Pasando el tiempo, la mayoría de los jar con el driver de conexión con las bases de datos más conocidas ya implementan este mecanismo, por lo que en código no necesitamos hacer absolutamente nada para que el driver se registre. La llamada a Class.forName() ya es en la mayoría de los casos totalmente innecesaria.

Publicado en java, MySQL | Deja un comentario

Mis experiencias con el UX

No soy diseñador UX, pero si veo diseños en páginas web que uso habitualmente y también, como desarrollador, veo cómo quedan nuestras aplicaciones con los diseños UX. Cuento aquí mis experiencias con aplicaciones que teóricamente son «user friendly».

UX o User eXperience es la parte de diseñar la aplicación, web, móvil o escritorio, para que sea amigable para un usuario. No se trata de poner colores e iconos bonitos, sino de colocar los distintos botones, menús y elementos que componen la web o la aplicación en sitios que sean fácilmente accesibles para el usuario, que los encuentre sin problemas, que las operaciones más habituales estén más a la vista y requieran pocos clicks de ratón, que la aplicación sea intuitiva de usar, etc, etc.

Es algo que desde hace ya unos años está de moda y hay gente dedicada exclusivamente a esto en sus trabajos.

La idea por supuesta es buena, un buen diseño puede facilitar mucho la vida al usuario. Pero al final, lo que hay es gente detrás, que serán o no buenos en su trabajo y que además no es un trabajo fácil, porque hay usuarios de todo tipo y lo que para uno es evidente o amigable, para otro puede no serlo.

Y yo debo ser de estos últimos, porque lo que me encuentro por ahí para mí deja de ser amigable o intuitivo. Y pongo varios ejemplos.

El banco ING direct ha cambiado hace poco su interfaz de  usuario. Antes tenías un botón de «ahorro e inversión». Le dabas y te salían todos tus productos de ahorro e inversión juntos, en un listado, o en iconos, pero todos en la misma página. De ahí ibas al que querías. En dos clicks tenías accesible el fondo de inversión concreto, o el broker de bolsa, o la cuenta naranja que querías.

Ahora por aquello de ponerlo todo junto de primeras, te pones grupos de paneles (cuentas corrientes, ahorro e inversión y, por supuesto, paneles para lo que ellos les interesa, que pidas una hipoteca o un préstamo), pero pueden no caber todos tus productos dentro de esos paneles, así que hay que desplazarse, como se ve en la siguiente imagenHay más productos a la derecha. Desde móvil o tableta, arrastras con el dedo y vas desplazando. En el ordenador, haces click en el botón «Siguiente ->». Y con eso ves uno más. Si tienes 10 y quieres ver el último, pues 10 clicks. Aquí claramente ING ha empeorado su interface de usuario seguramente teniendo diseñadores UX que lo han pensado muy bien y bonito para móvil, donde no hay mucho sitio para mostrar todo pero tienes un dedo rápido que desplaza cosas. No han pensado mucho en la interface web cuando la ves en un PC normal.

Otro ejemplo es la aplicación del decodificador de TV de Vodafone. Desde que lo tengo, han modificado la interface de usuario dos o tres veces… y cada vez para peor. Más bonita, mas elaborada, pero menos útil.

Actualmente cuando enciendes el decodificador, en vez de ver la tele, ves un panel con un montón de cosas inútiles que siempre tienes que quitar. Esas cosas inútiles son sugerencias de cosas para ver, pero como no tienen ni idea de tus gustos, pues eso, cosas inútiles.

Y una vez que estas viendo un canal de televisión, por ejemplo, una película, si quieres ver la info de la película … tres clicks. Uno para abrir lo de la info, que no te muestra la info sino que te muestra lo que ellos creen que te interesa primero, como empezar a ver la película desde el principio, poner/quitar subtítulos, grabar, .. y un «más información». Segundo click para ver más info y ves lo que quieres, el resumen de la película. Que no se quita solo, al igual que no se quita el panel anterior. Y le das un tercer click, que tampoco te quita esa info, sino que te lleva nuevamente a un panel que te dice qué canal estás viendo ¿?. Afortunadamente, ese sí se quita solo.

En cuanto a las aplicaciones del curro que han diseñado con UX, veo siempre el mismo problema. Toda esta gente suele pensar mucho en web, en móviles, en tabletas y tienden a hacer dos cosas que sí son adecuadas para pantallas táctiles y para web

  • Para pantallas táctiles tienden a poner pocos botones y grandes, que se les pueda dar con el dedo.
  • Tanto para web como para móviles/tabletas tienden a hacer que se sucedan pantallas, vas rellenando datos y pasando a la siguiente pantalla.

Pero esto nos mata en aplicaciones de escritorio, en PC normal. En un PC sueles tener una pantalla grande que manejas con un ratón. No es necesario botones grandes ni tienes la limitación en tamaño de una pantalla de móvil/tableta.

Y tampoco es necesario andar pasando de una pantalla a otra, tienes hueco suficiente en general para hacerlo todo en la misma pantalla sin saturar la pantalla de botones chiquititos ni exceso de información.

El resultado es que lo que para un móvil o tableta puede ser más o menos adecuado, para una aplicación de escritorio en PC es bastante incómodo que requiere un exceso de clicks de ratón.

Publicado en varios | Etiquetado | 1 comentario

¿Merece la pena un Chromebook?


No hace mucho y por capricho me agencié un chromebook. Es un portátil «chiquitín» que lleva el sistema operativo ChromeOS, nada de windows o linux, sino uno propio de Google.

Suelen tener teclado al estilo portátil, pero la pantalla es táctil. Permite además darle la vuelta del todo a la pantalla sobre el teclado de forma que queda para usar como una tableta, con el teclado pegado a la parte de atrás.

¿Cual es mi experiencia?

Pues lo veo un poco limitado, no llega a portátil ni a tableta, se queda en tierra de nadie. Y el ChromeOS parece que está todavía un poco en pañales.

Por un lado, lo de dar la vuelta al teclado para uso como tableta no me convence. Esto de tener la tableta con un teclado «pegado» por detrás es un poco «raro» si no incómodo.

En ChromeOS tienes el Google Play de Android y teóricamente puedes descargarte las aplicaciones y usarlas. Mis primeros experimentos:

  • La app de Microsoft Office no está soportada. Tienes que bajarte por separado elas app de word, excel, etc. No es grave, pero que no soporte la primera app que se me ocurre probar no mola.
  • Google authenticator, tampoco. Curioso que una app de Google, en el Google Play no esté soportada en el sistema operativo de Google.
  • El navegador Brave que estoy probando estos días, funciona pero no sale el apartado de recompensas.
  • Juegos, no he probado, pero no he probado porque los juegos que juego con tableta/móvil, estilo Class Royale, no me parecen muy adecuados para jugarlos con teclado directamente o con teclado pegado detrás de la tableta.

Así que por aquí la experiencia no es buena, las app de Android puede no comportarse igual o simplemente no ser compatibles con ChromeOS.

La otra cosa que no me ha convencido es el tema de las barras de scroll en el navegador (Chrome). A veces aparecen por lo que puedes ir con el ratón y arrastrarlas. Otras veces no aparecen, pero si llevas el ratón encima aparecen y puedes arrastrarlas. Y otras veces no aparecen de ninguna manera, no te queda más remedio que llevar el dedo a la pantalla táctil y hacer el scroll a dedo. Me resulta incómodo.

Y otra que me ha molestado. En el teclado no hay una tecla para mantener las mayúsculas. Buscando por google, si encuentras cómo mantener las mayúsculas activadas, pero te preguntas ¿por qué tienen que hacer cosas raras con el teclado?. Si, es cierto, es google, el del buscador web, así que seguramente es más importante una tecla con lupa para buscar en el buscador que una de mantener mayúsculas.

Así que veo útil un Chromebook solo si quieres moverte bastante (viajar) y necesitas consultar cosas en internet y tienes que escribir con frecuencia (correos o documentos), por lo que necesitas un teclado decente. Tendrías que buscar un Chromebook que sea más barato que un portátil, porque si el precio es similar, seguramente le saques más partido al portátil.

Y por supuesto, si lo vas a coger pensando en una app de Google Play concreta, primero entérate si funciona bien.

Y si te decices a comprarlo por amazón, haciéndolo a través de este enlace me ayudas un poco 🙂

Publicado en compras | Etiquetado , | Deja un comentario

Navegador Brave

Logo de BraveAndo últimamente echando un ojo al mundo de las criptomonedas y me he encontrado, de rebote, con el navegador Brave.

Es un navegador basado en Chromium, navegador de código abierto liberado por google y en el que se basa Google Chrome y otro montón de navegadores.

Brave se centra principalmente en la privacidad, seguridad y experiencia de usuario, haciendo básicamente dos cosas

  • Bloquea todo tipo de anuncios intrusivos y molestos. Hay extensiones para Chrome y otros navegadores que bloquean anuncios, pero con Brave viene por defecto.
  • Bloquea cookies de terceros, de forma que nuestros datos no se andan cediendo por ahí.

Todo esto hace que la navegación sea mejor, al no tener que aguantar popups de anuncios y siendo más rápida la carga de páginas, tanto por el bloqueo de anuncios como de cookies de terceros.

Además, al basarse el Chromium, es compatible con todas las extensiones de Google Chrome y ofrece facilidades para importar favoritos y otros datos que tengamos en Google Chrome.

¿Y qué tiene que ver Brave con Criptomonedas?

Pues que es un proyecto que se ha financiado como se financian ahora muchas startups. Publican su idea de proyecto, crean su propia criptomoneda (el BAT o Basic Attention Token), la ponen a la venta y si convencen a la gente en general para que la compren, tienen su financiación.

Y en su idea de proyecto está hacer un navegador seguro y financiarse cobrando a los anunciantes, mostrando anuncios en su navegador Brave. Pero con unas diferencias importantes respecto al método tradicional de anuncios:

  • Tú decides si quieres o no ver anuncios. Para motivarte a que los veas, te pagan con su criptomoneda si permites que Brave te muestre anuncios. No mucho, pero sí algo.
  • Los anuncios no son intrusivos. En mi caso y de momento sale de vez en cuando una notificación de windows en la esquina inferior derecha de mi pantalla, o una notificación de android. De vez en cuando quiere decir que tú eliges, entre un anuncio a la hora y 10 anuncios a la hora
  • Si eres un publicador de contenido, puedes registrar tu sitio en Brave, permitiéndoles poner anuncios cuando se visualice tu página. Te pagarán entonces, también con su criptomoneda. No tengo muy claro si esta funcionalidad ya está en marcha o de momento sólo es una intención.
  • Y lo más importante, qué anuncios se te muestran se decide en función de las páginas que visitas, pero toda esa info de qué páginas visitas está en tu navegador, en tu PC y no sale a los servidores de nadie, preservando tu anonimato/confidencialidad.

En fin, un descubrimiento. Aunque solo sea por ver las páginas sin popups de anuncios molestos merece la pena. Lo de las criptomonedas es un pequeño plus que puede resultar intersante a algunos.

Publicado en Uncategorized | Etiquetado , | Deja un comentario

Desarrollador viendo como se testea el producto

Una idiotez que me ha gustado 🙂

Pongo el enlace, que no deja poner aquí el vídeo. Devs watching QA test the product.

 

 

Publicado en anécdotas | Etiquetado | 2 comentarios