Mostrando entradas con la etiqueta javascript. Mostrar todas las entradas
Mostrando entradas con la etiqueta javascript. Mostrar todas las entradas

viernes, 21 de marzo de 2025

Funciones Javascript en BigQuery

 

BigQuery permite crear Stored Procedures y/o funciones usando como lenguaje base a Javascript. En este post veremos las UDF o las funciones definidas por el usuario.

Una función definida por el usuario (UDF) nos permite crear una función mediante una expresión SQL o código JavaScript.

Una UDF puede ser:

  1. Persistente o 
  2. Temporal (en el alcance de una única consulta).

Aquí podemos ver un ejemplo sacado de la página de documentación oficial de GCP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
CREATE TEMP FUNCTION multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS r"""
  return x*y;
""";

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, multiplyInputs(x, y) AS product
FROM numbers;

Se trata de una UDF temporal (usando TEMPORARY o TEMP)  que multiplica dos números tipo FLOAT64. Dentro del privote ``numbers`` habrá dos uniones con los datos a trabajar; invocaremos la función mediante una consulta SELECT y asignará el resultado como ``product``.

Tipos de datos permitidos

 Tipos de datos en BigQuery   Tipos de datos en Javascript  
 ARRAY  ARRAY
 BOOL  BOOLEAN
 BYTES  STRING base 64
 NUMERIC, BIGNUMERIC  Valor punto flotante
 STRING  STRING
 STRUCT  OBJECT
 TIMESTAMP  DATE
 DATE  DATE
 JSON  OBJECTS, ARRAY

Recordar que en Javascript no existen los tipos de manera explícita.

Ejemplo 1. Crearemos una función (persistente) BigQuery que use JS como lenguaje base para obtener la longitud de una cadena.

1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION `myproject.mydataset.longitud`(input STRING) RETURNS STRING LANGUAGE js AS '''
   if(input === '' || input ===null){
      return "La cadena tiene una longitud de 0 caracteres.";
   }else{
      return "La cadena tiene una longitud de: "+input.length+" caracteres.";
   }
'''

Para hacer uso de ella la invocaremos de esta forma:

1
2
DECLARE cadena STRING DEFAULT '';
SELECT `myproject.mydataset.longitud`(cadena) as resultado; 

El dato de entrada será la variable ``cadena`` cuyo valor será vacío. Lo que nos devolverá:

1
La cadena tiene una longitud de: 0 caracteres.

Está función obtiene la longitud de una cadena introducida por el usuario. No mucho por explicar.

Ejemplo 2. Crear una sencilla función para evaluar si una condición o valor booleano es "correcta" si es true, "incorrecta" si es false.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
CREATE OR REPLACE FUNCTION `myproject.mydataset.checkAssert`(condition BOOL) RETURNS STRING LANGUAGE js AS '''

  var result = "Evaluacion: "+condition+".";

  if(condition){
    result += " Es correcta.";
  }else{
    result += " Es incorrecta.";
  } 

  return result;

'''

Invocamos la función:

1
2
3
4
DECLARE condition BOOL;
SET condition= 34 > 0;

SELECT `myproject.mydataset.checkAssert`(condition) AS resultado ;

Hacer uso de UDF con Javascript como lenguaje base puede ayudarnos a resolver tareas que quizás de una manera más nativa sería algo más complicado.

Continuaremos con este tema en próximas entregas.

Enlaces:

https://cloud.google.com/bigquery/docs/user-defined-functions
https://stackoverflow.com/questions/62271743/bringing-in-a-function-from-javascript-to-big-query-standardsql
https://hoffa.medium.com/new-in-bigquery-persistent-udfs-c9ea4100fd83
https://briangrinstead.com/blog/js-functions-bigquery/

domingo, 18 de febrero de 2024

Un programa en varios lenguajes

 

Esta ocasión veremos un ejemplo de programa escrito en varios lenguajes de programación como: Java, Erlang, Python, Powershell, Clojure y otros más.

Ejercicio: Un programa que determine si una cadena ("ABC") tiene una longitud distinta de cero. Si la longitud de cadena es distinta de cero, que imprima la cadena en pantalla. Si no cumple la condición deberá mandar el mensaje: "Cadena vacía".

En pseudo código sería algo como esto:

// Pseudo code language
prog longitud:{
     var cadena:String = "ABC";
     var longitud:Int = cadena.size;
     if longitud != 0 then
        disp "${cadena}"
     else
        disp "Cadena vacía"
}


Por temas de espacio algunos bloques de código son omitidos para no hacer más grande el código, usted disculpe.

En Powershell:

longitud.ps1

$cadena="ABC"

if($cadena.Length -ne 0){
   Write-Host $cadena  
}
else{
   Write-Host "Cadena vacia"
}

En Clojure:

longitud.clj

(ns longitud)

(def cadena "ABC")
(def longitud (count cadena))
(if (not= longitud 0)
   (println cadena)
   (println "Cadena vacia")
)

En Erlang:

longitud.erl

-module(longitud).
-author("Codemonkey Junior Blogspot").
-version("1.0.0").
-export([start/0]).

println(Cosa) -> io:format("~p~n", [Cosa]).

start()->
    Cadena="ABC",
    Longitud=string:length(Cadena),
    if 
     Longitud /= 0 ->
       println(Cadena);
    true ->
       println("Cadena vacia")
    end.

En OpenEdge ABL:

longitud.p

define var as char no-undo initial "ABC".

if length(cadena)<>0 then
   disp cadena.
else
   disp "Cadena vacia".

En Rust:

longitud.rs

let cadena:String = String::from("ABC");

if cadena.chars().count()!=0 {
   println!("{}",cadena)
}
else{
   println!("Cadena vacia")
}

En PL/SQL:

longitud.sql

SET SERVEROUTPUT ON
DECLARE
  cadena varchar2(3):='ABC';
  BEGIN
       IF LENGTH(cadena) != 0 THEN
          dbms_output.put_line(cadena);
       ELSE
          dbms_output.put_line('Cadena vacia');
       END IF;
  END;
/

En Elixir:

longitud.exs

cadena = "ABC"

if String.length(cadena) != 0 do
  IO.puts "#{cadena}"
else
  IO.puts "Cadena vacia"
end

En R:

longitud.r

cadena <- "ABC"

if(nchar(cadena) != 0) {
  sprintf("%s",cadena)
}else{
  print("Cadena vacia")
}

En DataStage BASIC:

longitud.dsx

Option Explicit

' Declaración de variables
Dim cadena As String

' Asignación de valor a la variable
cadena = "ABC"

' Verificación de la longitud de la cadena
If Len(cadena) <> 0 Then
    ' Imprimir la cadena si no está vacía
    Print cadena
Else
    ' Imprimir un mensaje si la cadena está vacía
    Print "Cadena vacia"
End If

En Ballerina:

longitud.bal

import ballerina/io;

public function main() {
    string cadena = "ABC";

    if (lengthof cadena != 0) {
        io:println(cadena);
    } else {
        io:println("Cadena vacia");
    }
}

En C:

longitud.c

#include <stdio.h>
#include <string.h>

int main() {
    char cadena[] = "ABC";

    if (strlen(cadena) != 0) {
        printf("%s\n", cadena);
    } else {
        printf("Cadena vacia\n");
    }

    return 0;
}

En C++:

longitud.cpp

#include <iostream>
#include <string>

int main() {
    std::string cadena = "ABC";

    if (!cadena.empty()) {
        std::cout << cadena << std::endl;
    } else {
        std::cout << "Cadena vacia" << std::endl;
    }

    return 0;
}

En Haskell:

longitud.hs

main :: IO ()
main = do
    let cadena = "ABC"
    if length cadena /= 0
        then putStrLn cadena
        else putStrLn "Cadena vacia"

En Prolog:

longitud.pl

cadena_valida('ABC') :- write('ABC').
cadena_valida('') :- write('Cadena vacia').

main :- cadena_valida('ABC').

En Python:

longitud.py

cadena="ABC"
if len(cadena) !=0:
   print(cadena) 
else:
   print("Cadena vacia")

Este post se irá actualizando... see you later !!

domingo, 8 de mayo de 2022

Katas en programación (un solo programa en distintos lenguajes)

 

En este post crearemos un mismo programa usando lenguajes como Java, Elixir, Erlang, Javscript, Perl, Python y otros más.

Ejercicio. Crear tres funciones:

  • Función 1 para calcular  1.8 * numero, donde numero es la variable con el valor que introduce el usuario.
  • Función 2 para calcular 1000 + (x + y), donde x & y son las variables que contendrán los valores que introducirá el usuario.
  • Función 3 para calcular la suma de x+y+z

Código en Perl

 funciones.pl

#!/usr/bin/perl

use strict;
use warnings;
use constant MAX => 1000;
use constant VALOR => 1.8;

my($x,$y,$z);

$x=3;
$y=2;
$z=4;

print "Datos:\nx=",$x,", y=",$y,", z=",$z,"\n";


sub func1{
  return VALOR * $_[0];
}

sub func2{
  return MAX +($_[0]+$_[1]);
}

sub func3{
  return $_[0]+$_[1]+$_[2];
}

print "Resultado 1: ",func1($x),"\n";
print "Resultado 2: ",func2($y,$z),"\n";
print "Resultado 3: ",func3($x,$y,$z),"\n";

 

Código en Erlang

funciones.erl

-module(funciones).
-author("Codemonkey Junior").
-version("1.0.0").
-export([func1/1,func2/2,func3/3]).
-define(MAX,1000).
-define(VALOR,1.8).

func1(X)-> X*?VALOR.

func2(X,Y)-> ?MAX +(X+Y).

func3(X,Y,Z)-> X+Y+Z. 

Funcionando:

1> c(funciones).
{ok,funciones}
2> funciones:func1(3).
5.4
3> funciones:func2(3,9).
1012
4> funciones:func3(3,9,9).
21
5> 

Código en Elixir

funciones.exs

defmodule Constante do
  def mMAX, do: 1000
  def mVALOR, do: 1.8
end


x=2
y=4
z=5

IO.puts "Datos:\n x= #{x}, y= #{y}, z= #{z}"

func1 = fn (num) -> Constante.mVALOR*num end
func2 = fn (a,b) -> Constante.mMAX+(a+b) end
func3 = fn (a,b,c) -> a+b+c end

result1 = func1.(x)
result2 = func2.(z,y)
result3 = func3.(x,y,z)

IO.puts "Resultado 1: #{result1}"
IO.puts "Resultado 2: #{result2}"
IO.puts "Resultado 3: #{result3}"
 
Código en C#

Funciones.cs

using System;
        
public class Funciones
{

  public static readonly int MAX = 1000;
  public static readonly double VALOR = 1.8;


  public static double Func1(int num)
  {
    return VALOR * num;
  }

  public static int Func2(int x, int y)
  {
    return MAX +(x+y);
  }

  public static int Func3(int x, int y, int z)
  {
    return x+y+z;
  }

  public static void Main()
  {
    Console.WriteLine("Resultado 1: {0}",Func1(3));
    Console.WriteLine("Resultado 2: {0}",Func2(4,7));
  }

}

 

Código en C

funciones.c

#include<stdio.h>
#define VALOR 1.8
#define MAX 1000

int func1(int);
int func2(int,int);
int func3(int,int,int);


int func1(int num){
  return VALOR*num;
}

int func2(int x,int y){
  return MAX +(x+y);
}

int func3(int a,int b,int c){
  return a+b+c;
}

int main(int argc, char *argv[]){
  printf("Resultado 1:%d\n",func2(4,3));
  printf("Resultado 2:%d\n",func1(2));
  printf("Resultado 3:%d\n",func3(2,5,6));
  return 0;
}

Enlaces:

https://es.wikipedia.org/wiki/Kata_(programaci%C3%B3n)

domingo, 5 de diciembre de 2021

100 días de código javascript ... 9na parte



Ejemplo 1.Las expresiones regulares son un mecanismo para encontrar patrones en cadenas de texto. Recorrer un arreglo y mostrar solo la fecha que cumpla el patrón (regex).
let fechas = ["12-09-1990","24:05:2000","25-JUN-2001","08-AGO-1987"];

for(let c in fechas){
  if(/\d\d-\w\w\w-\d\d\d\d/.test(fechas[c])){
     console.log('Cumple:',fechas[c]);
  }
}

Ejemplo 2. Exportar e importar archivos JS.
titulo_export.js
const titulo = "El retrato de una odisea sin nombre.";

export {titulo};
titulo_import.js
"use strict";

// 1. Primer forma
import {titulo} from './titulo_export.js';

console.log(`Titulo: ${titulo}`);

// 2. Segunda forma
import * as libro from './titulo_export.js';

console.log(`Titulo: ${libro.titulo}`);
Tweets #100daysofcode :

Enlaces:
https://dmitripavlutin.com/javascript-string-trim/
https://vanshsharma.hashnode.dev/difference-bw-forin-and-forof

lunes, 15 de noviembre de 2021

PHP: expresiones regulares y otras cosas

PHP es un lenguaje bastante vilipendiado. No lo neguemos, tú, yo, tus colegas han tenido debates sobre "lo malo" que es el lenguaje. Sin embargo, con la madurez reconocemos que hemos estado equivocados, bastante equivocados. PHP es un lenguaje que ha salido avante a pesar del advenimiento de otros lenguajes de programación modernos. Con este lenguaje puedes crear servicios web, aplicaciones web dinámicas, etc. Tiene centenares o/y miles de Frameworks que facilitan (o complican) la vida del programador. Node JS, Angular... son lo de hoy, pero siempre habrá desarrollos que requieran algún programador que sepa PHP.
Antes de comenzar... instalaremos PHP Cli.
$ sudo apt-get update
$ sudo apt-get install php-cli -y
$ php --version

Las expresiones regulares son mecanismos par hacer coincidir patrones y/o cadenas. Para trabajar con expresiones regulares debemos:
  1. Definir qué patrón se quiere buscar
  2. Cadena donde se quiere buscar ese patrón

Ejemplo. Programa que verifique si las cadenas cumplen un patrón definido.

regex.php
<?php

  // Si empieza con F o f
  $expr1 = "/^F|f/";
  $cadena = "Fernando";
  if(preg_match($expr1, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si son dígitos
  $expr2 ="/[0-9]/";
  $cadena = "123456";
  if(preg_match($expr2, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son caracteres normales 
  $expr3 ="/\W/";
  $cadena = "%&@#!?{}[=";
  if(preg_match($expr3, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si tiene espacios
  $expr4 ="/\s/";
  $cadena = "a b c ";
  if(preg_match($expr4, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no tiene espacios vacíos
  $expr5 ="/\S/";
  $cadena = "abcdef";
  if(preg_match($expr5, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si es un dígito 
  $expr6 ="/\d/";
  $cadena = "12087";
  if(preg_match($expr6, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no es un dígito 
  $expr7 ="/\D/";
  $cadena = "TRES MIL UNO";
  if(preg_match($expr7, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si es un caracter 
  $expr7 ="/\w/";
  $cadena = "El gato tiene 3 patas.";
  if(preg_match($expr7, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son dígitos 
  $expr8 ="/[^0-9]/";
  $cadena = "Whisky";
  if(preg_match($expr8, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son dígitos 
  $expr9 ="/[^a-z]/";
  $cadena = "anita lava la tina";
  if(preg_match($expr9, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

?>
Ejecutando:
$ php -S 127.0.0.1:8080 regex.php
¡Feliz código!
Enlaces:
https://symfony.es/
https://codeigniter.com/
https://cakephp.org/
https://laravel.com/
https://miguelgomezsa.com/blog/laravel-vs-codeigniter
https://carlos-herrera.com/laravel-vs-codeigniter/
https://codemonkeyjunior.wordpress.com/2020/09/06/docker-instalando-imagen-de-php/

lunes, 18 de octubre de 2021

100 días de código javascript ...8va parte

Algunos twitts sobre #100Daysofcode








Enlaces:
https://javascript.info/
https://jsisweird.com/

sábado, 19 de junio de 2021

Node en ejemplos: importando paquetes

 

Node JS es una plataforma que nos permite correr aplicaciones Javascript del lado del servidor.  En post pasados hemos visto su instalación y algunos ejemplos. 

Instalación en distribuciones Ubuntu.


$ curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs

Comprobamos su instalación:
$ npm -v
$ node -v
Paquetes en Node JS.

Un paquete son archivos JS empaquetados. Es una parte fundamental en la reutlización de código.

Node JS nos permite importar paquetes para realizar ciertas funciones especiales, así como importar nuestros propios paquetes.


Ejemplo. Importar el paquete 'path' de Node Js. Para ello necesitamos tener un archivo texto.txt.
const path = require('path');
const print = console.log;

print("Archivo:");
print(path.parse("/home/codemonkey/Documentos/pruebasNodeJS/texto.txt"));
La salida:
Archivo:
{
  root: '/',
  dir: '/home/codemonkey/Documentos/pruebasNodeJS',
  base: 'texto.txt',
  ext: '.txt',
  name: 'texto'
}
Ejemplo. Crear un paquete llamado suma e importarlo en otro archivo denominado test_suma.js.
suma.js
exports.sumar = (x,y) => x+y;
test_suma.js
// Importamos suma.js
const operacion = require('./suma');
var x = 4, y = 3;
console.log(`Suma de ${x} + ${y} es: ${operacion.sumar(x,y)}`);

// Creamos una clase
class Operacion{
   getOperacion(x,y){
      const operacion = require('./suma.js');
      return operacion.sumar(x,y);
   }
}

x = 7;
y = 8;
let my_operacion = new Operacion().getOperacion(x,y);
console.log(`Suma de ${x} + ${y} es: ${my_operacion}`);
Ejecutamos:
$ node test_suma.js
Resultado:
Suma de 4 + 3 es: 7
Suma de 7 + 8 es: 15

Nota:
  Cuando es un paquete de Node JS no es necesario poner el punto y diagonal. Solo cuando es un paquete hecho por nosotros. También se puede omitir la extensión *.js en paquetes propios como se puede ver:
// Importo paquete de Node JS
const path = require("path");

// Importo mi paquete 
const path = require("./saludo");
Y un ejemplo más...
const path = require('path');
const print = console.log;

print("Archivo:");
print(path.parse("/home/codemonkey/Documentos/pruebasNodeJS/texto.txt"));


const saludo = require('./saludo');
saludo.saludo();
saludo.despedida();

const opera = require('./suma');
let x = 87.5;
let y = 45.8;
console.log(`Numeros >> x = ${x}, y = ${y} `);
console.log("Suma: ",opera.sumar(x,y));

const os = require('os');
console.log("Info del sistema:");
console.log("Arquitectura:",os.arch());
console.log("Hostname:",os.hostname());


Enlaces:
https://codemonkeyjunior.blogspot.com/search?q=node
https://nodejs.org

Jai un lenguaje de programación inspirado en C++

Hoy hablaremos de un nuevo lenguaje de programación llamado Jai . Se trata de un lenguaje de programación que está desarrolland...

Etiquetas

Archivo del blog