Dada la llegada de oracle 18 c. Oracle se le ocurrio liberar Oracle Live sql. Que es la mejor forma de aprender a escribir y correr sql.
Con esta aplicación podes aprender a escribir sql y a obtener información de esto.
Antes teniamos unas bases de ejemplo que traia oracle pero ahora solo nos conectamos a la web y listo, a practicar.
Dejo link: https://livesql.oracle.com/apex/livesql/file/index.html
Translate
miércoles, 7 de marzo de 2018
lunes, 5 de marzo de 2018
Apache Spark y Hadoop
Hadoop tiene alrededor de 10 años y ha demostrado ser una buena solución big data.
MapReduce es una gran solución para cálculos de un solo paso, pero no es eficiente para casos de uso que requieren cálculos y algoritmos de múltiples pasos.
Cada paso en el flujo de trabajo de procesamiento de datos tiene una fase de map y una fase de reduce y para usar esta tecnica tendremos que convertir cada paso en un patrón de MapReduce.
La salida del procesamiento de cada paso es guardado en discos distribuidos y luego esto es tomado como entrada para el siguiente paso. Como se puede ver no es una visión muy eficiente. También Hadoop generalmente se utiliza en cluster que son difíciles de configurar. A la vez Hadoop necesita otras herramientas para la integración como Apache storm para el manejo de streaming y Mahout para machine learning.
Si quisiéramos hacer algo complicado, tendríamos que encadenar una serie de trabajos de MapReduce y ejecutarlos en secuencia. Cada uno de esos trabajos tiene una alta latencia, y ninguno podría comenzar hasta que el trabajo anterior había terminado por completo.
Spark permite a los programadores desarrollar tuberías de datos complejas de varios pasos usando el patrón de gráfico acíclico dirigido (DAG). También es compatible con el uso compartido de datos en memoria en los DAG, por lo que diferentes trabajos pueden funcionar con los mismos datos sin tener que volver a calcular los datos para cada paso.
Spark se ejecuta sobre la infraestructura existente del sistema de archivos distribuidos Hadoop (HDFS) para proporcionar funcionalidad adicional. Proporciona soporte para implementar aplicaciones Spark en un clúster Hadoop v1 existente (con SIMR: Spark Inside MapReduce), Hadoop v2 YARN cluster, o incluso Apache Mesos.
Deberíamos considerar a Spark como una alternativa a Hadoop MapReduce para nuevas aplicaciones si ya estamos usando Hadoop en nuestra organización, en lugar de reemplazar completamente a Hadoop. Spark no pretende reemplazar a Hadoop, sino proporcionar una solución integral y unificada para administrar los diferentes requisitos de big data y casos de uso.
domingo, 4 de marzo de 2018
Que es Apache Spark?
Apache Spark es un framework de procesamiento de datos big data open source. Construido con las premisas de ser rápido y fácil de usar. Este Framework fue desarrollado en el 2009 en la universidad de Berkeley’s AMPLab y desde el 2010 fue liberado bajo la tutela de la organización Apache.
Es la competencia directa de Hadoop pero lejos de querer remplazarlo, se integra muy bien con el ecosistema Hadoop. Pero Apache Spark tiene varias ventajas comparado con otro framework Map-Reduce y big data.
Primero de todo, Apache Spark ofrece una forma coherente para procesar datos de diferentes naturalezas como video, texto, imágenes y de diferentes fuentes como red, online streaming, datos web online, etc.
A la vez, Spark permite correr aplicaciones en el clusters de Hadoop se ejecuten hasta 100 veces más rápido en memoria y 10 veces más rápido en disco.
Spark permite programar las aplicaciones en Python, Java o Scala. A la vez viene con un conjunto integrado de más de 80 operadores de alto nivel. Y podemos usarlo de forma interactiva para consultar datos dentro del shell.
Ademas las operaciones Map y Reduce, soportan consultas por sql, por streaming, maching learning y procesamiento por grafos. Los desarrolladores pueden usar estas capacidades solos o combinarlas para ejecutar en una sola información.
Dejo link: https://spark.apache.org/
Programando en Clojure en visual code
Como dije hace tiempo Clojure esta ganando cada vez más espacio, uno de los problemas que tenemos a la hora de empezar con este lenguaje es la falta de entornos de desarrollo.
A la vez, visual code es una ide liguera y que esta ganando muchos adeptos, más que nada por la facilidad de extensión y la cantidad de plugins que hay en el mercado.
Clojure no podía ser la excepción y hay un plugin para este lenguaje.
Esta extensión trae todo lo que necesitamos de una IDE: Intellisense, subraya cuando hay errores, un REPL interactivo, etc.
Esta muy completo e invito a que lo prueben.
Dejo link: https://marketplace.visualstudio.com/items?itemName=stiansivertsen.visualclojure#overview
miércoles, 28 de febrero de 2018
Un resumen de Scala for the Impatient, parte 38
Si un unapply método extrae un solo valor este debe retornar un Optional por ejemplo:
object Number {
def unapply(input: String): Option[Int] =
try {
Some(input.trim.toInt)
} catch {
case ex: NumberFormatException => None
}
}
Con este extractor podemos extraer el numero de un string :
val Number(n) = "1729"
Un extractor puede chequear un valor en este caso debe retornar un booleano:
object IsCompound {
def unapply(input: String) = input.contains(" ")
}
Se puede utilizar un extractor para agregar un test en una expresión
pattern matching:
author match {
case Name(first, IsCompound()) => …
case Name(first, last) => …
}
El método unapplySeq
Si utilizamos el extract en una secuencia, estaremos llamando a unapplySeq que retorna Option[Seq[A]] , donde A es el valor extraído:
object Name {
def unapplySeq(input: String): Option[Seq[String]] =
if (input.trim == "") None else Some(input.trim.split("\\s+"))
}
Dado este método ahora podemos utilizar un conjunto de parámetros:
author match {
case Name(first, last) => …
case Name(first, middle, last) => …
case Name(first, “van”, “der”, last) => ...
}
Ojo, no se puede tener un método unapply y un unapplySeq con similar parámetros.
Scala es un lenguaje de tipado estático y fuertemente tipado. Es decir que informa los errores de tipo en momento de compilación.
Si un tipo extiende de el trait scala.Dynamic, entonces el método llamadas, getters y setters se reescriben como llamadas a métodos especiales que pueden inspeccionar el nombre de la llamada original y los parámetros, y luego tomar acciones arbitrarias.
Veamos algunos ejemplos. Supongamos que la persona es una instancia de un tipo que se extiende
de Dynamic. Una declaración:
person.lastName = "Doe"
se puede remplazar:
person.updateDynamic ("lastName") ("Doe")
La clase Person debe tener dicho método:
clase Persona {
...
def updateDynamic (campo: String) (newValue: String) {...}
}
Depende de nosotros si implementamos el método updateDynamic.
Otro ejemplo:
val name = person.lastName
puede ser remplazado por:
val name = name.selectDynamic("lastName")
El metodo selectDynamic debe retornar un valor simple.
En scala existe DynamicProps que extiende a Dynamic y sobre escribe sus métodos:
class DynamicProps(val props: java.util.Properties) extends Dynamic {
def updateDynamic(name: String)(value: String) {
props.setProperty(name.replaceAll("_", "."), value)
}
def selectDynamic(name: String) =
props.getProperty(name.replaceAll("_", "."))
}
}
domingo, 25 de febrero de 2018
Que es machine learning?
Encontre un post de la gente de codecademy que esta muy bueno. Este post trata de explicar ¿qué es el aprendizaje automático, quién debe aprenderlo y cuándo puedo visitar Westworld?
El aprendizaje automático evolucionó a partir del reconocimiento de patrones y la aplicación de algoritmos que pueden aprender de los datos y luego hacer predicciones, y está estrechamente relacionado con las estadísticas computacionales. Esto nos indica el post.
Sin más que aconsejarlos que lo lean dejo el link:
http://news.codecademy.com/what-is-machine-learning/?utm_source=customer.io&utm_medium=email&utm_campaign=fortnightly_2-22-18&utm_content=whatismachinelearning
miércoles, 21 de febrero de 2018
Libros Gratuitos!!!
Quiero compartir un mail que me llego de java code geeks con unos libros gratuitos:
martes, 20 de febrero de 2018
Un resumen de Scala for the Impatient, parte 37
Los métodos apply y update
En scala podemos extender la sintaxis de llamada de funciones :
f(n1, n2, n3, …)
Si f es una función o un método, se ejecuta. De lo contrario, se
llama al método apply por lo tanto es equivalente a llamar a
f.apply(n1, n2, n3, …)
De la misma manera si se utiliza la notación de función con
asignación se llama al método update :
f(n1, n2, n3, …) = value
Es similar a llamar a :
f.update(n1, n2, n3, …, value)
Este mecanismo es utilizado en arrays y maps :
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100 // es como llamar a
scores.update("Bob", 100)
val bobsScore = scores("Bob") // es como llamar a
scores.apply("Bob")
El método apply también es usado para retornar instancias de
objetos, sin tener que llamar al constructor con el new :
class Fraction(n: Int, d: Int) {
}
object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
}
De esta manera podemos hacer lo siguiente:
val result = Fraction(3, 4) * Fraction(2, 5)
Extractors
Un extractor es un objeto que puede desaplicar un método. Se puede
pensar esto como el método contrario a el apply. Por ejemplo si el
apply agrega un elemento a una lista el extractor debería quitar
este elemento.
Por ejemplo el objeto Fraction tiene un método apply que retorna una
Fraction a partir de un numerador y un denominador. El extractor
debería retornar un numerador y un denominador a partir de una
Fraction.
object Fraction {
def unapply(input: Fraction) =
if (input.den == 0) None else Some((input.num, input.den))
}
Por lo general el método unapply retorna un Option dado que puede
haber un error cuando queremos desaplicar un método. En el ejemplo
si el denominador es 0 retorna None.
val Fraction(a, b) = f;
val tupleOption = Fraction.unapply(f)
if (tupleOption == None) throw new MatchError
// tupleOption is Some((t1 , t2))
En el ejemplo el método apply y unapply son inversos pero esto no es
obligatorio.
Graylog, guarda y consulta tus logs de forma centralizada.
Graylog es un producto que permite consultar y almacenar registros de aplicaciones de forma centralizada y eficiente. Para esto utiliza MongoDB para almacenar los log y Elasticsearch para la búsqueda e indexación.
Con Graylog se puede guardar los registros de forma
centralizada, detectar problemas de manera temprana y de esta manera resolverlos
más rápidamente.
A la vez Graylog provee un sistema de administración de
registros con el cual se puede consultar registros de forma interactiva y
rápida y permite almacenar registros de diferentes servidores, dispositivos de
red y aplicaciones.
De esta forma este producto permitirá auditar la aplicación
de forma económica y eficiente. Permitiendo a los auditores ganar tiempo y centralizarse
en su trabajo en vez de envolverlos en problemas técnicos.
lunes, 19 de febrero de 2018
MongoDB 4.0 incluye transacciones de múltiples documentos
MongoDB 4.0 incluye transacciones de múltiples documentos. Eso es todo. Toda la info...
Pero si no sabes:
El soporte para transacciones de documentos múltiples, es una técnica para el aislamiento de instantáneas a menudo asociada con las bases de datos relacionales PostgreSQL y Oracle. Y es la piedra angular ACID
MongoDB 4.0 ofrecerá la capacidad de realizar una lectura consistente. Es decir, devolverá solo los datos como se conocía en el momento en que comenzó la operación de lectura. Las versiones anteriores de MongoDB podían arrojar resultados que no necesariamente eran consistentes con ningún punto en el tiempo. Incluso podría omitir documentos o devolver varias versiones del mismo documento en una sola consulta. Pero esto ahora cambio.
Dejo link:
http://www.zdnet.com/article/mongodb-cto-how-our-new-wiredtiger-storage-engine-will-earn-its-stripes/
Pero si no sabes:
El soporte para transacciones de documentos múltiples, es una técnica para el aislamiento de instantáneas a menudo asociada con las bases de datos relacionales PostgreSQL y Oracle. Y es la piedra angular ACID
MongoDB 4.0 ofrecerá la capacidad de realizar una lectura consistente. Es decir, devolverá solo los datos como se conocía en el momento en que comenzó la operación de lectura. Las versiones anteriores de MongoDB podían arrojar resultados que no necesariamente eran consistentes con ningún punto en el tiempo. Incluso podría omitir documentos o devolver varias versiones del mismo documento en una sola consulta. Pero esto ahora cambio.
Dejo link:
http://www.zdnet.com/article/mongodb-cto-how-our-new-wiredtiger-storage-engine-will-earn-its-stripes/
jueves, 15 de febrero de 2018
Top de lenguajes que tenes que aprender en el 2018
Me encontre un post sobre los lenguajes que debes aprender este 2018, si no lo sabes. Y en resumen los lenguajes son los siguientes :
- JavaScript
- TypeScript (si bien no es un lenguaje, es un framework que suma características a un lenguaje, por lo tanto es valido)
- Python
- Java
- Kotlin
- C & C++
- PHP
- Swift
- Scala
Lindo ranking veo algunos lenguajes viejos, pero salvo algunos puntos, estoy de acuerdo.
martes, 13 de febrero de 2018
Un Post sobre el blog!
Tarde o temprano le tenía que tocas al blog hablar de el mismo. Por lo tanto te paso unos datos recopados del blog que no te van a servir de nada. Tal vez podes tirar estos datos en una reunión familiar, pero no se, velo...
- El blog nace en julio del 2009 y los primeros post eran publicaciones de tp de la facultad.
- El año que viene cumplimos 10 años. Me acabo de dar cuenta
- Tenemos publicados 1815 post, con este 1816.
Los temas son variados pero por lo general Java, Linux, Scala, es decir lenguajes de programación y software libre.
Les paso un gráfico:
Si no lo ven muy bien hagan click y se agranda (eso le digo a las chicas) , se los prometo.
Si clasificamos a el blog por tag tendremos el siguiente top ten (quitando a otros)
Y eso es todo amigos...
Si tienen preguntas, en los comentarios.
Ah, y notaron que hay un botón para donar dinero?
Si clasificamos a el blog por tag tendremos el siguiente top ten (quitando a otros)
- Java
- Linux
- Scala
- Python
- javascript
- Ruby
- Apache
- php
- C++
- Haskell
Y eso es todo amigos...
Si tienen preguntas, en los comentarios.
Ah, y notaron que hay un botón para donar dinero?
Programación Orientada a Objetos en Python, parte 4
Las propiedades “privadas”, no existen en Python :(
Sin embargo, hay una convención que se sigue en la mayoría del código Python: un nombre prefijado con un guión bajo (por ejemplo, _spam) debería tratarse como una propiedad privada
Cualquier identificador con la forma __spam (al menos dos guiones bajos al principio, como mucho un guión bajo al final) es textualmente reemplazado por _nombredeclase__spam, donde nombredeclase es el nombre de clase actual al que se le sacan guiones bajos del comienzo (si los tuviera). Se modifica el nombre del identificador sin importar su posición sintáctica, siempre y cuando ocurra dentro de la definición de una clase.
La modificación de nombres es útil para dejar que las subclases sobreescriban los métodos sin romper las llamadas a los métodos desde la misma clase. Por ejemplo:
class Mapeo:
def __init__(self, iterable):
self.lista_de_items = []
self.__actualizar(iterable)
def actualizar(self, iterable):
for item in iterable:
self.lista_de_items.append(item)
__actualizar = actualizar # copia privada del actualizar() original
class SubClaseMapeo(Mapeo):
def actualizar(self, keys, values):
# provee una nueva signatura para actualizar()
# pero no rompe __init__()
for item in zip(keys, values):
self.lista_de_items.append(item)
Hay que aclarar que las reglas de modificación de nombres están diseñadas principalmente para evitar colisiones de nombres; es posible acceder o modificar una variable que es considerada como privada. Esto hasta puede resultar útil en circunstancias especiales, tales como en el depurador.
Note que el código pasado a exec o eval() no considera que la clase que invoca sea la clase actual; esto es similar al efecto de la sentencia global, efecto que es de similar manera restringido a código que es compilado en conjunto. La misma restricción aplica a getattr(), setattr() y delattr(), así como cuando se referencia a __dict__ directamente.
A veces es útil tener un tipo de datos similar al “registro” de Pascal o la “estructura” de C, que sirva para juntar algunos pocos ítems con nombre. Una definición de clase vacía funcionará perfecto:
class Empleado:
pass
juan = Empleado() # Crear un registro de empleado vacío
# Llenar los campos del registro
juan.nombre = 'Juan Pistola'
juan.depto = 'laboratorio de computación'
juan.salario = 1000
Algún código Python que espera un tipo abstracto de datos, en particular puede frecuentemente recibir. En cambio una clase que emula los métodos de aquel tipo de datos. Por ejemplo, si tenés una función que formatea algunos datos a partir de un objeto archivo, podés definir una clase con métodos read() y readline() que obtengan los datos de alguna cadena en memoria intermedia, y pasarlo como argumento.
Los objetos método de instancia tienen atributos también: m.__self__ es el objeto instancia con el método m(), y m.__func__ es el objeto función correspondiente al método.
lunes, 12 de febrero de 2018
Programación Orientada a Objetos en Python, parte 3
Python soporta la herencia y la herencia múltiple. Una definición de clase con múltiples clases base se ve así:
class ClaseDerivada(Base1, Base2, Base3):
<declaración-1>
.
.
.
<declaración-N>
Si un atributo no se encuentra en ClaseDerivada, se busca en Base1, luego (recursivamente) en las clases base de Base1, y sólo si no se encuentra allí se lo busca en Base2, y así sucesivamente.
El orden de resolución de métodos cambia dinámicamente para soportar las llamadas cooperativas a super(). Este enfoque es conocido en otros lenguajes con herencia múltiple como “llámese al siguiente método” y es más poderoso que la llamada al superior que se encuentra en lenguajes con sólo herencia simple.
No nos olvidemos del problema del diamante, Por ejemplo, todas las clases heredan de object, por lo tanto cualquier caso de herencia múltiple provee más de un camino para llegar a object. Para que las clases base no sean accedidas más de una vez, el algoritmo dinámico hace lineal el orden de búsqueda de manera que se preserve el orden de izquierda a derecha especificado en cada clase, que se llame a cada clase base sólo una vez, y que sea monótona (lo cual significa que una clase puede tener clases derivadas sin afectar el orden de precedencia de sus clases bases). En conjunto, estas propiedades hacen posible diseñar clases confiables y extensibles con herencia múltiple.
Programación Orientada a Objetos en Python, parte 2
Bueno, ya vimos clases y herencia en python. Esta segunda parte vamos a seguir hablando de la construcción de objetos.
La operación de instanciación crea un objeto vacío. En muchas ocasiones necesitamos crear objetos en un estado inicial particular. Por lo tanto se puede definir un método especial llamado __init__(), de esta forma:
def __init__(self):
self.datos = []
Cuando definimos un método __init__(), la instanciación de la clase automáticamente invoca a __init__(). Entonces, en este ejemplo, una instancia nueva e inicializada se puede obtener haciendo:
x = MiClase()
Por supuesto, el método __init__() puede tener argumentos para mayor flexibilidad. En ese caso, los argumentos que se pasen al operador de instanciación de la clase van a parar al método __init__(). Por ejemplo,
>>> class Complejo:
... def __init__(self, partereal, parteimaginaria):
... self.r = partereal
... self.i = parteimaginaria
...
>>> x = Complejo(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
Python permite las variables de instancia son para datos únicos de cada instancia y las variables de clase son para atributos y métodos compartidos por todas las instancias de la clase:
class Perro:
tipo = 'canino' # variable de clase compartida por todas las instancias
def __init__(self, nombre):
self.nombre = nombre # variable de instancia única para la instancia
>>> d = Perro('Fido')
>>> e = Perro('Buddy')
>>> d.tipo # compartido por todos los perros
'canino'
>>> e.tipo # compartido por todos los perros
'canino'
>>> d.nombre # único para d
'Fido'
>>> e.nombre # único para e
'Buddy'
Todo valor es un objeto, y por lo tanto un objeto conoce su clase (también llamado su tipo). Ésta se almacena como objeto.__class__ y es un objeto.
La operación de instanciación crea un objeto vacío. En muchas ocasiones necesitamos crear objetos en un estado inicial particular. Por lo tanto se puede definir un método especial llamado __init__(), de esta forma:
def __init__(self):
self.datos = []
Cuando definimos un método __init__(), la instanciación de la clase automáticamente invoca a __init__(). Entonces, en este ejemplo, una instancia nueva e inicializada se puede obtener haciendo:
x = MiClase()
Por supuesto, el método __init__() puede tener argumentos para mayor flexibilidad. En ese caso, los argumentos que se pasen al operador de instanciación de la clase van a parar al método __init__(). Por ejemplo,
>>> class Complejo:
... def __init__(self, partereal, parteimaginaria):
... self.r = partereal
... self.i = parteimaginaria
...
>>> x = Complejo(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
Python permite las variables de instancia son para datos únicos de cada instancia y las variables de clase son para atributos y métodos compartidos por todas las instancias de la clase:
class Perro:
tipo = 'canino' # variable de clase compartida por todas las instancias
def __init__(self, nombre):
self.nombre = nombre # variable de instancia única para la instancia
>>> d = Perro('Fido')
>>> e = Perro('Buddy')
>>> d.tipo # compartido por todos los perros
'canino'
>>> e.tipo # compartido por todos los perros
'canino'
>>> d.nombre # único para d
'Fido'
>>> e.nombre # único para e
'Buddy'
Todo valor es un objeto, y por lo tanto un objeto conoce su clase (también llamado su tipo). Ésta se almacena como objeto.__class__ y es un objeto.
Suscribirse a:
Entradas (Atom)