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

viernes, 1 de noviembre de 2019

¿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!


sábado, 11 de agosto de 2018

Crystal v0.26.0 fue liberado !!


Crystal es un lenguaje que tiene muchísimo futuro y en mi opinión es el lenguaje orientado a objeto de tipado estático mejor diseñado.

Es simple y la inferencia de tipos lo hace fácil de usar y al ser de tipado estático es muy rápido. 

Esta es su versión 0.26.0 y sigue creciendo. 

Lo único que a mi modo de ver las cosas debería hacer es correr en una plataforma donde pueda reutilizar frameworks como dot net core o java. Eso le daría una popularidad increíble.

Sin más espero que siga creciendo este gran lenguaje.

Dejo link:
https://crystal-lang.org/
https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md

miércoles, 10 de enero de 2018

Lenguajes de programación para aprender en 2018

Quiero compartir un excelente articulo sobre lenguajes de programación en 2018 (es decir este año)

Si bien el articulo no presenta mayor sorpresa, lista los lenguajes más populares de 2017 y que seguirán fuerte en 2018. Ojo aparece Scala (esto me llamo mucho la atención)

Yo empece el año con Crystal y se lo recomiendo porque esta muy bueno el lenguaje.

Dejo link: https://platzi.com/blog/lenguajes-de-programacion-2018/?utm_source=facebook&utm_medium=paidsocial&utm_campaign=pubetapa0

martes, 9 de enero de 2018

Juego de Serie en Crystal


Cuando quiero aprender un nuevo lenguaje desarrollo un juego de series, es decir aparece una serie con un valor faltante y el jugador debe completarlo.

Uno de los requerimientos no funcionales es que se pueda agregar una serie nueva fácilmente, para cumplirlo vamos a utilizar las ventajas de herencia y polimorfismo.

Vamos a desarrollar este juego en Crystal :

Comencemos haciendo un nuevo proyecto:

crystal init app secuenciaCrystal
cd secuenciaCrystal

y luego probamos compilar :

shards build

Y todo debería funcionar. 

Ahora utilizaremos visual code con un plugin para crystal, para importar el proyecto, vamos a abrir carpeta y seleccionamos la carpeta donde estamos trabajando : 


Ahora vamos a hacer un archivo secuencia.cr que va a tener las clases de secuencias:


abstract class Secuencia

  @secuencia : Array(Int32)

  getter secuencia

  def initialize()
    @secuencia = generarSecuencia()
  end

  abstract def generarSecuencia() : Array(Int32)

end

class SecuenciaPar < Secuencia

  def generarSecuencia() : Array(Int32)
     Array(Int32).new(4) { |i|
       i * 2 * rand(100) + rand(10) * 2
     }

  end

end

class SecuenciaInPar < Secuencia

  def generarSecuencia() : Array(Int32)
    Array(Int32).new(4) { |i|
       i * 2 * rand(100) + rand(10) * 2 + 1
    }
  end

end

Luego hacemos otro archivo para juego:

require "./secuencia.cr"

class Juego

  getter puntos

  @secuencia : Secuencia

  def initialize()
    @puntos = 0
    @secuencia = generarSecuencia()
  end

  def generarSecuencia() : Secuencia
    i = rand(2)

    case i
        when 0
          SecuenciaPar.new
        else
          SecuenciaInPar.new
    end
  end

  def valor1()
    @secuencia.secuencia[0]   
  end

  def valor2()
    @secuencia.secuencia[1]   
  end

  def valor4()
    @secuencia.secuencia[3]   
  end

  def esta_bien?(num : Int32?) : Bool
    if @secuencia.secuencia[2] == num
       @puntos = @puntos + 1
       @secuencia = generarSecuencia()
       true
    else
       @puntos = @puntos - 1
       @secuencia = generarSecuencia()
       false
    end
  end

end

Y por ultimo tenemos el programa propiamente dicho:

require "./secuenciaCrystal/*"
require "./juego.cr"


module SecuenciaCrystal
  puts "Bienvenido a Secuancia Crystal"
  juego = Juego.new
  while true
    puts juego.valor1.to_s + " " + juego.valor2.to_s + " ______ " + juego.valor4.to_s + " \n"
    puts "Ingere el valor \n"
   
    valorStr = gets.to_s
   
    valor = (valorStr).to_i32

    if juego.esta_bien?(valor)
      puts " Ganaste !! Tus puntos : " + juego.puntos.to_s
    else
      puts " Perdiste !! Tus puntos : " + juego.puntos.to_s
    end
    puts "Ingere 0 para salir y otro valor para continuar"
    if gets()  == "0"
      break
    end

  end
  puts "Bye!"
end


Como se puede apreciar el diseño del juego permite generar una interfaz de consola o gráfica o en otra tecnología esta es la mayor ventaja de separar nuestros objetos de la capa de presentación.

Funcionando es muy divertido:



Dejo el repo: https://github.com/emanuelpeg/secuenciaCrystal



domingo, 7 de enero de 2018

Primeros pasos con Crystal parte 2


Instalado el compilador y probado. Podemos empezar a hacer nuestro primer proyecto.

Para poder continuar el post con un ide un poco más comoda que nano, voy a usar el visual code con un pluging para Crystal. Es muy fácil instalar esto, van a complementos y buscan Crystal :



Si conocen otra IDE mejor, por favor comenten. Gracias.

Ahora voy a la consola y voy hacer mi proyecto:

crystal init app MiPrimerApp

Esto creo todo un proyecto ya listo para usar con git y con dependencias, versión y todo lo necesario :

Por ahora y solo por ahora, vamos a hacer un "Hola mundo" . Editamos MiPrimerApp.cr y escribimos:

require "./MiPrimerApp/*"

module MiPrimerApp
  puts "Hola Mundo"
end

Luego en la consola entramos en la carpeta MiPrimerApp

cd MiPrimerApp

Ahora a ejecutar:

crystal deps

Para resolver las dependencias

crystal docs

Para generar la documentación. 

shards build

Para compilar todo. (luego hablaremos de shards)

Si todo fue bien, podemos entrar a la carpeta bin y ejecutar nuestra aplicación: 

 cd bin/
./MiPrimerApp 

Y listo!!



sábado, 6 de enero de 2018

Primeros pasos con Crystal

Ya instalado Crystal, vamos a comenzar haciendo un "Hola mundo"

Para hacer un ejemplo rápido vamos a utilizar la consola.

Primero con nano, vamos a hacer nuestro archivo que debe tener extensión .cr :

nano holaMundo.cr

Luego vamos a programar el hola mundo : 

puts "Hola Mundo"

Luego salimos y guardamos.

Ahora vamos a compilar y ejecutar: 

crystal holaMundo.cr

Si solo queremos ejecutar podemos hacer : 

crystal run holaMundo.cr 

Para generar un ejecutable debemos hacer : 

crystal build holaMundo.cr

Luego podemos ejecutar nuestro programa con : 

./holaMundo

Por defecto, los archivos ejecutables generados no están completamente optimizados. Para activar optimizaciones, se debe usar --release

crystal build holaMundo.cr --release

Si queremos no solo trabajar con un solo archivo sino hacer proyectos debemos utilizar el comando init pero eso sera en otro post. 

Instalar Crystal en Linux


Para instalar Crystal en Linux es muy fácil.

Vamos por pasos:

Primero, debe agregar el repositorio a su configuración APT. Podemos hacerlo con este comando:

curl https://dist.crystal-lang.org/apt/setup.sh | sudo bash

Eso agregará la clave de firma y la configuración del repositorio. Si queremos hacerlo manualmente, ejecutamos los siguientes comandos como root:

apt-key adv --keyserver keys.gnupg.net --recv-keys 09617FD37CC06B54
echo "deb https://dist.crystal-lang.org/apt crystal main" > /etc/apt/sources.list.d/crystal.list
apt-get update

Una vez que el repositorio está configurado, estamos listo para instalar Crystal:

sudo apt-get install crystal

Algunas veces necesitará instalar el paquete build-essential para ejecutar o construir programas Crystal. Puedes instalarlo con el comando:

sudo apt-get install build-essential

Y Listo!!

Dejo link: https://crystal-lang.org/docs/installation/on_debian_and_ubuntu.html



Ruby + C = Crystal

Imaginate un lenguaje con la potencia de C pero la sintaxis de Ruby. En resumen eso es Crystal, un lenguaje con chequeo de tipos y sintaxis similar a Ruby.

Veamos un ejemplo:

# A very basic HTTP server
require "http/server"

server = HTTP::Server.new(8080) do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world, got #{context.request.path}!"
end

puts "Listening on http://127.0.0.1:8080"
server.listen

Este pequeño ejemplo hemos montado un servidor web con una página de ejemplo.

Crystal tiene chequeo de tipo forma estática, por lo que el compilador detectará cualquier tipo de error antes de que falle en el tiempo de ejecución. Además, y para mantener el lenguaje limpio, Crystal tiene inferencia de tipos, por lo que no es necesario indicar el tipo la mayoría de las veces.

def shout(x)
  # Notice that both Int32 and String respond_to `to_s`
  x.to_s.upcase
end

foo = ENV["FOO"]? || 10

typeof(foo) # => (Int32 | String)
typeof(shout(foo)) # => String

Los tipos no permiten null y las variables nullable se representan como una unión entre el tipo y null. Como consecuencia, el compilador comprobará automáticamente si hay referencias nulas en tiempo de compilación.

if rand(2) > 0
  my_string = "hello world"
end

puts my_string.upcase

Si corremos esto :

$ crystal hello_world.cr
Error in hello_world.cr:5: undefined method 'upcase' for Nil (compile-time type is (String | Nil))

puts my_string.upcase

Crystal posee un potente sistema de macro , que abarca desde la inspección básica de plantillas y AST hasta la inspección de tipos y la ejecución de programas externos arbitrarios.

class Object
  def has_instance_var?(name) : Bool
    {{ @type.instance_vars.map &.name.stringify }}.includes? name
  end
end

person = Person.new "John", 30
person.has_instance_var?("name") #=> true
person.has_instance_var?("birthday") #=> false

Crystal usa hilos verdes, llamados fibras, para lograr concurrencia. Las fibras se comunican entre sí mediante canales, como en Go o Clojure, sin tener que recurrir a la memoria compartida o bloqueos.

channel = Channel(Int32).new
total_lines = 0
files = Dir.glob("*.txt")

files.each do |f|
  spawn do
    lines = File.read(f).lines.size
    channel.send lines
  end
end

files.size.times do
  total_lines += channel.receive
end

puts total_lines

Crystal tiene una sintaxis dedicada para llamar fácilmente a bibliotecas nativas, eliminando la necesidad de volver a implementar tareas de bajo nivel.

# Fragment of the BigInt implementation that uses GMP
@[Link("gmp")]
lib LibGMP
  alias Int = LibC::Int
  alias ULong = LibC::ULong

  struct MPZ
    _mp_alloc : Int32
    _mp_size : Int32
    _mp_d : ULong*
  end

  fun init_set_str = __gmpz_init_set_str(rop : MPZ*, str : UInt8*, base : Int) : Int
  fun cmp = __gmpz_cmp(op1 : MPZ*, op2 : MPZ*) : Int
end

struct BigInt < Int
  def initialize(str : String, base = 10)
    err = LibGMP.init_set_str(out @mpz, str, base)
    raise ArgumentError.new("invalid BigInt: #{str}") if err == -1
  end

  def <=>(other : BigInt)
    LibGMP.cmp(mpz, other)
  end
end

Las bibliotecas de Crystal se empaquetan como fragmentos y se distribuyen a través de Git sin necesidad de un repositorio centralizado. Los comandos incorporados permiten que las dependencias se especifiquen fácilmente a través de un archivo YAML y se obtengan de sus respectivos repositorios.

name: my-project
version: 0.1
license: MIT

crystal: 0.21.0

dependencies:
  mysql:
    github: crystal-lang/crystal-mysql
    version: ~> 0.3.1

Esto es solo un post de muestra. Para empezar de lleno vamos a tener que instalar el lenguaje y luego a estudiar, pero esos serán otros post.

Dejo link: https://crystal-lang.org/
https://github.com/crystal-lang/crystal/

domingo, 4 de junio de 2017

9 lenguajes que deberías aprender en el 2017


Muy pocas veces me encuentro con un articulo que dice que debemos aprender algo y coincido, normalmente son tecnologías ya consolidadas pero esta vez me encontré con un articulo que no le importo hacer futurología y tiro algunos nombres de lenguajes que son poco comunes en estas listas.

Los lenguajes que debemos aprender son:

  • Kotlin: como era de esperar, todo el mundo habla de él luego de convertirse en el lenguaje soportado por Android. 
  • Elm: Lenguaje funcional por demás interesante, permite compilar a html y javascript.
  • Julia: Similar a python pero dedicado a la ciencia. 
  • Elixir: Lenguaje funcional que hemos hablado ciento de veces en el blog.
  • Rust: Lenguaje de propósito general, que se parece mucho a C++
  • Crystal: Este si no lo conocía, se viene un post en breve. 
  • Groovy: En serio? yo creía que venia bajando su popularidad y de repente aparece en esta lista. 
  • R: Si haces algo con estadísticas debes conocer a R, es un lenguaje funcional dedicado a la estadísticas, que cada vez adquiere más adeptos. 
  • Go: El lenguaje de google viene lento pero seguro ganando mercado. 

Entre las cosas que me llamaron la atención puedo nombrar:

  • El 90% de los lenguajes nombrados tienen al menos un post en el blog! (tengo que hacer algo de publicidad)
  • Podríamos decir que la mitad o más son lenguajes funcionales, o que aplican técnicas de programación funcional, Entonces, a aprender funcional, no?


Por lo tanto decidí compartir este articulo:
http://www.rankred.com/new-programming-languages-to-learn/