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/