miércoles, 10 de mayo de 2023

ArrayList vs LinkedList in Java: A Deeper Comparison

 To understand the differences between ArrayList and LinkedList in Java, it's first important to understand that both are implementations of the List interface in Java and therefore offer similar functionalities. However, their performance in various situations differs due to the underlying data structures they use.

ArrayList


ArrayList is a dynamic array implementation. At its core, an ArrayList uses an array to store its elements. However, this array can grow dynamically to accommodate new elements as they are added to the list, which is not possible with a regular array.

The primary advantage of using an ArrayList lies in its efficiency in retrieving data. Thanks to the nature of arrays, you can access any element of an ArrayList in constant time (O(1)), simply by referencing the index of the element. This makes it ideal for scenarios where you need to frequently access elements by their index.
However, the insertion and deletion of elements in an ArrayList can be costly in terms of performance. If you insert or delete an element anywhere other than the end of the list, all subsequent elements must be shifted to fill or make space for the new element. This results in a time complexity of O(n).

LinkedList


LinkedList, on the other hand, is an implementation of a doubly-linked list. In a linked list, each element contains a reference to the previous and next elements in the list, forming a chain of elements.

The biggest advantage of a LinkedList is that it allows efficient insertions and deletions. You can add or remove an element from the list simply by changing the references of the neighboring elements. This process has a constant time complexity O(1) if the insertion or deletion occurs at the beginning or end of the list. However, if it occurs in the middle, we first need to locate the insertion or deletion point, which has a time complexity of O(n).

Contrarily, accessing individual elements in a LinkedList is slower compared to an ArrayList. Since the elements are not indexed, to access a particular element, you have to traverse the list from the beginning (or from the end, if it's closer), which has a time complexity of O(n).

Summary


In summary, if your application requires frequent index-based access to elements, an ArrayList might be the better choice. If, on the other hand, your application requires frequent insertions and deletions, especially in the middle of the list, then a LinkedList might be more suitable.

Additionally, it's important to note that LinkedList has a higher memory footprint than ArrayList because, in addition to the data, LinkedList also stores two references for the previous and next node.

Understanding these differences and how they impact the performance of your application will help you make an informed decision about which data structure to use in your Java code.

sábado, 21 de noviembre de 2020

JAVA Codify AES /JAVA Codificación AES

 El siguiente es un ejemplo de codificación AES en Java v8.

The next is an example of JAVA AES Encoding in Java 8


import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class Codify {
    public String codifyAES(String arg)   {


        try {
            byte[] raw = new byte[]{'0', '4', '3', '8', '4', '2', 'A', '5', '6', '0', '0', '0', '9', '8', '1', '9'};
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = null;
            cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(arg.getBytes());
            return Base64.getEncoder().encodeToString(encrypted);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }

        return null;
    }

}

AES 256

private static String secretKey = "boooooooooom!!!!";
private static String salt = "ssshhhhhhhhhhh!!!!";
 
public static String encrypt(String strToEncrypt, String secret) 
{
    try
    {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);
         
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
         
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
    } 
    catch (Exception e) 
    {
        System.out.println("Error while encrypting: " + e.toString());
    }
    return null;
}

jueves, 4 de junio de 2020

Debian "sudo command not found"

El día de hoy estaba trabajando con debian y me encontré con este error en la consola al intentar ejecutar el comando "sudo".

Los pasos para solucionarlo son:

1. Instalar el paquete "sudo", desde la cuenta del root.

#apt-get install sudo

2. Añadir el usuario al grupo de "sudo"

#usermod -aG sudo <username>

3. Iniciar sesión de nuevo.

https://laptrinhx.com/ubuntu-debian-fix-sudo-command-not-found-3405516199/

sábado, 23 de mayo de 2020

Virtualización en Acer Aspire E 15 E5-553-1786

Hace algunos años compré una laptop Acer de modelo Aspire E 15 E5-553-1786, estaba a buen precio, sin embargo fue una decepción cuando me neteré que el BIOS no cuenta con la opción para activar la opción de virtualización, por lo que no podía utilizar VirtualBox, luego de mucho tiempo encontré un artículo con una opción para activarlo desde Windows, por lo que comparto los pasos a seguir y el enlace. Cabe mencionar que ninguna de las actualizaciones del BIOS incluye la opción.

Paso 1:
descargar y descomprimir archivo H2OUVE.rar

yo lo descomprimi en carpeta
c:\temp

Paso 2: descargar y copiar archivo vars_mod.txt en carpeta c:\temp

Paso 3:
Entrar en modo consola como administrador
Presionando tecla windows y tecla x simultanamente.
Elegir => simbolo del sistema (administrador)

en modo consola nos cambiamos a la carpeta temp
cd\temp

tecleamos el comando:
H2OUVE.exe -sv vars_mod.txt
y ENTER

se ejecutara los procesos
y al finalizar unicamente apagamos la laptop
encendemos y listo
En virtualbox (en micaso) ya estaran activos la maquina virtual Windows de 64bits

Link original de referencia:

Nota: los pasos aqui descritos es responsabilidad de quien los use

Fuente:

viernes, 5 de julio de 2019

Programación Orientada a Objetos

¿Que es la programación orientada a objetos?



La programación orientada a objetos (POO) es un paradigma de programación basada en la interpretación de los elementos como objetos con atributos y otra propiedades.

El uso de este paradigma se popularizó a principios de la década de 1990. Actualmente existen distintos lenguajes de programación orientados a objetos, entre ellos:
  • Java
  • C++
  • Objective C
  • Ruby
  • Python
  • Smalltalk
  • Eiffel
  • Perl
  • Visual .net
  • PHP
  • etc
Algunos de los conceptos fundamentales de la POO:
  • Clase: Es la definición de las propiedades y comportamiento de un tipo de objeto en concreto.
  • Instanciación: Es la creación de un objeto a partir de una clase.
  • Herencia: Es la propiedad mediante la cual una clase puede heredar atributos y operaciones de otra.
  • Objeto: Es la instancia de una clase. Esta entidad es provista de las propiedades y atributos definidos en la clase a la que pertenece.
  • Método: Es un algoritmo asociado a un objeto, cuya ejecución se inicia tras la recepción de un mensaje o invocación. Por decirlo de otro modo es "lo que el objeto puede hacer". En un método se puede realizar un cambio en las propiedades del objeto o invocar otro método.
  • Evento: Es un suceso en el sistema.
  • Atributos: Características que pertenecen a la clase.
  • Mensaje: Es una comunicación dirigida a un objeto, que le ordena ejecute uno de sus métodos con ciertos parámetros asociados a dicho evento.
  • Propiedad o atributo: Es un contenedor de un tipo de dato asociado a un objeto, que permite acceder a los datos fuera del objeto y se define como sus características predeterminadas, y cuyo valor puede ser alterado por medio de un método.
  • Estado interno: Es una variable que se declara privada, y que solamente puede ser accedida y alterada por un método del objeto, no es visible al programador que maneja una instancia de la clase. 

Las características más importantes de la POO son:

Abstracción
Denota las características esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar "cómo" se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos, y, cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción. El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.

Encapsulamiento
Significa reunir todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión (diseño estructurado) de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.

Polimorfismo
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O, dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia
Las clases no se encuentran aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento, permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases, y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase, se dice que hay herencia múltiple; siendo de alta complejidad técnica por lo cual suele recurrirse a la herencia virtual para evitar la duplicación de datos.

Modularidad
Se denomina "modularidad" a la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la modularidad de diversas formas.

Principio de ocultación
Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una "interfaz" a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas; solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no puedan cambiar el estado interno de un objeto de manera inesperada, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Recolección de basura
La recolección de basura (garbage collection) es la técnica por la cual el entorno de objetos se encarga de destruir automáticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignación o liberación de memoria, ya que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para soportar el Paradigma de Programación Orientada a Objetos como C++ u Object Pascal, esta característica no existe y la memoria debe desasignarse expresamente.

Referencias:


lunes, 10 de junio de 2019

Estructura de control IF en PL/SQL - Oracle

El día de hoy trabajando con un script pl/sql me vi en la necesidad de implementar una sentencia de tipo "switch", sin embargo no soy programador pl/sql, por lo que fui con un camarada que si lo es y me explico un poco del tema, buscando más en Internet encontré la guía oficial de Oracle y comparto de manera resumida y en español la información en caso de que a alguien más le pueda ser de utilidad.

De acuerdo al "structure theorem" cualquier programa de computadora se puede escribir utilizando las estructuras básicas de control de acuerdo a la ilustración que se muestra abajo. Estas pueden ser combinadas de cualquier manera necesaria para poder resolver un problema.

Text description of pls81008_control_structures.gif follows

A continuación en listo los ejemplos de las estructuras que podemos utilizar en PL/SQL:

Sentencia IF-THEN


La forma más simple de la sentencia "IF" asocia una condición con una secuencia de sentencias encerradas en un bloque con las palabras "IF" y "END IF":

IF condition THEN
     sequence_of_statements
END IF;

Sentencia IF-THEN-ELSE

La segunda forma de la sentencia "IF" añade la palabra clave "ELSE" para indicar una secuencia alternativa de sentencias:

IF condition THEN
     sequence_of_statements
ELSE
     sequence_of_statements2

END IF;

Sentencia IF-THEN-ELSIF

Cuando se requiere especificar más casos en un flujo de condiciones se utiliza la tercera forma de la sentencia "IF", mediante la palabra  "ELSIF" (No ELSEIF), en este caso también la sentencia "ELSE" se vuelve opcional.

IF condition THEN
     sequence_of_statements
ELSIF condition 2 THEN

     sequence_of_statements2
ELSE
     sequence_of_statements3


END IF;

https://docs.oracle.com/cd/B10500_01/appdev.920/a96624/04_struc.htm

viernes, 20 de mayo de 2016

Crear Web Services con PHP y SOAP Básico

Encontré un excelente artículo que habla acerca de la creación de WS en PHP, es muy básico, sin embargo esta excelente para introducirse al tema, explica de manera muy clara los conceptos y los ejercicios son muy explícitos, la url del artículo es la siguiente (está en inglés): Creating Web Services with PHP and SOAP, Part 1

Para la banda que se desespera y no quiere leer aquí pongo los ejemplos, si alguien no sabe ingles y desea que traduzca la página para su comodidad por favor solicítenmelo en los comentarios :)


Servidor:

<?php
require_once "nusoap.php";

function getProd($category) {
    if ($category == "books") {
        return join(",", array(
            "The WordPress Anthology",
            "PHP Master: Write Cutting Edge Code",
            "Build Your Own Website the Right Way"));
 }
 else {
            return "No products listed under that category";
 }
}

$server = new soap_server();
$server->register("getProd");
$server->service($HTTP_RAW_POST_DATA);
?>

Cliente:

<?php
require_once "nusoap.php";
$client = new nusoap_client("http://localhost/nusoap/productlist.php");

$error = $client->getError();
if ($error) {
    echo "<h2>Constructor error</h2><pre>" . $error . "</pre>";
}

$result = $client->call("getProd", array("category" => "books"));

if ($client->fault) {
    echo "<h2>Fault</h2><pre>";
    print_r($result);
    echo "</pre>";
}
else {
    $error = $client->getError();
    if ($error) {
        echo "<h2>Error</h2><pre>" . $error . "</pre>";
    }
    else {
        echo "<h2>Books</h2><pre>";
        echo $result;
        echo "</pre>";
    }
}
?>