domingo, 28 de mayo de 2017

Un resumen de Scala for the Impatient, parte 19


Paquetes

Los paquetes en Scala son similares a lo propuesto en java o en los espacios de nombre de C++, esto es un mecanismo para el manejo de nombres, por ejemplo el nombre Map puede referirse a una estructura de datos mapa o diccionario de datos del paquete scala.collection.immutable y scala.collection.mutable sin que haya conflicto. Uno puede acceder a esta clase por medio de su nombre, scala.collection.immutable.Map o scala.collection.mutable.Map. Alternativamente podemos utilizar alias.

Para agregar algo a un paquete  

package com {
package horstmann {
package impatient {
class Employee

}
}
}

Ahora la clase Employee es accesible desde el paquete com.horstmann.impatient.

A diferencia de las clases u objetos, los paquetes pueden ser definidos en multiples archivos. Por ejemplo si decidimos agregar la clase Manager al paquete anterior:

package com {
package horstmann {
package impatient {
class Manager

}
}
}
 
Notemos que no existe una relación entre el directorio que contiene a la clase y el sistema de paquetes.

package com {
package horstmann {
package impatient {
class Employee

}
}
}

package com {
package bigjava {
class Counter

}
}
}

Reglas de Alcance

En Scala, las reglas de ámbito para los paquetes son más consistentes que en Java. Los paquetes de Scala anidan como todos los demás ámbitos, es decir se puede acceder a los nombres del ámbito de que están incluidos en ese ambito. Por ejemplo,

package com {
package horstmann {
object Utils {
def percentOf(value: Double, rate: Double) = value * rate / 100
...
}
package impatient {
class Employee {
...
def giveRaise(rate: scala.Double) {
salary += Utils.percentOf(salary, rate)
}
}
}
}
}

Como se puede ver Utils puede ser accedido por Employee porque esta en el ambito.

package com {
package horstmann {
package impatient {
class Manager {
val subordinates = new collection.mutable.ArrayBuffer[Employee]
...
}
}
}
}

Este código aprovecha el hecho de que el paquete scala siempre se importa. Por lo tanto, el paquete es en realidad scala.collection.

Y ahora supongamos que alguien crea el siguiente paquete, tal vez en un archivo diferente:

package com {
package horstmann {
package collection {
...
}
}
}

Ahora la clase Manager ya no compila. Dado que busca un miembro mutable dentro del paquete com.horstmann.collection y no lo encuentra.

En Java, este problema no puede ocurrir porque los nombres de los paquetes son siempre absolutos, comenzando en la raíz de la jerarquía del paquete. Pero en Scala, los nombres de los paquetes son relativos, al igual que los nombres de las clases internas. Con las clases internas, uno no suele tener problemas porque todo el código está en un archivo, bajo el control de quien está a cargo de ese archivo. Pero los paquetes son estructuras abiertas. Cualquier persona puede contribuir a un paquete en cualquier momento.

Una solución es utilizar nombres de paquetes absolutos, empezando por _root_, por ejemplo:

val subordinates = new _root_.scala.collection.mutable.ArrayBuffer[Employee]

Otro enfoque es usar cláusulas de paquete "encadenadas".

Un resumen de Scala for the Impatient, parte 18


Enumeraciones

Al contrario de java o c++, Scala no cuenta con enumeraciones. Pero la librería estándar de scala cuenta con una clase Enumeration, que nos ayudara a trabajar con enumeraciones.

Lo que tenemos que hacer es un objeto que extienda de la clase Enumeration:

object TrafficLightColor extends Enumeration {
  val Red, Yellow, Green = Value
}

Este objeto tiene 3 propiedades Red, Yellow, Green inicializadas como valor. Alternativamente se le puede pasar al valor un id y un nombre o las dos cosas:

val Red = Value(0, "Stop")
val Yellow = Value(10) // Name "Yellow"
val Green = Value("Go") // ID 11

Si no se especifica el id, se asignara uno más del asignado previamente y por defecto el nombre es el nombre del campo.

Ahora usted se puede referirse a la enumeración TrafficLightColor como TrafficLightColor.Red, TrafficLightColor.Yellow, TrafficLightColor.Green. Si esto resulta tedioso, puede importar la clase:

import TrafficLightColor._

Hay que recordar que los valores Red, Green y Yellow son de tipo Value, no TrafficLightColor, si se  quiere se puede definir un alias:

object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red, Yellow, Green = Value
}

Ahora el tipo TrafficLightColor.TrafficLightColor, se va importar y podremos usarlo:

import TrafficLightColor._

def doWhat(color: TrafficLightColor) = {
if (color == Red) "stop"
else if (color == Yellow) "hurry up"
else "go"
}

El id es el valor retornado cuando se llama a la enumeración y el nombre es lo que se llama cuando se llama al método toString

Si llamamos a TrafficLightColor.values podremos obtener todos los valores:

for (c <- TrafficLightColor.values) println(c.id + ": " + c)

Para terminar, podemos buscar un valor por id o nombre, si deseamos buscar el valor Red :
TrafficLightColor(0) // Calls Enumeration.apply
TrafficLightColor.withName("Red")


jueves, 25 de mayo de 2017

Testing en C++

El problema es fácil de plantear, debemos probar una clase en C++ en el entorno qt y deseamos hacerlo con el framework de unit test: UnitTest++

UnitTest ++ es un framework de testing para C ++. Fue diseñado para hacer desarrollo basado en pruebas en una amplia variedad de plataformas. La simplicidad, la portabilidad, la velocidad y la pequeña huella son aspectos muy importantes de UnitTest ++. UnitTest ++ es en su mayoría estándar C ++ y hace un uso mínimo de la biblioteca avanzada y características del lenguaje, lo que significa que debe ser fácilmente portátil a casi cualquier plataforma. Se puede instalar en  las siguientes plataformas:

  • Windows
  • Linux
  • Mac OS X


Desde Linux es fácil instalar el framework:

sudo apt-get install libunittest++-dev

o

sudo yum install  libunittest++-dev

Instalado este framework abrimos nuestro qt y nuestro proyecto, y agregamos en el .pro la siguiente linea: 

LIBS += -lunittest++

Con esta linea agregamos el framework de test y ahora podemos escribir un test, por lo tanto creamos un archivo .cpp nuevo y realizamos un test. 

En el siguiente ejemplo voy a testear una lista de enteros: 

#include <unittest++/UnitTest++.h>
#include "list.h"

TEST(sizeEquals1) {
    List list;
    CHECK(list.add(2));
    CHECK(list.getSize()==1);
}

TEST(sizeEquals2) {
    List list;
    CHECK(list.add(2));
    CHECK(list.add(2));
    CHECK(list.getSize()==2);
}

TEST(sizeEquals1WithRemove) {
    List list;
    CHECK(list.add(2));
    CHECK(list.add(2));
    CHECK(list.remove(2));
    CHECK(list.getSize()==1);
}

int main()
{
    return UnitTest::RunAllTests();
}
Y eso es todo, solo debemos correr el main y obtendremos el resultado de los tests, por ejemplo: 

../Collections/test.cpp:22: error: Failure in sizeEquals1WithRemove: list.getSize()==1
FAILURE: 1 out of 3 tests failed (1 failures).
Test time: 0.00 seconds.

Lo que esta diciendo aquí es que fallo el test sizeEquals1WithRemove. Y si todos los test terminan bien: 

Success: 3 tests passed.
Test time: 0.00 seconds.
Press <RETURN> to close this window...


Dejo link: 

miércoles, 24 de mayo de 2017

Try C#

Notaron que hace poco dije que .net core se viene con todo, bueno por lo tanto es buena idea estudiar C# y que mejor que tomar un curso de codescholl totalmente gratuito.

Code School
 
Try C#
You can build just about anything with C# — from web, desktop, and mobile apps to game development. Learn the basics of this general-purpose language and run your first C# console application when you play Try C#.
View the Course
What You'll Learn
89042fdf-a254-4aaa-98d9-33f0a608770b.png
 
Level 1: Introduction
Learn how to create and run a C# console application.                  
70861114-c2dc-4732-a588-b19113edeff6.png
 
Level 2: Variables
Explore data types as well as declare, store, and retrieve variables.
b685758e-eaf2-48c5-bda3-f26794d60926.png
 
Level 3: Conditions
Discover how to use conditions to change program flow.
Why Try C#?
Course Instructor Eric Fisher walks through the factors in choosing what programming language to learn andwhy you should try C#.
 
Twitter IconFacebook IconLinkedIn Icon

martes, 23 de mayo de 2017

Infografia de Kotlin

Hasta hace poco, si nombrabas Kotlin, pensaban que hablabas de la capital de Bielorrusia y ahora que Android le dio cobijo, esta en todas partes y bueno, tengo que hacerme eco de este entusiasmo:

Why learn Kotlin programming?

sábado, 20 de mayo de 2017

Kotlin, es un lenguaje oficial para programación en la plataforma Android


Ya es noticia en todos lados, y una gran noticia. La plataforma Android tiene un nuevo lenguaje con soporte oficial y es Kotlin.

Siempre me pregunte cuando nacio Android porque no hicieron su plataforma multilenguaje. Si bien habia muchos desarrolladores Java, java venia bajando. Es más creo que Android lo levanto mucho.

Pero como sabemos la plataforma Java tiene mucho futuro, pero el lenguaje empieza su desenso, que es natural y bueno. Kotlin es un lenguaje moderno, en muchos puntos parecido a Scala y me gusta mucho.

Jetbrains, la empresa creadora dle lenguaje la viene pegando increiblemente, IntelliJ IDEA como ide oficial de android, Kotlin como lenguaje oficial y si son de .net la ide JetBrains Rider sugerida como una IDE para programar en .net core. Me saco el sombrero!!

Espero que google siga agregando lenguajes a su plataforma!!

Dejo link:
https://kotlinlang.org/
https://www.infoq.com/news/2017/05/android-kotlin

viernes, 19 de mayo de 2017

Y lo que viene es .net core

La verdad que llegue muy tarde a .net core y todavia esta bastante verde. Pero me sorprendio.

Si bien existe posibilidades de ejecutar codigo .net con mono o otros tantos frameworks. .net core brinda algo que en la ecuaci{on le da mucho peso y es que es totalmente open source y gratuito y esta apoyado por microsoft y apoyada por otras empresas.

Si bien hoy es un salto grande y todavia no esta listo, para producción vamos a tener que estudiarla porque tiene mucho futuro. A simple vista parece que solo es un intento de microsoft para ganar un mercado virgen para él, pero cuando vemos otras empresas interesadas en el proyecto ahi lo tomamos en serío.

Sin más solo anuncio que me voy a poner a estudiar, y les aconsejo que lo hagan tambian.

Dejo link:
https://dotnet.github.io/

miércoles, 17 de mayo de 2017

Desde java a Dart



Encontre esta pagina para aprender Dart para los programadores Java. Esta muy bueno, con ejemplos concretos y es muy pedagojico. Muy recomendado!!

Dejo link:
https://codelabs.developers.google.com/codelabs/from-java-to-dart

Swift 3.1 se viene con todo

Swift 3.1 se viene con todo, mejoras en el lenguaje, mejoras al sistema de paquetes y mejoras en implementación en Linux!!

Como mejora al lenguaje 2 nuevas incorporaciones: prefix y drop (prefijo y postfijo) los cuales permiten recorrer una colección:

let subseq = s.prefix(while: {$0 < m}).drop(while: {$0 < n})

Como podemos ver devuelven la subsecuencia obtenida por la eliminación o inclusión de los elementos iniciales de una secuencia mientras que un predicado dado es verdadero.

Swift 3.1 también agrega una serie de inicializadores de conversión para todos los tipos numéricos, incluidos los tipos Int, Float y Double, que producen un resultado correcto o devuelven nil. Los inicializadores disponibles, tienen por objeto mejorar la conversión de datos. Todos los tipos numéricos tienen por lo tanto un nuevo inicializador que utiliza la palabra clave exacta, por ejemplo:

init?(exactly value: Int64)

Con licencia Apache License, Version 2.0. Swift se esta volviendo un lenguaje cada vez más poderoso.

Dejo link: http://swift-lang.org/main/

sábado, 13 de mayo de 2017

Mendeley


Tuve un curso en la maestría en el cual me mostraron Mendeley y quede maravillado.

Es un gestor de papers, pero se puede utilizar para lectura también. Básicamente Mendeley, organiza los libros o papers que has leído y cual no, permite buscar nuevos. Se sincroniza nuestra librería con la nube y nos permite seguir leyendo en cualquier lugar.

Solo uno tiene que hacerse una cuenta y luego se baja la aplicación que viene para muchas plataformas, se instala y listo.

Muy buen producto, es gratuito hasta 3 gigas y también podemos hacer comunidad y ver que leyeron nuestros amigos y compartir papers.

Esta bueno, muy recomendable.

Dejo link: https://www.mendeley.com/

miércoles, 10 de mayo de 2017

Primeros pasos en Sinatra


Donde nos lleva la vida, no? Nunca pensé que tenia que retomar mis estudios en ruby y mucho menos con Sinatra. Pero esta bueno, volver a leer un lenguaje que me gusta mucho.

Si quieren saber que es Sinatra, acá tenemos un post:
http://emanuelpeg.blogspot.com.ar/2012/11/sinatra-rapida-creacion-de-aplicaciones.html

Empecemos por el principio, instalar Ruby. Eso es muy fácil y si usan linux :

sudo apt-get install ruby-full

En distros Debian, Ubuntu, Mint o cualquier derivado de debian que use apt.

$ sudo yum install ruby

En distros rhel y para otras distros: https://www.ruby-lang.org/es/documentation/installation/

También tenemos que instalar el software de instalación de paquetes RubyGem.

$  sudo apt-get install rubygems 

En distros Debian, Ubuntu, Mint o cualquier derivado de debian que use apt.

$  sudo yum install rubygems 

En distros rhel.

Vamos a ver la versión que instalamos con el comando:

ruby -v

Si dice algo así hemos tenido éxito:

ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

Ya tenemos ruby las gemas, y ahora lo necesitamos a Sinatra:

$  gem install sinatra  

Esto hará que nuestro sistema descargue todas las dependencias como Rack y otras utilidades, aparte de la documentación oficial para varios de estos componentes, de forma que tengamos ayuda cuando queramos ejecutar algún comando en particular.

Ya una vez que tenemos instalado Sinatra y sus dependencias, empezar a utilizarlo , simplemente debemos crear un nuevo proyecto, es decir, una carpeta donde almacenar nuestros archivos y crear un archivo que llamaremos ejemplo.rb (muy original)

~ $ mkdir ejemplo
~ $ cd ejemplo
 ~/ejemplo $ nano ejemplo.rb

Y ahora escribimos el siguiente código:

require 'sinatra'

get '/' do
  "Hola, mundo!"
end

Y ya estamos, ahora a ejecutarlo:

$ ruby ejemplo.rb

Si todo salio bien tenemos la siguiente salida o parecida :

 /var/lib/gems/2.3.0/gems/rack-2.0.2/lib/rack/show_exceptions.rb:16: warning: already initialized constant Rack::ShowExceptions::CONTEXT
/usr/lib/ruby/vendor_ruby/rack/showexceptions.rb:16: warning: previous definition of CONTEXT was here
/var/lib/gems/2.3.0/gems/rack-2.0.2/lib/rack/show_exceptions.rb:114: warning: already initialized constant Rack::ShowExceptions::TEMPLATE
/usr/lib/ruby/vendor_ruby/rack/showexceptions.rb:115: warning: previous definition of TEMPLATE was here
[2017-05-10 22:44:39] INFO  WEBrick 1.3.1
[2017-05-10 22:44:39] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux-gnu]
== Sinatra (v1.4.7) has taken the stage on 4567 for development with backup from WEBrick
[2017-05-10 22:44:39] INFO  WEBrick::HTTPServer#start: pid=26437 port=4567

Lo importante es que levanto un servidor WEBrick en el puerto 4567 es decir que deberíamos ver un hermoso hola mundo en : http://localhost:4567/


martes, 9 de mayo de 2017

La guía para ejecutar MongoDB

Me llego este mail, y esta tan bueno que lo quiero compartir:

MongoDB
Hola, Pablo: 

Ejecutar MongoDB no es difícil. Si ya está familiarizado con los sistemas de base de datos, la curva de aprendizaje será corta. Si es administrador o arquitecto de bases de datos, o administrador de sistemas o redes, parte con mucha ventaja para aprender a utilizar MongoDB. 

Para facilitarle las cosas, hemos elaborado una Guía de mejores prácticas para las operaciones (en inglés). Obtenga un ejemplar y aprenda a:
  • Diseñar el modelo de datos buscando la simplicidad operativa
  • Facilitar una alta disponibilidad y escalabilidad
  • Supervisar la implementación, realizar copias de seguridad y prepararse para la recuperación ante desastres
  • Garantizar la seguridad y proteger los controles de acceso
Tanto si desea mejorar las operaciones de una implementación existente de MongoDB como si quiere prepararse para crear una, en este artículo monográfico se explica todo lo que necesita saber.
Obtenga un ejemplar
Reciba un cordial saludo,
El equipo de MongoDB
 
 Share on TwitterShare on FacebookShare on LinkedInShare on Google+ 
 
MongoDB Inc., 2017. Todos los derechos reservados.
Palacio de Miraflores, Suite 219 & 220, Carrera de San Jerónimo 15 - 2, Madrid 28014, Spain

sábado, 6 de mayo de 2017

Linux Mint 18.1, "Serena"

Un un problema con la placa de video tuve que formatear la maquina, no todo esta tan mal en la vida. Tuve la gran oportunidad de encontrarme con Linux Mint 18.1,  "Serena" y instale la versión xfce.

Que linda distro! Muy recomendable!

Dejo unos screenshot:






Dejo link: https://www.linuxmint.com

La programación como una forma de pensar


Leyendo un poco la web me encontré con un articulo de la scientific american, muy básicamente señala la importancia que tienen los lenguajes de programación modernos y su impacto positivo en el pensar humano.

La programación solía ser solo una traducción: expresar ideas en lenguaje natural, trabajar con ellas en la notación matemática, luego escribir diagramas de flujo y pseudocódigo, y finalmente escribir un programa. La traducción era necesaria porque cada lenguaje ofrece diferentes capacidades. El lenguaje natural es expresivo y legible, el pseudocódigo es más preciso, la notación matemática es concisa y el código es ejecutable.

Pero el precio de la traducción es que estamos limitados al subconjunto de ideas que podemos expresar efectivamente en cada lenguaje. Algunas ideas que son fáciles de expresar computacionalmente son difíciles de escribir en notación matemática, y las manipulaciones simbólicas que hacemos en matemáticas son imposibles en la mayoría de los lenguajes de programación.

El poder de los lenguajes de programación modernos es que son expresivos, legibles, concisos, precisos y ejecutables. Eso significa que podemos eliminar los lenguajes intermedios y usar un lenguaje para explorar, aprender, enseñar y pensar. Esto me hace pensar mucho en smalltalk.

Salvo que habla solo de python, por lo demás esta muy bueno.

Dejo link: https://blogs.scientificamerican.com/guest-blog/programming-as-a-way-of-thinking/

miércoles, 3 de mayo de 2017

Instalar Docker Community Edition en Ubuntu


No es un post muy revelador, la verdad que es bastante fácil pero una ayudita nunca viene mal.

Como prerequisitos, esto funciona para las siguientes versiones de Ubuntu:

  • Yakkety 16.10
  • Xenial 16.04
  • Trusty 14.04

Primero instalar  apt-transport-https,  ca-certificates y  curl : 




sudo apt-get -y install \
  apt-transport-https \
  ca-certificates \
  curl

Luego nos traemos el certificado. 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

y luego agregamos el repositorio: 

sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"

y luego refrescamos el repositorio: 

sudo apt-get update

y por ultimo pero no menos importante instalamos docker: 

sudo apt-get -y install docker-ce

Y probamos la instalación: 

sudo docker run hello-world

Oracle Database 12c esta disponible en Docker


Al parecer la semana pasada en Dockercon, Oracle anuncio que la base de datos Oracle va estar disponible en el Docker Store.

La verdad es que no entiendo nada, si ven el precio dice 0 ?

Algo raro hay, alguien me explica?

Dejo link: https://store.docker.com/images/oracle-database-enterprise-edition?tab=description
https://blog.docker.com/2017/04/oracle-database-dev-tools-in-docker-store/

domingo, 30 de abril de 2017

Un resumen de Scala for the Impatient, parte 17




Objetos que extienden de clases o trait

Un objeto puede extender de una clase y/o una o más traits. El resultado es un objeto que tiene las características de la clase y/o traits y puede agregar características propias.

Esto puede ser muy útil, por ejemplo para implementar el patrón NullObject. En el cual modelamos el objeto nulo, dado que queremos aprovechar las ventajas de la programación orientada a objeto.

Por ejemplo una acción de un comando que no haga nada:

abstract class UndoableAction(val description: String) {
def undo(): Unit
def redo(): Unit
}

object DoNothingAction extends UndoableAction("Do nothing") {
override def undo() {}
override def redo() {}
}

Luego si tenemos un mapa de acciones:

val actions = Map("open" -> DoNothingAction, "save" -> DoNothingAction, …)

El método apply

Es común que los objetos tengan un método apply que se ejecuta cuando se llama el objeto con parámetros:

Object(arg1, ..., argN)

Típicamente estos métodos retornan una instancia de la clase que acompaña este objeto.

Por ejemplo el Array tiene un método apply que construye un Array con los objetos pasados por parámetros:

Array("Mary", "had", "a", "little", "lamb")

Porque no usar un constructor? Para no usar la palabra clave new, de esta manera podemos construir  un arreglo de la siguiente manera:

Array(Array(1, 7), Array(2, 9))

Veamos un ejemplo de una definición de un método apply :

class Account private (val id: Int, initialBalance: Double) {
    private var balance = initialBalance
    ...
}
object Account { // The companion object
    def apply(initialBalance: Double) =
new Account(newUniqueNumber(), initialBalance)
   …
 }

Ahora podemos construir una cuenta de la siguiente manera:

val acct = Account(1000.0)

El Objeto aplicación

Un programa Scala al igual que c++ o java, ejecuta un método main el cual recibe por parámetros un vector de Strings y retorna el tipo Unit.

object Hello {
  def main(args: Array[String]) {
     println("Hello, World!")
  }
}

Otra forma de ejecutar programas sin escribir el método main es extender el de App :

object Hello extends App {
  println("Hello, World!")
}

Si necesita argumentos App tiene una propiedad args:

object Hello extends App {
  if (args.length > 0)
    println("Hello, " + args(0))
  else
    println("Hello, World!")
}

Ahora podemos correr nuestro programa:

$ scalac Hello.scala
$ scala Hello Fred
Hello, Fred

miércoles, 26 de abril de 2017

Scala exercises


Queres aprender scala? y divertirte??

Este sitio es para vos!!

Scala exercises permite ingresar con un usuario de github y podes realizar ejercicios que te permite aprender Scala, si! y de forma gratuita!!

Dejo link: https://www.scala-exercises.org


GitLab



GitLab es un sistema web para administración de nuestros repositorios GIT. Entre mucas características podemos nombras que trae con sigo una wiki y un sistema de seguimientos de bugs. Además es open source y fue desarrollado por GITlab inc.

Con todas esas ventajas no es de extrañar que sea usado por IBM, Sony, Jülich Research Center, NASA, Alibaba, Invincea, O’Reilly Media, Leibniz-Rechenzentrum (LRZ) y CERN.

La versión se puede bajar y instalar de forma gratuita pero a la vez trae una versión de pago.

La verdad que me toco usarlo y es por demás recomendable.

Dejo link: https://about.gitlab.com/

viernes, 21 de abril de 2017

Openlibra


Que bueno que esta openlibra. Para el que no conoce Openlibra es una biblioteca open source, donde se comparten libros y podes descargarlo de forma gratuita.

Se pueden encontrar libros de diferentes temas, si lo que te interesa es la ciencia de computación o informática, este sitio no te va a defraudar. Es muy bueno!!

Entre los temas que podes encontrar tenemos: programación, base de datos, open source, arduino, matemática, libro de metodología, etc.

Muy recomendado!!

Dejo link:
https://openlibra.com/


miércoles, 19 de abril de 2017

Scala vs Kotlin

Estoy viendo un tutorial de kotlin, igual ya antes había leído algo pero muy poco. Muy bueno este lenguaje, pero me llamo la atención que es muy similar a Scala.

Para nombrar algunas cosas una función en scala es algo así:

def suma(a : Int, b: Int) : Int = a + b

y en kotlin algo así:

fun suma(a : Int, b: Int) : Int = a + b

Similar no?

Como pueden probar esto? en scala:

object HelloWorld {
   
  def suma(a : Int, b: Int) : Int = a + b
   
   def main(args: Array[String]) {
      println(suma(2,3))
   }
}

y en kotlin:

fun suma(a : Int, b: Int) : Int = a + b

fun main(args: Array<String>) {
    println(suma(2,3))
}

Soy yo o son parecidos.

Bueno, estuve leyendo una comparación que indica que no tiene Kotlin y scala comparando uno con él otro. Lo malo es que fue escrito por la gente de Kotlin por lo que deja un poco mal parado a scala.

Dejo link:
https://kotlinlang.org/docs/reference/comparison-to-scala.html


sábado, 15 de abril de 2017

Un resumen de Scala for the Impatient, parte 16


Objetos

scala no tiene campos o métodos estáticos, en cambio se pueden usar los objetos. Estos son objetos que solo tienen una instancia (similar a los singletons) y contienen atributos y métodos. Veamos un ejemplo:

object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1; lastNumber }
}

Cuando necesita una único numero de cuenta puede llamar a Accounts.newUniqueNumber()

El constructor de un objeto es ejecutado cuando el objeto es utilizado por primera vez. En el ejemplo el constructor es ejecutado cuando se llame Accounts.newUniqueNumber(). Si este objeto no es utilizado, el constructor no es ejecutado.

Se debería utilizar objetos de scala cuando en java o c++ usábamos singleton.
Esto tiene mayores utilidades que los singletons y es más facil de usar :
  • Se puede utilizar como una clase útil que contiene funciones.
  • No tenemos los problemas del singleton, cuando quiere ser accedido por varios hilos.
  • Se puede utilizar para exponer servicios.

Objetos compañeros.

En Java o c++ podemos poner en la misma clase métodos y propiedades y/o métodos y propiedades estáticas. Pero en scala esto no es posible, por lo tanto podemos hacer objetos con el mismo nombre de la clase y este va contener métodos y propiedades de forma que funcionen como si fueran estáticos.

class Account {
val id = Account.newUniqueNumber()
private var balance = 0.0
def deposit(amount: Double) { balance += amount }
...
}

object Account { // The companion object
private var lastNumber = 0
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
}

El objeto y la clase pueden acceder a propiedades privadas pero deben estar en el mismo archivo.

Objetos que extienden de una Clase o un Rasgo (Trait)

Un objeto puede extender de una clase o uno o más Rasgos o Traits. El resultado es un objeto de una clase que extiende la clase dada y / o rasgos, y además tiene todas las características especificadas en la definición del objeto.

Una aplicación útil es especificar objetos predeterminados que se pueden compartir. Por ejemplo, considere una clase para acciones que se pueden deshacer en un programa.

abstract class UndoableAction(val description: String) {
def undo(): Unit
def redo(): Unit
}

Por defecto el objeto que no hace nada, puede ser un objeto ya que no debemos instanciarlo varias veces:

object DoNothingAction extends UndoableAction("Do nothing") {
override def undo() {}
override def redo() {}
}

DoNothingAction puede ser usado como acción por defecto.



viernes, 14 de abril de 2017

Sequel, un orm para Ruby

Sequel es un ORM para ruby, con todas las ventajas de un ORM y las ventajas que da un lenguaje como Ruby.

  • Sequel proporciona seguridad de subprocesos, agrupación de conexiones y un DSL conciso para la construcción de consultas SQL y esquemas de tabla.
  • Sequel incluye una capa completa de ORM para mapeos de tablas a objetos Ruby.
  • Sequel es compatible con funciones de base de datos avanzadas como sentencias, variables enlazadas, procedimientos almacenados, confirmación de dos fases, aislamiento de transacciones y fragmentación de bases de datos.
  • Actualmente, Sequel tiene adaptadores para ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3 y TinyTDS.
Veamos un ejemplo de creación de tabla y inserción: 


require "rubygems"
require "sequel"

# connect to an in-memory database
DB = Sequel.sqlite

# create an items table
DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end

# create a dataset from the items table
items = DB[:items]

# populate the table
items.insert(:name => 'abc', :price => rand * 100)
items.insert(:name => 'def', :price => rand * 100)
items.insert(:name => 'ghi', :price => rand * 100)

# print out the number of records
puts "Item count: #{items.count}"

# print out the average price
puts "The average price is: #{items.avg(:price)}"


Try docker


Codeschool ha lanzado un nuevo curso, esta vez sobre docker.

Para que no sabe que es docker:  Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de Virtualización a nivel de sistema operativo en Linux. Docker utiliza características de aislamiento de recursos del kernel de Linux, tales como cgroups y espacios de nombres (namespaces) para permitir que "contenedores" independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales.

En conclusión docker es el futuro en deployments por lo tanto, estaría bueno que hagas este curso.

Sin más dejo la info:

Try Docker
Dive into the basics of Docker and learn how to create a self-contained, shareable development environment with containers, images, Dockerfiles, and volumes.
View the Course
What You'll Learn

Level 1: Containers & Images
Learn how to use images to create Docker containers.                  

Level 2: Dockerfiles
Use Dockerfiles to configure images in a centralized and repeatable way.

Level 3: Volumes
Take control of the data in your containers with volumes.                  
Why Learn Docker?
Course Instructor Jon Friskics explains how Docker can make your development workflow more efficient.