domingo, 27 de abril de 2025

GCP: Google Cloud Run

En esta ocasión veremos qué es y para qué sirve Google Cloud Run. Google Cloud Run es una plataforma serverless que permite ejecutar aplicaciones en contenedores de manera escalable y sin preocuparse por la infraestructura subyacente.

Según la documentación oficial:

  • Puedes ejecutar contenedores como aplicaciones web, microservicios, funciones sin servidor y trabajos de procesamiento por lotes. 
  • Cloud Run gestiona la infraestructura, permitiéndote enfocarte en el código y la aplicación, sin preocuparte por la gestión de servidores.

Lo que se puede hacer:

  1. Desplegar aplicaciones web y APIs: Ejecuta aplicaciones web, microservicios o APIs RESTful en contenedores, con soporte para lenguajes como Python, Node.js, Java, Go, etc. 
  2. Escalado automático: Escala automáticamente los contenedores según la demanda (de cero a miles de instancias) y reduce a cero cuando no hay tráfico, optimizando costos. 
  3. Ejecutar tareas programadas o eventos: Procesa eventos de Pub/Sub, Cloud Scheduler o desencadenantes HTTP para tareas como procesamiento de datos, ETL o automatización. 
  4.  Soporte para aplicaciones stateless: Ideal para aplicaciones sin estado que manejan solicitudes HTTP o eventos, como backend para aplicaciones móviles o sitios web. 
  5. Integración con CI/CD: Automatiza despliegues con herramientas como Cloud Build, GitHub Actions o GitLab, permitiendo flujos de desarrollo continuo. 
  6. Gestión simplificada: No requiere gestionar servidores; Google Cloud Run maneja parches, actualizaciones y balanceo de carga. 
  7. Soporte para WebSockets: Útil para aplicaciones en tiempo real, como chats o juegos. 
  8. Integración con otros servicios de Google Cloud: Conecta fácilmente con Cloud Storage, Firestore, BigQuery, o bases de datos como Cloud SQL para construir aplicaciones complejas. 
  9.  Despliegue de aplicaciones de machine learning: Sirve modelos de ML en contenedores para inferencia en tiempo real. 
  10. Personalización de entornos: Usa imágenes de contenedores personalizadas con Docker, permitiendo flexibilidad en dependencias y configuraciones. 
  11. Seguridad y autenticación: Integra con Identity-Aware Proxy (IAP), Firebase Authentication o OAuth para proteger endpoints, y soporta dominios personalizados con HTTPS. 
  12. Ejecución de trabajos (Jobs): Ejecuta tareas de corta duración, como migraciones de bases de datos o procesamiento por lotes, con Cloud Run Jobs.

Cloud Run es ideal para desarrolladores que buscan una solución serverless, escalable y fácil de usar para desplegar aplicaciones modernas, con un modelo de pago por uso que optimiza costos.

Enlaces:

https://cloud.google.com/run

sábado, 26 de abril de 2025

Creando una aplicación web para calcular el IMC con Mojolicious

En una entrega pasada vimos cómo crear una aplicación web para calcular el IMC de una persona usando Django Framework. Esta vez lo haremos usando Mojolicious, un framework ligero para Perl.

Creando la aplicación web

Requisitos:

  1. Tener instalado Perl en la última versión. 
  2. Instalar Mojolicious.

¿Qué haremos?

  1. Crear un solo programa, el cual nombraremos ``imc.pl``. 
  2. Crear la lógica para obtener los datos: nombre, edad, peso y talla. 
  3. Crear la lógica para obtener el IMC (peso / (talla**2)). 
  4. Crear las vistas: formulario y resultado.

Si no tenemos instalado Mojolicious, lo podemos instalar así:

$ cpan
cpan> install Mojolicious

1. Creamos el programa ``imc.pl`` (Linux o Windows).

Linux:

$ touch imc.pl

Windows:

$ start notepad imc.pl

2. Debemos obtener los datos del formulario. Para ello Mojolicious nos permitirá incrustrar código HTML desde el mismo programa Perl ``imc.pl``. Los llamados layaouts.

__DATA__

@@ formulario.html.ep
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC Generator</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; }
        .form-group { margin-bottom: 15px; }
        input[type="text"], input[type="number"] { padding: 10px; width: 200px; }
        button { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; }
        button:hover { background-color: #45a049; }
        .orange {
            color: #ff6200;
        }
        .green{
            color:rgb(13, 207, 55);;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1> <span class ="orange">IMC </span> <span class ="green">Generator</span></h1>
        <form method="POST" action="/">
            <div class="form-group">
                <label for="nombre">Nombre:</label><br>
                <input type="text" id="nombre" name="nombre" required>
            </div>
            <div class="form-group">
                <label for="edad">Edad:</label><br>
                <input type="number" id="edad" name="edad" required>
            </div>
            <div class="form-group">
                <label for="peso">Peso (kg):</label><br>
                <input type="number" step="0.1" id="peso" name="peso" required>
            </div>
            <div class="form-group">
                <label for="talla">Talla (m):</label><br>
                <input type="number" step="0.01" id="talla" name="talla" required>
            </div>
            <button type="submit">Aceptar</button>
        </form>
    </div>
</body>
</html>

Este será el formulario para la entrada de datos. Ahora crearemos la lógica una vez que obtenemos los datos (nombre, edad, peso y talla).

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;

# Ruta para el formulario (GET)
get '/' => sub ($c) {
    $c->render(template => 'formulario');
};

# Ruta para procesar el formulario y mostrar resultados (POST)
post '/' => sub ($c) {
    # Obtener datos del formulario
    my $nombre = $c->param('nombre');
    my $edad   = $c->param('edad') || 0;
    my $peso   = $c->param('peso') || 0;
    my $talla  = $c->param('talla') || 0;

    # Calcular IMC
    my $imc = $talla > 0 ? $peso / ($talla * $talla) : 0;

    # Diagnóstico y recomendaciones
    my ($diagnostico, $recomendaciones);
    if ($imc < 18.5) {
        $diagnostico = "Peso bajo";
        $recomendaciones = "Necesita ayuda médica. Considere aumentar su ingesta calórica.";
    } elsif ($imc >= 18.5 && $imc <= 24.9) {
        $diagnostico = "Peso normal";
        $recomendaciones = "No necesita ayuda médica. Solo necesita seguir alimentándose bien y hacer ejercicio.";
    } elsif ($imc >= 25 && $imc <= 29.9) {
        $diagnostico = "Sobrepeso";
        $recomendaciones = "Necesita ayuda médica. Considere una dieta balanceada y ejercicio regular.";
    } else {
        $diagnostico = "Obesidad";
        $recomendaciones = "Necesita ayuda médica urgente. Consulte a un especialista.";
    }

    # Calcular peso ideal y talla ideal (IMC ideal = 22)
    my $imc_ideal = 22;
    my $peso_ideal = $imc_ideal * ($talla * $talla);
    my $talla_ideal = $peso > 0 ? sqrt($peso / $imc_ideal) : 0;

    # Renderizar la página de resultados
    $c->render(
        template        => 'resultado',
        nombre          => $nombre,
        edad            => $edad,
        peso            => $peso,
        talla           => $talla,
        imc             => sprintf("%.2f", $imc),
        diagnostico     => $diagnostico,
        recomendaciones => $recomendaciones,
        peso_ideal      => sprintf("%.2f", $peso_ideal),
        talla_ideal     => sprintf("%.2f", $talla_ideal),
    );
};

Por último la página de resultados.

@@ resultado.html.ep
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Resultado IMC</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; }
        .result { margin-top: 20px; padding: 20px; border: 1px solid #ccc; border-radius: 5px; }
        .result h2 { color: #4CAF50; }
        button { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; }
        button:hover { background-color: #45a049; }
        .orange {
            color: #ff6200;
        }
        .green{
            color:rgb(13, 207, 55);;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1> <span class ="orange">IMC </span> <span class ="green">Generator</span></h1>
        <div class="result">
            <p><strong>Nombre:</strong> <%= $nombre %></p>
            <p><strong>Edad:</strong> <%= $edad %></p>
            <p><strong>Peso:</strong> <%= $peso %> kg</p>
            <p><strong>Talla:</strong> <%= $talla %> m</p>
            <h2>IMC: <%= $imc %></h2>
            <p><strong>Diagnóstico:</strong> <%= $diagnostico %></p>
            <p><strong>Recomendaciones:</strong> <%= $recomendaciones %></p>
            <p><strong>Su peso ideal debe ser:</strong> <%= $peso_ideal %> kg</p>
            <p><strong>Su talla ideal debe ser:</strong> <%= $talla_ideal %> m</p>
        </div>
        <a href="/"><button>Aceptar</button></a>
    </div>
</body>
</html>

Código completo:

imc.pl

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;

# Ruta para el formulario (GET)
get '/' => sub ($c) {
    $c->render(template => 'formulario');
};

# Ruta para procesar el formulario y mostrar resultados (POST)
post '/' => sub ($c) {
    # Obtener datos del formulario
    my $nombre = $c->param('nombre');
    my $edad   = $c->param('edad') || 0;
    my $peso   = $c->param('peso') || 0;
    my $talla  = $c->param('talla') || 0;

    # Calcular IMC
    my $imc = $talla > 0 ? $peso / ($talla * $talla) : 0;

    # Diagnóstico y recomendaciones
    my ($diagnostico, $recomendaciones);
    if ($imc < 18.5) {
        $diagnostico = "Peso bajo";
        $recomendaciones = "Necesita ayuda médica. Considere aumentar su ingesta calórica.";
    } elsif ($imc >= 18.5 && $imc <= 24.9) {
        $diagnostico = "Peso normal";
        $recomendaciones = "No necesita ayuda médica. Solo necesita seguir alimentándose bien y hacer ejercicio.";
    } elsif ($imc >= 25 && $imc <= 29.9) {
        $diagnostico = "Sobrepeso";
        $recomendaciones = "Necesita ayuda médica. Considere una dieta balanceada y ejercicio regular.";
    } else {
        $diagnostico = "Obesidad";
        $recomendaciones = "Necesita ayuda médica urgente. Consulte a un especialista.";
    }

    # Calcular peso ideal y talla ideal (IMC ideal = 22)
    my $imc_ideal = 22;
    my $peso_ideal = $imc_ideal * ($talla * $talla);
    my $talla_ideal = $peso > 0 ? sqrt($peso / $imc_ideal) : 0;

    # Renderizar la página de resultados
    $c->render(
        template        => 'resultado',
        nombre          => $nombre,
        edad            => $edad,
        peso            => $peso,
        talla           => $talla,
        imc             => sprintf("%.2f", $imc),
        diagnostico     => $diagnostico,
        recomendaciones => $recomendaciones,
        peso_ideal      => sprintf("%.2f", $peso_ideal),
        talla_ideal     => sprintf("%.2f", $talla_ideal),
    );
};

# Iniciar la aplicación
app->start;

__DATA__

@@ formulario.html.ep
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC Generator</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; }
        .form-group { margin-bottom: 15px; }
        input[type="text"], input[type="number"] { padding: 10px; width: 200px; }
        button { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; }
        button:hover { background-color: #45a049; }
        .orange {
            color: #ff6200;
        }
        .green{
            color:rgb(13, 207, 55);;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1> <span class ="orange">IMC </span> <span class ="green">Generator</span></h1>
        <form method="POST" action="/">
            <div class="form-group">
                <label for="nombre">Nombre:</label><br>
                <input type="text" id="nombre" name="nombre" required>
            </div>
            <div class="form-group">
                <label for="edad">Edad:</label><br>
                <input type="number" id="edad" name="edad" required>
            </div>
            <div class="form-group">
                <label for="peso">Peso (kg):</label><br>
                <input type="number" step="0.1" id="peso" name="peso" required>
            </div>
            <div class="form-group">
                <label for="talla">Talla (m):</label><br>
                <input type="number" step="0.01" id="talla" name="talla" required>
            </div>
            <button type="submit">Aceptar</button>
        </form>
    </div>
</body>
</html>

@@ resultado.html.ep
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Resultado IMC</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; }
        .result { margin-top: 20px; padding: 20px; border: 1px solid #ccc; border-radius: 5px; }
        .result h2 { color: #4CAF50; }
        button { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; }
        button:hover { background-color: #45a049; }
        .orange {
            color: #ff6200;
        }
        .green{
            color:rgb(13, 207, 55);;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1> <span class ="orange">IMC </span> <span class ="green">Generator</span></h1>
        <div class="result">
            <p><strong>Nombre:</strong> <%= $nombre %></p>
            <p><strong>Edad:</strong> <%= $edad %></p>
            <p><strong>Peso:</strong> <%= $peso %> kg</p>
            <p><strong>Talla:</strong> <%= $talla %> m</p>
            <h2>IMC: <%= $imc %></h2>
            <p><strong>Diagnóstico:</strong> <%= $diagnostico %></p>
            <p><strong>Recomendaciones:</strong> <%= $recomendaciones %></p>
            <p><strong>Su peso ideal debe ser:</strong> <%= $peso_ideal %> kg</p>
            <p><strong>Su talla ideal debe ser:</strong> <%= $talla_ideal %> m</p>
        </div>
        <a href="/"><button>Aceptar</button></a>
    </div>
</body>
</html>

Ejecución del programa:

$ morbo imc.pl

Abrimos el navegador en la ruta:

http://127.0.0.1:3000/

¡Con esto habremos habremos creado nuestra aplicación webb con Mojolicious!

La aplicación se verá así:

Introducimos los datos:

Obtenemos los resultados:

Mojolicious nos permite crear aplicaciones web de una manera más sencilla a lo que otros frameworks no.

En esta aplicación hemos visto algunas de sus características, como el permitir incrustrar código HTML (con extensión *html.ep) como en PHP.

Más sobre este framework en próximas entregas.

Enlaces:

https://mojolicious.org/
https://codemonkeyjunior.blogspot.com/2025/04/mojolicious-un-framework-para-perl.html
https://codemonkeyjunior.blogspot.com/2025/04/creando-una-aplicacion-web-para.html

domingo, 20 de abril de 2025

Mojolicious: un framework para Perl

Mojolicious es un framework similar a Dancer2, cuyas características son:

  • Más completo que Dancer2, pero también más complejo. 
  • Ofrece WebSockets, testing integrado, plantillas, y soporte para aplicaciones en tiempo real. 
  • También tiene un modo lite para scripts rápidos (Mojolicious::Lite). 
  • No requiere muchas dependencias externas.

Instalación:

Opción 1:

$ cpan
cpan> install Mojolicious
cpan> quit

Opción 2:

$ cpan App::cpanminus
$ cpan Mojolicious

Nosotros elegiremos la primera opción.

Verificamos la instalación:

$ cpan
cpan> i Mojolicious::Lite
Module id = Mojolicious::Lite
    CPAN_USERID  SRI (Sebastian Riedel <kraihx@googlemail.com>)
    CPAN_VERSION undef
    CPAN_FILE    S/SR/SRI/Mojolicious-9.39.tar.gz
    UPLOAD_DATE  2024-11-23
    MANPAGE      Mojolicious::Lite - Micro real-time web framework
    INST_FILE    C:\Strawberry\perl\vendor\lib\Mojolicious\Lite.pm
    INST_VERSION undef

Creando nuestra primera aplicación

hola.pl

1
2
3
4
5
use Mojolicious::Lite;

get '/' => {text => 'Hola mundo desde Mojolicious'};

app->start;

Ejecutamos la aplicación:

$ morbo hola.pl

Abrimos el navegador en:

http://127.0.0.1:3000/

¡Hemos creado nuestra primera aplicación con Mojolicious!

Enlaces:

https://mojolicious.org/


Composer, un administrador de dependencias para PHP

Composer es un administrador de dependencias para PHP que rastrea las dependencias locales de sus proyectos y bibliotecas. Para ...

Etiquetas

Archivo del blog