sábado, 21 de enero de 2017

Scala by the pictures


Quiero compartir una pagina que esta muy buena, y se pueden ver buenas infografias de Scala.

Dejo link:
http://sciabarra.com/book/

martes, 17 de enero de 2017

Libro Aprendiendo Ruby on Rails 5 - Capítulo 6 disponible

Me llego este mail y lo comparto para todos los que quieran aprender Ruby:

Libro Aprendiendo Ruby on Rails 5
View this email in your browser

 

Capítulo 6 "Actualizando nuestra aplicación a Ruby on Rails 5".

El capítulo 6 ya está disponible y viene con un cambio importante, el enfoque del libro ya no es Ruby on Rails 4.2, en su lugar es Ruby on Rails 5, la versión más reciente de este marco de trabajo.

A quienes hayan comprado el libro, en las próximas horas les llegará un correo electrónico con las instrucciones de como descargar la actualización.

El capítulo habla de como migrar una aplicación de Ruby on Rails 4.2 a 5, nos lleva de la mano por todo el proceso hasta completar la actualización de manera exitosa.

Como siempre el capítulo está disponible en formato de eBook para Kindle, ePub y PDF.

Si aún no han comprado el libro y les interesa tenerlo, pueden comprarlo el libro aquí.

Para conocer del contenido de éste capítulo visita http://www.railsenespanol.co/capitulos/capitulo5.

Para tener acceso a los capítulos 1 y 2, sólo en necesario navegar al sitio y en la lista de temarios aparece el link para cada capítulo. http://www.railsenespanol.co/.
 

Acceso al foro del libro.

Quienes compraron el libro ya para el día de hoy recibienron via correo electrónico la invitación a Slack, donde podrán comentar y hacer observaciones sobre el contenido del libro.

Early Access del libro.

Los capítulos 1 y 2 están disponibles en línea de forma gratuita, pero ya es posible realizar la compra del libro en modo Early Access, es decir pre-pagar el libro con un precio especial y tener acceso a los siguientes capítulos conforme se va liberando.

En el modo Early Access también tendrás acceso al libro en los formatos PDF, Kindle y ePub para iPad, iPhone y Mac. El costo del libro es $15USD. Si quieres ayudar con el desarrollo del libro, puedes comprarlo en aquí.
 
Comprar el libro
Share
Tweet
+1
Share
Forward

domingo, 15 de enero de 2017

Que lenguajes de programación son usados por cada compañía?

Yo creo que esto ya lo publique, pero bueno, el publico se renueva. 


Dejo el link: http://www.improgrammer.net/the-programming-language-used-by-the-company/

Un resumen de Scala for the Impatient, parte 7

Procedimientos. 

Los procedimientos en Scala retornan el tipo Unit y tienen una especial notación sin el =

def box(s : String) { // Look carefully: no =
  val border = "-" * s.length + "--\n"
  println(border + "|" + s + "|\n" + border)
}

Algunas personas no les gusta esta notación por lo que eligen utilizar la misma que las funciones:

def box(s : String): Unit = {
...
}

Lazy Values

Cuando un valor es declarado como lazy el calculo de este valor se realiza cuando se necesita, no antes:

lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString

De esta manera, si words no es utilizado el archivo nunca se abrirá.

Lazy values es útil para retrasar declaraciones de inicialización costosas. También pueden solucionar otros problemas de inicialización, como las dependencias circulares. Además, son esenciales para desarrollar estructuras de datos perezosas como Streams.

val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es definido
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es usado
def words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa cada vez que es usado

Exceptions

Las excepciones funcionan igual que C++ o Java. Cuando se lanza una excepción, por ejemplo:

throw new IllegalArgumentException("x should not be negative")

Se anula la ejecución y el sistema de ejecución busca un manejador de excepciones que puede manejar la excepción IllegalArgumentException. Si esta es manejada se reanuda la ejecución donde es manejado, si no existe un manejador, el programa finaliza. Igual a java.

Como en Java, las excepciones que se lanzan deben ser una subclase de java.lang.Throwable. Sin embargo, a diferencia de Java, Scala no tiene excepciones "verificadas o chequeadas" es decir que nunca se debe declarar una función o un método que lanza una excepción.

Una expresión throw retornan el tipo especial Nothing. Esto es útil en las expresiones if / else. Si una rama tiene el tipo Nothing, el tipo de la expresión if / else es el tipo de la otra rama. Por ejemplo, considere:

if (x >= 0) { sqrt(x)
} else throw new IllegalArgumentException("x should not be negative")

Esta expresión retornara Double, dado que el else retorna Nothing.

La expresión try puede utilizar pattern matching:


try {
process(new URL("http://horstmann.com/fred-tiny.gif"))
} catch {
case _: MalformedURLException => println("Bad URL: " + url)
case ex: IOException => ex.printStackTrace()
}

Cuando no necesitamos las variables podemos utilizar el _ (guión bajo)

La instrucción try / finally le permite disponer de un recurso independientemente de que se haya producido o no una excepción. Por ejemplo:

var in = new URL("http://horstmann.com/fred.gif").openStream()
try {
process(in)
} finally {
in.close()
}

La cláusula finally se ejecuta independientemente de si la función de proceso lanza una excepción. La variable in siempre cerrara el recurso.

Este código es un poco sutil, y plantea varios problemas.

  • ¿Qué pasa si el constructor de URL o el método openStream lanza una excepción? Entonces el bloque try nunca se ingresa, y tampoco es la cláusula finally. Por lo tanto nunca se inicializara. 
  • ¿Por qué no es val in = nueva URL (...). OpenStream () dentro del bloque try? Entonces el alcance de en no se extendería a la cláusula final.
  • ¿Qué pasa si in.close () lanza una excepción? Entonces esa excepción es expulsada de la declaración, reemplazando cualquier anterior. (Esto es igual que en Java, y no es muy agradable.) Idealmente, la antigua excepción permanecería unida a la nueva.

Note que try / catch y try / finally tienen objetivos complementarios. La sentencia try / catch maneja las excepciones, y la sentencia try / finally toma alguna acción (normalmente cleanup) cuando no se maneja una excepción. Es posible combinarlas en una sola instrucción try / catch / finally:

try { ... } catch { ... } finally { ... }

miércoles, 11 de enero de 2017

Codeschool lanza un nuevo curso de PHP

Codeschool viene con todo y cada vez más amplia sus tecnologías, ahora nos ofrece un curso de PHP:

Los Programadores Andan Diciendo

Me reí muchísimo con este grupo en facebook, por lo que lo comparto:















https://www.facebook.com/ProgramadoresAndanDiciendo/?pnref=story

lunes, 9 de enero de 2017

Un resumen de Scala for the Impatient, parte 6


Funciones. 

Scala tiene funciones además de métodos. La diferencia es que las funciones no pertenecen a ningún objeto.
Para definir una función solo es necesario, nombre, parámetros y el cuerpo de la función:

def abs(x: Double) = if (x >= 0) x else -x

No es necesario definir el tipo, dado que el compilador lo infiere. En el caso que no pueda inferirlo como funciones recursivas, se le debe indicar.

Si la función debe hacer varias cosas se puede utilizar las llaves:

def fac(n : Int) = {
    var r = 1
    for (i <- 1 to n) r = r * i
     r
}

La función retorna lo ultimo que se ejecuta y no es necesario la palabra return.

Se pueden utilizar valores por defecto para las funciones:

def decorate(str: String, left: String = "[", right: String = "]") =
         left + str + right

Si llamamos a decorate("Hello") , el resultado va a ser :  "[Hello]"
Si llamamos a decorate("Hello", ">>>[") el resultado va a ser : ">>>[Hello]", pero, ¿como podemos llamar a la función con un parámetro para rigth y el default para left? con los parámetros nombrados:

decorate("Hello", right = "]<<<") // Calls decorate("Hello", "[", "]<<<")

Podemos nombrar todos los parámetros:

decorate(left = "<<<", str = "Hello", right = ">>>")

El resultado es "<<<Hello>>>" . Note que el orden de los parámetros no eran iguales que como fueron definidos.

Algunas veces es necesario implementar funciones con un numero variable de parametros, esto se hace con el * :

def sum(args: Int*) = {
    var result = 0
    for (arg <- args) result += arg
    result
}

Y esto se puede llamar de la siguiente manera:

val s = sum(1, 4, 9, 16, 25)
La función recibe un parámetro de tipo Seq pero no podemos pasar una sequencia desde una función por ejemplo esto retornara error:

val s = sum(1 to 5) // Error

Si la función es llamada con un solo argumento este debe ser entero y no rango de enteros, para solucionar este problema se debe agregar _* :

val s = sum(1 to 5: _*) // Consider 1 to 5 as an argument sequence

Si necesitamos llamar a una función recursiva podemos utilizar el mismo artilugio:

def sum(args: Int*) : Int = {
   if (args.length == 0) 0
   else args.head + recursiveSum(args.tail : _*)
}

jueves, 5 de enero de 2017

Top 10 del contenido de InfoQ en el 2016

Me llego un mail muy interesante de infocola o InfoQ, sobre los temas más leídos en el 2016.

Como yo, seguro que se te paso alguno. Por lo que comparto con vos este mail:

January 2017

Top 10 Content of 2016

In this special newsletter we show case the Top 10 content items published on InfoQ in 2016.

Top MiniBooks

The JHipster Mini-book is a guide to getting started with hip technologies today: AngularJS, Bootstrap and Spring Boot. This book shows you how to build an app with JHipster.
What is machine learning? Who is using it? How does it work? What are some real-world uses? Get answers to these questions and so much more in this free eBook! It's like a crash course in machine learning geared specifically for today's modern fraud fighter. Download Now.
SPONSORED CONTENT

Top News

While some applications will have an easy migration path to .NET Core, especially ones based on ASP.NET MVC, others may run into problems. Not just obvious ones such as porting from WinForms or WPF to Universal Windows Applications (UWP), but subtler issues that are deep within the core of the .NET Framework.
Services requiring an enterprise platform built of 100s of shared libraries to be able to run and only allowing approved network clients for talking to services are two anti-patterns, Ben Christensen explained at the recent Microservices Practitioner Summit sharing his experiences from building distributed systems and the trend he sees in increased coupling with binary dependencies.
Over the last year we've shown you various features that were being considered for C# 7. With the preview of Visual Studio 15, Microsoft has decided to demonstrate the features to make it into the final release of C# 7.
You've heard about DevOps and digital transformation. What do they have to do with you, the CIO? How can you make sure your organization is not just current, but staying truly competitive? Download this white paper to get answers to these and other questions. Download Now.
SPONSORED CONTENT

Top Articles

Jean-Jacques Dubray introduces a new pattern, State-Action-Model, that speeds up the development of modern applications and simplifies the interaction between the data model and the view.
Angular 2 & TypeScript have brought true object oriented development to the world's most popular web development framework. This article provides a high-level overview of Angular 2.
In this article, third installment of Apache Spark series, author discusses Apache Spark Streaming framework for processing real-time streaming data using a log analytics sample application.
Modern JavaScript development is in constant motion. In this article, Bonnie Eisenman shows JavaScript newcomers the lay of the land and where to begin.

Top Presentations

Philip Wadler on why category theory is relevant for developers, discussing the principle of Propositions as Types connecting propositions and proofs in logic, and types and programs in computing.
Cliff Click takes a look at Java vs C performance. He discusses both languages' strong and weak points and the programming context surrounding language choices.

Connect with InfoQ on Twitter
Connect with InfoQ on Facebook
Connect with InfoQ on LinkedIn
Connect with InfoQ on Google Plus
Connect with InfoQ on Youtube