lunes, 10 de junio de 2024

7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores oportunidades de ser exitoso, dependiendo de la tecnología implementada para su realización. Y es por ello que he usado casi todo tipo de lenguajes, plataformas de desarrollo (IDE) y frameworks de lenguaje para tratar de ahorrar tiempo. En esta gran vastedad de existos y fracasos, he conocido un Framework que es relativamente popular entre algunos tipos de desarrolladores (generalmente con pocos años de experiencia), que recomiendan Laravel para cualquier tipo de proyecto. Pero realmente, Laravel no es el principe azul que muchos tienen en su cuento de hadas.

Laravel es un marco PHP popular conocido por su sintaxis elegante, funciones fáciles de desarrollar y su ecosistema sólido. Si bien Laravel es ampliamente utilizado por desarrolladores y empresas de diversos tamaños, incluidas muchas grandes empresas, puede haber varias razones por las que algunas grandes empresas pueden optar por no utilizar Laravel, aquí menciono sólo las mías, las que más dolor han causado en mis proyectos:

  1. Sistemas heredados: las grandes empresas suelen tener sistemas y aplicaciones existentes creados con diferentes tecnologías. Migrar a un nuevo marco como Laravel puede requerir mucho tiempo, recursos y esfuerzo, lo que puede ser un impedimento.
  2. Pila de tecnología: algunas empresas pueden haber estandarizado una pila o marco de tecnología diferente que se alinea con su infraestructura, experiencia o requisitos técnicos específicos existentes.
  3. Soluciones empresariales: las grandes empresas pueden tener requisitos complejos como escalabilidad, seguridad, cumplimiento e integración con sistemas heredados. Algunas empresas pueden preferir soluciones o marcos empresariales que ofrezcan características específicas que satisfagan estas necesidades.
  4. Soporte y mantenimiento: las empresas pueden considerar factores como el soporte a largo plazo, el mantenimiento y el respaldo de la comunidad al seleccionar una pila de tecnología. Si bien Laravel tiene una comunidad grande y activa, algunas empresas pueden preferir marcos con opciones de soporte comercial. Por otro lado, Laravel depende mucho de librerías y recursos de terceros, lo que puede generar momentos de crisis críticas al momento de hacer alguna actualización.
  5. Rendimiento y escalabilidad: si bien Laravel es conocido por sus funciones y productividad fáciles de usar para los desarrolladores, algunas empresas pueden tener aplicaciones críticas para el rendimiento en las que priorizan marcos conocidos por sus características de rendimiento y escalabilidad.
  6. Personalización y control: las grandes empresas pueden tener requisitos únicos que requieren un alto grado de personalización y control sobre el marco. Algunas empresas pueden optar por marcos más flexibles o de bajo nivel para satisfacer estas necesidades.
  7. Preocupaciones por la dependencia de un proveedor: las empresas pueden desconfiar de la dependencia de un proveedor y preferir marcos de código abierto que brinden flexibilidad y libertad para cambiar de tecnología si es necesario.
  8. Falta de independencia entre desarrollo y diseño: tal vez uno de los mayores problemas que enfrenta Laravel, es que todos los diseñadores dependen fuertemente del acompañamiento de los desarrolladores para actualizar sus diseños. Cosa que en otros Frameworks es muy fácil de sobrellevar.


Es importante tener en cuenta que las opciones de tecnología pueden variar según factores como los requisitos del proyecto, la experiencia del equipo, el presupuesto, el cronograma y los casos de uso específicos. Si bien es posible que algunas grandes empresas no utilicen Laravel por los motivos mencionados anteriormente, muchas otras organizaciones, incluidas grandes empresas, han adoptado Laravel con éxito para sus proyectos. La popularidad de Laravel y su comunidad activa indican que sigue siendo una opción viable para una amplia gama de proyectos de desarrollo web.

jueves, 6 de junio de 2024

Crear carpetas de archivos y guardar gráficos en ellas con Python

El siguiente código es un ejemplo de cómo puedes crear carpetas (si no existe ya) y guardar un gráfico que hayas creado dentro de dicha carpeta.


import matplotlib.pyplot as plt
import os

def crear_grafico(datos_x, datos_y, titulo, nombre_archivo, carpeta):
  """
  Función que genera un gráfico de líneas y lo guarda en una carpeta.

  Args:
    datos_x: Lista de valores para el eje X.
    datos_y: Lista de valores para el eje Y.
    titulo: Título del gráfico.
    nombre_archivo: Nombre del archivo donde se guardará el gráfico.
	carpeta: ruta donde quedará guardado el gráfico
  Returns:
    None
  """

  # Crea la figura y el eje
  plt.figure()
  ax = plt.axes()

  # Crea el gráfico de líneas
  ax.plot(datos_x, datos_y)

  # Configura el título y las etiquetas de los ejes
  ax.set_title(titulo)
  ax.set_xlabel("Eje X")
  ax.set_ylabel("Eje Y")

  # Crea la carpeta si no existe
  if not os.path.exists(carpeta):
    os.makedirs(carpeta)

  # Guarda el gráfico en la carpeta
  plt.savefig(carpeta+"/"+nombre_archivo)

# Ejemplo de uso
datos_x = [1, 2, 3, 4, 5]
datos_y = [2, 4, 5, 4, 2]
titulo = "Ejemplo de gráfico de líneas"
nombre_archivo = "grafico.png"
carpeta = "graficos"

crear_grafico(datos_x, datos_y, titulo, nombre_archivo, carpeta)

Explicación del código:

  1. Importa las bibliotecas necesarias:
    • matplotlib.pyplot: Para generar el gráfico.
    • os: Para crear la carpeta si no existe.
  2. Define la función crear_grafico:
    • Recibe como argumentos:
      • datos_x: Lista de valores para el eje X.
      • datos_y: Lista de valores para el eje Y.
      • titulo: Título del gráfico.
      • nombre_archivo: Nombre del archivo donde se guardará el gráfico.
    • Crea la figura y el eje.
    • Genera el gráfico de líneas.
    • Configura el título y las etiquetas de los ejes.
    • Crea la carpeta si no existe.
    • Guarda el gráfico en la carpeta.
  3. Ejemplo de uso:
    • Se crean listas de datos para el eje X y el eje Y.
    • Se define el título del gráfico.
    • Se define el nombre del archivo donde se guardará el gráfico.
    • Se llama a la función crear_grafico para generar y guardar el gráfico.

Personalización del gráfico:

  • Puedes modificar el tipo de gráfico utilizando la función plt.plot. Por ejemplo, para crear un gráfico de barras, puedes usar plt.bar(datos_x, datos_y).
  • Puedes agregar más opciones de personalización al gráfico, como colores, marcadores, leyenda, etc.
  • Puedes modificar el nombre del archivo y la ubicación de la carpeta donde se guardará el gráfico.

Nota:

  • Este código es un ejemplo básico. Puedes modificarlo para adaptarlo a tus necesidades específicas.
  • Asegúrate de tener instalado matplotlib antes de ejecutar el código. Puedes instalarlo usando el comando pip install matplotlib.

sábado, 11 de mayo de 2024

Calcular edad con la fecha de nacimiento en PHP

 En este tutorial, aprenderemos cómo calcular la edad a partir de la fecha de nacimiento en PHP.

Daré dos ejemplos de Cómo calcular la edad.

Ejemplo 1


    $dob='1993-07-01';
    $year = (date('Y') - date('Y',strtotime($dob)));
    echo $year;

Ejemplo 2

 
    $dob = new DateTime('1993-07-01');
    $today   = new DateTime('today');
    $year = $dob->diff($today)->y;
    $month = $dob->diff($today)->m;
    $day = $dob->diff($today)->d;
    echo "Age is"." ".$year."years"." ",$month."months"." ".$day."days";

domingo, 5 de mayo de 2024

NumPy: La biblioteca fundamental para la computación científica en Python

Para los desarrolladores de software que se adentran en el mundo de Python, la biblioteca NumPy se convierte en una herramienta indispensable para el manejo de datos numéricos. NumPy, abreviatura de "Numerical Python", es una biblioteca de código abierto que proporciona una estructura de datos eficiente para arrays multidimensionales y una amplia gama de funciones matemáticas para su manipulación.

Su uso se extiende a diversos campos como la ciencia de datos, el análisis de datos, el aprendizaje automático, la ingeniería y la física.

¿Qué hace a NumPy tan poderosa?

  1. Arrays Numpy: NumPy introduce el concepto de arrays Numpy, los cuales son estructuras de datos optimizadas para almacenar y manipular grandes conjuntos de datos numéricos de manera eficiente. A diferencia de las listas de Python, los arrays NumPy ofrecen un rendimiento significativamente superior, especialmente al trabajar con grandes volúmenes de datos.

  2. Funciones matemáticas: NumPy proporciona una extensa colección de funciones matemáticas predefinidas para realizar operaciones comunes como la suma, resta, multiplicación, división, logaritmos, funciones trigonométricas y muchas más. Estas funciones están optimizadas para arrays NumPy, lo que las hace extremadamente rápidas y eficientes.

  3. Compatibilidad con otras bibliotecas: NumPy se integra a la perfección con otras bibliotecas populares de Python para el análisis de datos y el aprendizaje automático, como Pandas, SciPy y Matplotlib. Esto permite a los desarrolladores combinar las fortalezas de diferentes bibliotecas para crear soluciones de software completas y potentes.

Empezando con NumPy

Para utilizar NumPy en sus proyectos de Python, siga estos pasos:

Instalación: Instale la biblioteca NumPy utilizando el comando pip install numpy en su terminal o entorno de desarrollo.

Importación: Importe la biblioteca NumPy en su script Python utilizando la instrucción import numpy as np. Esto le dará acceso a todas las funciones y clases de NumPy.

Creación de arrays: Cree arrays NumPy utilizando la función np.array(). Puede especificar los datos del array y su tipo de dato. Por ejemplo, para crear un array unidimensional de 5 números enteros:

import numpy as np 
array_enteros = np.array([1, 2, 3, 4, 5])
 

Acceso a elementos: Acceda a elementos individuales de un array utilizando corchetes. Por ejemplo, para acceder al tercer elemento del array array_enteros:

elemento = array_enteros[2]
print(elemento)  # Imprime el valor 3

Operaciones con arrays: Realice operaciones matemáticas con arrays completos o elementos individuales utilizando las funciones matemáticas de NumPy. Por ejemplo, para calcular la suma de todos los elementos del array array_enteros:

suma = np.sum(array_enteros)
print(suma)  # Imprime el valor 15

Ejemplos de código

A continuación, se presentan algunos ejemplos de código que demuestran el uso de NumPy para tareas comunes:

1. Creación de arrays multidimensionales:

# Array bidimensional que representa una matriz 2x3
matriz = np.array([[1, 2, 3], [4, 5, 6]])

# Array tridimensional que representa un cubo 3x3x3
cubo = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
                  [[19, 20, 21], [22, 23, 24], [25, 26, 27]]])

2. Selección de subconjuntos de arrays:

# Seleccionar todos los elementos de la segunda fila del array 'matriz'
fila_2 = matriz[1, :] 
print(fila_2)  # Imprime el array [4 5 6]

# Seleccionar el elemento en la posición (1, 2) del array 'cubo'
elemento_cubo = cubo[1, 2, 1]
print(elemento_cubo)  # Imprime el valor 15

3. Operaciones matemáticas con arrays:

import numpy as np

# Creamos arrays de ejemplo
array1 = np.array([1, 2, 3, 4])
array2 = np.array([5, 6, 7, 8])

# Suma de arrays elemento a elemento
suma_elemento_a_elemento = array1 + array2
print("Suma elemento a elemento:\n", suma_elemento_a_elemento)

# Multiplicación de arrays elemento a elemento
multiplicacion_elemento_a_elemento = array1 * array2
print("Multiplicación elemento a elemento:\n", multiplicacion_elemento_a_elemento)

# Suma de todos los elementos de un array
suma_total = np.sum(array1)
print("Suma de todos los elementos de array1:", suma_total)

# Producto escalar de dos arrays
producto_escalar = np.dot(array1, array2)
print("Producto escalar de array1 y array2:", producto_escalar)

# Potencia de un array (cada elemento elevado al cuadrado)
potencia_cuadrada = array1 ** 2
print("Potencia cuadrada de array1:\n", potencia_cuadrada)

4. Funciones matemáticas:

# Calcular el logaritmo base 10 de todos los elementos del array 'array_numeros'
logaritmos = np.log10(array_numeros)

# Calcular la distancia euclidiana entre dos vectores 'vector1' y 'vector2'
distancia_euclidiana = np.linalg.norm(vector1 - vector2)

5. Estadística descriptiva:

# Calcular la media, mediana y desviación estándar del array 'array_datos'
media = np.mean(array_datos)
mediana = np.median(array_datos)
desviacion_estandar = np.std(array_datos)

6. Visualización de datos:

# Importar la biblioteca Matplotlib para la creación de gráficos
import matplotlib.pyplot as plt

# Crear un histograma a partir del array 'array_distribucion'
plt.hist(array_distribucion)
plt.xlabel('Valores')
plt.ylabel('Frecuencia')
plt.title('Histograma de distribución de datos')
plt.show()

Recursos adicionales: 

Conclusión

NumPy se ha convertido en una herramienta fundamental para los desarrolladores de software que trabajan con datos numéricos en Python. Su versatilidad, eficiencia y amplia gama de funciones la convierten en una biblioteca indispensable para el análisis de datos, el aprendizaje automático y la computación científica.

Al dominar los conceptos básicos de NumPy y aprovechar sus potentes funciones, los desarrolladores pueden crear soluciones de software robustas y escalables para una amplia gama de problemas.

 

Uso de varias funciones en Python como ejercicio de Paradigma Funcional.

 El ejercicio busca resolver la siguiente solicitud:

Escribir una función que aplique un descuento a un precio y otra que aplique el IVA a un precio. Escribir una tercera función que reciba un diccionario con los precios y porcentajes de una cesta de la compra, y una de las funciones anteriores, y utilice la función pasada para aplicar los descuentos o el IVA a los productos de la cesta y devolver el precio final de la cesta.

 El código es:

def aplicar_descuento(precio, porcentaje_descuento):
  """
  Función que aplica un descuento a un precio.

  Argumentos:
    precio: El precio original del producto.
    porcentaje_descuento: El porcentaje de descuento que se quiere aplicar.

  Devuelve:
    El precio final del producto con el descuento aplicado.
  """
  descuento = precio * porcentaje_descuento / 100
  precio_final = precio - descuento
  return precio_final

def aplicar_iva(precio, porcentaje_iva):
  """
  Función que aplica el IVA a un precio.

  Argumentos:
    precio: El precio original del producto.
    porcentaje_iva: El porcentaje de IVA que se quiere aplicar.

  Devuelve:
    El precio final del producto con el IVA aplicado.
  """
  iva = precio * porcentaje_iva / 100
  precio_final = precio + iva
  return precio_final

def calcular_total_compra(cesta_compra, funcion_aplicar):
  """
  Función que calcula el total de una compra aplicando una función a cada producto.

  Argumentos:
    cesta_compra: Un diccionario con los precios y porcentajes de descuento/IVA de cada producto.
    funcion_aplicar: La función que se quiere aplicar a cada producto (descuento o IVA).

  Devuelve:
    El precio total de la compra.
  """
  total = 0
  for producto, datos in cesta_compra.items():
    precio = datos["precio"]
    porcentaje = datos["porcentaje"]
    precio_final = funcion_aplicar(precio, porcentaje)
    total += precio_final
  return total

# Ejemplo de uso

cesta_compra = {
  "Producto A": {"precio": 100, "porcentaje": 10},
  "Producto B": {"precio": 50, "porcentaje": 20},
  "Producto C": {"precio": 200, "porcentaje": 5},
}

# Aplicar descuento del 10% a todos los productos
total_con_descuento = calcular_total_compra(cesta_compra, aplicar_descuento)
print(f"Total con descuento: {total_con_descuento}")

# Aplicar IVA del 21% a todos los productos
total_con_iva = calcular_total_compra(cesta_compra, aplicar_iva)
print(f"Total con IVA: {total_con_iva}")

Explicación del código:

  1. Funciones aplicar_descuento y aplicar_iva:

    • Estas funciones reciben el precio original del producto y el porcentaje de descuento/IVA como argumentos.
    • Calculan el descuento/IVA a aplicar.
    • Devuelven el precio final del producto con el descuento/IVA aplicado.
  2. Función calcular_total_compra:

    • Recibe un diccionario con los precios y porcentajes de descuento/IVA de cada producto, y una función para aplicar (descuento o IVA).
    • Inicializa una variable total para almacenar el precio total de la compra.
    • Recorre cada producto en la cesta de compra:
      • Obtiene el precio y el porcentaje del producto actual.
      • Aplica la función funcion_aplicar para obtener el precio final del producto.
      • Suma el precio final al total.
    • Devuelve el total de la compra.
  3. Ejemplo de uso:

    • Se crea un diccionario cesta_compra con los precios y porcentajes de descuento/IVA de cada producto.
    • Se calcula el total de la compra con descuento del 10% y se imprime.
    • Se calcula el total de la compra con IVA del 21% y se imprime.

Características del código:

  • Sigue los principios de la programación funcional:
    • Las funciones son puras, es decir, no modifican el estado externo y siempre devuelven el mismo resultado para los mismos argumentos.
    • Se utilizan funciones anónimas para pasar la función aplicar_descuento o aplicar_iva a la función calcular_total_compra.
  • Es modular:
    • Cada función tiene una responsabilidad específica.
    • El código es fácil de leer y entender.
  • Es reutilizable:
    • Las funciones aplicar_descuento, aplicar_iva y calcular_total_compra se pueden utilizar en otros programas.

sábado, 4 de mayo de 2024

Determinar si un año es bisiesto o no en Python

Esta vez se trata de una función que reciba un parámetro (el año) y devuelva True o False según que el año sea o no bisiesto.

Se recuerda que los años bisiestos son múltiplos de 4, pero los múltiplos de 100 no lo son, aunque los múltiplos de 400 sí.

Estos son algunos ejemplos de posibles respuestas: 2012 es bisiesto, 2010 no es bisiesto, 2000 es bisiesto, 1900 no es bisiesto.

def es_bisiesto(año):
  """
  Función que determina si un año dado es bisiesto o no.

  Argumentos:
    año (int): El año que se quiere verificar.

  Retorno:
    bool: True si el año es bisiesto, False en caso contrario.
  """
  if año % 4 != 0:
    return False
  elif año % 100 == 0 and año % 400 != 0:
    return False
  else:
    return True

# Solicitar el año al usuario
año = int(input("Ingrese un año: "))

# Evaluar si el año es bisiesto
if es_bisiesto(año):
  print(f"{año} es un año bisiesto")
else:
  print(f"{año} no es un año bisiesto")

          

Explicación del código:

  1. Función es_bisiesto:
    • Esta función toma un entero año como argumento.
    • Primero, verifica si el año es divisible por 4. Si no lo es, no es bisiesto y la función devuelve False.
    • Si el año es divisible por 4, se verifica si también es divisible por 100.
      • Si es divisible por 100, pero no por 400, no es bisiesto y la función devuelve False.
      • Si es divisible por 400, sí es bisiesto y la función devuelve True.
  2. Solicitud del año al usuario:
    • Se utiliza la función input() para solicitar al usuario que ingrese un año.
    • El valor ingresado se convierte a un entero usando int().
  3. Evaluación y mensaje:
    • Se llama a la función es_bisiesto() para determinar si el año ingresado es bisiesto.
    • Si la función devuelve True, se imprime un mensaje indicando que el año es bisiesto.
    • Si la función devuelve False, se imprime un mensaje indicando que el año no es bisiesto.

Ejemplo de ejecución:

 

Ingrese un año: 2020
2020 es un año bisiesto

Otro ejemplo:

Ingrese un año: 2100
2100 no es un año bisiesto

Este código proporciona una forma simple y clara de verificar si un año dado es bisiesto en Python. La función es_bisiesto() maneja correctamente las diferentes reglas para determinar si un año es bisiesto, y el código principal facilita la interacción con el usuario para obtener y procesar el año a verificar.

viernes, 3 de mayo de 2024

Calculadora de Índice de Masa Corporal (IMC) en Python

 El siguiente código le pide al usuario que ingrese su peso en Kg y su altura en Metros, para calcular su Indice de Masa Corporal (IMC)

def calcular_imc():
  """Calcula y muestra el índice de masa corporal (IMC).

  Pide al usuario que ingrese su peso y estatura, calcula el IMC y lo muestra por pantalla.
  """
  peso = float(input("Ingrese su peso en kg: "))
  estatura = float(input("Ingrese su estatura en metros: "))

  imc = peso / (estatura ** 2)
  imc_redondeado = round(imc, 2)

  print(f"Tu índice de masa corporal es: {imc_redondeado}")

calcular_imc()

Explicación del código:

  1. Función calcular_imc:
    • Pide al usuario que ingrese su peso y estatura utilizando input y convierte las entradas a flotantes.
    • Calcula el IMC dividiendo el peso por la estatura al cuadrado.
    • Redondea el IMC a dos decimales con round.
    • Muestra un mensaje con el IMC redondeado usando f-strings.
  2. Llamada a la función:
    • Al final, se llama a la función calcular_imc para ejecutar el programa.

Al ejecutar el código:

  • Te pedirá que ingreses tu peso en kg y tu estatura en metros.
  • Calculará tu IMC.
  • Mostrará un mensaje como: "Tu índice de masa corporal es: 23.52".

Mejoras opcionales:

  • Validación de entrada: Puedes agregar código para verificar que el usuario ingrese valores numéricos válidos para el peso y la estatura.
  • Clasificación del IMC: Puedes agregar código para clasificar el IMC según los estándares de la OMS (bajo peso, normal, sobrepeso, obesidad) y mostrar un mensaje adicional con la clasificación.
  • Interfaz más amigable: Puedes usar librerías como tkinter o PyQt para crear una interfaz gráfica más atractiva para la calculadora.

7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores...