Translate
jueves, 23 de junio de 2016
Apache TinkerPop es ahora Top-Level Project
Vamos por parte: Que es Apache TinkerPop? Apache Tinkerpop ™ es un framework para computación orientada a grafos para ambas bases de datos de gráficos (OLTP) y sistemas de análisis de gráficos (OLAP).
Un gráfico es una estructura compuesta de nodos y aristas o relación. Los dos nodos y aristas pueden tener un número arbitrario de pares de claves/valores denominadas propiedades. Los vértices o nodos denotan objetos discretos, tal como una persona, un lugar, o un evento. Los bordes indican las relaciones entre los vértices. Por ejemplo, una persona puede conocer a otra persona, han participado en un evento, y / o estuvo recientemente en un lugar determinado. Propiedades expresan información no relacional sobre los vértices y aristas. Ejemplo propiedades incluyen un vértice que tiene un nombre, una edad y un borde que tiene una marca de tiempo y / o un peso.
Y porque es importante que sea Top-Level Project? Por que con esto Apache nos indica que le va a dar prioridad a este proyecto y que ya salio de la incubadora, es decir esta listo para usar!!
Apache TinkerPop™ es un proyecto open source, distribuido bajo licencia Apache2.
Dejo link: http://tinkerpop.apache.org/
miércoles, 22 de junio de 2016
Eclipse Neon esta con nosotros!!
La fundación Eclipse publico una nueva versión de eclipse llamada Neon. Eclipse Neon provee varios cambios. Entre ellos podemos nombrar un nuevo instalador basado en Eclipse Oomph que permite personalizar nuestra instalación.
Otra gran característica es que se puede cambiar el tamaño del texto con ctrl+shift++ o ctrl+shift+- Por fin!!!!
Además muchas mejoras para los programadores java y c++ .
Yo ya estoy bajando la nueva versión!!
Dejo link: https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R/eclipse-inst-linux64.tar.gz
lunes, 20 de junio de 2016
Cómo el mundo digital está ayudando a reducir la brecha de género
Buenísimo informe publico accenture, me tengo que sacar el sombrero. Con el titulo, "Avanzando hacia la igualdad, cómo el mundo digital está ayudando a reducir la brecha de género"
Por favor leanlo, esta muy bueno: https://www.accenture.com/ar-es/gender-equality-research-2016?src=SOMS&c=car_hsaonlne16_10000200&n=smc_0416
Porque Haskell no implementa dependently typed?
Seguramente se lo han preguntado, si esta tan bueno dependently typed, porque no lo implementa Haskell?
El problema es que debería romper la restricción de fase entre el tipo y niveles de valor que permite Haskell para ser compilado a código máquina eficiente. Con nuestro nivel actual de la tecnología, un lenguaje dependently typed debe correr sobre una maquina virtual o interprete.
Idris es compila a C pero tiene un garage collector, la verdad no se bien como lo hace. Alguien me ayuda?
El problema es que debería romper la restricción de fase entre el tipo y niveles de valor que permite Haskell para ser compilado a código máquina eficiente. Con nuestro nivel actual de la tecnología, un lenguaje dependently typed debe correr sobre una maquina virtual o interprete.
Idris es compila a C pero tiene un garage collector, la verdad no se bien como lo hace. Alguien me ayuda?
Que es la arquitectura de software? y porque es tan importante?
Que es la arquitectura de software?
Existen muchas definiciones, pero mucha basta con chequear el conjunto de definiciones que publica el sei (Instituto de ingeniería de software) : http://www.sei.cmu.edu/architecture/start/glossary/community.cfm
Yo tengo una definición personal, la pueden criticar pero no van a poder negar que es simple: La arquitectura de software son las decisiones que tomamos para satisfacer los requerimientos no funcionales (o atributos de calidad)
Hablo de requerimientos no funcionales o atributos de calidad, que sería eso? Bueno, son requerimientos que no describen una funcionalidad, sino que definen atributos para medir la calidad. Veamos un ejemplo:
- La aplicación no debe demorar más de 50 segundos en listar las ordenes diarias procesadas.
- Debe permitir que solo un usuario con permisos pueda autorizar un pedido.
- Un usuario novato debe ser capaz de crear un pedido en 1 hora.
- Debe permitir agregar un campo nuevo a la pantalla en menos de 1 día.
Como se puede ver los requerimientos no funcionales necesitan decisiones muy importantes para poder satisfacerlos. Las cuales son muy pero muy difícil cambiar luego de haberlas tomado. Por lo tanto es muy importante analizar los requerimientos no funcionales y definir la arquitectura y además documentarla.
Que quede muy claro, olvidarse un requerimiento no funcional puede ser critico y podemos perder un proyecto o atrasarnos mucho. Es decir podemos perder mucho dinero!! Por lo tanto no tomarse el tiempo de analizar la arquitectura es una irresponsabilidad.
Una buena practica es hacer un pequeño cuadro en el cual se listan los requerimientos no funcionales y las decisiones que tomamos para solucionarlos.
Además existe un proceso de desarrollo de arquitectura de software que debe ser respetado:
- Analizar requerimientos, puff, tenemos que leer todos los requerimientos y detectar los requerimientos no funcionales que muchas veces se ocultan entre los requerimientos funcionales. Luego de encontrarlos debemos documentarlos y checkearlos con los usuarios.
- Diseño: Debemos diseñar la solución.
- Documentar: Debemos documentar la solución y luego debemos ver si es coherente, además si se entiende. Para esto se puede recurrir a las revisiones por pares.
- Evaluación: Esto se va ir haciendo a medida que se diseña y se documenta. A la vez juega un rol importante las revisiones por pares.
- Implementación: A trabajar! Pico, pala, sudor, un poco de inspiración y suerte. Debemos programar todo lo que diseñamos, y si algo falla o no se puede implementar volver al inicio de la lista :P
Como se puede ver el rol de arquitecto de software no es fácil y necesita que los desarrolladores, funcionales y testers, lo ayuden constantemente.
jueves, 16 de junio de 2016
Piso13
Piso13 es un podcast sobre tecnología, se habla de librerías open source, noticias, herramientas, vulnerabilidades de seguridad, lo que sea que nos llame la atención sin barreras de lenguajes.
Tratamos de hacer foco sobre conferencias, eventos y programadores de américa latina.
Se los recomiendo!!
Dejo link: http://13floor.org/podcast/
Tratamos de hacer foco sobre conferencias, eventos y programadores de américa latina.
Se los recomiendo!!
Dejo link: http://13floor.org/podcast/
domingo, 12 de junio de 2016
Comparando Go con Java
Como me gustan las comparativas. Ahora tenemos Go con java.
Empecemos:
Go es compilado a código máquina y se ejecuta directamente. No utiliza una maquina virtual.
Golang tiene una Garbage Collector, pero esto no es un GC completo como en Java, ya que no hay compactación de memoria.
Go tiene clausuras y se pueden escribir funciones que retornen funciones:
package main
import (
"fmt"
)
func CounterFactory(j int) func() int {
i := j
return func() int {
i++
return i
}
}
func main() {
r := CounterFactory(13)
fmt.Printf("%d\n", r())
fmt.Printf("%d\n", r())
fmt.Printf("%d\n", r())
}
Similar a Python, una función puede retornar muchos resultados.
También se puede escribir:
a,b = b,a
Go es menos orientado a objeto es como JavaScript.
package main
import (
"fmt"
)
type A struct {
a int
}
func (a *A) Printa() {
fmt.Printf("%d\n", a.a)
}
type B struct {
A
n string
}
func main() {
b := B{}
b.Printa()
b.A.a = 5
fmt.Printf("%d\n", b.a)
}
Go no tiene excepciones, tiene errores. No es necesario los try o catch, veamos un ejemplo:
package main
import (
"log"
"os"
)
func main() {
f, err := os.Open("filename.ext")
if err != nil {
log.Fatal(err)
}
defer f.Close()
}
Dejo el link: https://dzone.com/articles/comparing-golang-with-java
Programación Orientada a objetos desde la perspectiva de su creador
Muchos mitos existen sobre la programación orientada a objetos. Una de las cosas que he escuchado diferentes versiones es sobre su creación. Yo prefiero pensar que todo ocurrió en el Centro de Investigación de Palo Alto (PARC - Palo Alto Research Center) de Xerox en 1970.
Alan Kay es el creador de la programación orientada a objetos. Es decir si utilizas poo debes conocer a esta persona.
Kay entró a trabajar en el Centro de Investigación de Palo Alto (PARC - Palo Alto Research Center) de Xerox en 1970. En los setenta fue uno de los miembros principales del centro, desarrollando prototipos de estaciones de trabajo en red, usando el lenguaje de programación Smalltalk. Smalltalk es un lenguaje de poo puro. En Smalltalk todo es un objeto, es de tipado dinámico y con clausuras. Deberían leer sobre este lenguaje.
Kay, junto a algunos compañeros en PARC y otros predecesores del Norwegian Computing Centre, es uno de los padres de la Programación Orientada a Objetos. Creó el Dynabook que definió la base de los ordenadores portátiles y Tablet PC actuales, también es considerado por algunos como el arquitecto de los sistemas modernos de ventanas interfaz gráfica de usuario.
Unas de las frases que más me gustan:
“I invented the term object oriented, and I can tell you that C++ wasn't what I had in mind.” —Alan Kay. (Yo inventé el término "orientado a objetos", y te puedo asegurar que C++ no era en lo que estaba pensando)
Dejo link: http://www.vpri.org
jueves, 9 de junio de 2016
Java 9 elimina CORBA del classpath por defecto.
Es decir la nueva JDK de java 9, no vamos a tener CORBA. La verdad no es una gran noticia, no creo que muchas aplicaciones estén usando CORBA y deseen migrar a Java 9. Pero a pesar de ese detalle la noticia resono en todos los lugares.
Dejo link:
https://www.infoq.com/news/2016/06/corba-removed-java-9
Dejo link:
https://www.infoq.com/news/2016/06/corba-removed-java-9
Nim, un nuevo lenguaje!!
Nim es un lenguaje imperativo, multiparadigma, es un lenguaje compilado, de tipado estático. Diseñado para ser eficiente, expresivo y elegante. Soporta metaprogramming, programación funcional, procedural y orientación a objeto.
Veamos un hola mundo:
# This is a comment
echo "What's your name? "
var name: string = readLine(stdin)
echo "Hi, ", name, "!"
Y ahora vamos a compilar:
nim compile --run greetings.nim
Veamos un objeto:
type
Person = ref object of RootObj
name*: string # the * means that `name` is accessible from other modules
age: int # no * means that the field is hidden from other modules
Student = ref object of Person # Student inherits from Person
id: int # with an id field
var
student: Student
person: Person
assert(student of Student) # is true
# object construction:
student = Student(name: "Anton", age: 5, id: 2)
echo student[]
Entre sus características, podemos nombrar:
Dejo link:
http://nim-lang.org/
https://github.com/nim-lang/Aporia
Veamos un hola mundo:
# This is a comment
echo "What's your name? "
var name: string = readLine(stdin)
echo "Hi, ", name, "!"
Y ahora vamos a compilar:
nim compile --run greetings.nim
Veamos un objeto:
type
Person = ref object of RootObj
name*: string # the * means that `name` is accessible from other modules
age: int # no * means that the field is hidden from other modules
Student = ref object of Person # Student inherits from Person
id: int # with an id field
var
student: Student
person: Person
assert(student of Student) # is true
# object construction:
student = Student(name: "Anton", age: 5, id: 2)
echo student[]
Entre sus características, podemos nombrar:
- Librería estandar
- Garbage Collector
- Procedures
- Iterators
- Enumerations
- Modules
- Generics
- Templates
- Macros
- Compilación a javascript
- Aporia es la IDE con la que se pueden programar.
Dejo link:
http://nim-lang.org/
https://github.com/nim-lang/Aporia
domingo, 5 de junio de 2016
Traits en PHP
Buscando sobre traits en scala me encontré con que Php tambien tiene traits desde la versión 5.4.0
Los traits (rasgos) son un mecanismo de reutilización de código en lenguajes de herencia simple, como PHP. El objetivo de un trait es el de reducir las limitaciones propias de la herencia simple permitiendo que los desarrolladores reutilicen a voluntad conjuntos de métodos sobre varias clases independientes y pertenecientes a clases jerárquicas distintas. La semántica a la hora combinar Traits y clases se define de tal manera que reduzca su complejidad y se eviten los problemas típicos asociados a la herencia múltiple y a los Mixins.
Un Trait es similar a una clase, pero con el único objetivo de agrupar funcionalidades muy específicas y de una manera coherente. No se puede instanciar directamente un Trait. Es por tanto un añadido a la herencia tradicional, y habilita la composición horizontal de comportamientos; es decir, permite combinar miembros de clases sin tener que usar herencia.
Para los que vienen de Java es como las interfaces con métodos por defecto de Java 8.
Veamos un ejemplo:
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
Los miembros heredados de una clase base se sobrescriben cuando se inserta otro miembro homónimo desde un Trait. De acuerdo con el orden de precedencia, los miembros de la clase actual sobrescriben los métodos del Trait, que a su vez sobrescribe los métodos heredados.
Se sobrescribe un miembro de la clase base con el método insertado en MiHolaMundo a partir del Trait DecirMundo. El comportamiento es el mismo para los métodos definidos en la clase MiHolaMundo. Según el orden de precedencia los métodos de la clase actual sobrescriben los métodos del Trait, a la vez que el Trait sobrescribe los métodos de la clase base.
Veamos un ejemplo:
<?php
class Base {
public function decirHola() {
echo '¡Hola ';
}
}
trait DecirMundo {
public function decirHola() {
parent::decirHola();
echo 'Mundo!';
}
}
class MiHolaMundo extends Base {
use DecirMundo;
}
$o = new MiHolaMundo();
$o->decirHola();
?>
y el resultado va a ser:
¡Hola Mundo!
Se pueden insertar múltiples Traits en una clase, mediante una lista separada por comas en la sentencia use.
<?php
trait Hola {
public function decirHola() {
echo 'Hola ';
}
}
trait Mundo {
public function decirMundo() {
echo 'Mundo';
}
}
class MiHolaMundo {
use Hola, Mundo;
public function decirAdmiración() {
echo '!';
}
}
$o = new MiHolaMundo();
$o->decirHola();
$o->decirMundo();
$o->decirAdmiración();
?>
y el resultado sería:
Hola Mundo!
Hace mucho que no hago algo en PHP, pero se ve a las claras como evoluciono y evoluciona para bien.
Dejo la fuente:
http://php.net/manual/es/language.oop5.traits.php
miércoles, 1 de junio de 2016
compose y andThen en scala
Una buena practica de programación es realizar funciones atómicas que luego se puedan reutilizar. Esto nos permite reutilizarlas como parte de otras funciones y hasta como composiciones de funciones. Con este espíritu fueron creadas las funciones compose y andThen en scala.
Con compose puedo componer dos funciones, es decir que se ejecute una y luego con el resultado de la misma ejecutar la segunda función. Sería algo así: f(g(x))
scala> val fComposeG = f _ compose g _
fComposeG: (String) => java.lang.String = <function>
scala> fComposeG("yay")
res0: java.lang.String = f(g("yay"))
De la misma manera funciona andThen pero en orden de ejecución diferente. Es decir:
scala> val fAndThenG = f _ andThen g _
fAndThenG: (String) => java.lang.String = <function>
scala> fAndThenG("yay")
res1: java.lang.String = g(f(yay))
Dejo link:
https://twitter.github.io/scala_school/pattern-matching-and-functional-composition.html
All About Scala
All About Scala es un sitio donde podes encontrar tutoriales de scala, y tambien de Intellj. Por el momento los tutoriales de scala son un tanto básicos (buenos para comenzar).
Dejo link:
http://allaboutscala.com/tutorials/
Dejo link:
http://allaboutscala.com/tutorials/
lunes, 30 de mayo de 2016
PartialFunction en scala
Imaginemos que queremos definir un pattern matching si bien sabemos como se debe comportar con ciertos valores, no tenemos una comportamiento por default. Veamos un ejemplo:
def toYesOrNo(choice: Int): String = choice match {
case 1 | 2 | 3 => "yes"
case 0 => "no"
}
En este caso si trato de usar la función para un valor que no se encuentra definido en el dominio por ejemplo 5. Esto nos dará un error. Pero si utilizamos PartialFunction, no nos devolverá un error y a la vez podemos ver si esta función funciona con ese valor:
scala> val one: PartialFunction[Int, String] = { case 1 => "one" }
one: PartialFunction[Int,String] = <function1>
scala> one.isDefinedAt(1)
res0: Boolean = true
scala> one.isDefinedAt(2)
res1: Boolean = false
Dejo link:
https://twitter.github.io/scala_school/pattern-matching-and-functional-composition.html
miércoles, 25 de mayo de 2016
The Elements of Web Design
Codescholl nos trae un nuevo curso esta vez de diseño web.
Les dejo los temas:
Course Overview
- LEVEL 1 FREE LEVEL 2 Videos | 10 ChallengesUser DiscoveryBegin the design process by identifying and testing your hypothesized target audience.
- LEVEL 2 2 Videos | 13 ChallengesNavigating SitesAvoid nuclear meltdowns by learning how to organize your content and establish good navigation practices.
- LEVEL 3 3 Videos | 14 ChallengesUsability DesignLearn to create a positive bond with your users with smart, user-related web pages.
- LEVEL 4 1 Video | 6 ChallengesMobile Best PracticesYield some positive reactions with tips for designing with mobile in mind.
COMPLETE THESE LEVELS TO UNLOCK
Course Completion Badge
Learn how to design user-centered websites that are purposeful and easy to use.
Dejo link:
https://www.codeschool.com/courses/the-elements-of-web-design
Suscribirse a:
Entradas (Atom)