Translate

jueves, 16 de octubre de 2014

Standard ML

Estoy haciendo el curso de corsera sobre lenguajes de programación y en este curso se estudia Standard ML y madre mía ,que lenguaje!!! Y obvio despertó mi curiosidad, veamos que nos dice la wikipedia sobre SML: 

"El lenguaje de programación Standard ML o SML es un lenguaje descendiente del lenguaje ML que nació como el Meta Lenguaje del sistema LCF. A diferencia de muchos otros lenguajes de programación, SML tiene una especificación formal, como semántica operacional publicada en el libro The Definition of Standard ML."

Yo ya hable de SML en otro post pero mi inconstancia, no dejo que profundice. Seguramente estas pensando que me puede aportar este lenguaje? Que lo hace especial?

Como primer punto es un lenguaje funcional y es de tipado estático, con genéricos. A la vez el compilador infiere los tipos por lo que tiene el sistema de tipos más simple y mejor diseñado que he usado, y si no mira:

- val i = 2
val i = 2 : int
- val miLista = [1,1,3,4,5]
val miLista = [1,1,3,4,5] : int list
- val otraLista = [miLista, [1,2,8]]
val otraLista = [[1,1,3,4,5],[1,2,8]] : int list list
- val unString="unString"
val unString = "unString" : string

Si ven otraLista es de tipo list y es genérica. Y este genérico es de tipo lista de enteros, en java sería así:

List<List<Integer>>

Al ser un lenguaje funcional las funciones son lo más importante, y se definen de la siguiente manera:

- fun sumar (a:int, b:int):int = a + b
val sumar = fn : int * int -> int
- sumar (4, 5)
val it = 9 : int

Como ven la función sumar es de tipo int * int -> int , lo que significa que tiene dos parámetros enteros y devuelve un entero. 

Otro tipo interesante son las tuplas, son colecciones de elementos de un mismo tipo que se pueden acceder por un indice, similar a los arreglos:

- fun sumarTupla(tupla: int * int) : int = #1 tupla + #2 tupla
val sumarTupla = fn : int * int -> int
- sumarTupla((1,2))
val it = 3 : int

SML es un lenguaje que tiene un sistema de tipos muy simple, voy a seguir postiando cosas interesantes sobre el lenguaje. 



sábado, 11 de octubre de 2014

Que lenguaje deben enseñar en la facultad y cual no? y porque?


Estuvimos discutiendo sobre que lenguaje se debe enseñar en la facultad y quede bastante enganchado con el tema por lo que decidí preguntarle a ustedes los lectores. Que piensan?

Es bueno que la facultad enseñe los lenguajes más utilizados? Debe enseñar conceptos y no lenguajes? 

En mi opinión la facultad no debería preocuparse si el lenguaje se utiliza o no en el mercado, es más mejor si enseña uno que no usa nadie, así el alumno tiene que aprender otros y por su cuenta. 

Por favor comenten que piensan!!

Ruby vs. The World

Quiero compartir con ustedes este muy interesante video y presentación que compara o habla de diferentes lenguajes modernos.

Dejo link: http://matt.aimonetti.net/posts/2012/11/02/rubyconf-2012-ruby-vs-the-world/

miércoles, 8 de octubre de 2014

The Linux Foundation Certification Program

Todo comenzó con un curso en EDX y ahora linux foundation no solo nos regala un curso, sino que también nos permite certificarnos como sysadmin o engineer.



Multiple Dispatch

Quiero recomendarles el siguiente articulo "Multiple Dispatch" si estan interesados en que es el double Dispach y por que es interesado.

sábado, 4 de octubre de 2014

ExpressionBuilder

Cuando realizamos Unit test necesitamos crear componentes o objetos para testear, no se puede
mockear todo. Una muy buena idea es construir nuestros objetos con builders. A la vez podemos reutilizar estos builder en diferentes tests.

Una idea muy buena son los ExpressionBuilders, que son builders que simulan un DSL para construir objetos. Es muy Elegante:

customer.newOrder()
  .with(6, "TAL")
  .with(5, "HPK").skippable()
  .with(3, "LGV")
  .priorityRush();

Esto se logra haciendo que el builder contenga la instancia que debe construir y cada vez que se llama a with o otro método que setea la instancia, devolvemos this, para poder encadenar los llamados. 

Queda de esta forma:

public class OrderBuilder {
  private Order subject = new Order();
  private OrderLine currentLine;

  public OrderBuilder with(int quantity, String productCode) {
    currentLine = new OrderLine(quantity, Product.find(productCode));
    subject.addLine(currentLine);
    return this;
  }

  public OrderBuilder skippable() {
    currentLine.setSkippable(true);
    return this;
  }

  public OrderBuilder priorityRush() {
    subject.setRush(true);
    return this;
  }

  public Order getSubject() {
    return subject;
  }
}

Por supuesto que esta técnica no solo se puede utilizar en unit test... 

jueves, 2 de octubre de 2014

MySQL ofrece una API REST

Si, si, MySQL ofrece una API REST. Toma tu torta! leyendo infoQ me encontré con la noticia de que existe un plugin, para agregar una API REST, este plugin se encuentra en MySql labs.

Esta API nos permite acceder a nuestra información por medio de REST. De hecho lo que hacemos es hacer una consulta con una url:

SQL: SELECT * FROM simple ORDER BY id
URL: http://127.0.0.1:8080/sql//SELECT+%2A+FROM+simple+ORDER+BY+id

Además se puede hacer CRUD, y se puede utilizar JSON.

Dejo link: http://www.infoq.com/news/2014/09/MySQL-REST


miércoles, 1 de octubre de 2014

Ceylon roadmap


Charan charan !! Ceylon 1.0 ha sido liberado!!

Y el equipo de Ceylon sigue trabajando, la versión 1.1 va a estar centrada en mejoras de rendimiento e interoperabilidad y la versión 1.2 añadirá nuevas características del lenguaje.

A prestar atención!!

Dejo link:
http://ceylon-lang.org/documentation/1.0/roadmap/

domingo, 28 de septiembre de 2014

sábado, 27 de septiembre de 2014

PureScript, un lenguaje que lleva la programación funcional al browser

PureScript es un lenguaje similar a Haskell que compila a javascript, por lo que puede ser ejecutado por un browser y interactuar con una pagina web.


PureScript fue creado por Phil Freeman, quien se inspiro en Haskell para hacer este lenguaje. El cual nos trae de Haskell las siguientes características:

  • Inferencia de tipos.
  • Higher Kinded Polymorphism, no supe como traducirlo, pero sería un mecanismo de abstracción sobre constructores.
  • Pattern matching
  • Type Classes: tan poco me conversia la traducción, un mecanismo de abstracción sobre las estructuras de datos que permite utilizarlos sin tener que pensar directamente en la estructura de los datos en sí.
El código esta en github y es de licencia MIT.

Dejo link:

miércoles, 24 de septiembre de 2014

Soporte nativo para Json en java 9?

Al parecer en Java 9 vamos a tener soporte nativo para JSon. Es decir que vamos a poder utilizar una Api nativa para procesar Json.

 Históricamente, Java ha sido una plataforma de elección para el procesamiento de XML, pero en los últimos años el mundo se ha movido más y más hacia los datos JSON siendo consumida y devuelta por los servicios web basados ​​en REST simples. Java ha bajado un poco detrás de la curva de otros lenguajes, y es este déficit que JEP 198 espera abordar.

Dejo link: http://www.infoq.com/news/2014/09/CoreJSONJava9

domingo, 21 de septiembre de 2014

Primeros pasos en Qt: Qt Designer


Qt designer es una herramienta pensada para el diseño de interfaces de forma cómoda y fácil.

Una de las ventajas de la utilización de Qt Designer es que permite a los programadores una gran libertad para modificar sus diseños sin ser forzados a cambiar su código fuente. Al desarrollar escribiendo solo código C++, los cambios en el diseño pueden llevar mucho tiempo. Con Qt Designer, no se pierde tiempo, simplemente regenera el código fuente que ha cambiado.
Las Interfaz de usuario (ventanas) se guarda en un archivo .ui (un formato de archivo basado en XML), mientras que la funcionalidad personalizada se implementa mediante subclases.

Supongamos que debamos acceder a cualquier componente que hemos diseñado desde el diseñar. Debemos llamarlos desde un objeto generado, que se construye en el constructor y es de igual tipo que la ventana, no estoy siendo muy claro, veamos un poco de código para expresarme mejor:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->pushButton->setText("Chau!!");
}

En el ejemplo para acceder a pushButton tuvimos que utilizar el objeto ui que es la ventana.


Aprendiendo Ruby on Rails 4.0

Sin preámbulos, quiero compartir el libro con ustedes, si bien el libro no esta terminado es totalmente gratuito y en español. Por lo tanto suscribanse!!

Dejo un extracto:

"Conoce como desarrollar aplicaciones web con un enfoque de afuera hacia adentro - Outside-in - con el marco de trabajo de Ruby on Rails 4.0.

Aprender de la naturalidad de un languaje de programación como Ruby y de cómo Ruby on Rails 4.0 explota nuestra productividad."

Dejo link:
http://railsenespanol.co/


jueves, 18 de septiembre de 2014

domingo, 14 de septiembre de 2014

Primeros pasos en Qt: Signals y Slots a fondo

El mecanismo de signals y slots es fundamental para qt. Los Slots son muy similares a las funciones comunes, pueden ser virtuales, sobrecargados, privados, protegidos y públicos. Además pueden ser invocados como cualquier otra función de c++ y sus parámetros pueden ser de cualquier tipo. La diferencia con las funciones es que los Slots pueden ser invocados automáticamente desde una señal.

La conexión entre signal y slot es así:

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

Donde sender y receiver son objetos de tipo QObjects, además signal y slot se pasan como parámetro sin parámetros, solo el nombre de la función.

Una signal puede llamar a diferentes slots y un slot puede ser llamado por diferentes funciones. Veamos unos ejemplos:

Una signal puede llamar a diferentes slots:

connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));

Un slot es llamado por diferentes signal: 
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));

Una signal puede conectar otra signal:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
Cuando la primera señal es emitida, la segunda es emitida.

Una conexión puede ser removida: 
disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));

Algo muy importante es que la signal y el slot o signal a la que es conectada debe tener la misma cantidad de parámetros y del mismo tipo. Si el slot o signal a la que es conectada tiene más parámetros, simplemente sera ignorados. Si los parámetros son de diferente tipo qt lanzara una advertencia cuando se compila y un error en tiempo de ejecución.

El mecanismo de signals y slots, no esta limitado a el diseño de interfaces de usuarios, también se puede usar en el modelado heredando de QObject.