Translate
miércoles, 26 de abril de 2017
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
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)}"
Dejo link: http://sequel.jeremyevans.net/
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:
|
martes, 11 de abril de 2017
Curso de Kotlin Gratis
Se pueden encontrar muchísimos cursos de programación pero de un lenguaje moderno en castellano, es raro.
Les quiero recomendar este curso de Kotlin en castellano:
Les quiero recomendar este curso de Kotlin en castellano:
Dejo link:
sábado, 8 de abril de 2017
Phoenix el poderoso framework de elixir
Si están prendidos con los post sobre Elixir, les va interesar leer el siguiente post (que no es mio) de Phoenix que es un framework de Elixir.
Sin más dejo el link:
http://backtrackacademy.com/articulo/conoce-phoenix-el-poderoso-framework-de-elixir
Un resumen de Scala for the Impatient, parte 15
Nested Classes
En Scala se puede definir una función dentro de una función o una clase dentro de otra clase:
import scala.collection.mutable.ArrayBuffer
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members += m
m
}
}
Supongamos que tenemos 2 Networks:
val chatter = new Network
val myFace = new Network
Cada instancia tiene una definición de clase por lo tanto la clase Member de chatter no es igual a la clase Member de myFace.
En nuestro ejemplo una instancia de Member puede ser agregado a diferentes redes:
val fred = chatter.join("Fred")
val wilma = chatter.join("Wilma")
fred.contacts += wilma // OK
val barney = myFace.join("Barney") // es de tipo myFace.Member
fred.contacts += barney // No porque son de diferente tipo
Ante este comportamiento hay 2 posibilidades:
1.Se puede mover Member a otra clase o a algún objeto. Por ejemplo:
object Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
}
class Network {
private val members = new ArrayBuffer[Network.Member]
...
}
2. Se puede utilizar type projection, que permite utilizar una subclase en varias instancias. Network#Member esto significa Member es un subtipo y esta en la clase Network y no es una clase de la instancia.
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Network#Member]
}
...
}
martes, 4 de abril de 2017
Los Creadores de los Lenguajes de Programación mas famosos
Muy buen vídeo que nos muestra a los padres de los lenguajes de programación:
A mi entender falto Smalltalk, Haskell y Scala. Pero es solo mi opinión. Que opinan ustedes??
A mi entender falto Smalltalk, Haskell y Scala. Pero es solo mi opinión. Que opinan ustedes??
La curva de aprendizaje en Scala
Me gusto este gráfica por lo tanto lo comparto :D
Muy buena hoja de ruta, solo nos queda estudiar :P
Dejo link:
http://sciabarra.com/blog/scala-learning-curve/
Muy buena hoja de ruta, solo nos queda estudiar :P
Dejo link:
http://sciabarra.com/blog/scala-learning-curve/
Se encuentran abiertas las inscripciones a los cursos de Gugler 2017
Quiero recomendar los cursos de Gugler que se dictan en la facultad UADER. Pueden hacerlo de forma presencial o distancia.
Hasta el lunes 17 de abril están abiertas las inscripciones para los alumnos y quienes deseen realizar los cursos del primer cuatrimestre que dictará el Laboratorio de Investigación Gugler de nuestra Facultad. La modalidad de cursado de las diferentes propuestas son presenciales y para alumnos de Latinoamérica y España la modalidad es a distancia.
Dejo links:
http://fcyt.uader.edu.ar/web/node/4089
https://inscripciones.gugler.com.ar
Hasta el lunes 17 de abril están abiertas las inscripciones para los alumnos y quienes deseen realizar los cursos del primer cuatrimestre que dictará el Laboratorio de Investigación Gugler de nuestra Facultad. La modalidad de cursado de las diferentes propuestas son presenciales y para alumnos de Latinoamérica y España la modalidad es a distancia.
Dejo links:
http://fcyt.uader.edu.ar/web/node/4089
https://inscripciones.gugler.com.ar
sábado, 1 de abril de 2017
Empezando con Elixir 3
Enum
Enum es un conjunto de funciones para interactuar con colecciones. El cual incluya más de 100 funciones.
Si queremos enumerar todas las funciones podemos hacer lo siguiente:
iex(1)> Enum.__info__(:functions) |> Enum.each(fn({function, arity}) -> IO.puts "#{function}/#{arity}" end)
all?/1
all?/2
any?/1
any?/2
at/2
at/3
chunk/2
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 3 end)
false
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) > 1 end)
true
any? Parecido a all? pero retorna true si alguno cumple la condición:
iex> Enum.any?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 5 end)
true
iex> Enum.any?(["foo", "bar"], fn(s) -> String.length(s) == 5 end)
false
Enum es un conjunto de funciones para interactuar con colecciones. El cual incluya más de 100 funciones.
Si queremos enumerar todas las funciones podemos hacer lo siguiente:
iex(1)> Enum.__info__(:functions) |> Enum.each(fn({function, arity}) -> IO.puts "#{function}/#{arity}" end)
all?/1
all?/2
any?/1
any?/2
at/2
at/3
chunk/2
...
Usando esto, está claro que tenemos una gran cantidad de funcionalidad, y eso es por una razón clara. La enumeración es el núcleo de la programación funcional y es una cosa increíblemente útil.
Veamos algunas funciones importantes :
all? Nos permite saber si todos los elementos de una lista cumplen alguna condición, veamos un ejemplo:
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 3 end)
false
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) > 1 end)
true
any? Parecido a all? pero retorna true si alguno cumple la condición:
iex> Enum.any?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 5 end)
true
iex> Enum.any?(["foo", "bar"], fn(s) -> String.length(s) == 5 end)
false
chunk, dada una colección retorna un grupo de colecciones con la cantidad de elementos pasada como segundo parámetro.
iex> Enum.chunk([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]
chunk_by igual que chunk pero se dividen las listas a partir de una función.
iex> Enum.chunk_by(["one", "two", "three", "four", "five"], fn(x) -> String.length(x) end)
[["one", "two"], ["three"], ["four", "five"]]
iex> Enum.chunk_by(["one", "two", "three", "four", "five", "six"], fn(x) -> String.length(x) end)
[["one", "two"], ["three"], ["four", "five"], ["six"]]
map_every a veces fragmentar una colección no es suficiente para exactamente lo que pueda necesitar. En este es el caso, map_every puede ser muy útil para modificar sólo los elementos específicos:
iex> Enum.map_every([1, 2, 3, 4], 2, fn x -> x * 2 end)
[2, 2, 6, 4]
each necesitamos iterar toda la colección:
iex> Enum.each(["one", "two", "three"], fn(s) -> IO.puts(s) end)
one
two
three
each retorno al atom :ok
map, aplica una función a una collección retornando una segunda colección:
iex> Enum.map([0, 1, 2, 3], fn(x) -> x - 1 end)
[-1, 0, 1, 2]
min y max, se puede suponer que buscan el minimo y el maximo:
iex> Enum.min([5, 3, 0, -1])
-1
iex> Enum.max([5, 3, 0, -1])
5
reduce podemos destilar nuestra colección en un solo valor. Para ello, suministramos un acumulador opcional para pasar a nuestra función; Si no se proporciona ningún acumulador, se utiliza el primer valor:
iex> Enum.reduce([1, 2, 3], 10, fn(x, acc) -> x + acc end)
16
iex> Enum.reduce([1, 2, 3], fn(x, acc) -> x + acc end)
6
iex> Enum.reduce(["a","b","c"], "1", fn(x,acc)-> x <> acc end)
"cba1"
sort, ordena una colección :
iex> Enum.sort([5, 6, 1, 3, -1, 4])
[-1, 1, 3, 4, 5, 6]
iex> Enum.sort([:foo, "bar", Enum, -1, 4])
[-1, 4, Enum, :foo, "bar"]
opcionalmente podemos pasar por parámetro una función:
# with our function
iex> Enum.sort([%{:val => 4}, %{:val => 1}], fn(x, y) -> x[:val] > y[:val] end)
[%{val: 4}, %{val: 1}]
# without
iex> Enum.sort([%{:count => 4}, %{:count => 1}])
[%{count: 1}, %{count: 4}]
uniq_by, remueve los duplicados:
iex> Enum.uniq_by([1, 2, 3, 2, 1, 1, 1, 1, 1], fn x -> x end)
[1, 2, 3]
Resultados de la encuesta 2017 de Stack overflow
Cada año stack overflow realiza una encuesta que va desde tecnología más utilizada, sueldos y si prefieren viaje a las estrellas o guerra de las galaxias.
Son muchísimos datos que me llaman la atención, a medida que vaya leyendo hago posts
Sin más, dejo link:
https://stackoverflow.com/insights/survey/2017
jueves, 30 de marzo de 2017
FaunaDB, Una nueva base de datos temporal, objeto-relacional y distribuida
Leyendo infoQ me encontré con una nueva base de datos llamada FaunaDB. Si, ya se lo que piensas "otra base de dato??!!", y es verdad estamos repletos de base datos.
Los antiguos líderes técnicos de Twitter y Couchbase han creado FaunaDB, una nueva base de datos temporal de propósito general.
Matt Freels, antiguo Director Técnico de los equipos de base de datos de Twitter, junto con Chris Anderson, cofundador de Couchbase, unieron sus fuerzas para liderar la creación de una nueva "base de datos operacional adaptativa" . El resultado es FaunaDB, una base de datos distribuida objeto-relacional que promete escalar linealmente.
FaunaDB es un sistema de CP construido para proporcionar consistencia y tolerancia de partición. Se puede ejecutar a través de múltiples centros de datos y es compatible con el fracaso de una minoría de ellos sin interrupción del servicio. Se puede escalar horizontal y verticalmente, ejecutándose en un ordenador portátil, un servidor, varios servidores localmente o en la nube, incluyendo configuraciones virtualizadas o contenedoras.
Del mismo modo que Datomic, FaunaDB mantiene todas las instancias de un dato, no sobrescribiéndolas, sino creando otras nuevas cuando se realiza una escritura. Esto es útil especialmente cuando se auditan datos, verificando su evolución en el tiempo.
Dejo link:
https://www.infoq.com/news/2017/03/faunadb
https://fauna.com/
Los antiguos líderes técnicos de Twitter y Couchbase han creado FaunaDB, una nueva base de datos temporal de propósito general.
Matt Freels, antiguo Director Técnico de los equipos de base de datos de Twitter, junto con Chris Anderson, cofundador de Couchbase, unieron sus fuerzas para liderar la creación de una nueva "base de datos operacional adaptativa" . El resultado es FaunaDB, una base de datos distribuida objeto-relacional que promete escalar linealmente.
FaunaDB es un sistema de CP construido para proporcionar consistencia y tolerancia de partición. Se puede ejecutar a través de múltiples centros de datos y es compatible con el fracaso de una minoría de ellos sin interrupción del servicio. Se puede escalar horizontal y verticalmente, ejecutándose en un ordenador portátil, un servidor, varios servidores localmente o en la nube, incluyendo configuraciones virtualizadas o contenedoras.
Del mismo modo que Datomic, FaunaDB mantiene todas las instancias de un dato, no sobrescribiéndolas, sino creando otras nuevas cuando se realiza una escritura. Esto es útil especialmente cuando se auditan datos, verificando su evolución en el tiempo.
Dejo link:
https://www.infoq.com/news/2017/03/faunadb
https://fauna.com/
Suscribirse a:
Entradas (Atom)