Translate
lunes, 5 de octubre de 2015
Reduce el riesgo a fallas con ELM
Ya he hablado de Elm, es un lenguaje funcional que compila a javascript. Bueno hace muy poco leo en infoQ un articulo sobre la reducción de fallas utilizando ELM.
Según este articulo una aplicación Elm, "una vez que se compila, por lo general trabaja en el primer intento sin regresiones o excepciones de tiempo de ejecución".
A la vez este articulo muestra que ELM es más rápido que muchos frameworks javascripts:
Dejo link:
http://www.infoq.com/news/2015/09/elm-introduction-feldman
miércoles, 30 de septiembre de 2015
ionide una IDE para F#
Si adaptamos Atom para programar en F# que nos queda? Ionide es la respuesta. Un entorno de desarrollo para F# que nos ofrece:
Dejo algunos gif:
Dejo link:
http://ionide.io/
- syntax highlighting
- error highlighting
- autocompletion
- tooltips
- integración con F# de forma interactiva (como un RELP)
- Scaffolding
Dejo algunos gif:
Dejo link:
http://ionide.io/
Nuevo curso de Html 5
|
|
|
domingo, 27 de septiembre de 2015
Teoría de Categorías explicado por Erik Meijer
Erik Meijer es un groso, no voy a exponer su cv en este blog, solo voy a decir que le envidio mucho las remeras. Erik nos explica la Teoría de Categorías :
jueves, 24 de septiembre de 2015
Se viene GNOME 3.18
Hace varios post hable sobre Gnome y dije que no estaba bueno, bueno me equivoque. La verdad es que encontraron el camino, había que tenerles paciencia se esta poniendo muy bueno y si no mira este vídeo:
Dejo link: https://www.gnome.org/
domingo, 20 de septiembre de 2015
Python 3.5 trae nuevas características
Recientemente se anuncio python 3.5 que trae nuevas características, nuevos módulos, mejoras en librerías estandar y seguridad.
Vamos a mostrar un poco la nueva sintaxis:
Corrutinas con sintaxis asincrónica-esperar: que permite a los desarrolladores escribir código como si fuera secuencial. De hecho, el compilador incorpora a través de una secuencia de corrutinas, por lo que es efectivamente concurrente. Veamos el siguiente ejemplo:
async def read_data(db):
data = await db.fetch('SELECT ...')
if (data...)
await api.send(data ...')
Un operador que permite expresar multiplicación entre matrices:
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
instead of:
S = dot((dot(H, beta) - r).T, dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
Desembalaje, que pretende extender el uso permitido del operador * y hacer posible el uso de múltiples veces en llamadas a funciones, o en el interior de tuplas:
>>> print(*[1], *[2], 3)
1 2 3
>>> dict(**{'x': 1}, y=2, **{'z': 3})
{'x': 1, 'y': 2, 'z': 3}
>>> *range(4), 4
(0, 1, 2, 3, 4)
Como primer pantallazo, son noticias muy buenas!!!
Vamos a mostrar un poco la nueva sintaxis:
Corrutinas con sintaxis asincrónica-esperar: que permite a los desarrolladores escribir código como si fuera secuencial. De hecho, el compilador incorpora a través de una secuencia de corrutinas, por lo que es efectivamente concurrente. Veamos el siguiente ejemplo:
async def read_data(db):
data = await db.fetch('SELECT ...')
if (data...)
await api.send(data ...')
Un operador que permite expresar multiplicación entre matrices:
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
instead of:
S = dot((dot(H, beta) - r).T, dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
Desembalaje, que pretende extender el uso permitido del operador * y hacer posible el uso de múltiples veces en llamadas a funciones, o en el interior de tuplas:
>>> print(*[1], *[2], 3)
1 2 3
>>> dict(**{'x': 1}, y=2, **{'z': 3})
{'x': 1, 'y': 2, 'z': 3}
>>> *range(4), 4
(0, 1, 2, 3, 4)
Como primer pantallazo, son noticias muy buenas!!!
jueves, 17 de septiembre de 2015
10 tips para los que se inician en Python
Quiero compartir un post sobre tips para los que se inician en python. Esta muy bueno, fácil de entender y muy útil.
Dejo link:
http://www.techbeamers.com/top-10-python-coding-tips-for-beginners/
lunes, 14 de septiembre de 2015
Bazel
Bazel es la herramienta que Google utiliza para construir la mayoría de su software. Esta es de código abierto.
Según Google, Bazel está dirigido a construir "código de forma rápida y fiable" y es "fundamental para la capacidad de Google dado que es una empresa grande y que crece rápidamente"
Antes de la construcción de Bazel, Google construía su software utilizando Makefiles que no le daba mayor confiabilidad. Además, en comparación con los Makefiles, Bazel ofrece conceptos de alto nivel, como "test", "C ++ binario", las nociones de "plataforma de destino" y "host plataforma ", etc.
Bazel soporta varios lenguajes en los que estan c++, java, rust, scala o groovy.
Dejo link:
http://bazel.io/
domingo, 13 de septiembre de 2015
Introducción a ScalaTest
Vamos a hacer algunos test con ScalaTest. Empecemos haciendo una clase:
case class Guest(name: String)
case class Room(number: Int, guest: Option[Guest] = None){ room =>
def isAvailable(): Boolean = ???
def checkin(guest: Guest): Room = ???
def checkout(): Room = ???
}
/*
* We will automatically create 10 rooms
* if these are not specified.
*/
case class Hotel(
rooms: List[Room] = (1 to 10).map(n => Room(number=n)).toList){
def checkin(personName: String): Hotel = ???
}
Hemos hecho una clase Hotel que contiene 10 habitaciones. El ??? significa que el metodo no fue definido, pero me permite compilar. Vamos a trabajar bien TDD.
Antes que nada agregamos el framework al proyecto utilizando sbt:
libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"
Ahora vamos a hacer una clase común para reutilizar métodos comunes:
package org.me.hotel
import org.scalatest.{FlatSpec,Matchers}
abstract class UnitTest(component: String) extends FlatSpec
with Matchers{
behavior of component
}
Como se puede ver hicimos una clase padre o general para todos los tests, esta extiende de FlatSpec e implementa Matchers.
A la vez le pasamos por parámetro el nombre del componente a probar. Si quisieramos utilizar esta clase lo hariamos de la siguiente manera:
class MyClassUnitTest extends UnitTest("MyClass")
A la vez utilizamos Matchers dado que nos provee expresiones más cercanas a los humanos como:
(2+2) should equal (4)
(2+2) shouldEqual 5
(2+2) should === (4)
(2+2) should be (4)
(2+2) shouldBe 5
Bueno ahora definimos nuestro test:
package org.me.hotel
class RoomTest extends UnitTest("Room") {
it should "provide info about its occupation" in {
Room(1).isFree() shouldEqual true
Room(1,None).isFree() shouldEqual true
Room(1,Some(Guest("Bruce"))).isFree() shouldEqual false
}
it should "allow registering a new guest if room is free" in {
val occupiedRoom = Room(1).checkin(Guest("James"))
occupiedRoom.isFree shouldEqual false
occupiedRoom.guest shouldEqual(Option(Guest("James")))
}
it should "deny registering a new guest if room is already occupied" in {
an [IllegalArgumentException] should be thrownBy {
Room(1,Some(Guest("Barbara"))).checkin(Guest("Bruce"))
}
}
it should "deny checking out if room is already free" in {
an [IllegalArgumentException] should be thrownBy {
Room(1).checkout()
}
}
it should "allow checking out if room is occupied by someone" in {
val room = Room(1,Some(Guest("Carmine")))
val freeRoom = room.checkout()
freeRoom.isFree shouldEqual true
}
}
Como se puede ver los test quedan escritos casi en lenguaje natural.
Si corremos los tests nos darán un error:
> test
[info] RoomTest:
[info] Room
[info] - should provide info about its occupation *** FAILED ***
[info] scala.NotImplementedError: an implementation is missing
[info] at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252)
[info] at org.me.hotel.Room.isFree(Room.scala:6)
[info] at org.me.hotel.RoomTest$$anonfun$1.apply$mcV$sp(RoomTest.scala:6)
[info] at org.me.hotel.RoomTest$$anonfun$1.apply(RoomTest.scala:5)
...
[info] Run completed in 699 milliseconds.
[info] Total number of tests run: 15
[info] Suites: completed 6, aborted 0
[info] Tests: succeeded 3, failed 12, canceled 0, ignored 0, pending 0
[info] *** 12 TESTS FAILED ***
[error] Failed tests:
[error] org.me.hotel.RoomTest
[error] org.me.hotel.HotelTest
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 6 s, completed 12-ago-2015 16:08:47
Ahora a hacer que nuestras clases pasen sus tests, Suerte!!!!
package org.me.hotel
import org.scalatest.{FlatSpec,Matchers}
abstract class UnitTest(component: String) extends FlatSpec
with Matchers{
behavior of component
}
Como se puede ver hicimos una clase padre o general para todos los tests, esta extiende de FlatSpec e implementa Matchers.
A la vez le pasamos por parámetro el nombre del componente a probar. Si quisieramos utilizar esta clase lo hariamos de la siguiente manera:
class MyClassUnitTest extends UnitTest("MyClass")
A la vez utilizamos Matchers dado que nos provee expresiones más cercanas a los humanos como:
(2+2) should equal (4)
(2+2) shouldEqual 5
(2+2) should === (4)
(2+2) should be (4)
(2+2) shouldBe 5
Bueno ahora definimos nuestro test:
package org.me.hotel
class RoomTest extends UnitTest("Room") {
it should "provide info about its occupation" in {
Room(1).isFree() shouldEqual true
Room(1,None).isFree() shouldEqual true
Room(1,Some(Guest("Bruce"))).isFree() shouldEqual false
}
it should "allow registering a new guest if room is free" in {
val occupiedRoom = Room(1).checkin(Guest("James"))
occupiedRoom.isFree shouldEqual false
occupiedRoom.guest shouldEqual(Option(Guest("James")))
}
it should "deny registering a new guest if room is already occupied" in {
an [IllegalArgumentException] should be thrownBy {
Room(1,Some(Guest("Barbara"))).checkin(Guest("Bruce"))
}
}
it should "deny checking out if room is already free" in {
an [IllegalArgumentException] should be thrownBy {
Room(1).checkout()
}
}
it should "allow checking out if room is occupied by someone" in {
val room = Room(1,Some(Guest("Carmine")))
val freeRoom = room.checkout()
freeRoom.isFree shouldEqual true
}
}
Como se puede ver los test quedan escritos casi en lenguaje natural.
Si corremos los tests nos darán un error:
> test
[info] RoomTest:
[info] Room
[info] - should provide info about its occupation *** FAILED ***
[info] scala.NotImplementedError: an implementation is missing
[info] at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252)
[info] at org.me.hotel.Room.isFree(Room.scala:6)
[info] at org.me.hotel.RoomTest$$anonfun$1.apply$mcV$sp(RoomTest.scala:6)
[info] at org.me.hotel.RoomTest$$anonfun$1.apply(RoomTest.scala:5)
...
[info] Run completed in 699 milliseconds.
[info] Total number of tests run: 15
[info] Suites: completed 6, aborted 0
[info] Tests: succeeded 3, failed 12, canceled 0, ignored 0, pending 0
[info] *** 12 TESTS FAILED ***
[error] Failed tests:
[error] org.me.hotel.RoomTest
[error] org.me.hotel.HotelTest
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 6 s, completed 12-ago-2015 16:08:47
Ahora a hacer que nuestras clases pasen sus tests, Suerte!!!!
martes, 8 de septiembre de 2015
Este sábado 12 empieza el #HackathonLitoral2015 en Santa Fe. Inscribite!
Curso recomendado de Coursera
Me llego el siguiente mail de Coursera, muy buenos cursos:
My Courses Course Catalog | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
domingo, 6 de septiembre de 2015
Haciendo fácil la minería de datos con Rapidminer
Si es raro un post de minería de datos en este blog. Les cuento que estoy haciendo un curso y me llamo la atención gratamente este producto.
Supongamos que necesitas saber reglas para un problema, por ejemplo que persona no debes darles créditos. Entonces que haces:
Si bien estoy simplificando mucho la historia, en la herramienta es así. Luego al ser un trabajo empírico debes hace muchas comparaciones con la realidad.
Esas reglas las podes utilizar con algún motor de reglas como Jboss drools o programarlas.
Rapidminer trae muchas herramientas de diferente índole, para limpiar datos, generar reglas, hacer arboles de decisión, importar datos, etc.
Tiene una versión comercial y otra open source y gratuita.
Dejo link:
https://rapidminer.com/
Supongamos que necesitas saber reglas para un problema, por ejemplo que persona no debes darles créditos. Entonces que haces:
- Te instalas, rapidminer
- Importas datos históricos
- Generas el árbol con algún algoritmo y tenes las reglas. Y listo!
Si bien estoy simplificando mucho la historia, en la herramienta es así. Luego al ser un trabajo empírico debes hace muchas comparaciones con la realidad.
Esas reglas las podes utilizar con algún motor de reglas como Jboss drools o programarlas.
Rapidminer trae muchas herramientas de diferente índole, para limpiar datos, generar reglas, hacer arboles de decisión, importar datos, etc.
Tiene una versión comercial y otra open source y gratuita.
Dejo link:
https://rapidminer.com/
Blog.scalac.io
Quiero compartir con ustedes una excelente pagina que contiene un montón de recursos sobre scala y Akka, tal vez ya la conocen scalac.io
Dejo link: http://blog.scalac.io/
Pequeña introducción a Wolfram
Bueno, si tomamos un lenguaje para navegar en el conocimiento y brindar conocimiento; sin duda; Wolfram es la respuesta.
Ente las características de Wolfram podemos nombrar:
Les dejo un tutorial muy bueno!! Al final de cada ítem pueden validar si entendieron.
Dejo link:
http://www.wolfram.com/language/fast-introduction-for-programmers/
http://reference.wolfram.com/language/
Ente las características de Wolfram podemos nombrar:
- Fue diseñado para ser utilizado de forma interactiva.
- Tiene alrededor de 5000 funciones incorporadas.
- Expresiones simbólicas, por ejemplo podríamos pasar por parámetro un gráfico o guardarlo en una variable.
- Las listas se indican por medio de llaves, tiene listas por comprensión y maneja indices negativos.
Les dejo un tutorial muy bueno!! Al final de cada ítem pueden validar si entendieron.
Dejo link:
http://www.wolfram.com/language/fast-introduction-for-programmers/
http://reference.wolfram.com/language/
jueves, 3 de septiembre de 2015
Aprende Html 5 gracias W3C y EDX
Me llego esta propuesta de curso y esta tan buena que la quiero compartir:
| |||||
Dear all,
We're back! And we need your help in getting the word out.
We are again teaching how to build powerful Web sites and apps with HTML5. If you are tuned into tech news, you've surely been recently exposed to a flurry of articles encouraging developers to ditch other technologies in favor of HTML5.
Register for the new edition of the course! (to start on 5 October 2015)
Thank you.
Best,
Marie-Claire and Michel.
| |||||
|
Suscribirse a:
Entradas (Atom)