Translate

lunes, 4 de noviembre de 2019

Cuáles era sus lenguajes de programación favoritos, odiados o recomendarían para aprender a programar...

Unas 15K personas de todo el mundo han contestado el meme en Twitter de cuáles era sus lenguajes de programación favoritos, odiados o recomendarían para aprender a programar... Los he recopilado y analizado con @graphext y aquí un hilo con los principales insights que encontré 👇

Este es un tweet muy interesante Victoriano Izquierdo :




domingo, 3 de noviembre de 2019

Prolog


PROLOG es un lenguaje de programación declarativo. Los lenguajes declarativos se diferencian de los lenguajes imperativos o procedurales en que están basados en formalismos abstractos (PROLOG está basado en la lógica de predicados de primer orden y LISP, otro lenguaje de programación declarativa, en lambda calculo), y por tanto su semántica no depende de la máquina en la que se ejecutan. Las sentencias en estos lenguajes se entienden sin necesidad de hacer referencia al nivel máquina para explicar los efectos colaterales.

PROLOG es un lenguaje de programación muy útil para resolver problemas que implican objetos y relaciones entre objetos. Está basado en los siguientes mecanismos básicos, que se irán explicando :
  • Unificación
  • Estructuras de datos basadas en árboles
  • Backtracking automático
La sintaxis del lenguaje consiste en lo siguiente:
  • Declarar hechos sobre objetos y sus relaciones
  • Hacer preguntas sobre objetos y sus relaciones
  • Definir reglas sobre objetos y sus relaciones
Vamos utilizar SWI-prolog : https://swish.swi-prolog.org/

Las cláusulas PROLOG son de tres tipos: hechos, reglas y preguntas. Las cláusulas PROLOG consisten en una cabeza y un cuerpo. Los hechos son cláusulas que tienen cabeza pero no tienen cuerpo. Las preguntas sólo tienen cuerpo. Las reglas tienen siempre cabeza y cuerpo. Los hechos son siempre ciertos. Las reglas declaran cosas que son ciertas dependiendo de una condición. El programa PROLOG (o base de datos PROLOG) está formado por hechos y reglas y para PROLOG no hay ninguna distinción entre ambas. Las preguntas se le hacen al programa para determinar qué cosas son ciertas.

Los hechos PROLOG : 

En consola:
assert(progenitor(laura, damian)).

En un archivo:
progenitor(laura, damian).

“progenitor” es el nombre de la relación o nombre de predicado y “laura” y “damian” son los argumentos. Los hechos acaban siempre con punto. 

Las reglas en PROLOG: 

Existe en PROLOG la posibilidad de definir la relación “abuelo(X,Y)” o la relación “tio(X,Y)” como reglas, además de poderlo hacer como hechos o como conjunción de objetivos.

[user].
abuelo(X,Y):- 
progenitor(X,Z), progenitor(Z,Y).
tio(X,Y):- 
progenitor(Z,Y), progenitor(V,Z), progenitor(V,X).
<EOF> 

También podemos crear reglas recursivas : 

[user].
predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).

La definición de varias reglas con el mismo nombre de relación equivale en PROLOG a la “O” lógica o disyunción.

Las preguntas PROLOG

Sobre un conjunto de hechos se pueden realizar una serie de preguntas en la consola. Por ejemplo:

?- progenitor(laura, damian).
true.
?- progenitor(juan, damian).
false.

PROLOG busca automáticamente en la base de datos si existe un hecho que se puede unificar.

También se puede consultar por medio de variables. Por ejemplo:

?- progenitor(jose,X).
X = ana ;
X = patricia.

Debemos consultar más de un resultado por medio de la tecla “Tab”

Sintaxis en Prolog : Los objetos o términos PROLOG pueden ser objetos simples o estructuras. Los objetos simples pueden ser constantes o variables. Las constantes serán átomos o números. Los átomos empiezan con letra minúscula (nunca con números), pueden contener caracteres especiales y pueden ser nombres entre comillas simples. Los números serán enteros o reales, sin una definición explícita de tipos. PROLOG se utiliza para una programación simbólica, no numérica, por eso los enteros se utilizarán por ejemplo para contar el número de elementos de una lista, pero los reales son poco utilizados. Las variables empiezan con mayúscula o con subrayado. Las variables anónimas son aquellas cuyo nombre es sólo el carácter subrayado (_). Se usan cuando no es importante el nombre de la variable o cuando la variable no puede unificar con otra, dentro de la misma cláusula.

Términos. Constantes: Números. Este tipo de constantes se utilizan para representar tanto números enteros como números reales y poder realizar con ellos operaciones aritméticas.
Átomos. Los átomos se utilizan para dar nombre a objetos específicos, es decir, representan individuos concretos. Existen tres clases principales de átomos:
Cadenas formadas por letras, dígitos y el símbolo de subrayado, que deben empezar necesariamente por una letra minúscula.  
Cualquier cadena de caracteres encerrada entre comillas simples.

Términos. Variables
Las variables en Prolog se representan mediante cadenas formadas por letras, dígitos y el símbolos de subrayado, pero deben necesariamente empezar por una letra mayúscula  o por un símbolo de subrayado. 

Ejemplos: X, Resultado_1, Entrada, _total3, _3bis
Las variables que empiezan con un símbolo de subrayado, se denominan variables anónimas, y se usan cuando se necesita trabajar con variables cuyos posibles valores no interesan. 

Términos compuestos. Listas : Uno de los términos compuestos mas importantes y útiles que ofrece Prolog son las listas, secuencias ordenadas de cero o mas elementos, donde los elementos pueden ser cualquier tipo de termino. La lista vacía se representa mediante el átomo [] , toda lista no vacía tiene una cabeza y un resto (que será una lista), y se representa mediante un termino compuesto de paridad 2, cuyos argumentos son, respectivamente, la cabeza y el resto de la lista.
La notación consiste en enumerar entre corchetes todos los elementos de la lista, separados por comas. 
Ejemplos,  [a, []] o [a] y [a, b, c, []] o [a,b,c] 

Prolog también dispone de otra notación para las listas, que consiste en representar la lista con cabeza X y resto Y mediante el termino [X|Y]. Esta ultima  notación es fundamental para poder separar la cabeza del resto de una lista.

Y vamos a continuar...

Programación lógica

La programación funcional se basa en el concepto de función (que no es más que una evolución de los predicados), de corte más matemático. La programación lógica gira en torno al concepto de predicado, o relación entre elementos.

La lógica matemática es la manera más sencilla, para el intelecto humano, de expresar formalmente problemas complejos y de resolverlos mediante la aplicación de reglas, hipótesis y teoremas. De ahí que el concepto de "programación lógica" resulte atractivo en diversos campos donde la programación tradicional es un fracaso.

La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial o relacionadas:
  • Sistemas expertos, donde un sistema de información imita las recomendaciones de un experto sobre algún dominio de conocimiento.
  • Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre una teoría existente.
  • Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con limitaciones) la información contenida en una expresión lingüística humana.
La programación lógica también se utiliza en aplicaciones más "mundanas" pero de manera muy limitada, ya que la programación tradicional es más adecuada a tareas de propósito general.

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior como la lógica difusa. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es demostradamente computable (hasta el momento).

Un concepto importante de programación lógica es la descomposición de programas en sus componentes lógicos y sus componentes de control. Con lenguajes de programación lógica de bajo nivel, estos componentes determinan la solución del problema, por eso los componentes de control pueden variar para proporcionar alternancia de ejecución de un programa lógico. Estos conceptos son capturados con el eslogan

Algoritmo= lógica + control

donde "lógica" representa un programa lógico y "control" diferentes estrategias de demostración del teorema.

Esto no se queda así, seguimos con prolog!! 


sábado, 2 de noviembre de 2019

Resultados de la encuesta de Stackoverflow 2019



Stackoverflow publico los resultados de su encuesta 2019, la verdad todo normal nada que me llame la atención excepto:


  • Lenguaje más amado Rust, ya me tengo que poner a estudiar este lenguaje. 
  • Lenguajes mejor pagos, del top 5, 4 son funcionales. Así que es buena idea aprender programación funcional. 




Dejo link : https://insights.stackoverflow.com/survey/2019

viernes, 1 de noviembre de 2019

Cual es el lenguaje más utilizado y el más moderno?

Es muy interesante saber cual es el lenguaje que más se usa hoy día, para poder aprenderlo si no lo sé y para saber por dónde anda el mercado.

Por eso dejo estas 2 imagenes que son por demás interesantes:


Otra cuestión es saber cual es el lenguaje más moderno de los más utilizados, porque es licito pensar que este tendrá mayor futuro : 




Map, Reduce y Filter


Los métodos fold están muy relacionados a métodos que apliquen una función a una lista. Esto en muchos lenguajes se traducen en 2 métodos : Map y Reduce.

Map: Aplica una función a una lista, retornando otra lista que puede ser de diferente tipo. Transforma la lista.
Reduce: Aplica una función a una lista, acumulando o resolviendo un problema determinado, y retorna un valor.

Debemos recordar que una de las bases de la programación funcional donde provienen estos métodos es la inmutabilidad. Por lo tanto estos métodos retornan nuevas listas, sin modificar la existente.

En javascript :

const obtenerNombreDeCiudades = array => array.map(({ nombre }) => nombre);
const nombreDeCiudades = obtenerNombreDeCiudades (ciudadesPobladas);

const obtenerHabitantes = array => array.reduce((acumulador, { habitantes }) => acumulador + habitantes, 0)
const habitantesTotales = obtenerHabitantes(ciudades);

En java 8 : 

En java podemos utilizar funciones map/reduce con Streams, veamos unos ejemplos: 

String[] myArray = new String[]{"bob", "alice", "paul", "ellie"};
Stream<String> myStream = Arrays.stream(myArray);
Stream<String> myNewStream = myStream.map(s -> s.toUpperCase());
String[] myNewArray =  myNewStream.toArray(String[]::new);

int myArray[] = { 1, 5, 8 };
int sum = Arrays.stream(myArray).sum();

String[] myArray = { "this", "is", "a", "sentence" };
String result = Arrays.stream(myArray).reduce("", (a,b) -> a + b);

En C# :

.NET implementa la operación de map/reduce con la extensión LINQ. Veamos un ejemplo: 

map: 
var result = numbers.Select(x => x + 3);

reduce: 
var sum = number.Aggregate((x, y) => x + y);

Otra función muy importante es filter, filter permite filtrar listas, y claro : 

En Javascript

var rebels = pilots.filter(function (pilot) {
  return pilot.faction === "Rebels";
});
var empire = pilots.filter(function (pilot) {
  return pilot.faction === "Empire";
});
//con labmda
const rebels = pilots.filter(pilot => pilot.faction === "Rebels");
const empire = pilots.filter(pilot => pilot.faction === "Empire");

En Java

Arrays.stream(myArray)
      .filter(s -> s.length() > 4)
      .toArray(String[]::new);

En C#

List<Employee> e = employees.Where(
      x => x.SickDays >= n).ToList();


¿Cuál es el mejor y más nuevo lenguaje de programación?


Encontré dicha pregunta en quora, y la respuesta :

  • Julia (Influenciado por: Fortran, Lisp, Lua, Python, Perl, Ruby y MATLAB)
  • Kotlin (Influenciado por: JavaScript, Java, C# y Scala)
  • Elm (Influenciado por: Standard ML, F#, Haskell y OCaml)
  • Elixir (Influenciado por: LFE, Clojure, Erlang and Ruby)
  • Rust (Influenciado por: C#, Ruby, C++, Alef, Haskell, NIL, Cyclone, Limbo y Erlang)
  • Crystal (Influenciado por: C, Ruby, C# and Python)
  • Groovy (Influenciado por: Python, Java, Smalltalk, Objective-C y Perl)
  • R (Influenciado por: S, XLispStat, Common Lisp y Scheme)
  • Hack (por Facebook)
  • Go (Influenciado por: C, Python, Smalltalk, Alef, CSP, Modula, Pascal, Limbo y BCPL)
  • Dart (por Google)
  • Bosque (Nuevo lenguaje de programación de Microsoft)
  • Ballerina (Basado en Java, Javascript, Go, Rust, C#)
  • V (Basado en Go y Rust)

La verdad no conocía a Bosque, Ballerina y V. 

Más allá de dicha respuesta, a mi entender, todo depende de a que te vas a dedicar, por ejemplo: 

Si vas a hacer una aplicación base, base de datos, sistema operativos, aplicaciones de escritorio: 
  • V
  • Go 
  • Rust

Si te queres dedicar a ciencia de datos : 
  • Julia
  • R

Si queres hacer back-end de aplicaciones : 
  • Kotlin
  • Groovy
  • Bosque
  • Ballerina
  • Hack
  • Elixir

Aplicaciones front-end :
  • Elm
  • Dart

Me puedo equivocar, pero es mi opinión. 

Otra cosa, faltan lenguajes que siempre nuevos, como Scala, Idris, Swift o tantos otros...

Opinen!


miércoles, 30 de octubre de 2019

Disponible Fedora 31


¡Esta aquí! Esta disponible Fedora 31. Gracias al arduo trabajo de miles de miembros y colaboradores de la comunidad de Fedora, celebramos otro lanzamiento a tiempo. ¡Esto se está convirtiendo en un hábito!

Entre las mejoras, Firefox se ejecutará de forma nativa en la sesión de GNOME Wayland, por lo que no se apoyará más en XWayland, la capa de compatibilidad para ejecutar aplicaciones Xorg en Wayland. La inclusión de módulos centrados en la seguridad en la compilación para EFI de Grub 2 y la inclusión de Mono 5.20 son otros aspectos a destacar de este lanzamiento.

Y en la pagina del release aprovecharon para publicitar Fedora Toolbox, Fedora Toolbox es una herramienta simple para iniciar y administrar contenedores de espacios de trabajo personales, para que pueda desarrollar o experimentar en una experiencia aislada. Es tan simple como ejecutar "toolbox enter" desde la línea de comandos.


Dejo link:
https://getfedora.org

Reporting, Predictive Analytics, and Everything In Between: A Guide to Selecting the Right Analytics for You

Debe ser uno de los títulos más largos que he escrito.

Me llego un mail de la empresa que tiene soporte comercial de jasperreports promocionando un libro que regala :

TIBCO Software Inc.View in browser
New O'Reilly Ebook:
Reporting, Predictive Analytics, and Everything In Between
Hi Emanuel,
Any organization considering investing in a data analytics initiative today has a lot of options to choose from, including visual, predictive, or even embedded analytics.
But which type of analytics is right for you? This ebook explains the different types of analytics and helps you determine the best course of action based on your business needs. 
oreilly-ebook-asset-img.png
Read this ebook to learn:
  1. How analytics types differ and the pros and cons of each
  2. How to identify the right analytics for your use case
  3. Key considerations to evaluate before getting started
 
Cheers!
The TIBCO Team
TIBCO Software Inc. 
3303 Hillview Ave, Palo Alto, California 94304 
This marketing email was sent to emanuelpeg@yahoo.com.ar 
Copyright and Privacy Policy   |   Manage Preferences or Unsubscribe 
Get the latest news at tibco.com.
Facebook    LinkedIn    Twitter    Youtube

Aprovechar!!

Dejo link:
https://www.tibco.com/resources/ebook-download/reporting-to-predictive-analytics?utm_source=emailblast&utm_medium=email&utm_campaign=jaspersoft_globl_js-oreilly-ebook-edm-10-19&mkt_tok=eyJpIjoiWXpNM1lUSmtPV1F6WTJVMiIsInQiOiJXRVwvSEJSMFhMSlFUOWNDZ0d6VnpuOUh4N2g0TlhuUFBpSU15Q1wva2tLUEQ1MEdLUFlLQVdcL25la0ZISEw5czhSR2NrUVdRa1ZJM3RxRFhZYWZSWUpLT1wvTkZnOXE1K29CZTRZT0h3NjJuUzUxZ2tKYit0bGVrMDNvZnRcL2RjdFhIIn0%3D

viernes, 25 de octubre de 2019

Libros de Java geek

Download IT Guides!

 
JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications. JSF 2 uses Facelets as its default templating system. Other view...
 
 
Scala is a general-purpose programming language. It has full support for functional programming and a very strong static type system. Designed to be concise, many of Scala's design...
 
 
Text provides support for most advanced PDF features such as PKI-based signatures, 40-bit and 128-bit encryption, color correction, Tagged PDF, PDF forms (AcroForms), PDF/X, color...
 
 
Spring Integration extends the Spring programming model to support the well-known Enterprise Integration Patterns. Enables lightweight messaging within Spring-based applications and...
 

martes, 22 de octubre de 2019

Procedimientos almacenados y funciones en MariaDB


Si ya usamos bases de datos como Oracle, Interbase / Firebird, PostgreSQL, seguro escuchamos hablar de procedimientos almacenados. Y en MariaDB esto no es una novedad.

Ahora bien, ¿qué son en realidad los procedimientos almacenados? Luego de sumergirnos en este tema veremos que el nombre es plenamente identificatorio y casi explica lo que es un procedimiento almacenado.

Los procedimientos almacenados son un conjunto de instrucciones SQL más una serie de estructuras de control que nos permiten dotar de cierta lógica al procedimiento. Estos procedimientos están guardados en el servidor y pueden ser accedidos a través de llamadas, como veremos más adelante.

Para crear un procedimiento, MariaDB nos ofrece la directiva CREATE PROCEDURE. Al crearlo éste es ligado o relacionado con la base de datos que se está usando, tal como cuando creamos una tabla, por ejemplo.

Para llamar a un procedimiento lo hacemos mediante la instrucción CALL. Desde un procedimiento podemos invocar a su vez a otros procedimientos o funciones.

Un procedimiento almacenado, al igual cualquiera de los procedimientos que podamos programar en nuestras aplicaciones utilizando cualquier lenguaje, tiene:
  • Un nombre.
  • Puede tener una lista de parámetros.
  • Tiene un contenido (sección también llamada definición del procedimiento: aquí se especifica qué es lo que va a hacer y cómo). Ese contenido puede estar compuesto por instrucciones sql, estructuras de control, declaración de variables locales, control de errores, etcétera.

MariaDB sigue la sintaxis SQL:2003 para procedimientos almacenados, que también usa IBM DB2.

En resumen, la sintaxis de un procedimiento almacenado es la siguiente:

  CREATE PROCEDURE nombre (parámetro)
      [características] definición

o para ser más técnicos:

CREATE
    [OR REPLACE]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

type:
    Any valid MariaDB data type

characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'

routine_body:
    Valid SQL procedure statement

Puede haber más de un parámetro (se separan con comas) o puede no haber ninguno (en este caso deben seguir presentes los paréntesis, aunque no haya nada dentro).

Los parámetros tienen la siguiente estructura: modo nombre tipo

Donde:
  • modo: es opcional y puede ser IN (el valor por defecto, son los parámetros que el procedimiento recibirá), OUT (son los parámetros que el procedimiento podrá modificar) INOUT (mezcla de los dos anteriores).
  • nombre: es el nombre del parámetro.
  • tipo: es cualquier tipo de dato de los provistos por MariaDB.
  • Dentro de características es posible incluir comentarios o definir si el procedimiento obtendrá los mismos resultados ante entradas iguales, entre otras cosas.
  • definición: es el cuerpo del procedimiento y está compuesto por el procedimiento en sí: aquí se define qué hace, cómo lo hace y bajo qué circunstancias lo hace.
Así como existen los procedimientos, también existen las funciones. Para crear una función, MariaDB nos ofrece la directiva CREATE FUNCTION.

La diferencia entre una función y un procedimiento es que la función devuelve valores. Estos valores pueden ser utilizados como argumentos para instrucciones SQL, tal como lo hacemos normalmente con otras funciones como son, por ejemplo, MAX() o COUNT().

Utilizar la cláusula RETURNS es obligatorio al momento de definir una función y sirve para especificar el tipo de dato que será devuelto (sólo el tipo de dato, no el dato).

Su sintaxis es:

CREATE FUNCTION nombre (parámetro)
RETURNS tipo
[características] definición

o para ser más técnicos:

CREATE [OR REPLACE]
    [DEFINER = {user | CURRENT_USER | role | CURRENT_ROLE }]
    [AGGREGATE] FUNCTION [IF NOT EXISTS] func_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...]
    RETURN func_body


func_parameter:
    param_name type


type:
    Any valid MariaDB data type


characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'


func_body:
    Valid SQL procedure statement

Puede haber más de un parámetro (se separan con comas) o puede no haber ninguno (en este caso deben seguir presentes los paréntesis, aunque no haya nada dentro). Los parámetros tienen la siguiente estructura: nombre tipo

Donde:
  • nombre: es el nombre del parámetro.
  • tipo: es cualquier tipo de dato de los provistos por MariaDB.
  • Dentro de características es posible incluir comentarios o definir si la función devolverá los mismos resultados ante entradas iguales, entre otras cosas.
  • definición: es el cuerpo del procedimiento y está compuesto por el procedimiento en sí: aquí se define qué hace, cómo lo hace y cuándo lo hace.

Para llamar a una función lo hacemos simplemente invocando su nombre, como se hace en muchos lenguajes de programación.

Desde una función podemos invocar a su vez a otras funciones o procedimientos.

delimiter //
CREATE PROCEDURE procedimiento (IN cod INT)
    BEGIN
        SELECT * FROM tabla WHERE cod_t = cod;
    END
//
Query OK, 0 rows affected (0.00 sec)
delimiter ;
CALL procedimento(4);


En el código anterior lo primero que hacemos es fijar un delimitador. Al utilizar la línea de comandos de MariaDB vimos que el delimitador por defecto es el punto y coma (;): en los procedimientos almacenados podemos definirlo nosotros.

Lo interesante de esto es que podemos escribir el delimitador anterior; sin que el procedimiento termine. Más adelante, en este mismo código volveremos al delimitador clásico. Luego creamos el procedimiento con la sintaxis vista anteriormente y ubicamos el contenido entre las palabras reservadas BEGIN y END.

El procedimiento recibe un parámetro para luego trabajar con él, por eso ese parámetro es de tipo IN. Definimos el parámetro como OUT cuando en él se va aguardar la salida del procedimiento. Si el parámetro hubiera sido de entrada y salida a la vez, sería de tipo denominado INOUT.

El procedimiento termina y es llamado luego mediante la siguiente instrucción:

  mysql> CALL procedimento(4);


Otro ejemplo:

CREATE PROCEDURE procedimiento2 (IN a INTEGER)
BEGIN
DECLARE variable CHAR(20);
IF a > 10 THEN
SET variable = ‘mayor a 10’;
ELSE
SET variable = ‘menor o igual a 10’;
END IF;
INSERT INTO tabla VALUES (variable);
END

  • El procedimiento recibe un parámetro llamado a que es de tipo entero.
  • Se declara una variable para uso interno que se llama variable y es de tipo char.
  • Se implementa una estructura de control y si a es mayor a 10 se asigna a variable un valor. Si no lo es se le asigna otro.
  • Se utiliza el valor final de variable en una instrucción SQL.


Recordemos que para implementar el ultimo ejemplo se deberán usar nuevos delimitadores, como se vio anteriormente.

Observemos ahora un ejemplo de funciones:

delimiter //
CREATE FUNCTION cuadrado (s SMALLINT) RETURNS SMALLINT
   RETURN s*s;
//
Query OK, 0 rows affected (0.00 sec)
delimiter ;
SELECT cuadrado(2);


En definitiva hemos dado un recorrido por el mundo de la programación de procedimientos almacenados en MariaDB.

Dejo Links:
https://mariadb.com/kb/en/library/create-procedure/
https://mariadb.com/kb/en/library/stored-procedures/


Aprender Go en codecademy

En 2009, Google se propuso crear un lenguaje de programación que fuera rápido, productivo y divertido de usar. Y lo más importante, no querían hacer compensaciones entre legibilidad, eficiencia o rendimiento.

10 años después, Go esta estable y lo usan compañías como Netflix, Uber, Codecademy y, por supuesto, Google.

Hoy, nos complace anunciar que nos hemos asociado con Google para crear el mejor curso Go para principiantes más amigable en cualquier lugar. Aprenderá la sintaxis, recibirá preguntas sobre cómo declarar funciones y creará proyectos.

Los primeros cuatro módulos de "Learn Go" están en vivo en nuestro catálogo en este momento.

Este es el mail (la traducción) que me llego de los amigos de Codecademy, con el cual nos invitan a hacer un curso gratuito de Go.

Dejo el link: https://www.codecademy.com/learn/learn-go

Dejo el mail :

 
 
Codeacdemy Presents Learn Go in Partnership with Google
Learn Go
 
 
 
 
In 2009, Google set out to create a programming language that was fast, productive, and fun to use. And most importantly, they didn’t want to make any tradeoffs between readability, efficiency, or performance.
 
10 years later, Go is trusted by developers at companies like Netflix, Uber, Codecademy, and, of course, Google.
 
Today, we’re excited to announce that we’ve partnered with Google to build the best, most beginner-friendly Go course anywhere. You’ll learn the syntax, get quizzed on how to declare functions, and build projects like a flight coordinator for an interstellar travel agency.
 
The first four modules of “Learn Go” are live in our catalog right now.
 
Start Now
 

Ya llega Smalltalks 2019!!!

No se pierdan la Smalltalks de este año en la Universidad Nacional de Comahue en Neuquén!


domingo, 20 de octubre de 2019

Channel Buffering en Go


Por defecto, los canales no tienen búfer, lo que significa que solo aceptarán envíos si hay una recepción correspondiente es decir una lista para recibir los valores enviados. Los canales almacenados temporalmente aceptan un número limitado de valores sin un receptor correspondiente para esos valores.

Veamos un ejemplo:

package main

import "fmt"

func main() {
    messages := make(chan string, 2)
    messages <- "buffered"
    messages <- "channel"

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}

$ go run channel-buffering.go
buffered
channel

Aquí hacemos un canal de cadenas que almacenan en búfer hasta 2 valores.

Debido a que este canal está protegido, podemos enviar estos valores al canal sin una recepción concurrente correspondiente.

Más tarde podemos recibir dos valores más.

Dejo link : https://gobyexample.com/channel-buffering

martes, 15 de octubre de 2019

Proba Rust con Play.rust-lang.org


Rust se esta perfilando como el nuevo C y es excelente lenguaje de bajo nivel. Centrado en el paralelismo y buenas prácticas de programación, esta ganando mucho mercado.

A nivel personal, creo que es mejor que Go, pero eso es para otro post ...

Si quieren probar un poco Rust, tienen play.rust-lang.org un sitio donde podemos escribir codigo, compilarlo y correrlo. Ideal para ir probando código a medida que leemos unos posts o un libro.

Dejo link : https://play.rust-lang.org/