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.

Calculadora de pago de horas trabajadas segun el valor por hora en Python

 Tenemos el siguiente problema para resolver en Python:

Escribir un programa que pregunte al usuario por el número de horas trabajadas y el coste por hora. Después debe mostrar por pantalla la paga que le corresponde.

def calcular_paga(horas, valor_hora):
  """Calcula la paga del usuario.

  Args:
    horas: El número de horas trabajadas por el usuario.
    valor_hora: El valor por hora del trabajo del usuario.

  Returns:
    La paga que le corresponde al usuario.
  """
  paga = horas * valor_hora
  return paga

# Ejemplo de uso
horas_trabajadas = float(input("Ingrese el número de horas trabajadas: "))
valor_por_hora = float(input("Ingrese el valor por hora: "))
paga_total = calcular_paga(horas_trabajadas, valor_por_hora)
print("La paga total es:", paga_total)

 Este código define una función calcular_paga que toma el número de horas trabajadas y el valor por hora como argumentos y devuelve la paga que le corresponde al usuario.

Durante la ejecución del código, antes de llamar la función calcular_paga :

  1. Solicita al usuario que ingrese el número de horas trabajadas y el valor por hora utilizando la función input.
  2. Convierte las entradas del usuario a números flotantes utilizando la función float.
  3. Calcula la paga del usuario multiplicando las horas trabajadas por el valor por hora.
  4. Muestra la paga total al usuario utilizando la función print.

Al final del código, se llama a la función calcular_paga para ejecutar el programa.

miércoles, 1 de mayo de 2024

Calcular el valor de la hipotenusa teniendo un punto x,y en el plano cartesiano en Python

 

  • Este código asume que el usuario ingresa valores numéricos válidos para las longitudes de los catetos.
  • Se puede modificar el código para manejar errores de entrada, como cuando el usuario ingresa un valor no numérico.
  • También se puede agregar código para validar que las longitudes de los catetos sean positivas.
  •  

    import math
    
    def calcular_hipotenusa(x, y):
      """
      Calcula la longitud de la hipotenusa de un triángulo rectángulo utilizando el teorema de Pitágoras.
    
      Parámetros:
        x: La longitud del cateto x.
        y: La longitud del cateto y.
    
      Retorno:
        La longitud de la hipotenusa.
      """
      hipotenusa = math.sqrt(x**2 + y**2)
      return hipotenusa
    
    # Ejemplo de uso
    x = float(input("Ingrese la longitud del cateto x: "))
    y = float(input("Ingrese la longitud del cateto y: "))
    
    hipotenusa = calcular_hipotenusa(x, y)
    
    print("La longitud de la hipotenusa es:", hipotenusa)
    
    

    Explicación:

    1. Importamos la biblioteca math: Esta biblioteca contiene funciones matemáticas, incluyendo la función sqrt() para calcular la raíz cuadrada.
    2. Definimos la función calcular_hipotenusa:
      • Esta función toma dos parámetros: x y y, que representan las longitudes de los catetos del triángulo rectángulo.
      • La función calcula la longitud de la hipotenusa utilizando la fórmula del teorema de Pitágoras: hipotenusa = sqrt(x^2 + y^2).
      • La función retorna el valor de la hipotenusa.
    3. Ejemplo de uso:
      • Solicitamos al usuario que ingrese las longitudes de los catetos x e y.
      • Convertimos las entradas del usuario a números flotantes utilizando la función float().
      • Llamamos a la función calcular_hipotenusa para obtener la longitud de la hipotenusa.
      • Imprimimos el resultado utilizando la instrucción print().

    lunes, 29 de abril de 2024

    Calcular Angulo de referencia y el valor (+/-) de Seno, Coseno y Tangente en Python

     Esta función primero define una función llamada calcular_angulo_referencia que toma un ángulo como parámetro. La función primero convierte el ángulo a radianes si es necesario. Luego, calcula el ángulo de referencia tomando el módulo absoluto del ángulo y dividiéndolo por 2π.

    import math
    
    def calcular_angulo_referencia(angulo, tipo_dato):
      """
      Esta función calcula el ángulo de referencia, el cuadrante y las positividades de seno, coseno y tangente para un ángulo dado en radianes o grados.
    
      Parámetros:
        angulo: El ángulo en radianes o grados.
        tipo_dato: Un string que indica si el ángulo es en "radianes" o "grados".
    
      Retorno:
        Una tupla que contiene el ángulo de referencia en grados, el cuadrante y las positividades de seno, coseno y tangente.
      """
    
      # Convertir el ángulo a radianes si es necesario
      if tipo_dato.lower() == "grados":
        angulo = math.radians(angulo)
    
      # Calcular el ángulo de referencia
      angulo_ref = abs(angulo) % (2 * math.pi)
    
      # Determinar el cuadrante
      if angulo_ref <= math.pi / 2:
        cuadrante = 1
      elif angulo_ref <= math.pi:
        cuadrante = 2
      elif angulo_ref <= 3 * math.pi / 2:
        cuadrante = 3
      else:
        cuadrante = 4
    
    
      # Calcular las positividades de las funciones trigonométricas
      seno_positivo = True if cuadrante in [1, 2] else False
      coseno_positivo = True if cuadrante in [1, 4] else False
      tangente_positivo = True if cuadrante in [1, 3] else False
    
      # Convertir el ángulo de referencia a grados si es necesario
      angulo_ref_grados = math.degrees(angulo_ref)
    
      if (float(angulo_ref_grados) > 180.0):
        angulo_ref_grados = (360 - angulo_ref_grados) * -1
    
      return angulo_ref_grados, cuadrante, seno_positivo, coseno_positivo, tangente_positivo
    
    # Ejemplo de uso
    angulo = float(input("Ingrese el ángulo: "))
    tipo_dato = input("Ingrese el tipo de dato (radianes o grados): ").lower()
    
    resultado = calcular_angulo_referencia(angulo, tipo_dato)
    
    print(f"Ángulo de referencia: {resultado[0]:.2f}°")
    print(f"Cuadrante: {resultado[1]}")
    print(f"Seno positivo: {resultado[2]}")
    print(f"Coseno positivo: {resultado[3]}")
    print(f"Tangente positiva: {resultado[4]}")
    

    A continuación, la función determina el cuadrante en el que se encuentra el ángulo de referencia dividiendo el rango de 0 a 2π en cuatro cuadrantes iguales, y también el tipo de dato (radianes o grados). Finalmente, la función calcula las positividades de las funciones trigonométricas seno, coseno y tangente para el ángulo de referencia en el cuadrante determinado.

    La función devuelve una tupla que contiene el ángulo de referencia en grados, el cuadrante, y las positividades de seno, coseno y tangente.

    La parte final del código proporciona un ejemplo de cómo usar la función calcular_angulo_referencia. Solicita al usuario que ingrese un ángulo en radianes o grados, y luego imprime los resultados devueltos por la función.

    Calculadora científica para calcular el seno, coseno, tangente, exponencial y logaritmo neperiano

    La siguiente es una unción que simula una calculadora científica que permita calcular el seno, coseno, tangente, exponencial y logaritmo neperiano. La función preguntará al usuario el valor y la función a aplicar, y mostrará por pantalla una tabla con los enteros de 1 al valor introducido y el resultado de aplicar la función a esos enteros.

    import math
    
    def calculadora_cientifica():
      """
      Función que simula una calculadora científica básica.
    
      Permite calcular el seno, coseno, tangente, exponencial y logaritmo neperiano de un rango de valores enteros.
      """
    
      # Solicitar valor y función al usuario
      valor = int(input("Ingrese el valor máximo (entero): "))
      funcion = input("Ingrese la función a calcular (seno, coseno, tangente, exponencial, logaritmo): ").lower()
    
      # Validar la función ingresada
      if funcion not in ("seno", "coseno", "tangente", "exponencial", "logaritmo"):
        print("Función no válida. Intente de nuevo.")
        return
    
      # Crear tabla de resultados
      print("\n| Valor | Resultado |\n|---|---|")
    
      # Calcular y mostrar resultados
      for i in range(1, valor + 1):
        if funcion == "seno":
          resultado = math.sin(i)
        elif funcion == "coseno":
          resultado = math.cos(i)
        elif funcion == "tangente":
          resultado = math.tan(i)
        elif funcion == "exponencial":
          resultado = math.exp(i)
        elif funcion == "logaritmo":
          resultado = math.log(i)
    
        print(f"| {i} | {resultado:.4f} |")
    
    if __name__ == "__main__":
      calculadora_cientifica()
    
    

    Explicación del código:

    1. Importación de la biblioteca math: Se importa la biblioteca math para acceder a funciones matemáticas como sin, cos, tan, exp y log.
    2. Función calculadora_cientifica:
      • Solicitar valor y función al usuario: Se utilizan las funciones input para obtener el valor máximo (entero) y la función a calcular del usuario.
      • Validar la función ingresada: Se verifica si la función ingresada es válida ("seno", "coseno", "tangente", "exponencial", "logaritmo"). Si no es válida, se muestra un mensaje de error y se termina la función.
      • Crear tabla de resultados: Se imprime un encabezado de tabla con las columnas "Valor" y "Resultado".
      • Calcular y mostrar resultados: Se utiliza un bucle for para iterar desde 1 hasta el valor máximo ingresado. Dentro del bucle, se calcula el resultado de la función correspondiente al valor actual (i) utilizando las funciones matemáticas de la biblioteca math. El resultado se formatea con 4 decimales y se imprime en la tabla junto con el valor actual.
    3. Bloque if __name__ == "__main__"::
      • Este bloque garantiza que el código dentro de la función calculadora_cientifica solo se ejecute cuando se ejecute el script como programa principal, y no cuando se importe como módulo.

    Ejecución del código:

    1. Guarde el código como un archivo Python (por ejemplo, calculadora_cientifica.py).
    2. Abra una terminal o ventana de comandos y navegue hasta la ubicación donde guardó el archivo.
    3. Ejecute el código usando el siguiente comando:
    python calculadora_cientifica.py
    
    1. Se le pedirá que ingrese el valor máximo y la función a calcular. El código calculará y mostrará una tabla con los resultados para los valores enteros desde 1 hasta el valor máximo especificado.

    martes, 26 de enero de 2021

    5 Errores comunes programando en PHP y cómo prevenirlos

     Ahora que los desarrolladores pueden rastrear los problemas exactos que causan cuellos de botella en el rendimiento en aplicaciones PHP, veamos cinco errores comunes que cometen los desarrolladores al crear aplicaciones PHP y cómo pueden resolverlos.

    Error 1: Hacer demasiadas consultas a la base de datos

    PHP se encuentra con el mismo tipo de restricciones que los desarrolladores tendrían con otros lenguajes, como demasiadas consultas de bases de datos. Los desarrolladores no son expertos en bases de datos. La mayoría no conocen todos los matices de la base de datos que utilizan. A menudo, no están usando su capa de acceso a la base de datos de manera óptima, por lo que terminan haciendo demasiadas consultas a la base de datos o generando consultas a la base de datos que no usan índices.

    Las bases de datos también funcionan de manera diferente bajo diferentes tipos de carga. Una base de datos que se ejecuta en una computadora portátil con decenas de megabytes de memoria se comporta de manera diferente a una base de datos de producción con un gigabyte, ya que se utilizan diferentes estrategias para seleccionar qué datos mirar. Las consultas que funcionaron en la máquina local de un desarrollador o en el entorno de ensayo pueden funcionar de manera diferente en producción.

    Las mitigaciones para un rendimiento deficiente de las consultas de la base de datos son agregar consultas en caché y ajustar. El almacenamiento en caché ayuda a reducir la cantidad de consultas enviadas a la base de datos cuando el resultado ya se conoce o se accede con frecuencia. Por ejemplo, el artículo "más reciente" de un sitio de noticias cambia con menos frecuencia de la que se lee. Al almacenar en caché los resultados, los desarrolladores pueden mejorar el rendimiento leyendo los resultados del caché en lugar de la base de datos. Ajustar las consultas de la base de datos generalmente implica agregar índices adicionales en los datos que se usan con frecuencia en condiciones o combinaciones. También puede implicar el almacenamiento de datos de formas que requieran menos combinaciones para acceder.

    Error 2: Cargar demasiados archivos


    Con otros lenguajes de programación, las aplicaciones se inician y luego mantienen el código y los datos asociados en la memoria. Con PHP, sin embargo, no existe un estado de aplicación persistente: los archivos se recargan con cada solicitud. Cuando los desarrolladores no tienen en cuenta esto, pueden encontrarse con el problema de cargar demasiados archivos, lo que consume los recursos del sistema y ralentiza el rendimiento.

    Los desarrolladores pueden resolver este problema activando el almacenamiento en caché del código de operación (código de operación). Como muchos lenguajes, PHP procesa el código fuente en códigos de operación, que luego se ejecutan en el tiempo de ejecución de PHP. La conversión de código PHP a códigos de operación ocurre en cada solicitud, ya que PHP no tiene un estado compartido. Si bien analizar el código fuente y generar códigos de operación es relativamente barato, los costos se acumulan a medida que una aplicación maneja más tráfico. Al habilitar el almacenamiento en caché del código de operación, el paso de análisis del código fuente se puede omitir, lo que produce ganancias de rendimiento medibles.

    Error 3: Configuración incorrecta del servidor web

    A diferencia de otros lenguajes de programación en los que el servidor web es parte del lenguaje, PHP se ejecuta dentro de un servidor web. Apache HTTP Server y Nginx son los dos más utilizados. El servidor web es otra capa que los desarrolladores de PHP deben supervisar. Desde elegir un modelo de proceso en Apache hasta ajustar PHP-FPM (Fast Process Manager) cuando se usa Nginx, existen algunas opciones de ajuste para usar.

    Por ejemplo, los desarrolladores deberán configurar la cantidad de procesos de trabajo que se crearán y la frecuencia con la que se reciclarán. Si no tienen suficientes trabajadores (procesos en ejecución) disponibles, sus usuarios tendrán que hacer cola y esperar a que un trabajador esté libre. Si tienen demasiados trabajadores, podrían quedarse sin memoria durante un momento de mucha actividad. Los desarrolladores pueden utilizar la cantidad de memoria que normalmente utiliza una aplicación y los recursos disponibles en sus servidores como guía para elegir la cantidad de trabajadores.

    Error 4: Malas prácticas de seguridad

    PHP permite a los desarrolladores combinar una variedad de paradigmas de programación y cambiar entre código HTML y PHP con fluidez. Sin rigor, esto puede resultar rápidamente en un código desordenado que es difícil de mantener. Esta flexibilidad es una de las razones por las que PHP es un lenguaje excelente para principiantes, pero puede convertirse fácilmente en una debilidad que puede exponer las aplicaciones a problemas de seguridad como cross-site scripting (XSS) e inyección SQL (SQLi).

    Los desarrolladores pueden mitigar estos riesgos mediante el uso de bibliotecas, herramientas y frameworks maduros. El uso de una biblioteca de plantillas como Twig ayuda a evitar el scripting entre sitios al codificar automáticamente en HTML todas las variables que se muestran en las plantillas. El uso de un mapeador relacional de objetos (ORM) o una biblioteca de abstracción de bases de datos puede evitar la inyección de SQL mediante el uso de declaraciones preparadas.

    Error 5: No usar tipos estrictos y sugerencias de tipo

    PHP tiene un sistema de tipos indulgente. Históricamente, PHP ha favorecido los tipos de coerción sobre la creación de errores. Esto puede llevar a trampas como dividir números por palabras y obtener resultados "útiles", pero también crear errores en tiempo de ejecución. Para ayudar a prevenir este tipo de errores, los desarrolladores deben habilitar "strict_types" y usar herramientas como Psalm y PHPStan como parte de su proceso de desarrollo. Estas herramientas analizan el código de forma estática y, al observar qué tipos de datos se utilizan en su aplicación, pueden señalar problemas potenciales antes de que se conviertan en problemas reales que afecten a los usuarios.

    domingo, 27 de diciembre de 2020

    for loop PHP continue to next item

     

    <?php
    $stack = array('first', 'second', 'third', 'fourth', 'fifth');
    
    foreach($stack as $v){
        if($v == 'second') {
          continue;
        }
        echo $v.'<br>';
    }
    /*
    first
    third
    fourth
    fifth
     */
    ?> 

    sábado, 26 de diciembre de 2020

    Send json post ajax Javascript (and JQuery)

     

    $.ajax({
        url: 'users.php',
        dataType: 'json',
        type: 'post',
        contentType: 'application/json',
        data: JSON.stringify( { "first-name": $('#first-name').val(), "last-name": $('#last-name').val() } ),
        processData: false,
        success: function( data, textStatus, jQxhr ){
            $('#response pre').html( JSON.stringify( data ) );
        },
        error: function( jqXhr, textStatus, errorThrown ){
            console.log( errorThrown );
        }
    });

    Javascript regex only letters and spaces (with JQuery)

     

    <script>
    //regex expression:
    var reg_name_lastname = /^[a-zA-Z\s]*$/;
    
    //Validation to the user_name input field
    if(!reg_name_lastname.test($('#user_name').val())){ //
        alert("Correct your First Name: only letters and spaces.");
        valid = false;
    }
    </script> 

    miércoles, 23 de diciembre de 2020

    Javascript Generate PDF from div content with JQuery

     Usar la librería: jsPDF

    Usar en el HTML cualquier div de donde vamos a gerar el PDF: 

     

    <div id="content">
         <h3>Hello, this is a H3 tag</h3>
    
        <p>A paragraph</p>
    </div>
    <div id="editor"></div>
    <button id="cmd">generate PDF</button>
    

    Y el JavaScript:

    var doc = new jsPDF();
    var specialElementHandlers = {
        '#editor': function (element, renderer) {
            return true;
        }
    };
    
    $('#cmd').click(function () {
        doc.fromHTML($('#content').html(), 15, 15, {
            'width': 170,
                'elementHandlers': specialElementHandlers
        });
        doc.save('sample-file.pdf');
    });
    

    martes, 29 de enero de 2019

    [Corregido] 500 Error: File is writeable by group

    Casos en los que se presenta:
    • Cuando ingresas a tu script en PHP y aunque sólo tengas la linea de Hola mundo, aparece este mensaje.
    • Otros mensajes similares de diagnóstico es que siempre obtienes un error 500, cuando el código nunca ha tenido problemas.
    • Ingresas al cPanel y de repente tienes una cola de mensajes de error con el mensaje:
    [Day Mon 31 16:34:12 2011] [error] [client 11.111.111.111] SoftException in Application.cpp:256: File "/home/username/public_html/index.php" is writeable by group
     
    Causas?

    Realmente pueden ser varias cosas:
    • Aumentaste la versión de PHP de manera general en tu servidor, o al menos en la carpeta donde tienes tu proyecto.
    • El servidor hizo una actualización e PHP por una nueva versión.
    • Hiciste cambios en los permisos de tus archivos y carpetas.
    • Algún script hizo cambios en los permisos de tus archivos y carpetas.

    La solución es muy simple.

    Ya sea con tu cliente de FTP o por el administrador de archivos, debes configurar las carpetas con los permisos chmod 755 y dentro de esa carpeta a todos tus archivos  con los permisos chmod 644.

    Listo! Ingresa de nuevo a tu script.

    jueves, 26 de octubre de 2017

    Anti-DDoS PHP Script (Prevenir ataques DDoS en PHP)

    Las soluciones contra un ataque DDoS son más bien del lado de la configuración del servidor y el firewall que tenemos allí instalado.

    No obstante, es posible a nivel de código tener un pequeño control, que si no evita el ataque completamente, al menos lo puede mitigar en una gran medida. Manos a la obra...

    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...