Mostrando las entradas con la etiqueta Desarrollo. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Desarrollo. Mostrar todas las entradas

Cómo manejar el error en tiempo de ejecución UnsatisfiedLinkError en Java

 

Introducción: Uso de bibliotecas nativas en Java

Una librería nativa es una librería que contiene código compilado para una arquitectura (nativa) específica. Hay ciertos escenarios, como las integraciones hardware-software y las optimizaciones de procesos, en los que el uso de bibliotecas escritas para diferentes plataformas puede ser muy útil o incluso necesario. Para ello, Java ofrece la Interfaz Nativa Java (JNI), que permite al código Java que se ejecuta dentro de una Máquina Virtual Java (JVM) interoperar con aplicaciones y bibliotecas escritas en otros lenguajes de programación, como C, C++ y ensamblador. La JNI permite al código Java llamar y ser llamado por aplicaciones y bibliotecas nativas escritas en otros lenguajes y permite a los programadores escribir métodos nativos para manejar situaciones en las que una aplicación no puede escribirse completamente en Java.

Los formatos habituales de las bibliotecas nativas son los archivos .dll en Windows, .so en Linux y .dylib en plataformas macOS. El lenguaje convencional para cargar estas bibliotecas en Java se presenta en el siguiente ejemplo de código.

package rollbar;

public class ClassWithNativeMethod {

    static {
    System.loadLibrary("someLibFile");
    }

    native void someNativeMethod(String arg);
    /*...*/
}

Java carga las bibliotecas nativas en tiempo de ejecución invocando el método System.load() o System.loadLibrary(). La principal diferencia entre ambos es que el último no requiere que se especifique la ruta absoluta y la extensión de archivo de la biblioteca, sino que se basa en la propiedad del sistema java.library.path. Para acceder a los métodos nativos de las bibliotecas cargadas, se utilizan stubs de métodos declarados con la palabra clave native.

Error UnsatisfiedLinkError: ¿Qué es y cuándo se produce?

Si un programa Java está utilizando una librería nativa pero es incapaz de encontrarla en tiempo de ejecución por alguna razón, lanza el error en tiempo de ejecución java.lang.UnsatisfiedLinkError. Más concretamente, este error se lanza siempre que la JVM es incapaz de encontrar una definición apropiada en lenguaje nativo de un método declarado nativo, mientras intenta resolver las bibliotecas nativas en tiempo de ejecución [2]. El error UnsatisfiedLinkError es una subclase de la clase java.lang.LinkageError lo que significa que este error es capturado al inicio del programa, durante el proceso de carga y enlace de clases de la JVM.

Algunas situaciones habituales en las que se produce este error incluyen una referencia a las bibliotecas ocijdbc10.dll y ocijdbc11.dll al intentar conectarse a una base de datos Oracle 10g u 11g con el controlador OCI JDBC [3], así como la dependencia de la biblioteca lwjgl.dll utilizada en el desarrollo de juegos y aplicaciones Java que dependen de algunas bibliotecas C/C++ heredadas.

Update the PATH environment variable

Cómo solucionar el error UnsatisfiedLinkError

Para averiguar el culpable exacto y solucionar el error UnsatisfiedLinkError, hay que tener en cuenta un par de cosas:

  • Asegúrese de que el nombre de la biblioteca y / o la ruta se especifican correctamente.
  • Llame siempre a System.load() con una ruta absoluta como argumento.
  • Asegúrese de que la extensión de la biblioteca está incluida en la llamada a System.load().
  • Compruebe que la propiedad java.library.path contiene la ubicación de la biblioteca.
  • Compruebe que la variable de entorno PATH contiene la ruta a la biblioteca.
  • Ejecute el programa Java desde un terminal con el siguiente comando: java -Djava.library.path=«<LIBRARY_FILE_PATH>» -jar <JAR_FILE_NAME.jar>

Una cosa importante a tener en cuenta es que System.loadLibrary() resuelve los nombres de archivos de biblioteca de una manera dependiente de la plataforma, por ejemplo, el fragmento de código en el ejemplo en la Introducción esperaría un archivo llamado someLibFile.dll en Windows, someLibFile.so en Linux, etc.

Además, el método System.loadLibrary() busca primero en las rutas especificadas por la propiedad java.library.path, y luego por defecto en la variable de entorno PATH.

Ejemplo de Error UnsatisfiedLinkError

El código siguiente es un ejemplo de intento de cargar una biblioteca nativa llamada libraryFile.dll con el método System.loadLibrary() en una plataforma Windows OS. La ejecución de este código arroja el error en tiempo de ejecución UnsatisfiedLinkError con un mensaje que dice «no libraryFile in java.library.path» sugiriendo que no se pudo encontrar la ruta a la biblioteca .dll.

package rollbar;

public class JNIExample {

 static {
   System.loadLibrary("libraryFile");
 }

 native void libraryMethod(String arg);

 public static void main(String... args) {
   final JNIExample jniExample = new JNIExample();
   jniExample.libraryMethod("Hello");
 }
}
Exception in thread "main" java.lang.UnsatisfiedLinkError: 
no libraryFile in java.library.path: 
C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;
C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;
C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files\MySQL\MySQL Utilities 1.6\;
C:\Program Files\Git\cmd;C:\Program Files (x86)\PuTTY\;
C:\WINDOWS\System32\OpenSSH\;...
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2447)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:809)
    at java.base/java.lang.System.loadLibrary(System.java:1893)
    at rollbar.JNIExample.<clinit>(JNIExample.java:6) 
Hay un par de enfoques para solucionar este error.

Enfoque #1: Actualizar la variable de entorno PATH

Uno es asegurarse de que la variable de entorno PATH contiene la ruta al archivo libraryFile.dll. En Windows, esto se puede hacer navegando a Panel de control → Propiedades del sistema → Avanzadas → Variables de entorno, encontrando la variable PATH (sin distinguir mayúsculas de minúsculas) en Variables del sistema, y editando su valor para incluir la ruta a la biblioteca .dll en cuestión. Para obtener instrucciones sobre cómo hacer esto en diferentes sistemas operativos, consulte.

Método 2: Comprobación de la propiedad java.library.path

Otro método consiste en comprobar si la propiedad del sistema java.library.path está establecida y si contiene la ruta a la biblioteca. Esto se puede hacer llamando a System.getProperty(«java.library.path») y verificando el contenido de la propiedad, como se muestra en el siguiente código.

package rollbar;

public class JNIExample {

 static {
   var path = System.getProperty("java.library.path");

   if (path == null) {
     throw new RuntimeException("Path isn't set.");
   }

   var paths = java.util.List.of(path.split(";"));
   //paths.forEach(System.out::println);

   if (!paths.contains("C:/Users/Rollbar/lib")) {
     throw new RuntimeException("Path to library is missing.");
   }

   System.loadLibrary("libraryFile");
 }

 native void libraryMethod(String arg);

 public static void main(String... args) {
   final JNIExample jniExample = new JNIExample();
   jniExample.libraryMethod("Hello");
 }
}
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Path to library is missing.
    at rollbar.JNIExample.<clinit>(JNIExample.java:16)

Técnicamente, la propiedad java.library.path puede ser actualizada llamando a System.setProperty(«java.library.path», «./lib»), pero como las propiedades del sistema son cargadas por la JVM antes de la fase de carga de la clase, esto no tendrá efecto en la llamada System.loadLibrary(«libraryFile») que intenta cargar la biblioteca en el ejemplo anterior. Por lo tanto, la mejor manera de resolver el problema es seguir los pasos descritos en el enfoque anterior.

Método #3: Sobreescribiendo la propiedad java.library.path

Como complemento al enfoque anterior, la única forma efectiva de establecer explícitamente la propiedad java.library.path es ejecutando el programa Java con el argumento de línea de comandos -Dproperty=value, como se muestra a continuación:

java -Djava.library.path=«C:\Users\Rollbar\lib» -jar JNIEjemplo

Y puesto que esto anularía la propiedad system si ya está presente, cualquier otra librería requerida por el programa para ejecutarse también debería incluirse aquí.

Método #4: Usar System.load() en lugar de System.loadLibrary()

Por último, sustituir System.loadLibrary() por una llamada a System.load() que tome la ruta completa de la biblioteca como argumento es una solución que evita la búsqueda en java.library.path y soluciona el problema independientemente de cuál fuera la causa inicial del error UnsatisfiedLinkError.

package rollbar;

public class JNIExample {

 static {
   System.load("C:/Users/Rollbar/lib/libraryFile.dll");
 }

 native void libraryMethod(String arg);

 public static void main(String... args) {
   final JNIExample jniExample = new JNIExample();
   jniExample.libraryMethod("Hello");
   System.out.println("Library method was executed successfully.");
 }
}
Library method was executed successfully.

Sin embargo, no siempre es deseable codificar la ruta a la biblioteca, por lo que en esos casos es preferible recurrir a otros métodos.

Resumen

El uso de librerías nativas compiladas para diferentes plataformas es una práctica común en Java, especialmente cuando se trabaja con sistemas grandes y de características o rendimiento críticos. El marco de trabajo JNI permite a Java hacer esto actuando como puente entre el código Java y las bibliotecas nativas escritas en otros lenguajes. Uno de los problemas con los que se encuentran los programadores es la imposibilidad de cargar correctamente estas bibliotecas nativas en su código Java, momento en el que la JVM desencadena el error en tiempo de ejecución UnsatisfiedLinkError. Este artículo proporciona una visión de los orígenes de este error y explica los enfoques pertinentes para tratar con él.

Seguimiento, análisis y gestión de errores con Rollbar

Gestionar errores y excepciones en el código es todo un reto. Puede hacer que el despliegue de código de producción sea una experiencia desconcertante. Ser capaz de rastrear, analizar y gestionar errores en tiempo real puede ayudarle a proceder con más confianza. Rollbar automatiza la supervisión y clasificación de errores, lo que hace que corregir errores de Java sea más fácil que nunca. Inscríbase hoy mismo

Referencias

[1] Oracle, 2021. Java Native Interface Specification Contents, Introduction. Oracle and/or its affiliates. [Online]. Available: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/intro.html. [Accessed Jan. 11, 2022]

[2] Oracle, 2021. UnsatisfiedLinkError (Java SE 17 & JDK 17). Oracle and/or its affiliates. [Online]. Available: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/UnsatisfiedLinkError.html. [Accessed Jan. 11, 2022]

[3] User 3194339, 2016. UnsatisfiedLinkError: no ocijdbc11 in java.library.path. Oracle and/or its affiliates. [Online]. Available: https://community.oracle.com/tech/developers/discussion/3907068/unsatisfiedlinkerror-no-ocijdbc11-in-java-library-path. [Accessed Jan. 11, 2022]

[4] User GustavXIII, 2012. UnsatisfiedLinkError: no lwjgl in java.library.path. JVM Gaming. [Online]. Available: https://jvm-gaming.org/t/unsatisfiedlinkerror-no-lwjgl-in-java-library-path/37908. [Accessed Jan. 11, 2022]

[5] Oracle, 2021. How do I set or change the PATH system variable?. Oracle and/or its affiliates. [Online]. Available: https://www.java.com/en/download/help/path.html. [Accessed Jan. 11, 2022]

Artículo traducido para el blog de n4p5t3r

Orginal: https://rollbar.com/blog/java-unsatisfiedlinkerror-runtime-error/#

 

Deno: El futuro del desarrollo JavaScript con mayor seguridad y simplicidad

 

En los últimos años, el ecosistema de JavaScript ha crecido enormemente, pero también ha enfrentado desafíos, especialmente en términos de seguridad y manejo de dependencias. Para abordar estos problemas, Ryan Dahl, el creador original de Node.js, introdujo Deno, un nuevo runtime para JavaScript y TypeScript que promete mejorar tanto la experiencia de desarrollo como los aspectos de ciberseguridad.

¿Qué es Deno y quién lo creó?

undefined

Deno es un runtime para ejecutar código JavaScript y TypeScript que fue lanzado en mayo de 2020. Fue creado por Ryan Dahl, el mismo ingeniero detrás de Node.js, quien reconoció varias limitaciones y problemas en su creación original. En una charla de 2018, Dahl enumeró algunas de las principales preocupaciones que tuvo con Node.js, lo que lo motivó a crear Deno como una versión más moderna y segura de un runtime de JavaScript.

Las principales críticas que Dahl hizo sobre Node.js fueron la necesidad de un administrador de paquetes externo (npm), la inseguridad por defecto al ejecutar código y la complejidad del sistema de módulos. Con Deno, buscó solucionar estos problemas ofreciendo un entorno más simple y seguro para desarrollar aplicaciones con JavaScript y TypeScript.

Principales Bondades de Deno

Deno se distingue de otros runtimes como Node.js por varias características clave que abordan directamente las preocupaciones en torno a la seguridad y el desarrollo simplificado:

  1. Seguridad por Defecto: A diferencia de Node.js, donde el acceso a archivos, redes o entornos es permitido por defecto, en Deno todo está bloqueado por defecto. Esto significa que el desarrollador tiene que otorgar explícitamente permisos al programa para acceder a recursos como el sistema de archivos o la red. Este enfoque es una mejora significativa en términos de ciberseguridad, ya que reduce el riesgo de vulnerabilidades y ataques por defecto.
  2. Soporte Nativo para TypeScript: Deno integra soporte nativo para TypeScript sin necesidad de configuraciones adicionales ni transpiladores externos. Esto no solo facilita la codificación para aquellos que prefieren TypeScript, sino que también asegura un desarrollo con tipado estático, lo que ayuda a prevenir errores en tiempo de compilación.
  3. Sistema de Módulos Basado en URLs: A diferencia de Node.js, que depende de npm y un archivo package.json, Deno utiliza un sistema de módulos basado en URLs. Esto permite importar librerías directamente desde URLs sin necesidad de un administrador de paquetes, reduciendo la complejidad en la gestión de dependencias y mejorando la seguridad al evitar repositorios centralizados que pueden ser atacados o comprometidos.
  4. Binario Único: Deno es distribuido como un solo binario. No necesita instaladores complejos ni múltiples dependencias para funcionar. Esto simplifica el proceso de instalación y configuración, además de hacerlo más portable.
  5. API Estándar Moderna: Deno utiliza una API moderna basada en las especificaciones web estándar, lo que hace que sea más fácil para los desarrolladores trasladar sus conocimientos de otras plataformas web a Deno. Este enfoque fomenta la reutilización del código entre el navegador y el backend.

Seguridad y Ciberseguridad en Deno

Una de las mayores preocupaciones de Ryan Dahl al diseñar Deno fue mejorar los aspectos de seguridad que vio como puntos débiles en Node.js. Deno adopta un enfoque radicalmente diferente, otorgando al desarrollador control absoluto sobre los permisos del programa. Por ejemplo, un script en Deno no puede acceder a la red, el sistema de archivos o el entorno de ejecución sin permisos explícitos:

# Permitir acceso a la red
deno run –allow-net app.ts

# Permitir acceso al sistema de archivos
deno run –allow-read –allow-write app.ts

Esto ayuda a mitigar ataques comunes como el path traversal, donde un atacante intenta acceder a archivos o directorios no autorizados.

Deno también implementa el uso de sandboxing, lo que significa que el código que se ejecuta en Deno tiene un entorno aislado que minimiza el riesgo de que código malicioso comprometa el sistema operativo o acceda a datos no autorizados.

Sintaxis y Usabilidad

Deno se diseñó para ser amigable y familiar para los desarrolladores que ya están familiarizados con JavaScript y TypeScript. La sintaxis es muy similar a la de Node.js, pero con mejoras y soporte nativo para las características modernas del lenguaje.

Un ejemplo sencillo de código en Deno que lee un archivo:

const decoder = new TextDecoder(«utf-8»);
const data = await Deno.readFile(«example.txt»);
console.log(decoder.decode(data));

Este código hace uso de promesas y APIs nativas de Deno para leer un archivo de manera asíncrona. La diferencia clave aquí es que en Deno, este código no funcionaría sin el permiso adecuado:

deno run –allow-read read_file.ts

Deno vs. Node.js: ¿Cuál es mejor?

La comparación entre Deno y Node.js depende de las necesidades específicas del proyecto. Mientras que Deno ofrece mayores medidas de seguridad, simplicidad en el manejo de dependencias y soporte nativo para TypeScript, Node.js sigue siendo el estándar de facto en la industria con un vasto ecosistema de paquetes y una comunidad más madura.

Sin embargo, Deno se posiciona como una alternativa fresca y moderna, especialmente para proyectos nuevos que no dependen del ecosistema tradicional de npm.

Conclusión

Deno es un paso adelante en la evolución del desarrollo de JavaScript, con un enfoque fuerte en la seguridad, simplicidad y el uso de TypeScript. Si bien Node.js sigue dominando el mercado, Deno ofrece una alternativa atractiva para aquellos que buscan una solución más segura y moderna. Su enfoque en la seguridad por defecto y la gestión simplificada de dependencias lo convierten en una excelente opción para desarrolladores enfocados en el desarrollo ágil y la ciberseguridad.

Si quieres explorar un nuevo enfoque para tus proyectos en JavaScript y TypeScript, Deno es definitivamente una plataforma que vale la pena probar.

Para más detalles sobre cómo instalar y comenzar a usar Deno, visita su sitio oficial: Deno.

GPL vs MIT: Comparación de las licencias de código abierto más populares

 

Como cualquier otra creación del intelecto humano, el software de código abierto (OSS) está sujeto a la protección de la propiedad intelectual. Uno de los derechos que otorga la propiedad intelectual al desarrollador de un programa o aplicación de OSS es el derecho a conceder licencias a terceros, lo que determina cómo puede utilizarse, modificarse y redistribuirse el software. Dos de las licencias más populares, la Licencia Pública General de GNU (GPL) y la Licencia MIT (MIT), destacan como las principales opciones para los desarrolladores que desean compartir su código con el mundo manteniendo ciertos derechos y responsabilidades. Dicho esto, vamos a comparar estas licencias para entender sus diferencias y cómo afectan al desarrollo de software.

GPL (Licencia Pública General de GNU)

La GPL es una licencia copyleft, lo que significa que garantiza que las obras derivadas también sigan siendo de código abierto. Esta licencia hace hincapié en la libertad de uso, estudio, modificación y redistribución del software. Todo software que incorpore código con licencia GPL debe publicarse también bajo la GPL, lo que garantiza que el código fuente siga estando a disposición de todos los usuarios. Esta disposición fomenta la colaboración y el desarrollo impulsado por la comunidad.

Uno de los aspectos más importantes de la GPL es su naturaleza viral. Si usted utiliza y distribuye código GPL en su proyecto, éste también debe estar licenciado bajo la GPL. Esto garantiza que las mejoras y modificaciones introducidas en el código reviertan en la comunidad.

Licencia MIT

A diferencia de la GPL, la licencia MIT es más permisiva. Permite a los usuarios hacer casi todo lo que quieran con el código, incluso modificarlo, distribuirlo y utilizarlo con fines comerciales, siempre que incluyan los avisos originales de copyright y licencia. Esta flexibilidad hace que la licencia MIT resulte atractiva para los desarrolladores que desean maximizar la adopción y el uso de su software sin imponer restricciones significativas. Es extremadamente concisa y básicamente dice: «Haga lo que quiera con este código, pero no me demande».

A diferencia de la GPL, la licencia MIT no exige que las obras derivadas sean de código abierto. Los desarrolladores pueden incorporar código con licencia MIT a sus proyectos sin necesidad de publicar el código fuente de todo el proyecto. Esto facilita a las empresas el uso de componentes de código abierto en sus productos de software propietario.

Comparación

Restricciones de la licencia: La GPL impone requisitos más estrictos a las obras derivadas para garantizar que sigan siendo «de código abierto». Por otro lado, la licencia MIT permite una mayor flexibilidad, permitiendo a los desarrolladores utilizar componentes de código abierto en proyectos propietarios.

Adopción comunitaria frente a adopción comercial: La licencia GPL da prioridad al desarrollo y la colaboración impulsados por la comunidad al exigir que las obras derivadas sean de código abierto. En cambio, la licencia MIT fomenta la adopción comercial al permitir la integración de componentes de código abierto en productos de software propietario.

Complejidad jurídica: Debido a su naturaleza viral, la GPL puede crear complejidad legal, especialmente para las empresas que quieren incorporar código con licencia GPL en su software propietario. La licencia MIT, con su naturaleza permisiva, ofrece simplicidad y claridad, lo que facilita su uso y comprensión.

Diferencias filosóficas: La elección entre la GPL y la MIT suele reflejar diferencias filosóficas en la comunidad del software libre. Los defensores de la GPL hacen hincapié en los principios de libertad y comunidad, mientras que los defensores de la licencia MIT hacen hincapié en el pragmatismo y la flexibilidad.

Conclusión

Tanto la GPL como el MIT son licencias populares de código abierto que ofrecen distintos enfoques para compartir y distribuir software. La elección entre estas licencias depende de los objetivos y valores de cada desarrollador y organización. Si el objetivo es maximizar la colaboración de la comunidad y garantizar que las mejoras beneficien a todos, entonces considere el uso de la GPL, pero si la intención es la adopción generalizada y la flexibilidad en la forma en que otros utilizan el código (incluidas las aplicaciones propietarias), entonces la licencia MIT puede ser preferible.

OSFetch

 

En vista de la posible «dada de baja» del proyecto neofetch por parte de sus desarrolladores, decidí desarrollar mi propia versión llama OSFetch.

OSFetch es una herramienta escrita en python que obtiene información del sistema operativo actual, como el nombre, la versión, la arquitectura del hardware, información de la CPU, memoria y disco, y muestra un logotipo ASCII del sistema operativo con colores según la distribución de Linux.

Este proyecto está basado en el proyecto Neofetch, y proporciona funcionalidades similares pero enfocadas en obtener información específica del sistema operativo actual.
Si deseas tener acceso al proyecto puedes hacerlo a través del enlace de github https://github.com/rr-n4p5t3r/OSFetch

Simbiote

 

Simbiote es una suite de herramientas de ciberseguridad diseñada para la replicación y el cifrado de archivos en sistemas de almacenamiento de datos. Este proyecto ofrece una serie de herramientas que permiten replicar archivos en discos duros y directorios específicos, así como cifrar y descifrar archivos utilizando técnicas de cifrado seguro.

Nota importante: Este proyecto debe ser utilizado únicamente para fines educativos. El autor de los scripts no se responsabiliza del mal uso que se le den a los mismos.

Puedes acceder al repositorio aquí.

Funcionalidades

Carnage.py

Carnage.py es una implementación de Simbiote que permite la replicación de archivos en un disco duro. Utiliza un algoritmo que replica cada archivo presente en el disco duro elevado a la potencia de la cantidad total de archivos en el disco. Esto resulta en una replicación masiva de archivos que puede ayudar en la preservación y protección de datos en sistemas de almacenamiento local.

HellSpawn.py

HellSpawn.py es una herramienta de Simbiote diseñada para cifrar el contenido de un directorio utilizando una clave de cifrado generada previamente. Utiliza la biblioteca de criptografía Fernet para cifrar los archivos presentes en el directorio, garantizando así la confidencialidad de los datos almacenados. Esta herramienta proporciona una capa adicional de seguridad para proteger la información sensible.

Spawn.py

Spawn.py es la contraparte de HellSpawn.py. Esta herramienta se encarga de descifrar el contenido cifrado previamente utilizando la clave de cifrado generada por HellSpawn.py. Al descifrar los archivos, permite restaurar el contenido original del directorio, lo que facilita el acceso a los datos para los usuarios autorizados.

Venom.py

Venom.py es otra implementación de Simbiote que replica archivos, pero esta vez en un directorio específico de un disco duro. Similar a Carnage.py, replica cada archivo presente en el directorio especificado elevado a la potencia de la cantidad total de archivos en el directorio. Esta herramienta proporciona una forma eficiente de replicar archivos en directorios específicos para mantener la integridad y disponibilidad de los datos.

Contribución

Las contribuciones son bienvenidas. Si deseas contribuir al proyecto, sigue estos pasos:

  1. Haz un fork del repositorio.
  2. Clona tu fork en tu máquina local.
  3. Crea una nueva rama para tu contribución (git checkout -b feature/nueva-funcionalidad).
  4. Realiza tus cambios y haz commits (git commit -am 'Agrega nueva funcionalidad').
  5. Haz push a tu rama (git push origin feature/nueva-funcionalidad).
  6. Abre un pull request en GitHub.

Licencia

Este proyecto está licenciado bajo la Licencia Pública General de GNU, versión 3 (GNU GPLv3).

Quantum – Servidor Web

 

El  proyecto se encuentra desarrollado en lenguaje Java y cuenta con soporte para ejecutar contenido html5, css3, js, php, flask (python) y además cuenta con soporte para certificados ssl.

Instalación

Puedes iniciar clonando el proyecto Quantum desde el respositorio oficial en Github.

El proceso de instalación inicialmente es ejecutar el archivo JAR (Quantum-1.0), ubicado en la ruta «/target» dentro de la carpeta del proyecto.

Puertos habilitados

Puerto en el que desea que escuche su servidor (por ejemplo: 80, 8080, 8000, u otro).

El servidor utiliza los siguientes puertos para su funcionamiento:

  • PORT = 1980
  • SSLPORT = 2016

Almacenamiento de LOGs

Los archivos de log se almacenan en ubicaciones predefinidas dependiendo del sistema operativo. Se crean dos tipos de log: uno para errores y otro para accesos.

Las rutas definidas para los log son las siguientes:

  • LOG_WINDOWS = «C:\www\log\»
  • LOG_LINUX = «/var/log/»

Los archivos parametrizados son los siguientes:

  • log_quantum_error.log
  • log_quantum_acceso.log

Ruta raíz del directorio web

Este atributo define la ruta raíz del directorio web que contendrá los archivos HTML, PHP y otros recursos servidos por el servidor en sistemas Windows y Linux. Se utiliza para construir las rutas de los archivos solicitados por los clientes.

  • WEB_ROOT_WINDOWS = «C:\\quantum\\www»
  • WEB_ROOT_LINUX = «/mnt/quantum/www»

Tamaño del buffer

Determina la cantidad de datos que se pueden leer o escribir en un archivo o socket a la vez. Se expresa en bytes. Puedes dejarlo como está, o reducirlo a 1024.

  • bufferSize = 8192

Recomendación

Mantener revisando el repositorio de github para validar las actualizaciones que estaré cargando, al menos una vez a la semana.

30 APIs con planes gratis para desarrolladores

 Si quieres un listado completo con cientos, consulta este repo: 

https://github.com/public-apis/public-apis