lunes, 10 de agosto de 2026

¿En que estoy? ¿Por qué tan desaparecido?

Este blog fue un lugar donde documentar mi proceso como ingeniero en desarrollo de software, de junior a senior, los años han pasado y uno  crece, cambia, como persona, como profesional, físicamente, mentalmente.

Las adversidades me han hecho crecer, han moldeado mi personalidad. Y aunque no estamos donde deseamos estar si que estamos cada vez más cerca.

En algún momento lo tuve claro, no era libre, era un don nadie, sin una pizca de poder. Vulnerable antes los desafíos y vaivenes de la vida.

Fue necesario sentarme muchas mañanas y noches conmigo mismo, cuestionándome que es lo que quiero de mi, de la vida. Definir un plan, una estrategia, iterarlo y finalmente ponerlo en marcha.

No me veo trabajando por obligación mas allá de los 50 años, quiero poder elegir, elegir donde, cuando y con quien trabajar.

Pero conseguirlo es desafiante, hay que pagar el precio y uno muy alto.

En los últimos 5 años de mi vida he estado pasando de empleado a empresario, una nueva carrera pero que será la que finalmente me de la libertad que busco.

El mundo cambió, post plandemia aparecen retos, desafíos y oportunidades. Inflación e IA son los drivers que están moviendo al mundo y tenemos que buscar como adaptarnos.

sábado, 4 de enero de 2025

Java Sound API

En esta oportunidad vamos a revisar la API Java Sound de Java, una API que nos permitirá trabajar con archivos de audios y dispositivos de audios como micrófonos y audífonos.

Prefacio

   Para quienes está dirigido esta guía
   Qué es lo que esta guía describe
   Para más información

Capitulo 1: Introducción a la API Java Sound

   Objetivos de diseño

      Para quien es la API Java Sound
      ¿Como se relaciona la API Java Sound con otras interfaces?

   Paquetes
   Sampled Audio

      Qué es un Sampled Audio
      Configuraciones de Audio

   


Java Sound API Prefacio

A quien está dirigido está guía

Está guía está destinada para tres grupos de lectores:

  • Desarrollador de aplicaciones: Programadores de software que quieren escribir aplicaciones o applets que usen audio o MIDI. La mayoría de los lectores entran en esta categoría.
  • Proveedores de servicios: Desarrolladores de módulos de software que extienden las capacidades de una implementación de la API Java Sound. Por ejemplo, un fabricante puede proporcionar un nuevo mixer de audio o un sintetizador MIDI, o la habilidad de leer y escribir un nuevo formato de archivo. La API Java Sound está diseñada para permitir a los programas automáticamente acceder a todos los modulos "plug-in" disponibles en un sistema particular.
  • Implementadores de API: Desarrolladores creando una nueva implementación de la API Java Sound
Se asume que los lectores tienen un conocimiento básico de programación en el lenguaje Java. Tener familiaridad con audio y MIDI te será muy útil pero no es necesario.

¿Qué es lo que esta guía describe?
Esta es una descripción conceptual extensa 

viernes, 26 de julio de 2024

Operaciones basicas de Entrada y Salida en Java

Esta lección cubre las clases de la plataforma Java usadas para operaciones básicas de entrada y salida I/O. Primero nos enfocamos en flujos de entrada y salida I/O un concepto poderoso que simplifica las operaciones I/O. Esta lección también le da una mirada a la serialización, que permite a un programa escribir objetos enteros en un stream de salida y volver leerlos (de sream a objeto).

Continuamos revisando operaciones de lectura y escritura con archivos y operaciones del sistema de archivos, incluyendo el acceso random a los archivos.

La mayoría de las clases cubiertas en la sección de  Flujos de I/O se encuentran en el paquete java.io. La mayoría de las clases cubiertas en la sección Archivos I/O están en el paquete java.nio.file.


Flujos de I/O

Byte Streams manejo de datos binarios

Character Streams manejo de datos caracteres, automáticamente se realiza la traducción hacia y desde el conjunto de carácter local.

Buffered Streams

Scanning and Formatting

I/O from de command line

Data Streams

Object Streams

Archivos I/O

Que es un Path

La clase Path

Operaciones Path

Operaciones File

Verificando un Archivo o Directorio

Borrando un archivo o directorio

Copiando un Archivo o Directorio

Moviendo un Archivo o Directorio

Gestionando Metadata

Leyendo, Escribiendo y Creando Archivos

Random Acces Files

Creando y Leyendo Directorios

Enlaces símbolos

Recorriendo el árbol de archivos

Buscando Archivos

Observando un directorio para cambios

Otros metodos practicos

Codigo legado para Archivos I/O


Referencias:

 https://docs.oracle.com/javase/tutorial/essential/io/index.html


miércoles, 10 de julio de 2024

Trabajando con la clase Print Services y Attributes

En las lecciones anteriores hemos aprendido que el api Java 2D soporta impresión de paginas, proporciona diálogos para ver y seleccionar las impresoras disponibles, configurar paginas, numero de copias y otros atributos específicos de impresión. La clase Printing Services es otro componente clave de cualquier sistema de impresión.

La API Java Print Service (JPS) API extiende de Java 2D para ofrecer las siguientes funcionalidades:

  • La aplicación descubre impresoras que satisfacen sus necesidades consultando dinámicamente las capacidades de la impresora.
  • La aplicación puede extender la clase Attributes incluida en el API JPS
  • Aplicaciones de terceros pueden conectar sus propios servicios de impresión con la interfaz Service Provider Interface SPI, estos servicios propios pueden imprimir diferentes formatos incluidos Postscripts, PDF, y SVG.

La API Java Print Service consiste de 4 paquetes:

  • javax.print
  • javax.print.attribute
  • javax.print.event
  • javax.print.attribute
  • javax.print.attribute.standard
El paquete javax.print proporciona las principales clases e interfaces para la API Java Print Service API. Esto le permite a las aplicaciones cliente y servidor:
  • Descubrir y seleccionar servicios de impresión según sus capacidades.
  • Especificar el formato de los datos de impresión
  • Enviar trabajos de impresión al servicio que admita el tipo de documento que se va a imprimir.
Especificación del Tipo de Documento

La clase DocFlavor representa el formato del dato a imprimir, tales como JPEG o PostScript. La clase DocFlavor consiste de dos partes: un tipo MIME y un nombre de clase de representación.
Un tipo MIME describe el formato, y una clase de representación indica como el documento es entregado a la impresora o al flujo de salida. Una aplicación usa la clase DocFlavor y un conjunto de atributos para encontrar impresoras con capacidades especificadas por el conjunto de atributos.
Este código de ejemplo demuestra como obtener un arreglo de objetos StreamPrintServiceFactory que pueden retornar objetos StreamPrintService con capacidad de convertir una imagen GIF en un PostScript

Definición de Atributos
Los paquetes javax.print.attribute y javax.print.attribute.standard defined atributos de impresión que describen las capacidades de un servicio de impresión, especifican los requerimientos de un trabajo de impresión, y permiten seguir el progreso del trabajo de impresión.
Por ejemplo, si a ti te gustaría usar el formato de papel A4 e imprimir 3 copias de tu documento tendrías que crear un conjunto de los siguientes atributos implementando la interfaz PrintRequestAttributeSet


Entonces tu tienes que pasar el conjunto de atributos al trabajo de impresión mediante el método print junto con el DocFlavor

Buscando Servicios de Impresión
Una aplicación invoca el método estático de la clase abstracta PrintServiceLookup para localizar servicios de impresión que tengan la capacidad de satisfacer la petición de impresión. Por ejemplo, en orden de imprimir dos copias por ambos lados de un documento, la aplicación primero necesita encontrar impresoras que tengan la capacidad de imprimir ambos lados.

Usos comunes del API
En conclusión, el API Java Print Service ejecuta los siguientes pasos para procesar una petición de impresión.

  1. Elije un DocFlavor
  2. Crea un conjunto de atributos
  3. Localiza un servicio de impresión que pueda manejar la petición de impresión como fue especificada por el DocFlavor y el conjunto de atributo.
  4. Crea un objeto de la clase Doc encapsulando el DocFlavor y la data actual a imprimir.
  5. Obtener un objeto de la clase Print Job, representado por DocPrintJob, desde el servicio de impresión
  6. Llama al método print del objeto Print Job


martes, 2 de abril de 2024

Guia rapida de ANT para proyectos en Netbeans

 En esta entrada te dejaré las claves para que te manejes en el uso de ANT.

Apache Ant es una biblioteca Java y una herramienta de línea de comandos cuya misión es ejecutar los procesos descritos en archivos xml como target y task que dependen unos de otros. El principal uso conocido de Ant es la creación de aplicaciones Java. Ant proporciona una serie de tareas integradas que permiten compilar, ensamblar, probar y ejecutar aplicaciones Java. Ant también se puede utilizar de forma eficaz para crear aplicaciones que no sean Java, por ejemplo aplicaciones C o C++. De manera más general, Ant se puede utilizar para automatizar cualquier tipo de proceso que pueda describirse en términos de targets y tasks.

Ant está escrito en Java. Los usuarios de Ant pueden desarrollar sus propios "antlibs" que contienen tareas y tipos de Ant, y se les ofrece una gran cantidad de "antlibs" comerciales o de código abierto ya preparados.

Ant es extremadamente flexible y no impone convenciones de codificación ni diseños de directorios a los proyectos Java que lo adoptan como herramienta de compilación.
El proyecto Apache Ant es parte de Apache Software Foundation.


El archivo de tareas build.xml y build-impl.xml

Es un archivo xml donde se describen todas las tareas que quieres que ANT ejecute, tareas como compilar, crear archivos y directorios, copiar archivos, incluso ejecutar otros jars.

Este archivo XML debe cumplir con el DTD de ANT, aquí puedes encontrar la lista de cada una de las tareas predefinidas

https://ant.apache.org/manual/Tasks/

Si has creado tu proyecto con Netbeans en el directorio de tu proyecto vas a tener el archivo build.xml, si editas este archivo te vas a dar cuenta que el archivo está casi vacío pero hay una linea clave

<import file="nbproject/build-impl.xml"/>

Si entras al directorio nbproject vas a encontrar el archivo build-impl.xml, es un archivo de procesos para ANT, gracias a este archivo tu puedes hacer un clean and build y generar tu jar. No vamos a entrar en detalles, este archivo es muy complejo y extenso.

Para no tener que editar el archivo build-impl.xml Netbeans pone a tu disposición una lista de targets los cuales están vacíos y puedes usarlos para ejecutar tus tareas. A continuación te presento la lista disponible.


      -pre-init:                 called before initialization of project properties
      -post-init:                called after initialization of project properties
      -pre-compile:              called before javac compilation
      -post-compile:             called after javac compilation
      -pre-compile-single:       called before javac compilation of single file
      -post-compile-single:      called after javac compilation of single file
      -pre-compile-test:         called before javac compilation of JUnit tests
      -post-compile-test:        called after javac compilation of JUnit tests
      -pre-compile-test-single:  called before javac compilation of single JUnit test
      -post-compile-test-single: called after javac compilation of single JUunit test
      -pre-jar:                  called before JAR building
      -post-jar:                 called after JAR building
      -post-clean:               called after cleaning build products

Estos targets se ejecutan antes y después de los targets principales. Por ejemplo, existe un target llamado init, Netbeans te proporciona -pre-init y -pos-init y así para el resto de Targets.

Properties en ANT

Las propiedades son pares clave-valor donde Apache Ant intenta evaluar ${key} al valor en tiempo de ejecución.

Hay muchas tareas (task) que pueden establecer propiedades; la más común es la tarea property. Además, las propiedades se pueden definir mediante argumentos de línea de comando o mecanismos similares desde fuera de Ant.

Normalmente, los valores de las propiedades no se pueden cambiar: una vez que se establece una propiedad, la mayoría de las tareas no permitirán que se modifique su valor. En general, las propiedades son de alcance global, es decir, una vez que se han definido, están disponibles para cualquier tarea (task)  u objetivo (target) invocado posteriormente; no es posible establecer una propiedad en un proceso de construcción hijo creado mediante las tareas ant, antcall o subant y make. Sin embargo, está disponible para el proceso de compilación de llamadas.

Desde Ant 1.8.0, la tarea local se puede utilizar para crear propiedades con alcance local para un objetivo o un elemento secuencial como el de la tarea macrodef.

A continuación un ejemplo del uso de la tarea property

Definimos una propiedad con el nombre yguard.version y le asignamos el valor 4.1.0, definimos una propiedad lib.dir y le asignamos el resultado de la concatenación del valor de la propiedad ${basedir}/lib

Usamos la tarea echo para imprimir el valor de la propiedad basedir 




martes, 3 de octubre de 2023

Me retiro del desarrollo de Software

 Apreciable audiencia

Me retiro del desarrollo de Software, ahora me voy a dedicar a las Inversiones y Trading, si quieres seguirme puedes suscribirte a mi canal


https://www.youtube.com/@eltradermexicano

lunes, 19 de junio de 2023

Mapear XML a Objetos en Java

 En Java tenemos al menos dos FrameWorks para mapear objetos de XML a Java y viceversa. El primero es XML Beans y el segundo es Eclipse Modeling Framework (EMF). Aclaro que no soy muy fan de Eclipse y en esta entra no voy a entrar en detalles.



Mapear XML a Objetos usando EMF

Esta entrada no está muy detallada, no soy fan de Eclipse así que solo lo revisaremos de forma muy superficial.

Instalación de los plugins


Generando el Jar con Objetos


domingo, 18 de junio de 2023

Java RMI

En el sentido más amplio, "RMI" está vivo y bien: hay muchas aplicaciones en las que un proceso expone métodos para ser ejecutados por otro. La situación es ligeramente diferente cuando el término se usa para referirse al método patentado de RMI que está integrado en la JVM y ha existido desde los primeros días de Java. Este método de RMI utiliza un protocolo que es bastante específico de Java, no tiene soporte incorporado para propagar un contexto de transacción o un contexto de seguridad, y es complicado de enrutar a través de firewalls. Puede usar el mismo marco RMI en Java con protocolos como IIOP, que son independientes del idioma y admiten la propagación del contexto de seguridad y transacciones; pero todavía hay problemas con los firewalls.

La tecnología RMI de Java tradicional todavía se usa ampliamente para la administración y el monitoreo remotos, pero no veo que se use mucho a nivel de aplicación. Parece más popular en estos días exponer métodos como servicios web e invocarlos usando HTTP(S). Hay marcos para hacer esto en Java, y dichos servicios pueden hacerse independientes del idioma.

Este tutorial está diseñado y probado para Java 8, veremos de repaso algunos temas que ya están deprecados y que difícilmente podremos llevarlo a la practica.

Un resumen de las aplicaciones RMI

Las aplicaciones RMI a menudo se componen de dos programas, un programa servidor y un programa cliente. Un programa servidor crea objetos remotos, permite que puedan ser referenciados y espera para que otros programas clientes invoquen los métodos de estos objetos. Un programa cliente obtiene referencias remotas de uno o mas objetos que se encuentran en el servidor y entonces invoca los métodos de estos.

RMI proporciona el mecanismo por el cual el servidor y el cliente se comunican y pasan información de un lado a otro. Tal aplicación a veces se denomina aplicación de objetos distribuidos.

Los objetos de las aplicaciones distribuidas necesitan realizar lo siguiente:

  • Localizar objetos remotos. Las aplicaciones pueden usar varios mecanismos para obtener referencias de objetos remotos. Por ejemplo, una aplicación puede registrar objetos remotos con el registro RMI RMI's simple naming facility. Alternativamente, una aplicación puede pasar y retornar referencias de objetos remotos como parte de otras invocaciones remotas.
  • Comunicarse con objetos remotos. Detalles de la comunicación entre objetos remotos son manejados por RMI. Para el programador, la comunicación remota parece similar a una invocación regular de métodos Java.
  • Cargar definiciones de clases para los objetos que se pasan. Porque RMI habilita que os objetos se pasen de un lado a otro, proporciona mecanismos para cargar la definición de clase de un objeto así como también mecanismos para la transmisión de datos del objeto.


La siguiente ilustración representa una aplicación distribuida RMI que usa el registro RMI para obtener una referencia a un objeto remoto. El server invoca el nombre del objeto remoto registrado. El cliente busca el objeto remoto por el nombre con el que se registro en el servidor y luego ejecuta los metodos. La ilustración también muestra que el sistema RMI usa un servidor web para cargar las definiciones de clases, desde el servidor hacia el cliente y desde el cliente hacia el servidor, para los objetos cuando sean requeridos.


viernes, 17 de marzo de 2023

Como administrar tu lista de tareas TODO en Netbeans

 Es común que mientras estás codificando van surgiendo tareas que se derivan de la tarea principal pero que no son prioritarios en el momento. Para que no te olvides puedes poner comentarios con el prefijo //TODO

Si eres un usuario recurrente de NetBeans ya estás enterado que a partir de la versión 8 o 9, NetBeans paso a formar parte de la fundación Apache y con ello muchos cambios vinieron.

Como administrar tu lista de tareas en NetBeans 13

El prefijo no necesariamente tiene que ser //TODO ya que lo puedes configurar a tu gusto, para ello debes ir a Tools - Team - Pestaña Action Items
Ahí puedes agregar patrones para TODO FIXME PENDING

Para ver las lista de estas tareas o comentarios debes activar el panel, para ello ve a Windows - Action Items



viernes, 3 de febrero de 2023

Java Logging API

Java Util Logger o jdk14logging  el API de Java Logging, se encuentra en el paquete java.util.logging, facilita el servicio de mantenimiento de software permitiendo generar reportes de logs para analizar errores, rendimiento o comportamiento del software.

Estos archivos son analizados por usuarios finales, administradores de sistemas, ingenieros de soporte técnico, y equipos de desarrollo de software.

El API de Logging captura información tales como fallas de seguridad, errores de configuración, cuellos de botella en el rendimiento, y o errores en la aplicación o plataforma.

El paquete principal incluye soporte para entregar texto plano o en formato XML como salida hacia la memoria, flujos de salida, consolas, archivos y sockets. Es más, el API de Logging tiene la capacidad de interactuar con otros servicios de Logging que ya existan en el sistema operativo.

Temas

  • Vista general del Flujo de Control
  • Niveles del Log
  • Loggers
  • Metodos del Logging
  • Handlers
  • Formatters
  • El LogManager
  • Archivo de configuración
  • Configuración por defecto
  • Actualizaciones dinámicas de configuración
  • Métodos Nativos
  • XML DTD
  • Mensajes con ID's Unicos
  • Seguridad
  • Gestión de configuración
  • Empaquetado
  • Localización
  • Acceso remoto y serialización
  • Ejemplos de Java Logging
  • Apéndice A: DTD para la salida XMLFormatter


Vista General del Flujo de Control

Las aplicaciones pueden generar logs invocando los métodos de objetos de la clase Logger. Los objetos de la clase Logger están organizados en jerarquía según el paquete de la clase (Abuelo - Padre - Hijo, y así sucesivamente). Los objetos Logger de una capa inferior pueden heredar algunas características de sus padres.

Estos objetos Logger crean objetos LogRecord que son pasados a objetos Handler para ser publicados. Ambos objetos, Logger y Handler pueden usar objetos Level y opcionalmente objetos Filter para decidir si ellos están interesados en un objeto particular de la clase LogRecord. Cuando es necesario publicar externamente un objeto LogRecord, un objeto Handler puede opcionalmente usar un objeto Formatter para localizar y formatear el mensaje antes de publicarlo en un flujo I/O.



Cada objeto Logger realiza un seguimiento de un conjunto de objetos Handler. Por defecto todos los objetos Logger también pueden enviar sus salidas a los objetos Logger padres. Pero los objetos Logger también podrían ser configurados para ignorar objetos Handler que estén arriba en la jerarquía.

Algunos objetos Handler pueden directamente enviar la salida a otros objetos Handler. Por ejemplo, el objeto de la clase MemoryHandler mantiene un buffer interno de objetos LogRecord, y por medio de eventos gatilladores, publica estos objetos LogRecord en otros Handler. En tales casos, cualquier formateo lo realiza el último Handler en la cadena.


Niveles de Log Logging Levels

Cada mensaje del log tiene asociado un objeto Level para el log. El Level  (Nivel) ofrece una guía de cuan importante y urgente es el mensaje del Log. Los objetos Level de un log encapsulan un valor entero, los valores mas altos indican prioridades más altas.

java.util.logging.Level define 7 niveles de logging

  • SEVERE (el mas alto)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Hay otros dos niveles de logging, OFF que "apaga o ignora" todas las sentencias de logging y ALL que registra todas las sentencias de logging.

Te recomiendo probar todos los niveles de logging para que puedes comprender mejor su funcionamiento y prioridad.

Loggers

Como se indico anteriormente, un código cliente envía solicitudes de logs a objetos Logger. Cada objeto Logger realiza un seguimiento del nivel de registro que le interesa y descarta las solicitudes de registro que se encuentran por debajo de este nivel.

Los objetos Logger normalmente son entidades con nombres que utilizan nombres separados por puntos, como java.awt. Los nombres son jerárquicos (recuerda como las clases java se organizan en paquetes y directorios) y lo gestiona LogManager. Normalmente los nombres de estos Logger siguen el estándar de empaquetamiento de java, pero no es necesario que lo siga exactamente. Por ejemplo un Logger llamado java.awt podría manejar solicitudes de logging para clases que se encuentren en el paquete java.awt, pero también podría manejar solicitudes de logging para clases que se encuentren en sun.awt que soporten implementaciones de las abstracciones definidas en el paquete java.awt

Además de poder asignarle nombres a los objetos Logger, también es posible crear objetos Logger anónimos que no aparecen en el nombre de espacios compartidos.

Consulte la sección de seguridad.

Los objetos Logger mantienen un seguimiento de sus objetos Logger padres dentro del espacio de nombres. El padre de un Logger es su ancestro existente más cercano en el espacio de nombres. El objeto Logger raiz llamado "" no tiene padre. Todos los objetos Logger anonimos tienen como padre al objeto Logger raiz. Los objetos Logger pueden heredar varios atributos de sus padres en el espacio de nombres. En particular, un registrador puede heredar:

  • El nivel del logging o Level Logging: Si el nivel de un logger se establece como null, entonces el logger usará un nivel effectivo que se obtendrá subiendo por el árbol de padres y usara el primer nivel no null.
  • Handlers: De forma predeterminada un Logger registrará cualquier mensaje de salida en los handlers de sus padres y así recursivamente por el arbol.
  • El nombre del Conjunto de Recursos Resource Bundle: Si un Logger tiene un nombre de Resource Bundle en null, entonces heredará el nombre de Resource Bundle de su padre y así recursivamente mientras sea null.

Handlers o Manejadores

Java SE proporciona las siguientes clases Handler:

  • StreamHandler: Un simple handler para escribir registros formateados hacia un OutputStream.
  • ConsonleHandler: Un simple handler para escribir registros formateados hacia un System.err.
  • FileHandler: Un hanlder que escribe registros formateados en un solo archivo o en un conjunto de archivos logs que van rotando. Ya explicaremos más adelante a que nos referimos cuando decimos que van rotando.
  • SocketHandler: Un handler que escribe registros formateados en puertos TCP/IP remotos.
  • MemoryHandler:Un handler que almacena los registros en la memoria.


El archivo properties de configuración

Logging property Description
handlers A comma-delimited list of handler class names that are added to the root Logger. The default handlers are java.util.logging.FileHandler and java.util.logging.ConsoleHandler (with a default level of INFO).
java.util.logging.FileHandler.level Sets the log level for all FileHandler instances. The default log level is FINE.
java.util.logging.FileHandler.pattern The log file name pattern. The default is %t/edpLog%u%g.log which means that the file is named edpLog%u%g.log where:
  • %u is a unique number to resolve conflicts between simultaneous Java processes.
  • %g is the generation number to distinguish between rotating logs.
%t specifies the system temporary directory as the location in which the log files are stored.
java.util.logging.FileHandler.limit The maximum size of the file, in bytes. If this is 0, there is no limit. The default is 1000000 (which is 1 MB). Logs larger than 1MB roll over to the next log file.
java.util.logging.FileHandler.count The number of log files to use in the log file rotation. The default is 10000 (which produces a maximum of 10,000 log files).
java.util.logging.FileHandler.formatter The class name of the Formatter to use for the FileHandler instances.
java.util.logging.ConsoleHandler.level Sets the default log level for all ConsoleHandler instances.
java.util.logging.FileHandler.append Specifies whether the FileHandler should append onto any existing files (defaults to false).
java.util.logging.ConsoleHandler.formatter The class name of the Formatter to use for the ConsoleHandler instances.
java.util.logging.SimpleFormatter.format Specifies the format to use for log messages. For details on the format syntax, see: http://docs.oracle.com/javase/7/docs/api/java/util/logging/SimpleFormatter.html

com.oracle.eid = FINE

com.oracle.endeca = FINE

com.oracle.endeca.pdi = INFO

Sets the default logging level for the Big Data Discovery loggers.

org.eclipse.jetty = WARNING org.apache.spark.repl.

SparkIMain$exprTyper = INFO org.apache.spark.repl.SparkILoop

$SparkILoopInterpreter = INFO

Sets the default logging level for the Spark and Jetty loggers.

Referencia

https://jenkov.com/tutorials/java-logging/index.html

https://sematext.com/blog/java-logging/

https://docs.oracle.com/javase/7/docs/api/java/util/logging/SimpleFormatter.html

https://docs.oracle.com/cd/E57471_01/bigData.100/data_processing_bdd/src/rdp_logging_config.html

https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example

https://commons.apache.org/proper/commons-logging/guide.html#Introduction

https://docs.oracle.com/en/java/javase/22/core/java-logging-overview.html

jueves, 7 de abril de 2022

Cantinas en la CDMX

Según yo las cantinas habían desaparecido pero no, aun siguen en pie. Aquí una lista, algunas de estas cantinas tienen ficheras.

Restaurante Bar Mr Lee

Cantina el Tio Pepe

Salon Bach

Dos Naciones, Bolivar 58

San Luis Club

miércoles, 16 de marzo de 2022

Introducción a jdk14logger

Jdk14Logger es una implementación de la interfaz org.apache.commons.logging.Log, al mismo tiempo es un Wrapper del framework java.util.logging que se introdujeron en la versión Merlin (JDK 1.4).


Handlers

En palabras simples un handler es finalmente una clase responsable de escribir los logs en una salida como un archivo o la consola. Puedes tener varios handlers para una aplicación. Los dos handlers mas usados son:

  • java.util.logging.FileHandler Escribe los logs en un archivo
  • java.util.logging.ConsoleHandler Escribe los logs en la consola
Los handlers se configuran en el archivo de configuración que explicaremos más adelante, si no defines un archivo de configuración por defecto existirá el handler java.util.logging.ConsoleHandler, todos los logs se escribirán en la consola.

Algunas de las propiedades de los handlers son:

  • java.util.logging.FileHandler.level=INFO
  • java.util.logging.FileHandler.limit=5000000
  • java.util.logging.FileHandler.count=10
  • java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
  • java.util.logging.FileHandler.pattern=tes_log
  • java.util.logging.FileHandler.append=false

Loggers

Son los objetos loggers, debes tener cuidado al crear una instancia, te recomiendo crearlo de la siguiente manera

private static final Logger logger = Logger.getLogger(Database.class.getCanonicalName());

Los loggers quedarán organizados de forma jerárquica según los paquetes en donde se encuentren 

Levels

java.util.logging.Level define diferente niveles de logging. Hay 7 niveles de logging en Java

  • SEVERE (el mas alto)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Hay otros dos niveles de logging, OFF que "apaga o ignora" todas las sentencias de logging y ALL que registra todas las sentencias de logging.

Te recomiendo probar todos los niveles de logging para que puedes comprender mejor su funcionamiento y prioridad.


Jerarquía de Levels

Los Levels son muy flexible y debes tener claro como es la Jerarquía

  • .level Es el level global y tiene la jerarquía más alta
  • handler.level Cada handler puede tener un level propio, este no debe ser más alto que el global. Por ejemplo si en global tienes el level INFO entonces el handler puede tener los levels INFO, WARNING Y SEVERE
  • logger.level Cada Logger puede tener un level propio, este no debe ser más alto que el level del handler

Te dejo un ejemplo de un archivo de configuración


Referencia

https://sematext.com/blog/java-logging/#toc-javautillogging-2

https://medium.com/el-acordeon-del-programador/logs-en-java-con-java-util-logging-d344ae2ba7bc

miércoles, 2 de febrero de 2022

Como establecer el puerto de una impresora de recibos

Acabo de comprar una impresora de recibos, la 3nStart TP08 para el punto de venta OpenbravoPOS. Lo he configurado siguiendo la guía ¿Cómo configurar la impresora 3nStart en OpenbravoPOS?, sin embargo, al imprimir Windows me muestra el error "Ocurrió un error al imprimir"

Solución

Descripción general

Este artículo proporciona la siguiente información: 

  • Eliminación de un puerto existente que no funciona.
  • Creación de un nuevo Puerto mejorado de Lexmark a través de un Puerto mejorado de Lexmark o a través de un puerto TCP/IP estándar.
  • Enlaces a artículos relacionados con información para diagnosticar los errores "Sin comunicación” o “No se pudo imprimir".

 

 

Antes de empezar

No debería intentar volver a crear el puerto de la impresora de red hasta haber verificado que la impresora se está comunicando correctamente en la red.

Es posible comprobar esta situación mediante: 
  • Una comprobación de estado mediante el comando Ping. Para ello sera necesario obtener la dirección IP de la impresora mediante la impresión de la página de los valores de red de la impresora.
  • Verifique que el Estado de la impresora aparece como Conectado en la página de los valores de red. 
  • Verifique el acceso al servidor web integrado introduciendo la dirección IP de la impresora en el campo de dirección del navegador web, por ej. http://10.10.10.10.

 

Procedimiento:  Eliminación de un puerto existente


PasoAcción
  1
Abra la carpeta Impresoras o Impresoras y faxes para localizar el icono de la impresora. 
Para efectuar esta acción:
  • En Windows XP, haga clic en Incio > Valores > Impresoras y faxes o en Inicio > Panel de control > Impresoras y faxes.
  • En Windows Vista y Windows 7 haga clic en Inicio > Panel de control > Hardware y sonidos > Impresoras.
  • En Windows 8:
Interfaz de usuario modernaEscritorio
  1. Desde la página de inicio, expanda hacia arriba desde la parte inferior de la pantalla o coloque el cursor en el perímetro inferior de la pantalla y haga clic con el botón derecho del ratón.
  2. Haga clic en Todas las aplicaciones.
  3. Haga clic o pulse Panel de control y, a continuación, haga clic en Ver dispositivos e impresoras en Hardware y sonido. (Vista por categorías)
  1. Haga clic con el botón derecho del ratón sobre la parte inferior izquierda para que aparezcan los accesos directos de usuario avanzado.
  2. Haga clic o toque el Panel de control y, a continuación, Ver dispositivos e impresora.


 

  2Con el botón derecho del ratón, haga clic sobre la imagen de la impresora  y, a continuación, seleccione Propiedades en el menú desplegable.
  3Haga clic en la pestaña Puertos.
  4
IMPORTANTE: antes de eliminar el puerto, asegúrese de que no se encuentra activo.  
Si no puede deshacer la selección del puerto aparecerá el mensaje No se puede eliminar un puerto seleccionado.
Imagen: 
  
Para deshacer la selección de un puerto:

  1. Desplácese hasta la parte superior del listado de puertos de la impresora.
     
  2. Coloque una marca de verificación junto a cualquiera de los diferentes puertos alternativos tales como LPT1, USB001, LPT2, Archivo, etc.
     
  3. Haga clic en Aplicar. 

IMPORTANTE: si en el momento de la desinstalación tiene instalado otros controladores en el mismo puerto, deberá repetir el procedimiento de deshacer la selección para cada uno de los controladores antes de que se pueda deshacer la selección del puerto.
  5Vuelva al puerto que desea eliminar y coloque una marca de verificación a su lado.
  6Haga clic en Eliminar puerto.
  7Haga clic en Sí cuando aparezca el mensaje de confirmación para terminar el proceso. Haga clic en No si ya no desea realizar la acción o si se ha dado cuenta de que el problema de impresión procede de otra fuente.   
  8A continuación, efectúe la creación de un nuevo puerto, tal y como se especifica más abajo, o seleccione un puerto distinto y haga clic en Aceptar.

Haga clic aquí para ver una imagen ampliada de los pasos.

 

Procedimiento: Creación de un nuevo puerto


Antes de empezar
  • Es aconsejable imprimir una página de los valores de red de la impresora para determinar la dirección IP o nombre de equipo de la impresora (host). 
    Nota: el nombre del equipo (host) es identificado por la primera parte del nombre del dominio totalmente cualificado, por ejemplo: gregor.dhcp.hello.com 
  • El siguiente ejemplo utiliza Software de comunicación mejorado de Lexmark, el cuál sirve para instalar el puerto TCP/IP mejorado de Lexmark. El citado software se puede seleccionar durante la instalación de controladores del software original en el ordenador. 
  • Es posible crear un puerto mediante un puerto TCP/IP estándar de Microsoft, pero se perderán algunas funciones de comunicación bidireccional. También puede perder ciertas mejoras como la de Mensajería de estado de Lexmark, que sirve para identificar y ayudar en la resolución de muchos de los problemas más comunes de la impresora.  

PasoAcción
  1
Abra la carpeta Impresoras o Impresoras y faxes para localizar el icono de la impresora. 
Para efectuar esta acción:
  • En Windows XP, haga clic en Incio > Valores > Impresoras y faxes o en Inicio > Panel de control > Impresoras y faxes. 
  • En Windows Vista haga clic en Inicio > Panel de control > Hardware y sonidos > Impresoras.
  • sdf

Interfaz de usuario modernaEscritorio
  1. Desde la página de inicio, expanda hacia arriba desde la parte inferior de la pantalla o coloque el cursor en el perímetro inferior de la pantalla y haga clic con el botón derecho del ratón.
  2. Haga clic en Todas las aplicaciones.
  3. Haga clic o pulse Panel de control y, a continuación, haga clic en Ver dispositivos e impresoras en Hardware y sonido. (Vista por categorías)
  1. Haga clic con el botón derecho del ratón sobre la parte inferior izquierda para que aparezcan los accesos directos de usuario avanzado.
  2. Haga clic o toque el Panel de control y, a continuación, Ver dispositivos e impresora.
 
  2Con el botón derecho del ratón, haga clic sobre la imagen de la impresora  y, a continuación, seleccione Propiedades en el menú desplegable.
  3Haga clic en la pestaña Puertos.
  4
Haga clic en Añadir puerto.  
  5En Tipos de puerto disponibles, seleccione puerto TCP/IP mejorado de Lexmark y, a continuación, haga clic en Nuevo puerto. 
  6Introduzca el Nombre de puerto que mejor identifique a la impresora, como su ubicación, nombre del propietario, nombre de la organización o cualquier otro tipo de identificador. Asegúrese de que el nombre del puerto no sobrepasa los 14 caracteres y evite el uso de caracteres especiales o espacios.   
  7
En Introduzca una única dirección IP o nombre de equipo, escriba la dirección IP de la impresora o su nombre de equipo tal y como aparece en la página de valores de red.
Solución alternativa: si la dirección IP de la impresora aparece en Elegir un dispositivo de la lista, también sería posible realizar la selección mediante este método. 
Requisitos del Nombre de equipo: La DNS debe estar activa en la red y deberá comprobar que es posible acceder al nombre de equipo mediante un comando ping.    
  8Haga clic en Aceptar y verá como aparece el indicador de espera de Windows durante la creación del puerto.
  9Deberá volver a aparecer la ventana Tipos de puertos disponibles si la creación de puerto se ha realizado correctamente. Haga clic en Cerrar.
  10Importante: compruebe que el puerto que acaba de crearse tiene una marca de verificación junto a su nombre, y haga clic en Aplicar.
  11Opcional: Haga clic en la pestaña General y, a continuación, haga clic en Imprimir página de prueba para confirmar la correcta comunicación con la impresora.    

Haga clic aquí para ver una imagen ampliada de los pasos.
Ruta al TCP/IP estándar: Seleccione puerto TCP/IP estándar en el paso 5 > Nuevo Puerto > Asistente...Agregar > Siguiente > Introduzca el Nombre de impresora (nombre de equipo) o dirección IP y el nombre de puerto > Siguiente > Terminar. 

martes, 25 de enero de 2022

Cómo leer la ayuda de sintaxis de comandos

Muchas aplicaciones para el desarrollo de software no cuentan con una interfaz grafica y deben ser ejecutados des la línea de comandos o Símbolo de Sistema en Windows.

Ejemplo de estas aplicaciones son Maven, javac, ANT, Git, etc,.


Estas aplicaciones cuentan con una ayuda el cual se puede imprimir en el Simbolo de Sistema con las opciones --help o -h


Comandos del sistema

La mayoría de los comandos del sistema pueden mostrar una pantalla de ayuda de comandos ingresando la palabra clave del comando del sistema seguida de una opción de ayuda. Muchos comandos del sistema usan una opción de ayuda común, mientras que otros comandos del sistema pueden usar opciones de ayuda diferentes y/o adicionales. Para los primeros intentos, sin tener que buscar todavía la opción de ayuda olvidada de un comando, pruebe las siguientes opciones más comunes que probablemente resulten en la invocación exitosa de la pantalla de ayuda del comando:

Opciones de ayuda

-h

-?

-ayuda


Convenciones de sintaxis de la pantalla de ayuda

[ ] Encierra parámetros opcionales, se ingresan sin los caracteres []


{ } Incluye parámetros obligatorios, se ingresan sin los caracteres {}


  | Separa dos o más elementos, de los cuales solo se puede elegir uno


... Indica un parámetro repetible


( ) Delimitador de parámetro repetible (no siempre se usa)


Las PALABRAS CLAVE del comando aparecen en mayúsculas


variables, que requieren que usted determine e ingrese la entrada apropiada, aparecen en mingit úsculas


-D nombre=valor Permite definir una variable para el sistema. Estás variables pueden estar predefinidas. Por ejemplo en java: -Dfile.encoding=UTF8