Translate

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

martes, 24 de marzo de 2026

Consumir una API en Google Sheets


Con Google Sheets y Google Apps Script podés crear funciones personalizadas que consuman APIs externas.

En este ejemplo vamos a obtener el valor del dólar oficial desde: https://dolarapi.com/v1/dolares/oficial

Crear la función:

1. Ir a Extensiones → Apps Script

2. Crear la siguiente función:


function DOLAR_OFICIAL() {

  var url = "https://dolarapi.com/v1/dolares/oficial";

  

  var response = UrlFetchApp.fetch(url);

  var data = JSON.parse(response.getContentText());

  

  return data.venta;

}


Cómo usarla en la hoja:


En cualquier celda:

=DOLAR_OFICIAL()


¿Qué está pasando?

UrlFetchApp.fetch(url) → hace la llamada HTTP

JSON.parse(...) → convierte la respuesta a objeto

data.venta → accede al valor de venta del dólar


Podemos devolver más datos (compra y venta):


function DOLAR_OFICIAL_COMPLETO() {

  var url = "https://dolarapi.com/v1/dolares/oficial";

  

  var response = UrlFetchApp.fetch(url);

  var data = JSON.parse(response.getContentText());

  

  return [

    ["Compra", "Venta"],

    [data.compra, data.venta]

  ];

}


Uso:

=DOLAR_OFICIAL_COMPLETO()


Esto va a llenar dos columnas automáticamente.


domingo, 22 de marzo de 2026

Apps Script en Google Docs


Este post es nada que ver con este blog, pero Apps Script me ha salvado tanto que sería malísimo no compartirlo. 

Google Docs no solo sirve para escribir documentos: también permite automatizar tareas mediante scripts usando Google Apps Script.

Esto te permite agregar lógica personalizada, generar contenido dinámico o incluso integrar servicios externos.

Apps Script es una plataforma basada en JavaScript que corre en la nube y permite extender herramientas como:

  • Google Docs
  • Google Sheets
  • Google Drive
  • Gmail


En el caso de Google Docs, podemos crear funciones que modifiquen el documento o generen contenido automáticamente.


1. Abrí un documento en Google Docs

2. Ir a Extensiones → Apps Script

3. Se abrirá el editor de scripts

4. Escribí tu función y guardá


Vamos a crear una función que reciba un nombre y retorne "Hola " + nombre.


function saludar(nombre) {

  return "Hola " + nombre;

}


A diferencia de Google Sheets, en Docs no podés invocar funciones directamente en el texto como fórmulas. Pero podés:

  • Ejecutarla desde el editor
  • O usarla para insertar contenido en el documento


Por ejemplo, una versión que escribe directamente en el documento:


function insertarSaludo() {

  var doc = DocumentApp.getActiveDocument();

  var body = doc.getBody();

  

  var nombre = "Emanuel";

  var saludo = "Hola " + nombre;

  

  body.appendParagraph(saludo);

}


Podés combinar esto con menús personalizados para ejecutar funciones desde la UI del documento.


function onOpen() {

  DocumentApp.getUi()

    .createMenu('Mis Scripts')

    .addItem('Insertar saludo', 'insertarSaludo')

    .addToUi();

}


Es ideal para: 

  • Generar reportes automáticamente
  • Insertar firmas o textos repetitivos
  • Crear plantillas dinámicas
  • Integrar con APIs externas



miércoles, 18 de marzo de 2026

Puertos en Elm

 


Los puertos permiten la comunicación entre Elm y JavaScript.

Los puertos se utilizan con mayor frecuencia para WebSockets y localStorage. Centrémonos en el ejemplo de WebSockets.

Aquí tenemos prácticamente el mismo HTML que hemos usado en las páginas anteriores, pero con un poco de código JavaScript adicional. Creamos una conexión a wss://echo.websocket.org que simplemente repite lo que le enviamos.

<!DOCTYPE HTML>

<html>


<head>

  <meta charset="UTF-8">

  <title>Elm + Websockets</title>

  <script type="text/javascript" src="elm.js"></script>

</head>


<body>

    <div id="myapp"></div>

</body>


<script type="text/javascript">


// Start the Elm application.

var app = Elm.Main.init({

    node: document.getElementById('myapp')

});


// Create your WebSocket.

var socket = new WebSocket('wss://echo.websocket.org');


// When a command goes to the `sendMessage` port, we pass the message

// along to the WebSocket.

app.ports.sendMessage.subscribe(function(message) {

    socket.send(message);

});


// When a message comes into our WebSocket, we pass the message along

// to the `messageReceiver` port.

socket.addEventListener("message", function(event) {

    app.ports.messageReceiver.send(event.data);

});


// If you want to use a JavaScript library to manage your WebSocket

// connection, replace the code in JS with the alternate implementation.

</script>


</html>


Llamamos a Elm.Main.init() como en todos nuestros ejemplos de interoperabilidad, pero esta vez estamos usando el objeto app resultante. Nos suscribimos al puerto sendMessage y enviamos mensajes al puerto messageReceiver.


Observa las líneas que utilizan la palabra clave port en el archivo Elm correspondiente. Así es como definimos los puertos que acabamos de ver en JavaScript.

port module Main exposing (..)


import Browser

import Html exposing (..)

import Html.Attributes exposing (..)

import Html.Events exposing (..)

import Json.Decode as D




-- MAIN



main : Program () Model Msg

main =

  Browser.element

    { init = init

    , view = view

    , update = update

    , subscriptions = subscriptions

    }





-- PORTS



port sendMessage : String -> Cmd msg

port messageReceiver : (String -> msg) -> Sub msg




-- MODEL



type alias Model =

  { draft : String

  , messages : List String

  }



init : () -> ( Model, Cmd Msg )

init flags =

  ( { draft = "", messages = [] }

  , Cmd.none

  )




-- UPDATE



type Msg

  = DraftChanged String

  | Send

  | Recv String



-- Use the `sendMessage` port when someone presses ENTER or clicks

-- the "Send" button. Check out index.html to see the corresponding

-- JS where this is piped into a WebSocket.

--

update : Msg -> Model -> ( Model, Cmd Msg )

update msg model =

  case msg of

    DraftChanged draft ->

      ( { model | draft = draft }

      , Cmd.none

      )


    Send ->

      ( { model | draft = "" }

      , sendMessage model.draft

      )


    Recv message ->

      ( { model | messages = model.messages ++ [message] }

      , Cmd.none

      )




-- SUBSCRIPTIONS



-- Subscribe to the `messageReceiver` port to hear about messages coming in

-- from JS. Check out the index.html file to see how this is hooked up to a

-- WebSocket.

--

subscriptions : Model -> Sub Msg

subscriptions _ =

  messageReceiver Recv




-- VIEW



view : Model -> Html Msg

view model =

  div []

    [ h1 [] [ text "Echo Chat" ]

    , ul []

        (List.map (\msg -> li [] [ text msg ]) model.messages)

    , input

        [ type_ "text"

        , placeholder "Draft"

        , onInput DraftChanged

        , on "keydown" (ifIsEnter Send)

        , value model.draft

        ]

        []

    , button [ onClick Send ] [ text "Send" ]

    ]




-- DETECT ENTER



ifIsEnter : msg -> D.Decoder msg

ifIsEnter msg =

  D.field "key" D.string

    |> D.andThen (\key -> if key == "Enter" then D.succeed msg else D.fail "some other key"


Fíjate que la primera línea dice "port module" en lugar de simplemente "module". Esto permite definir puertos dentro de un módulo. El compilador ofrece una pista si es necesario, ¡así que esperemos que nadie se quede atascado en esto!


Bien, ¿pero qué ocurre con las declaraciones de puerto para sendMessage y messageReceiver?

La declaración sendMessage nos permite enviar mensajes desde Elm.

port sendMessage: String -> Cmd msg

Aquí declaramos que queremos enviar valores de tipo String, pero podríamos enviar cualquier tipo que funcione con indicadores. 

A partir de ahí, podemos usar sendMessage como cualquier otra función. Si tu función de actualización genera un comando sendMessage "hello", lo recibirás en JavaScript:


app.ports.sendMessage.subscribe(function(message) {

socket.send(message);

});


Este código JavaScript se suscribe a todos los mensajes salientes. Puedes suscribir varias funciones y cancelar suscripciones por referencia, pero generalmente recomendamos mantener la configuración estática.

También recomendamos enviar mensajes más completos, en lugar de crear múltiples puertos individuales. Esto podría implicar tener un tipo personalizado en Elm que represente todo lo que necesites comunicar a JavaScript, y luego usar Json.Encode para enviarlo a una única suscripción de JavaScript. Muchos consideran que esto crea una separación de responsabilidades más clara. El código de Elm gestiona claramente parte del estado, y JavaScript gestiona otra parte.


La declaración messageReceiver nos permite escuchar los mensajes que llegan a Elm.


messageReceiver: (String -> msg) -> Sub msg


Estamos indicando que vamos a recibir valores de tipo String, pero también podemos escuchar cualquier tipo que pueda llegar a través de indicadores o puertos de salida. Simplemente reemplazamos el tipo String por uno de los tipos que pueden cruzar el límite.


Podemos usar messageReceiver como cualquier otra función. En nuestro caso, llamamos a messageReceiverRecv al definir nuestras suscripciones porque queremos recibir mensajes entrantes de JavaScript. Esto nos permitirá recibir mensajes como Recv "¿cómo estás?"` en nuestra función de actualización.


En JavaScript, podemos enviar datos a este puerto cuando queramos:


socket.addEventListener("message", function(event) {

    app.ports.messageReceiver.send(event.data);

});


En este caso, enviamos mensajes cada vez que el websocket recibe uno, pero también se pueden enviar en otros momentos. Quizás también estemos recibiendo mensajes de otra fuente de datos. Está bien, ¡y Elm no necesita saber nada al respecto! Simplemente envía las cadenas a través del puerto correspondiente.


Los puertos sirven para establecer límites claros. Definitivamente, no intentes crear un puerto para cada función de JavaScript que necesites. Puede que te guste mucho Elm y quieras hacerlo todo con él, cueste lo que cueste, pero los puertos no están diseñados para eso. En su lugar, concéntrate en preguntas como "¿quién controla el estado?" y usa uno o dos puertos para enviar y recibir mensajes. Si te encuentras en un escenario complejo, incluso puedes simular valores de Msg enviando JavaScript como `{ tag: "active-users-changed", list: ... }`, donde tienes una etiqueta para cada variante de información que podrías enviar.


Aquí tienes algunas pautas sencillas y errores comunes:


Se recomienda enviar `Json.Encode.Value` a través de puertos. Al igual que con las banderas, ciertos tipos básicos también pueden pasar a través de puertos. Esto es de la época anterior a los decodificadores JSON, y puedes leer más al respecto aquí.


Todas las declaraciones de puertos deben aparecer en un módulo de puerto. Probablemente sea mejor organizar todos los puertos en un solo módulo para que la interfaz sea más fácil de visualizar en un solo lugar.


Los puertos son para aplicaciones. Un módulo de puerto está disponible en las aplicaciones, pero no en los paquetes. Esto garantiza que los desarrolladores de aplicaciones tengan la flexibilidad que necesitan, pero el ecosistema de paquetes está completamente escrito en Elm. Creemos que esto creará un ecosistema y una comunidad más sólidos a largo plazo, y analizaremos las ventajas y desventajas en profundidad en la siguiente sección sobre los límites de la interoperabilidad entre Elm y JavaScript.


Los puertos pueden eliminarse como código muerto. Elm tiene un sistema de eliminación de código muerto bastante agresivo y eliminará los puertos que no se utilicen dentro del código Elm. El compilador desconoce lo que sucede en JavaScript, así que intente conectar las cosas en Elm antes que en JavaScript.


miércoles, 4 de marzo de 2026

Elm y su Interoperabilidad con JavaScript

 


Ya hemos visto la arquitectura de Elm: tipos, comandos, suscripciones e incluso tenemos Elm instalado localmente.

Pero ¿qué sucede cuando necesitas integrarlo con JavaScript? Quizás exista una API de navegador que aún no tenga un paquete Elm equivalente. ¿Quizás quieras integrar un widget JavaScript en tu aplicación Elm? Veamos los tres mecanismos de interoperabilidad de Elm:

  • Banderas
  • Puertos
  • Elementos personalizados

Antes de analizar los tres mecanismos, necesitamos saber cómo compilar programas Elm a JavaScript.

Ejecutar elm make genera archivos HTML por defecto. Entonces, si dices:


elm make src/Main.elm


Se genera un archivo index.html que puedes abrir y empezar a experimentar. Si te estás iniciando en la interoperabilidad de JavaScript, te conviene generar archivos JavaScript:


elm make src/Main.elm --output=main.js


Esto genera un archivo JavaScript que expone una función Elm.Main.init(). Una vez que tengas main.js, puedes escribir tu propio archivo HTML con la función que desees.


Aquí está el HTML mínimo necesario para que tu archivo main.js aparezca en un navegador:


<html>

<head>

    <meta charset="UTF-8">

    <title>Main</title>

    <script src="main.js"></script>

</head>


<body>

    <div id="myapp"></div>

    <script>

            var app = Elm.Main.init({

                node: document.getElementById('myapp')

            });

    </script>

</body>

</html>


Quiero destacar las líneas importantes:

  • <head> - Tenemos una línea para cargar nuestro archivo main.js compilado. ¡Es obligatorio! Si compilas un módulo Elm llamado Main, obtendrás una función Elm.Main.init() disponible en JavaScript. Si compilas un módulo Elm llamado Home, obtendrás una función Elm.Home.init() en JavaScript. Etc.
  • <body> - Necesitamos hacer dos cosas aquí. Primero, creamos un <div> que queremos que nuestro programa Elm controle. ¿Quizás esté dentro de una aplicación más grande, rodeado de un montón de otras cosas? ¡No hay problema! Segundo, tenemos un <script> para inicializar nuestro programa Elm. Aquí llamamos a la función Elm.Main.init() para iniciar nuestro programa, pasando el nodo que queremos controlar.

Este es un archivo HTML normal, así que puedes incluir lo que quieras. Mucha gente carga archivos JS y CSS adicionales en el <head>. Esto significa que es perfectamente posible escribir el CSS a mano o generarlo de alguna manera. Agrega algo como <link rel="stylesheet" href="whatever-you-want.css"> en tu <head> y tendrás acceso a él. (También hay algunas opciones excelentes para especificar tu CSS dentro de Elm, ¡pero ese es otro tema!)

Ahora que sabemos cómo incrustar programas Elm en un documento HTML, es hora de empezar a explorar las tres opciones de interoperabilidad: indicadores, puertos y elementos personalizados en próximos posts.

domingo, 2 de noviembre de 2025

Estado del Octoverso

Github publicó el informe anual Octoverse, en el cual se pueden ver datos interesantes de los proyectos. El informe es grande y tiene muchos detalles.

En especial me intereso los lenguajes más utilizados:


Pero a partir de 2025, la curva de crecimiento de Python comenzó a seguir una trayectoria casi idéntica en paralelo con JavaScript y TypeScript, lo que sugiere que la adopción de la IA está influyendo en la elección del lenguaje en estos ecosistemas.




Dejo link: https://octoverse.github.com/

lunes, 16 de junio de 2025

Arrow Function vs Function en JavaScript


En JavaScript tenemos dos formas principales de declarar funciones:


// Function clásica

function sumar(a, b) {

  return a + b;

}


// Arrow function

const sumar = (a, b) => a + b;


Aunque pueden parecer equivalentes, tienen diferencias importantes:

this léxico:

  • Function clásica: el this depende de cómo se invoque la función.
  • Arrow function: el this se captura del contexto donde fue definida.


const obj = {

  numero: 42,

  funcionClasica: function() {

    console.log(this.numero);  // 42

  },

  arrowFunction: () => {

    console.log(this.numero);  // undefined (o distinto según el contexto externo)

  }

}


Las arrow functions no tienen su propio this.

Las arrow functions no tienen arguments:


function funcionClasica() {

  console.log(arguments);

}


const arrowFunction = () => {

  console.log(arguments); // ReferenceError

}


Si necesitas los argumentos en arrow function, podés usar parámetros rest (...args).


Las arrow functions no pueden ser constructores:


No podés hacer new sobre una arrow function.


function Persona() {}

const PersonaArrow = () => {};


new Persona(); // OK

new PersonaArrow(); // TypeError


Las arrow functions no tienen prototype:


console.log(Persona.prototype); // {}

console.log(PersonaArrow.prototype); // undefined


Las arrow functions tienen una sintaxis más compacta. Ideal para callbacks, funciones de orden superior o programación funcional:


const numeros = [1, 2, 3];

const dobles = numeros.map(n => n * 2);


Hoisting:

  • Las function declarations se elevan (hoisting).
  • Las arrow functions (al ser expresiones) no:


sumar(2,3); // OK

function sumar(a,b){ return a + b; }


sumarArrow(2,3); // TypeError: sumarArrow is not a function

const sumarArrow = (a,b) => a + b;


Mejor en callbacks, no siempre en métodos:


Por su manejo de this, las arrow functions suelen ser preferidas en callbacks, pero no tanto para métodos de objetos o clases.


Regla rápida: usa arrow functions cuando quieras mantener el this del contexto externo (sobre todo en callbacks). Usa functions clásicas cuando necesites un constructor, arguments, o una función completamente autónoma.


jueves, 5 de junio de 2025

Proxy en javascript


En JavaScript moderno hay varias formas de observar cambios en objetos, pero la más directa y nativa es usando Proxy, que te permite interceptar y reaccionar a operaciones sobre un objeto, como modificar una propiedad.


Veamos un ejemplo:


function observeObject(obj, callback) {

  return new Proxy(obj, {

    set(target, prop, value) {

      const oldValue = target[prop];

      target[prop] = value;


      // Ejecutamos el callback cuando se modifica algo

      callback(prop, value, oldValue);


      return true;

    }

  });

}


// Ejemplo de uso

const original = { nombre: 'Juan', edad: 30 };


const observado = observeObject(original, (prop, newVal, oldVal) => {

  console.log(`Propiedad '${prop}' cambió de ${oldVal} a ${newVal}`);

});


observado.nombre = 'Ana';   // Se dispara el callback

observado.edad = 31;        // También se dispara


Me gusto mucho, es simple y puede venir al pelo para ciertas ocaciones, pero debemos de tener en cuenta que : 

  • Solo observa propiedades directas, no anidadas. Si querés observar objetos dentro del objeto, hay que aplicar recursivamente el Proxy.
  • No detecta borrados (como delete obj.prop) a menos que también implementes el deleteProperty trap.
  • No funciona con arrays de forma intuitiva si hacés push, pop, etc., salvo que interceptes esos métodos.


lunes, 5 de mayo de 2025

Simular punteros en Javascript


JavaScript no tiene punteros como en C o C++, pero sí se puede simular su comportamiento usando objetos y referencias. En JavaScript, los objetos se pasan por referencia, lo que significa que si modificas una propiedad del objeto dentro de una función, el cambio se refleja afuera.

Veamos un ejemplo:


function incrementar(valor) {

    valor.numero++;

}


let puntero = { numero: 10 };

incrementar(puntero);

console.log(puntero.numero); // 11


Aquí puntero simula un puntero: su campo numero puede ser modificado por funciones.

Se pasa la referencia al objeto, no una copia.


Otra forma es con arreglos para simular puntero a variables primitivas


function setValor(arr, nuevoValor) {

    arr[0] = nuevoValor;

}


let x = [5];

setValor(x, 42);

console.log(x[0]); // 42


x es un arreglo de un solo elemento. Se comporta como una caja que puede modificarse dentro de funciones.

Esto puede verse como una simulación de un int* en C++.

Veamos un ejemplo sin utilizar funciones: 


let a = { valor: 10 };

let b = a; // b apunta al mismo objeto que a


b.valor = 99;


console.log(a.valor); // 99

console.log(b.valor); // 99


a y b apuntan al mismo objeto.

Cambiar b.valor también afecta a.valor.

También se puede utilizar arreglos:


let x = [42];

let y = x;


y[0] = 100;


console.log(x[0]); // 100

console.log(y[0]); // 100


En JavaScript, los valores primitivos (números, strings, booleanos, etc.) se pasan por valor, pero los objetos y arrays se pasan por referencia y podemos utilizarlos para simular punteros.


sábado, 18 de enero de 2025

El Operador |> de Elixir y sus equivalentes en otros lenguajes


En Elixir, el operador |> pasa el resultado de una expresión como el primer argumento de la siguiente función. Ya lo explicamos en el post anterior. 


" hello "

|> String.trim()

|> String.upcase()

Resultado: "HELLO"


Este diseño promueve una lectura fluida del código, eliminando la necesidad de paréntesis anidados.


F#, un lenguaje funcional inspirado en ML, también tiene un operador pipe |> con un propósito similar al de Elixir.


" hello "

|> String.trim

|> String.uppercase


El operador en F# permite que el flujo de datos sea explícito, facilitando la composición de funciones.


Python no tiene un operador pipe nativo, pero existen bibliotecas que lo emulan, como `pipe` o `toolz`. Sin embargo, sin bibliotecas adicionales, puedes lograr algo similar con reduce:


from functools import reduce


data = " hello "

result = reduce(lambda acc, fn: fn(acc), [str.strip, str.upper], data)

print(result)  # HELLO


Con una biblioteca como pipe:


from pipe import Pipe


result = " hello " | Pipe(str.strip) | Pipe(str.upper)

print(result)  # HELLO


JavaScript aún no tiene un operador pipe oficial, pero hay una propuesta en desarrollo en el comité TC39 (etapa 2 al momento de escribir). Con esta propuesta, el pipe se usa de la siguiente manera:


" hello "

  |> (x => x.trim())

  |> (x => x.toUpperCase());


Por ahora, puedes emularlo con funciones:


const pipeline = (...fns) => x => fns.reduce((v, f) => f(v), x);


const result = pipeline(

  x => x.trim(),

  x => x.toUpperCase()

)(" hello ");

console.log(result); // HELLO


Scala no tiene un operador pipe nativo, pero es posible definir uno:


implicit class PipeOps[T](val value: T) extends AnyVal {

  def |>[R](f: T => R): R = f(value)

}


val result = " hello "

  |> (_.trim)

  |> (_.toUpperCase)

println(result) // HELLO


En C#, aunque no existe un operador pipe, los métodos de extensión de LINQ se comportan de manera similar:


string result = " hello "

    .Trim()

    .ToUpper();

Console.WriteLine(result); // HELLO


El concepto detrás del operador pipe (`|>`) es universal: facilita la composición de funciones y mejora la legibilidad. Aunque su implementación varía entre lenguajes, su propósito sigue siendo el mismo: transformar datos paso a paso de manera clara y concisa.


sábado, 9 de noviembre de 2024

GraalVM + sistema operativo = GraalOS


GraalOS es una iniciativa experimental que integra la tecnología de GraalVM directamente en el sistema operativo, permitiendo que las aplicaciones, especialmente las desarrolladas en lenguajes JVM (Java, Scala, Kotlin), se ejecuten de manera más eficiente y directa sobre el hardware. GraalOS busca ser un sistema operativo minimalista y optimizado para ejecutar aplicaciones de alto rendimiento, proporcionando un entorno ideal para microservicios, procesamiento en la nube y aplicaciones en tiempo real.

Las principales características de GraalOS son: 

  1. Soporte Nativo para Lenguajes JVM: GraalOS permite ejecutar código de JVM directamente sobre el sistema operativo sin capas intermedias, ofreciendo un rendimiento nativo para lenguajes como Java, Kotlin y Scala.
  2. Integración con GraalVM: GraalOS está construido sobre la base de GraalVM, lo que permite la compilación AOT (Ahead-of-Time) y el uso de `native-image` para generar binarios nativos que corren eficientemente sobre el hardware.
  3. Ecosistema Multilenguaje: Aunque está optimizado para lenguajes de la JVM, GraalOS también soporta otros lenguajes como JavaScript, Python y R, aprovechando la compatibilidad de GraalVM.
  4. Optimización para Microservicios: GraalOS está diseñado para ejecutarse en contenedores ligeros, ideales para arquitecturas de microservicios y entornos de computación en la nube.

Uno de los puntos fuertes de GraalOS es el uso de la tecnología de compilación Ahead-of-Time (AOT) de GraalVM. La compilación AOT permite que el código de JVM se convierta en código nativo, lo cual mejora significativamente el tiempo de inicio y reduce el uso de memoria.

native-image -jar tu_aplicacion.jar

Este comando convierte un archivo JAR en un binario nativo, optimizado y listo para ejecutarse en GraalOS. Los binarios nativos generados pueden arrancar casi instantáneamente y son ideales para aplicaciones que requieren respuesta en tiempo real.

GraalOS ofrece un entorno perfecto para el despliegue de aplicaciones en la nube gracias a su integración optimizada con GraalVM. Además, permite manejar aplicaciones en tiempo real gracias a su bajo tiempo de respuesta y consumo de recursos. Su diseño minimalista y eficiente hace que sea una opción atractiva para desarrolladores que busquen optimizar costos y rendimiento en entornos de microservicios o serverless.

Aunque GraalOS es experimental, se puede probar en entornos de contenedores o como un sistema operativo en máquinas virtuales para evaluar su rendimiento en aplicaciones específicas. Para comenzar, puedes instalar GraalOS en una máquina virtual y luego utilizar GraalVM para compilar y ejecutar aplicaciones.


apt update && apt install graalos


GraalOS representa un avance en la forma en que interactuamos con el hardware a nivel de sistema operativo para ejecutar aplicaciones nativas. Aunque en sus primeras etapas, su integración con GraalVM abre la puerta a nuevas oportunidades en la ejecución de aplicaciones de alto rendimiento y microservicios en la nube.

Con una promesa de rendimiento optimizado, tiempos de respuesta ultrarrápidos y soporte multilenguaje, GraalOS podría transformar la forma en que desarrollamos e implementamos aplicaciones nativas.

Dejo like : 

https://blogs.oracle.com/java/post/introducing-graalos

https://graal.cloud/

jueves, 31 de octubre de 2024

Le pregunte a la IA : ¿Qué lenguaje tiene las mejores perspectivas de futuro: Python, Java o JavaScript?

Le pregunte a la IA : ¿Qué lenguaje tiene las mejores perspectivas de futuro: Python, Java o JavaScript? y como me gusto mucho su respuesta se las comparto: 

Para evaluar el futuro de Python, Java, y JavaScript, consideremos cómo se están usando, su versatilidad y las tendencias que los impulsan en áreas clave:


Python

   - Ventajas: Python es ampliamente valorado por su legibilidad y simplicidad, lo cual lo hace popular tanto entre principiantes como en sectores avanzados como la ciencia de datos, la inteligencia artificial (IA), y el análisis de datos. Su ecosistema ofrece un gran soporte en estas áreas, con bibliotecas como TensorFlow, Pandas, y NumPy.

   - Perspectivas de Futuro: Su relevancia en IA y ciencia de datos seguirá creciendo, dado que es el lenguaje de referencia en estos campos. Aunque tiene limitaciones de rendimiento comparado con lenguajes de bajo nivel, las mejoras continuas en sus bibliotecas y en plataformas de soporte (como el uso de PyPy y la integración con código en C++) pueden mitigar estas limitaciones. Sin embargo, en áreas que demandan alto rendimiento en tiempo real, como juegos y aplicaciones de alta concurrencia, su uso podría ser limitado.


Java

   - Ventajas: Java es conocido por su estabilidad y robustez, especialmente en entornos empresariales y sistemas a gran escala. La JVM (Java Virtual Machine) permite que las aplicaciones en Java se ejecuten de manera confiable en múltiples plataformas. Java también es ampliamente utilizado en aplicaciones de Android y sigue siendo un estándar en muchas empresas.

   - Perspectivas de Futuro: La madurez y confiabilidad de Java aseguran su presencia en grandes empresas y aplicaciones financieras, que demandan sistemas sólidos y escalables. Recientemente, con mejoras de rendimiento en las versiones más nuevas y características de programación moderna (como pattern matching y records), Java sigue evolucionando y atrayendo a una nueva generación de desarrolladores. Su uso en aplicaciones web modernas y su compatibilidad con entornos de nube son elementos clave que aseguran su vigencia en el mercado.


JavaScript

   - Ventajas: JavaScript es el lenguaje dominante en el desarrollo web, y su versatilidad ha crecido enormemente con el ecosistema Node.js, lo cual permite su uso tanto en el frontend como en el backend. Su capacidad para construir aplicaciones de una sola página (SPA), junto con frameworks como React, Vue, y Angular, le ha dado un rol esencial en la web moderna.

   - Perspectivas de Futuro: La demanda de aplicaciones web interactivas y rápidas respalda el crecimiento de JavaScript. Además, su capacidad de integrarse con **WebAssembly (Wasm)** ha ampliado su uso en aplicaciones de alto rendimiento en el navegador. Node.js sigue siendo relevante para el backend, y con la evolución continua del lenguaje (por ejemplo, ES2022), JavaScript se mantiene competitivo. 


- Python: dominará en ciencia de datos, IA y aplicaciones académicas; su simplicidad asegura su uso entre nuevos programadores.

- Java: mantiene su posición en el desarrollo empresarial y de sistemas complejos; su futuro está asegurado en estos sectores.

- JavaScript: seguirá siendo fundamental en el desarrollo web, y su interoperabilidad con WebAssembly amplía sus horizontes.


En general, la elección del lenguaje con las "mejores perspectivas" depende del campo específico. Para IA y datos, Python; para sistemas empresariales, Java; y para la web y aplicaciones de usuario, JavaScript. Cada uno tiene un rol fuerte y perspectivas sólidas en sus respectivos dominios.


Que piensan? 

sábado, 26 de octubre de 2024

Obtener un tipo a partir de un string en Javascript


Necesitaba obtener un tipo apartir de un string en javascript, por ejemplo "Math.Fraction" y yo tenia que retornar el tipo, caso medio raro pero puede pasar y lo resolvi así : 

 

 function getType(typeStr, context = window) {

    const parts = typeStr.split('.');

    let currentContext = context;


    for (const part of parts) {

        if (typeof currentContext[part] === 'undefined') {

            return undefined;

        }

        currentContext = currentContext[part];

    }


    return currentContext;

}


Tema que no es muy util esta función pero talves necesitan saber si un tipo esta definido y lo pueden hacer así : 

const isDefined = (typeStr, context = window) => getType(typeStr, context) !== undefined;

Si se les ocurre otra forma de hacer esto me escriben en los comentarios. 


viernes, 23 de agosto de 2024

lunes, 20 de mayo de 2024

Lenguajes utilizados en los proyectos apache

Tal vez hace mucho que Apache publico este gráfico pero yo recién lo veo : 



Como se puede ver Java es el lenguaje más utilizado por los proyectos de apache, seguido de python, c++, c, javascript, scala, C#, go, perl, etc ... 




lunes, 8 de abril de 2024

ClearScript


ClearScript es una librería que permite ejecutar javascript o VBScript en .NET. Actualmente es compatible con JavaScript (a través de V8 y JScript) y VBScript.

Vamos con un ejemplo:

Primero agregamos la dependencia: 


dotnet add package Microsoft.ClearScript --version 7.4.5


Y bueno, ahora podemos ejecutar javascript por ejemplo: 


using Microsoft.ClearScript;

using Microsoft.ClearScript.V8;


public class Example

{

    static void Main()

    {

        // Create a new V8ScriptEngine

        using var engine = new V8ScriptEngine();

        try

        {

            // Execute JavaScript code

            engine.Execute("var x = 10; var y = 20; var z = x + y;");


            // Get the value of a JavaScript variable

            var zValue = engine.Script.z;


            Console.WriteLine("The value of z is: " + zValue);

        }

        catch (ScriptEngineException ex)

        {

            Console.WriteLine("Error executing JavaScript: " + ex.Message);

        }

    }

}


Y si todo fue bien el resultado es: 


The value of z is: 30


Y listo! 

Dejo link: https://microsoft.github.io/ClearScript/

miércoles, 19 de abril de 2023

Le preguntamos a ChatGPT ¿cual es el lenguaje de programación que debo estudiar?


Estuve jugando un rato con chatGPT y les cuento : 

YO: ¿cual es el lenguaje de programación que debo estudiar?

ChatGPT : La elección del lenguaje de programación a estudiar dependerá de tus objetivos y del tipo de aplicación que quieras desarrollar. Aquí te presento algunas opciones populares y sus características principales:

Python: Es un lenguaje de programación popular en la actualidad debido a su facilidad de aprendizaje, su versatilidad y su amplio uso en aplicaciones de inteligencia artificial, ciencia de datos y análisis estadístico.

JavaScript: Es un lenguaje de programación utilizado en aplicaciones web para crear interacciones dinámicas en la interfaz de usuario, también es muy utilizado en el desarrollo de aplicaciones móviles.

Java: Es un lenguaje de programación orientado a objetos y es utilizado en aplicaciones empresariales, de escritorio y móviles.

C++: Es un lenguaje de programación de bajo nivel que se utiliza en aplicaciones de sistemas y de rendimiento.

Swift: Es el lenguaje de programación utilizado para desarrollar aplicaciones para dispositivos Apple, como iPhone y iPad.

Te recomiendo investigar más sobre estas opciones y elegir la que mejor se adapte a tus objetivos y necesidades. También es importante tener en cuenta que el aprendizaje de un lenguaje de programación no es algo que se logre de la noche a la mañana, sino que requiere práctica y dedicación.


YO: Con cual encontraré trabajo más rápido?

ChatGPT : No hay una respuesta definitiva a esta pregunta, ya que el mercado laboral y las oportunidades de trabajo varían de acuerdo a la ubicación geográfica, las tendencias de la industria y la experiencia previa que tengas.

Sin embargo, algunos lenguajes de programación son más demandados que otros en la actualidad. Por ejemplo, Python es muy utilizado en la industria de la inteligencia artificial, análisis de datos y aprendizaje automático, lo que puede hacer que sea más fácil encontrar trabajo en estas áreas.

También es importante destacar que el dominio de un solo lenguaje de programación no garantiza la obtención de trabajo en el campo de la programación. Muchas empresas buscan programadores que tengan habilidades en múltiples lenguajes y tecnologías, así como una comprensión profunda de los conceptos de programación y las metodologías de desarrollo de software.

En resumen, la elección del lenguaje de programación que te ayudará a encontrar trabajo más rápido dependerá de tus habilidades, intereses y las oportunidades laborales disponibles en tu área geográfica. Lo mejor es enfocarse en aprender bien un lenguaje de programación y tener una sólida comprensión de los fundamentos de la programación para destacar en el mercado laboral.


YO: Y cual te gusta más?

ChatGPT : Como modelo de lenguaje de programación, como soy, no tengo emociones ni preferencias. Mi función es brindar información objetiva y responder a preguntas de manera imparcial.

Sin embargo, en la comunidad de programadores, cada uno tiene sus propias preferencias y opiniones personales sobre qué lenguaje de programación es mejor para diferentes aplicaciones. La elección del lenguaje de programación dependerá de las necesidades del proyecto y del programador en sí. Lo importante es que el lenguaje de programación elegido sea adecuado para el propósito del proyecto y que el programador tenga la experiencia y habilidades necesarias para trabajar con él de manera efectiva.


Interesante conversación que les quería compartír, ustedes que opinan?



martes, 4 de abril de 2023

Inscripciones Abiertas a Cursos Gugler 2023

 

PRENSA GUGLER  LAB 2023

  NOTICIAS ACTUALES

informacion  OFERTA ACADÉMICA


 Se encuentran abiertas las inscripciones para el primer cuatrimestre del año 2023, para todas las capacitaciones dictadas por el Laboratorio de Investigación Gugler. Podés asegurar tu lugar en el curso y comisión que desees !!!.

Las clases inician:

Martes 18/04 , Miércoles 19/04, Jueves 20/04 o Sábado 22/04, según el curso que elegiste

 

Inscribirteclic aquí

Cursos, Horarios y comisionesclic aquí.

 

 

Dictamos nuestros cursos en la Facultad de Ciencia y Tecnología, perteneciente a la Universidad Autónoma de Entre Ríos. En nuestro portafolio de capacitación encontrarás:

MODALIDAD PRESENCIAL

  • Cursos de Programación:
    Programación en Python.
    Programación web frontend.
     
  • Cursos de Mantenimiento/Reparación:
    Reparación y Mantenimiento de PC.

 MODALIDAD DISTANCIA

  • Cursos de Programación:
    Programación en PHP.
    Programación en Java.
informacion   MÁS INFORMACIÓN 

informacion LABORATORIO DE INVESTIGACIÓN GUGLER

Si deseas comunicarte con nosotros, te recordamos que podes hacerlo a través de los siguientes portales, en los cuales encontrarás información sobre Gugler.

TEL: (0343) - 4975066 Interno 119

Sitio Oficial:  www.gugler.com.ar

Campus:  campusvirtual.gugler.com.ar

Sistema de Gestión Cursos:  sgc.gugler.com.ar

Sistema de Gestión Cursos Móvil: Aquí 

Sistema de Documentación:  sgd.gugler.com.ar

Sistema de Validación:  giua.gugler.com.ar

                   Twitter                Facebook

Laboratorio Gugler

partir del 2012, la Facultad de Ciencia y Tecnología nos declaro:  "Laboratorio de Investigación".

 

El laboratorio ha ampliado las incumbencias de Gugler, ya que además de la capacitación, la promoción y difusión del software libre, ahora abarcará actividades como publicaciones y proyectos de investigación, así como también el dictado y participación en conferencias o exposiciones de ámbitos académicos y científicos.

 

Ante cualquier duda comunicarse con nosotros a gugler_contacto@uader.edu.ar

GUGLER PRESS

 


viernes, 24 de febrero de 2023

Programación poliglota con GraalVM parte 2


Seguimos con GraalVM 

Veamos un ejemplo queremos ejecutar una aplicación javascript o node que dentro llama a codigo ruby, por ejemplo. 

Vamos a tener que crear un archivo .js que lo llamaré ejemplo.js que contenga lo siguiente: 


var array = Polyglot.eval("ruby", "[1,2,42,4]")

console.log(array[2]);


Y lo ejecutamos con : 


js --polyglot --jvm ejemplo.js

42

node --polyglot --jvm ejemplo.js

42


Así de fácil o queremos ejecutar en una aplicación R, javascript :

array <- eval.polyglot("js", "[1,2,42,4]")
print(array[3L])

Y lo corremos con : 

Rscript --polyglot --jvm ejemplo.R
[1] 42

Y puedo seguir con ejemplos pero creo que se entiende :D


Dejo link : https://www.graalvm.org/reference-manual/polyglot-programming/#running-polyglot-applications

lunes, 10 de octubre de 2022

Probando tus test con stryker4s


Professor X: For someone who hates mutants... you certainly keep some strange company.

William Stryker: Oh, they serve their purpose... as long as they can be controlled.


Si tenemos que probar los test de mi aplicación entramos en una recursividad que nos puede mantener haciendo test de test hasta los fines de los tiempos. 

Pero pero esta copado, saber si realmente tus test prueban, lo que uno desea probar y no esta bueno darlo por sentado y tampoco es productivo, ir debugeando test por test para ver si realmente prueba. 

Por ende una herramienta como stryker4s esta buena, lo que hace esto es mutar tu código un toque y espera que los test fallen, si los test no fallan esa parte del código que muto no esta siendo testeada. 

La idea, me parece de lo más lógica, y no entiendo bien como no se nos ocurrio antes :( 

Para utilizarlo agregamos la siguiente dependencia en nuestro proyecto sbt : 

addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % stryker4sVersion)

Después de agregar el plugin, se puede usar Stryker4s ejecutando sbt stryker en la raíz del proyecto y la magia comienza. 

No solo este framework existe para scala, tambien lo podemos usar en C# o javascript. 

Dejo link : 

https://stryker-mutator.io/

https://stryker-mutator.io/docs/stryker4s/getting-started/

https://github.com/stryker-mutator/stryker4s

viernes, 19 de agosto de 2022

Cursos Gugler!!

 

 PRENSA GUGLER  LAB 2022

  NOTICIAS ACTUALES

informacion  OFERTA ACADÉMICA


Estimado Goette Emanuel :

 Se encuentran abiertas las inscripciones para el segundo cuatrimestre del año 2022, para todas las capacitaciones dictadas por el Laboratorio de Investigación Gugler. Podés asegurar tu lugar en el curso y comisión que desees !!!.

Las clases inician:

  • Martes 30/08 , Miércoles 31/08, Jueves 01/09 o Sábado 03/09, según el curso que elegiste

 

Inscribirteclic aquí

Cursos, Horarios y comisionesclic aquí.

 

 

Dictamos nuestros cursos en la Facultad de Ciencia y Tecnología, perteneciente a la Universidad Autónoma de Entre Ríos. En nuestro portafolio de capacitación encontrarás:

MODALIDAD PRESENCIAL

  • Cursos de Sistemas Operativos:
    Administración GNU/Linux.
     
  • Cursos de Programación:
    Programación en Python.
      
  • Cursos de Mantenimiento/Reparación:
    Reparación y Mantenimiento de PC.

 MODALIDAD DISTANCIA

  • Cursos de Programación:
    Programación en PHP.
    Programación en Java.
    Programación web frontend
informacion   MÁS INFORMACIÓN 

informacion LABORATORIO DE INVESTIGACIÓN GUGLER

Si deseas comunicarte con nosotros, te recordamos que podes hacerlo a través de los siguientes portales, en los cuales encontrarás información sobre Gugler.

TEL: (0343) - 4975066 Interno 119

Sitio Oficial:  www.gugler.com.ar

Campus:  campusvirtual.gugler.com.ar

Sistema de Gestión Cursos:  sgc.gugler.com.ar

Sistema de Gestión Cursos Móvil: Aquí 

Sistema de Documentación:  sgd.gugler.com.ar

Sistema de Validación:  giua.gugler.com.ar

                   Twitter                Facebook

Laboratorio Gugler

partir del 2012, la Facultad de Ciencia y Tecnología nos declaro:  "Laboratorio de Investigación".

 

El laboratorio ha ampliado las incumbencias de Gugler, ya que además de la capacitación, la promoción y difusión del software libre, ahora abarcará actividades como publicaciones y proyectos de investigación, así como también el dictado y participación en conferencias o exposiciones de ámbitos académicos y científicos.

 

Ante cualquier duda comunicarse con nosotros a gugler_contacto@uader.edu.ar

GUGLER PRESS