lunes, 24 de junio de 2024

Open Dylan

Dylan es un lenguaje funcional de objetos creado originalmente por Apple para Newton.

Dylan es un descendiente directo de Scheme y CLOS (sin la sintaxis Lisp) con un modelo de programación diseñado para admitir la generación eficiente de código de máquina, incluido un control detallado sobre comportamientos dinámicos y estáticos.

Empecemos con el clásico Hola, mundo.

format-out("Hola %s\n", "mundo en Dylan!!")

Para instalarlo eberás descargarlo del siguiente link:

https://github.com/dylan-lang/opendylan/releases/tag/v2023.1.0

(Open) Dylan tiene un REPL similar a lenguajes como Haskell, Clojure, etc.

?45 + 32;
=> 77
?45 - 32;
=> 13
?33 / 33;
=> 1

Si no deseas instalarlo, puede probarlo en el siguiente link:

https://play.opendylan.org/

El sitio provee algunos ejemplos, como el uso de ciclos for, clases, cálculo del Fibonacci, entre otros más.

for loop

for (i from 1,
     c in "abcdef",
     until: c = 'e')
  format-out("%d: %s\n", i, c);
end;

Cálculo del Fibonacci:

define method fib ()
  let a = 0;
  let b = 1;
  method ()
    let r = a + b;
    a := b;
    b := r;
    a
  end
end;

let f = fib();
for (i from 1 to 20) format-out("%= ", f()) end

Clases

// Classes are the primary way to build data structures in Dylan.
// Slots are accessed via normal function calls.

define class <account> (<object>)
  constant slot account-id :: <integer>,
    required-init-keyword: id:;
  constant slot account-name :: <string>,
    required-init-keyword: name:;
  slot account-balance :: <integer> = 0;
end;

let a = make(<account>, id: 1, name: "Zippy");
account-balance(a) := 500;
format-out("%s (#%d) balance = %d",
           account-name(a), account-id(a), account-balance(a));

Macros

define macro inc!
    { inc!(?var:name) } => { inc!(?var, 1) }
    { inc!(?var:name, ?val:expression) } => { ?var := ?var + ?val }
end;

let x = 0;
inc!(x);
inc!(x, 10);
format-out("x = %d\n", x);

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

Enlaces:

https://opendylan.org/
https://play.opendylan.org/

domingo, 23 de junio de 2024

El lenguaje de programación D

 


Según el sitio oficial, el lenguaje D es:

Un lenguaje de programación de propósito general con escritura estática, acceso a nivel de sistemas y sintaxis similar a C.

Después de la creación del lenguaje C muchos otros lenguajes como C++ o C# proclamaban ser el real sucesor. Sin embargo, el lenguaje D aprendió de los error de C++ y clama ser el real sucesor de C.

En primer lugar:

  • Conserva la esencia de C/C++.
  • Capaz de hacer código de bajo nivel como C/C++.
  • Omite algunos aspectos de C/C++.
  • Conserva la herencia, pero solo la simple.
  • Uso de plantillas como C++.
  • Soporta la programación funcional.
  • Manejo de memoria (recolección de basura).
  • Interacción con la API de C.

Para probar este lenguaje sin tener que instalarlo debes visitar este sitio:

https://tour.dlang.org/

Ejemplo. Crear el hola, mundo en D.

holamundo.d

import std.stdio;

void main(string[] args)
{
    writeln("Hola, mundo en D");
}

A primera vista es similar a un programa hecho en C.

Ejemplo. Sumar dos números enteros.

suma.d

import std.stdio;

/*
  Sumar dos números en lenguaje D
*/

void main(string[] args)
{
    int x = 0;
    int y = 21;
    
    if(x == 0){
        x = 31;
    }
    
    int suma = x + y;
    writef("La suma de %d y %d es: %d", x,y,suma);

}

Declarar variables es de manera idéntica a la que se hace en C.

Tipos de datos básicos en D:

  • bool, byte, ubyte, char 
  • short, ushort, wchar
  • int, uint, dchar
  • long, ulong
  • float, double, real

Ejemplo. Mostrar el elemento 2 de un arreglo de cadenas.

saludo.d

import std.stdio;

void main(string[] args)
{
    string[] nombre = ["Miguel","Oscar","Karla"];
    writef("Hola, %s", nombre[2]);

}

Ejemplo. Uso de sentencias condicionales (if, switch)

seleccion.d

import std.stdio : writeln;


void main(string[] args)
{
    if (1 == 1)
        writeln("Esto siempre será verdadero");

    int c = 5;
    switch(c) {
        case 0: .. case 9:
            writeln(c, " entre 0 y 9");
            break; 
        case 10:
            writeln("10");
            break;
        default: 
            writeln("Ningún caso");
            break;
    }
}

En D existen estas sentencias de flujo de control selectivas:

  • if-else
  • switch

Ejemplo. Obtener la media de una matriz de números.

recorrer.d

import std.stdio : writefln;



void main() {

    auto arr = [

        [5, 15],      // 20

        [2, 3, 2, 3], // 10

        [3, 6, 2, 9], // 20

    ];



    foreach (i, row; arr)

    {

        double total = 0.0;

        foreach (e; row)

            total += e;



        auto avg = total / row.length;

        writefln("Promedio [row=%d]: %.2f", i, avg);

    }

}

Continuaremos con este tema en próximas entregas.

Enlaces:

https://dlang.org/
https://tour.dlang.org/
http://www.dsource.org/

sábado, 22 de junio de 2024

GCP: Recorrer consultas con FOR en BigQuery

(GCP) BigQuery posee un lenguaje propio similar al PL/SQL de Oracle. Con este lenguaje podemos realizar diversas operaciones con los datos de las tablas.

Desde simples consultas (SELECT), inserciones de datos (INSERT), actualizaciones (UPDATE) y hasta eliminar datos (DELETE). También operaciones de creación (CREATE) o truncado (TRUNCATE).

Además de contar con diversas funciones de cadena, tiempo, matemáticas, etc. que nos pueden servir para distintos fines.

SELECT "Hola, mundo en BigQuery!!";

-- Mismo mensaje usando la función FORMAT
SELECT ('%s', "Hola, mundo en BigQuery!!");

¿Qué podemos hacer con este lenguaje de BigQuery?

Podemos validar si un campo es nulo:

-- Recordar que cada bloque tiene un inicio y un fin
BEGIN
  -- Declaramos una variable de tipo INTEGER
  DECLARE resultado INT64;
  -- Seteamos el resultado de la consulta a la variable resultado
  SET resultado = (SELECT COUNT(campo) FROM `PROJECT.DATASET.Tabla`);
  -- Verificamos si el resultado es null
  IF resultado IS NULL THEN
     SELECT FORMAT('%s', 'El resultado es NULL');
  END IF;

END;

Podríamos recorrer el resultado de una consulta con un bucle FOR ... DO

BEGIN
   -- Declaramos las variables
   DECLARE fecha DATE;
   DECLARE resultado INT64;

   -- Seteamos fecha
   fecha = '2013-04-12';

   -- Recorremos resultado de consulta, similar al CURSOR de PL/SQL de Oracle
   FOR rowI IN(SELECT campo FROM `PROJECT.DATASET.TablaContable` WHERE fch = fecha)
    DO
  -- Seteamos el valor rescuperado en la variable resultado
  SET resultado = rowI[0];
  SELECT FORMAT('Recuperamos el valor: %d', resultado);
  -- Realizamos una actualización en otra tabla
  UPDATE `PROJECT.DATASET.TablaContableTemp` SET campo = resultado
  WHERE fch = fecha; 

END FOR;

END;

Recordar que es necesario que cada bloque empiece con la palabra BEGIN y termine con la palabra END con punto y coma. Misma regla aplica cuando uno crear un Stored Procedure.

-- Stored Procedure para actualizar tabla: TABLACONTABLETEMP
CREATE OR REPLACE PROCEDURE  `PROJECT.DATASET.ActualizaTablaContableTemp`(fecha DATE)
BEGIN
   -- Declaramos las variables
   DECLARE resultado INT64;

   -- Recorremos resultado de consulta, similar al CURSOR de PL/SQL de Oracle
   FOR row IN(SELECT campo FROM `PROJECT.DATASET.TablaContable` WHERE fch = fecha)
    DO
  -- Seteamosel valor rescuperado en la variable resultado
  SET resultado = row[0];
  SELECT FORMAT('Recuperamos el valor: %d', resultado);
  -- Realizamos una actualización en otra tabla
  UPDATE `PROJECT.DATASET.TablaContableTemp` SET campo = resultado
  WHERE fch = fecha; 

END FOR;

END;

Para invocarlo bastaría esta línea:

CALL`PROJECT.DATASET.ActualizaTablaContableTemp`('2013-04-12');

Más ejemplos en próximas entregas.

Enlaces:

https://codemonkeyjunior.blogspot.com/2024/06/gcp-funciones-matematicas-de-cadena-y.html

Gradle: creando un proyecto C++ (2)

Hace tiempo vimos como crear un proyecto en C++ usando Gradle.

Creamos un directorio:

mkdir holamundo

Nos ubicamos en el directorio creado:

cd holamundo

Creamos el proyecto:

gradle init

Elegimos estas opciones:

PS C:\Users\HP\Documents\pruebasGradle\holamundo> gradle init

Select type of build to generate:
  1: Application
  2: Library
  3: Gradle plugin
  4: Basic (build structure only)
Enter selection (default: Application) [1..4] 1

Select implementation language:
  1: Java
  2: Kotlin
  3: Groovy
  4: Scala
  5: C++
  6: Swift
Enter selection (default: Java) [1..6] 5

Project name (default: holamundo):

Select build script DSL:
  1: Kotlin
  2: Groovy
Enter selection (default: Kotlin) [1..2] 2

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] no


> Task :init
To learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.8/samples/sample_building_cpp_applications.html

Nos ubicamps en la carpeta app:

cd app

Este será el contenido del archivo gradle.build:

plugins {
    // Apply the cpp-application plugin to add support for building C++ executables
    id 'cpp-application'

    // Apply the cpp-unit-test plugin to add support for building and running C++ test executables
    id 'cpp-unit-test'
}

// Set the target operating system and architecture for this application
application {
    targetMachines.add(machines.windows.x86_64)
}

Editamos el programa:

app.cpp

#include <iostream>
#include <stdlib.h>
#include "app.h"

std::string holamundo::Greeter::greeting() {
    return std::string("Hola, mundo desde C++ y Gradle!");
}

int main () {
    holamundo::Greeter greeter;
    std::cout << greeter.greeting() << std::endl;
    return 0;
}

Construimos:

gradle build

Ejecutamos:

./app/build/exe/main/debug/app.exe

Salida:

Hola, mundo desde C++ y Gradle!

Editamos los archivos:

  • app.h 
  • app.cpp

Crearemos una nueva función que calcule el número de pulsaciones de una persona. Las variables de entrada de la función serán: edad y peso de la persona.

app.h

/*
 * This source file was generated by the Gradle 'init' task
 */

#ifndef APP_H
#define APP_H

#include <string>

namespace holamundo {
    class Greeter {
        public:
        std::string greeting();
        double pulsations(double weigth, int age);
    };
}

#endif

app.cpp

/*
 * This source file was generated by the Gradle 'init' task
 */

#include <iostream>
#include <stdlib.h>
#include "app.h"

std::string holamundo::Greeter::greeting() {
    return std::string("Hola, mundo desde C++ y Gradle!");
}

double holamundo::Greeter::pulsations(double weight, int age) {
    return 210 - (0.5 * age) - (0.11 * weight);
}

int main () {
    holamundo::Greeter greeter;
    std::cout << greeter.greeting() << std::endl;
    std::cout <<"Pulsaciones: "<< greeter.pulsations(56.0,42) << std::endl;
    return 0;
}

Construimos y ejecutamos:

gradle build
./app/build/exe/main/debug/app.exe

Salida:

Hola, mundo desde C++ y Gradle!
Pulsaciones: 182.84

Como se puede observar han habido algunos cambios a la hora de crear el proyecto. Además que ya no podemos usar la GUI de Gradle.

Enlaces:

https://codemonkeyjunior.blogspot.com/2021/09/gradle-creando-un-proyecto-c.html

domingo, 16 de junio de 2024

GCP: Funciones matemáticas , de cadena y tiempo en BigQuery

En esta ocasión veremos cómo usar algunas de las funciones propias de BigQuery. Tanto en consultas, bloques, stored procedures y nuestras propias funciones.

Veremos:

  • Funciones matemáticas: RAND, POW, COS, SIN, etc.
  • Funciones de cadena: FORMAT, REPLACE, TRIM, CHAR_LENGTH, CONCAT, etc.
  • Funciones de manejo del tiempo: CURRENT_TIME, TIME, EXTRACT, FORMAT_TIME, etc.

Para hacer uso de las funciones solo debemos hacer uso de SELECT seguido de la función que queremos emplear:

Funciones matemáticas:

-- Consultas matemáticas
SELECT RAND(); -- generará un número aleatorio de tipo FLOAT64

SELECT POW(3,2); -- 3 elevado a la 2da potencia

SELECT COS(3); -- Coseno de 3 

SELECT SIN(-2); -- Seno de -2 

Funciones de cadena:

-- Consultas de cadena

SELECT TRIM(" Este es un ejemplo de la función trim "); -- quitará los espacios de la cadena

SELECT CHAR_LENGTH("Ferrocarrilero");-- la longitud será de 14 caracteres

SELECT LOWER("ANITA LAVA LA TINA"); -- anita lava la tina

SELECT UPPER("una pequeña gacela"); -- UNA PEQUEÑA GACELA

SELECT REPLACE("Maria", 'i','y'); -- Marya

Funciones de tiempo:

-- Consultas de tiempo

SELECT CURRENT_TIME AS now; -- mostrará el tiempo actual

SELECT TIME(15,30,00) as hora; -- mostrará la hora en formato hh:mm:ss

Empecemos con los bloques en BigQuery:

BEGIN 
-- Código BigQuery
END;

Como se puede observar, es similar a como lo hacemos en PL/SQL de Oracle.

Ejemplo. Crear un bloque BigQuery que verifique el tamaño de una cadena y si es mayor a cero, que la muestre.

BEGIN 
  
  -- Declaramos una variable llamada nombre de tipo String
  DECLARE nombre STRING;

  -- Asignamos un valor a la variable nombre
  SET nombre = "MARIA";
   
  -- Obtenemos el tamaño de la cadena y verificamos que sea mayor a cero
  IF CHAR_LENGTH(nombre) > 0 THEN
     SELECT FORMAT('Hola %s',nombre);
  END IF;
   
END;

Ejemplo. Crear un bloque BigQuery en el que se calcule la potecia de un número elevado a otro número. Para eso usaremos la función ``POW``.

BEGIN

  DECLARE x FLOAT64;
  DECLARE y FLOAT64;

  SET x = 54;
  SET y = 32;

  IF y < 0 THEN
    SELECT "REVISAR DATOS";
  ELSE
    SELECT FORMAT('La potencia del no. %f elevado a %f nos da: %f', x,y, (SELECT POW(x,y)));
  END;
  

END;

Podríamos crear tanto stored como funciones que implementen esas funciones propias de BigQuery.

Ejemplo. Crear un stored procedure BigQuery que genere un número aleatorio y tenga como entrada un número flotante. Si ambos números so iguales, mostrar un mensaje de logrado. En caso contrario, pedir que se intente nuevamente.

CREATE OR REPLACE PROCEDURE `project.dataset.adivinaNumero`(numero FLOAT64)
BEGIN
  DECLARE aleatorio FLOAT64;
  -- Generamos número aleatorio
  SET aleatorio = (SELECT RAND());
    

  -- Verificamos si son iguales
  IF numero = aleatorio THEN
      SELECT FORMAT('%f, bien hecho', aleatorio);
  ELSE
     SELECT FORMAT('%f, intenta de nuevo', numero);
  END IF;

END;

Para invocar procedimeinto:

CALL `project.dataset.adivinaNumero`(0.53332);

En próximas entregas veremos más ejemplos.

Enlaces:

https://codemonkeyjunior.blogspot.com/2024/05/gcp-crear-stored-procedures-y-funciones.html

lunes, 10 de junio de 2024

Apex: un lenguaje de programación orientado a objetos

Apex es un lenguaje de programación orientado a objetos desarrollado por Salesforce para el desarrollo de aplicaciones en su plataforma de gestión de relaciones con clientes (CRM).

Características de Apex:

  1. Orientado a Objetos:

    • Apex es un lenguaje de programación orientado a objetos, lo que significa que permite a los desarrolladores definir clases, interfaces y métodos.
  2. Fuertemente Tipado:

    • Apex es un lenguaje fuertemente tipado, lo que significa que las variables deben declararse con un tipo de dato específico y no se permite cambiar el tipo una vez declarado.
  3. Sintaxis Similar a Java y C#:

    • La sintaxis de Apex es similar a la de Java y C#, lo que facilita la adopción para desarrolladores familiarizados con estos lenguajes.
  4. Integración Profunda con Salesforce:

    • Apex está diseñado para integrarse estrechamente con la plataforma Salesforce, permitiendo a los desarrolladores interactuar con la base de datos de Salesforce y otros servicios de la plataforma.
  5. Ejecución en la Nube:

    • El código Apex se ejecuta en la infraestructura de Salesforce, lo que significa que los desarrolladores no necesitan preocuparse por la gestión de servidores o la infraestructura subyacente.
  6. Eventos y Triggers:

    • Apex permite definir triggers, que son fragmentos de código que se ejecutan automáticamente en respuesta a eventos específicos en la base de datos de Salesforce, como inserciones, actualizaciones o eliminaciones de registros.

Usos Principales de Apex:

  1. Desarrollo de Aplicaciones Personalizadas:

    • Los desarrolladores pueden crear aplicaciones personalizadas que se ejecutan en la plataforma Salesforce, utilizando Apex para la lógica del negocio y Visualforce o Lightning Components para la interfaz de usuario.
  2. Automatización de Procesos:

    • Apex se utiliza para automatizar procesos de negocio complejos que no pueden ser manejados por las herramientas de automatización de Salesforce como Process Builder o Flows.
  3. Integración con Otros Sistemas:

    • Apex permite integrar Salesforce con otros sistemas y servicios a través de APIs web, lo que facilita la comunicación y la sincronización de datos entre diferentes plataformas.
  4. Manipulación de Datos:

    • Apex proporciona capacidades avanzadas para manipular datos en la base de datos de Salesforce, incluyendo la creación, lectura, actualización y eliminación de registros.

Ejemplo. Calcular el número de pulsaciones de una persona. Los datos de entrada serán:

  • Edad.
  • Peso y
  • Nombre.
public class HeartRateCalculator {
    // Método para calcular el número de pulsaciones por minuto
    public static Double calculateHeartRate(Integer age, Double weight) {
        // Aplicar la fórmula para calcular las pulsaciones
        Double heartRate = 210 - (0.5 * age) - (0.11 * weight);
        return heartRate;
    }
    
    // Método para ejecutar algunos cálculos de ejemplo
    public static void runExample() {
        // Datos de prueba
        Integer[] ages = new Integer[]{25, 30, 40, 35};
        Double[] weights = new Double[]{70.0, 60.0, 80.0, 55.0};
        String[] names = new String[]{"Juan", "Maria", "Pedro", "Ana"};
        
        // Iterar sobre los datos de prueba y calcular las pulsaciones
        for (Integer i = 0; i < ages.size(); i++) {
            Double heartRate = calculateHeartRate(ages[i], weights[i]);
            System.debug('Nombre: ' + names[i] + ', Edad: ' + ages[i] + ', Peso: ' + weights[i] + ', Pulsaciones: ' + heartRate);
        }
    }
}

A primera vista parece ser un código hecho en Java. Apex posee una sintaxis similar a ese lenguaje por lo que a los programadores Java no podría causarles mucha dificultad aprender a usarlo.

Tipos de Datos Primitivos

  1. Integer:

    • Representa números enteros. Ejemplo: Integer age = 25;
  2. Double:

    • Representa números de punto flotante de doble precisión. Ejemplo: Double price = 19.99;
  3. Long:

    • Representa números enteros de mayor tamaño que Integer. Ejemplo: Long distance = 123456789L;
  4. Decimal:

    • Representa números decimales de alta precisión. Útil para cálculos financieros. Ejemplo: Decimal salary = 12345.67;
  5. String:

    • Representa una cadena de caracteres. Ejemplo: String name = 'John Doe';
  6. Boolean:

    • Representa un valor de verdadero o falso. Ejemplo: Boolean isActive = true;
  7. Date:

    • Representa una fecha. Ejemplo: Date today = Date.today();
  8. Time:

    • Representa una hora sin fecha. Ejemplo: Time now = Time.now();
  9. Datetime:

    • Representa una fecha y una hora. Ejemplo: Datetime now = Datetime.now();
  10. ID:

    • Representa un identificador único de un registro en Salesforce. Ejemplo: ID recordId = '001D000000IRFMA';

Colecciones

List

List<String> names = new List<String>{'Alice', 'Bob', 'Charlie'};

Set

Set<Integer> uniqueNumbers = new Set<Integer>{1, 2, 3};

Map

Map<String, Integer> nameToAge = new Map<String, Integer>{'Alice' => 30, 'Bob' => 25};

sObject

Account acc = new Account(Name = 'Acme Corporation');

Enumerations (Enum)

public enum Weekdays {
    Monday, Tuesday, Wednesday, Thursday, Friday
}
Weekdays today = Weekdays.Monday;

Classes

public class Person {
    public String name;
    public Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
Person p = new Person('John Doe', 30);

Ejemplo. Uso de tipos en Apex.

public class Example {
    public static void runExample() {
        // Primitivos
        Integer age = 25;
        Double price = 19.99;
        String name = 'John Doe';
        Boolean isActive = true;
        Date today = Date.today();
        Time now = Time.now();
        Datetime currentTime = Datetime.now();
        ID recordId = '001D000000IRFMA';

        // Colecciones
        List<String> names = new List<String>{'Alice', 'Bob', 'Charlie'};
        Set<Integer> uniqueNumbers = new Set<Integer>{1, 2, 3};
        Map<String, Integer> nameToAge = new Map<String, Integer>{'Alice' => 30, 'Bob' => 25};

        // sObject
        Account acc = new Account(Name = 'Acme Corporation');

        // Enum
        public enum Weekdays {
            Monday, Tuesday, Wednesday, Thursday, Friday
        }
        Weekdays today = Weekdays.Monday;

        // Custom class
        public class Person {
            public String name;
            public Integer age;

            public Person(String name, Integer age) {
                this.name = name;
                this.age = age;
            }
        }
        Person p = new Person('John Doe', 30);

        // Debugging outputs
        System.debug('Age: ' + age);
        System.debug('Price: ' + price);
        System.debug('Name: ' + name);
        System.debug('Is Active: ' + isActive);
        System.debug('Today: ' + today);
        System.debug('Current Time: ' + currentTime);
        System.debug('Record ID: ' + recordId);
        System.debug('Names: ' + names);
        System.debug('Unique Numbers: ' + uniqueNumbers);
        System.debug('Name to Age Map: ' + nameToAge);
        System.debug('Account: ' + acc);
        System.debug('Today is: ' + today);
        System.debug('Person: ' + p.name + ', Age: ' + p.age);
    }
}

Esto solo es un vistazo al lenguaje, en próximas entregas continuaremos con el tema.

Enlaces:

https://www.salesforce.com/mx/

Vibe Coding (la programación vía IA): ¿el futuro de la programación?

Vibe Coding es un nuevo paradigma de programación, una nueva forma de crear código. Es un enfoque emergente en el desarrollo de sof...

Etiquetas

Archivo del blog