Translate

jueves, 11 de febrero de 2021

Versiones en java

Con la compra de oracle a Sun microsystem la empresa dueña de la base de datos decidió dar un impulso mayor al lenguaje Java. Y ...



Libros de Java code Geek

 

Download IT Guides!

 

Java Reflection Tutorial

We are going to explain what reflection is in general and how can be used in Java. Real uses cases about different reflection uses are listed in the next chapters.

 
 

Abstraction in Java

The principle is sometimes stated as a recommendation to the programmer, but sometimes stated as requirement of the programming language, assuming it is self-understood why abstractions...

 
 

Multithreading and Concurrency Questions

There is a number of things that could potentially blow up and the complexity of systems rises considerably when concurrency is introduced.

However, the...

 
 

Java Annotations Tutorial

We have provided an abundance of tutorials here at Java Code Geeks, like Creating Your Own Java Annotations, Java Annotations Tutorial with Custom Annotation and Java...

 

Rust crea una fundación y es apoyado por Microsoft, Amazon, Google


La gente de Mozilla crea una fundación para darle impulso a Rust.  Dicha fundación es apoyada por Microsoft, Amazon, Google...

Hoy, en nombre del equipo de Rust Core, me complace anunciar la Fundación Rust, una nueva organización independiente sin fines de lucro para administrar el lenguaje de programación y el ecosistema de Rust, con un enfoque único en apoyar al conjunto de mantenedores que gobiernan y desarrollan el proyecto. La Fundación Rust celebrará su primera reunión de la junta mañana, 9 de febrero, a las 4 pm CT. La junta directiva está compuesta por 5 directores de nuestras empresas miembros fundadores, AWS, Huawei, Google, Microsoft y Mozilla, así como 5 directores de liderazgo de proyectos, 2 que representan al Core Team, así como 3 áreas de proyecto: Fiabilidad, Calidad y Colaboración.

Así comienza el primer post de Rust Fundation y es esperable que esto impulse aun más el lenguaje...

Dejo link:

https://foundation.rust-lang.org/posts/2021-02-08-hello-world/

sábado, 6 de febrero de 2021

Que puedo hacer con GraalVM?


GraalVM es (en mi opinión) uno de los proyectos más interesantes de estos tiempos en el mundo java. 

Lo que pasa es que GraalVM es un proyecto paraguas y dentro tiene varios proyectos que permiten hacer diferentes cosas. Veamos que podemos hacer con este proyecto: 

1. Correr java más rápido. La JVM de GraalVM es más rápida que la jvm estandar.  

2. Low-footprint, fast-startup Java

3. Podemos escribir aplicaciones poliglotas en : JavaScript, Java, Ruby y R

4. Ejecutar las aplicaciones java de forma nativa

5. Utilizar herramientas que funcionan en todos los lenguajes

6. Código Java como biblioteca nativa

7. Polyglot en la base de datos, correr aplicaciones Java en la base de datos. 

8. Crear tu propio lenguaje. 


Como se puede ver hay varias cositas. Vamos a centrarnos en cada una en post posteriores. 


viernes, 5 de febrero de 2021

GraalVM 21.0 introduce una JVM escrita en Java


GraalVM es (en mi opinión) uno de los proyectos más interesantes de estos tiempos en el mundo java. 

La versión 21 introduce una JVM escrita en Java. Con esta versión, Java on Truffle, una JVM escrita en Java que utiliza el framework Truffle, proporciona una opción adicional para ejecutar aplicaciones Java.


Java on Truffle, con nombre en código Espresso, se puede instalar utilizando GraalVM Updater que es un administrador de paquetes que descarga e instala paquetes que no están incluidos en la distribución principal de GraalVM.

gu install espresso

Para ejecutar una aplicación Java usando Java en Truffle, la opción -truffle debe pasarse al comando java.

java -truffle -jar awesomeApp.jar

Java on Truffle es una JVM minificada que proporciona todos los componentes centrales de una JVM como el intérprete de bytes code, la interfaz nativa de Java (JNI) y el protocolo Java Debug Wire (JDWP). Implementa las API de la biblioteca Java Runtime Environment (libjvm.so) y reutiliza todos los JAR necesarios y las bibliotecas nativas de GraalVM. Y al igual que con una JVM tradicional, Java on Truffle admite la ejecución de otros lenguajes basados en JVM como Kotlin.

Dado que está implementado en Java y puede ejecutar Java, Java en Truffle es esencialmente Java autohospedado o Java en Java. Esto abre oportunidades interesantes para investigar e innovar la JVM, ya que permite a los desarrolladores de Java leer y comprender el código fuente de la JVM y mejorarlo.

Dejo link: 

https://www.graalvm.org/release-notes/21_0/

https://www.graalvm.org/reference-manual/java-on-truffle/

miércoles, 3 de febrero de 2021

Primeros pasos con Clojure, parte 22


Los mapas se usan comúnmente para dos propósitos: administrar una asociación de claves a valores y representar datos de aplicaciones de dominio. El primer caso de uso suele denominarse diccionarios o mapas hash en otros lenguajes.

Los mapas se representan como claves y valores alternados rodeados por {y}.

(def scores {"Fred"  1400

                   "Bob"   1240

                  "Angela" 1024})

Cuando Clojure imprime un mapa en el REPL, pondrá comas entre cada par clave / valor. Estos se utilizan exclusivamente para facilitar la lectura: las comas se tratan como espacios en blanco en Clojure. 

;; same as the last one!

(def scores {"Fred" 1400, "Bob" 1240, "Angela" 1024})

Se agregan nuevos valores a los mapas con la función assoc (abreviatura de "asociar"):

user=> (assoc scores "Sally" 0)

{"Angela" 1024, "Bob" 1240, "Fred" 1400, "Sally" 0}

Si la clave utilizada en assoc ya existe, el valor se reemplaza.

user=> (assoc scores "Bob" 0)

{"Angela" 1024, "Bob" 0, "Fred" 1400}

La operación complementaria para eliminar pares clave-valor es dissoc ("disociar"):

user=> (dissoc scores "Bob")

{"Angela" 1024, "Fred" 1400}





Ubuntu renovará su instalador de sistema con Flutter


Normalmente hago post de como utilizar tecnología pero no de quien o donde se usa. Y creo muy importante esta noticia porque es un ejemplo de un uso de tecnología. 

Flutter es una tecnología que permite hacer aplicaciones mobile multiplataforma utilizando el lenguaje de programación Dart. Y la empresa canonical (dueña de Ubuntu) ha elegido esta tecnología para reescribir su instalador de sistema. 

Por lo tanto en un futuro cercano vamos a tener un intalador de Ubuntu hecho en Flutter. 

Y eso, dejo link: https://discourse.ubuntu.com/t/refreshing-the-ubuntu-desktop-installer/20659


sábado, 30 de enero de 2021

Aplanando listas en Python


Algunas veces tenemos una estructura de lista que dentro tiene listas, y se complica demasiado trbajar con estas estructuras, por lo tanto lo que podemos hacer es aplanarlas en una lista simple. Esto lo podemos hacer con itertools.chain.from_iterable del paquete itertools, veamos un ejemplo : 

a_list = [[1, 2], [3, 4], [5, 6]]

print(list(itertools.chain.from_iterable(a_list)))

# Output: [1, 2, 3, 4, 5, 6]

# o podemos hacer : 

print(list(itertools.chain(*a_list)))

# Output: [1, 2, 3, 4, 5, 6]



ReScript


Javascript no nos da un descanso...

Luego de aprender Javascript, aprendimos CofeScript (se acuerdan?) y luego Typescript y ahora llega Rescript. 

Rescript es el lenguaje similar a JavaScript que estabas esperando. Es el slogan de este lenguaje, aunque yo no esperaba nada :P 

Antes de ponerme a ver la instalación del entorno y todo eso, vamos a ver  el lenguaje, veamos unos ejemplos: 


// MyFile.res


let rec fib = n => {

  switch n {

  | 0 | 1 => 1

  | n => fib(n -1) + fib(n-2)

  }

}

Js.log(fib(0))


A simple vista se puede ver la influencia de los lenguajes funcionales. 

Rescript aporta un sistema de tipos, podemos tener estructuras o tipos, veamos ejemplos : 

//definimos una estructura persona

type rec person = {

  name: string,

  friends: array<person>

}

//Definimos tipos y los usamos 

type intCoordinates = (int, int, int)

type floatCoordinates = (float, float, float)


let a: intCoordinates = (10, 20, 20)

let b: floatCoordinates = (10.5, 20.5, 20.5)


En fin, ReScript nos brinda muchas ventajas, como tipos, lazy values, objetos, etc .. Pero no veo, claramente algunas ventajas para migrar un proyecto Typescript a Rescript. Como me gustan los vs, tengo que hacer un post Rescript vs Typescript.  

Dejo link: https://rescript-lang.org/


miércoles, 27 de enero de 2021

Libros Gratuitos de Java Code Geeks

 

Download IT Guides!

 

Apache Maven Cookbook

An XML file describes the software project being built, its dependencies on other external modules and components, the build order, directories, and required plug-ins. It comes with...

 
 

Apache Hadoop Tutorial

Hadoop has become the de-facto tool used for Distributed computing. For this reason we have provided an abundance of tutorials here at Java Code Geeks.

 
 

JBoss Drools Cookbook

Drools supports the JSR-94 standard for its business rule engine and enterprise framework for the construction, maintenance, and enforcement of business policies in an organization,...

 
 

Java Interview Questions

In the following sections we will discuss about object-oriented programming and its characteristics, general questions regarding Java and its functionality, collections in Java, garbage...

 

lunes, 25 de enero de 2021

De CSV a json con Python


Si tenemos que pasar un archivo csv a un formato Json podemos utilizar este comando mágico : 

python -c "import csv,json;print json.dumps(list(csv.reader(open('csv_file.csv'))))"

Y Listo!!

 

jueves, 21 de enero de 2021

Primeros pasos con Clojure, parte 21



Seguimos con Clojure... 

Los conjuntos ordenados se ordenan según una función de comparación que puede comparar dos elementos. De forma predeterminada, se utiliza la función de comparación de Clojure, que ordena en el orden "natural" los números, cadenas, etc.


user=> (conj (sorted-set) "Bravo" "Charlie" "Sigma" "Alpha")

#{"Alpha" "Bravo" "Charlie" "Sigma"}


También se puede utilizar un comparador personalizado con sorted-set-by.


user> (sorted-set-by > 3 5 8 2 1)

#{8 5 3 2 1}


into se utiliza para agregar una colección en otra.


user=> (def players #{"Alice" "Bob" "Kelly"})

user=> (def new-players ["Tim" "Sue" "Greg"])

user=> (into players new-players)

#{"Alice" "Greg" "Sue" "Bob" "Tim" "Kelly"}


into devuelve una colección del mismo tipo que su primer argumento.


miércoles, 20 de enero de 2021

Primeros pasos con Clojure, parte 20


Seguimos con Clojure... 

Los Set son conjuntos matemáticos, desordenados y sin duplicados. Los conjuntos son ideales para comprobar de forma eficaz si una colección contiene un elemento o para eliminar cualquier elemento arbitrario.

(def players #{"Alice", "Bob", "Kelly"})

Al igual que con los vectores y las listas, conj se usa para agregar elementos.

user=> (conj players "Fred")
#{"Alice" "Fred" "Bob" "Kelly"}

Como los conjuntos no tienen orden, se agrega en cualquier lado. 

La función disj ("disjoin") se utiliza para eliminar uno o más elementos de un conjunto.

user=> (disj players "Bob" "Sal")
#{"Alice" "Kelly"}

Para saber si un elemento ya esta contenido se hace : 

user=> (contains? players "Kelly")
true


martes, 19 de enero de 2021

Detectar cuellos de botella en Python


Esto puede ser extremadamente útil para identificar los cuellos de botella en scripts Python :


python -m cProfile my_script.py


cProfile es una implementación más rápida que profile, ya que está escrito en c


lunes, 18 de enero de 2021

Primeros pasos con Clojure, parte 19


Seguimos con Clojure... 

Las listas son listas enlazadas secuenciales que agregan nuevos elementos al principio de la lista, en lugar de al final como vectores.

Debido a que las listas se evalúan invocando el primer elemento como una función, debemos agregar el ' para evitar la evaluación:

(def cards '(10 :ace :jack 9))

Las listas no están indexadas, por lo que se deben recorre accediendo al primero y al resto.

user=> (first cards)

10

user=> (rest cards)

'(:ace :jack 9)

conj se puede usar para agregar elementos a una lista al igual que con los vectores. Sin embargo, conj  agrega elementos al frente de las listas:

user=> (conj cards :queen)

(:queen 10 :ace :jack 9)

Las listas también se pueden usar como una pila con peek y pop:

user=> (def stack '(:a :b))

#'user/stack

user=> (peek stack)

:a

user=> (pop stack)

(:b)