Fundamentos de POO con Java.

Programación Orientada a objetos. (Luis Joyanes Aguilar) (E-book)

LinApp, encuentra tu aplicación comercial para GNU/Linux.

LinApp, un sitio que busca reunir en un solo lugar todo el Software Comercial que existe para Linux, desde aplicaciones profesionales hasta juegos.

La iniciativa pretende crear un amplio catalogo de programas comerciales para Linux, las cuales quizás hayan existido desde siempre, pero que tal vez desconozcamos. Uno de los colaboradores del sitio (y que comunicó la existencia del proyecto) destaca lo siguiente:

“Uno de los problemas que tuvimos fue encontrar aplicaciones profesionales (comerciales) para Linux. No me malinterpreten. Hay un montón de aplicaciones gratuitas de aspecto profesional pero a veces sólo necesitamos más. Encontrar esas aplicaciones es realmente difícil, ya que eran pocos, casi ninguno, los sitios web que lista las aplicaciones comerciales para Linux. Así que hemos decidido crear página web que promuevan las aplicaciones comerciales de Linux, así que hicimos lin-app.com.

Nuestro lema: Más aplicaciones Linux = Más usuarios de Linux = Aún más aplicaciones Linux = Mejor soporte para Linux.”

Si bien hasta ahora las aplicaciones libres y gratis de las que hablamos frecuentemente satisfacen bastante bien nuestras necesidades, considero importante que haya más alternativas y en este punto concuerdo con el razonamiento que plantea Marko, ya que a veces la “falta de alternativas” de software se convierte en un factor importante para la “falta de adopción” de Linux por parte de algunas personas.

Así que si necesitas una mayor variedad de programas, aun no encuentras una aplicación entre las ofertas gratuitas o solo deseas explorar nuevas alternativas por parte del software comercial, ¡ya sabes donde buscar!

El sitio cuenta en este momento con más de 100 aplicaciones que están distribuidas por toda la red, y por cada una de ellas nos presentan una imagen, una breve descripción, el tamaño del archivo, el precio y un link hacia la página oficial del producto y de su respectiva empresa, donde finalmente puedes conseguir la aplicación.

Me parece bastante interesante esta iniciativa, ya que uno difícilmente se toparía (o buscaría siquiera) aplicaciones comerciales para nuestro sistema que, sin embargo, con esfuerzo han portado algunas empresas para que funcionen nativamente en Linux.

Fuente | muylinux.com

Lenguajes de programación emergentes (2a. y última parte).

Continuamos con la lista de 10 lenguajes de programación emergentes iniciada desde la semana anterior. Al final les ofrezco algunos comentarios.

6. Kodu

  • Creado por: Anderson, Cheng y MacLauring, del grupo de Sistemas Creativos de Microsoft Research.
  • Año de creación: 2009.
  • Paradigma: Visual.
  • Descripción: Kodu no es un lenguaje de programación visual únicamente, también es un ambiente para diseñar, construir y jugar tus propios videojuegos. Los programas están compuestos de páginas, a su vez desglosadas en reglas, y luego éstas en condiciones y acciones. Los elementos básicos del lenguaje son puramente íconos. Incluye 20 personajes con diferentes habilidades.
  • Inspirado en: Logo y Squeak.
  • Instalación: Descarga (gratuitamente) e instala para Windows XP, Vista y 7. También para Xbox 360.
  • Ejemplo:

7. Scala

  • Creado por: El Dr. Martin Odersky, investigador del pretigioso EPFL.
  • Año de creación: 2003.
  • Paradigma: Multiparadigma; orientado a objetos (puro), funcional, imperativo.
  • Descripción: Fue programado en Java, y puede interactuar directamente con este lenguaje. Todo es un objeto, incluso los números. Su abstracciones pretenden ser más poderosas y uniformes. Fue creado con la idea de que la programación sea orientada a componentes.
  • Inspirado en: Smalltalk, Haskell, Erlang.
  • Instalación: En Ubuntu: sudo apt-get install scala
  • Ejemplo:

   object Numeros {
    def main(args: Array[String]) {
     for (i <- 1 until 11)
      print(i+" ")
    }
   }

8. Ioke

  • Creado por: Ola Bini, uno de los principales programadores de JRuby.
  • Año de creación: 2008.
  • Paradigma: Orientado a objetos, prototipado.
  • Descripción: Dinámico, fuertemente tipeado, corre sobre la JVM y la CLR. Se dice que es código plegable, es decir, código que crea código. Como lenguaje, su principal objetivo es ser expresivo.
  • Inspirado en: Smalltalk, Lisp, Ruby.
  • Instalación:

    1. Descarga y descomprime
    2. Ioke y otros ejecutables están en el directorio ./ioke/bin
  • Ejemplo

      x = 1
    until(x == 11,
    "#{x} " print
    x++
    )

9. Trylon

  • Creado por: Steve Folta, reconocido ex-programador de BeOS.
  • Año de creación: 2007.
  • Paradigma: Orientado a objetos.
  • Descripción: Usa indentaciones para estructurar los programas, igual que Python; con sintaxis similar a la de Smalltalk. Usa tipeado dinámico en los objetos, aunque los programas se compilan (estáticamente) con un compilador de lenguaje C.
  • Inspirado en: Python, Smalltalk.
  • Instalación:

    1. Descarga y descomprime
    2. Entra al directorio
    3. En Ubuntu instala los archivos de cabecera del recolector de basura: sudo apt-get install libgc-dev
    4. make
    5. sudo make install
  • Ejemplo:

   trylon numeros
   main: args
     x = 1
     while x <= 10
      print: x string + " "
      x+=1

10. Objective-J

  • Creado por: 280 North, Inc., empresa formada por ex-empleados de Apple.
  • Año de creación: 2008.
  • Paradigma: Multiparadigma: Reflectivo, orientado a objetos, funcional, imperativo.
  • Descripción: Como el nombre lo dice, es una implementación de Objective-C en JavaScript. La sintaxis es casi idéntica al primero. Como el compilador está creado con JavaScript, no es necesario instalar ningún complemento para el navegador. El framework Capuccino —que implementa el API de Cocoa— está escrito con Objective-J.
  • Inspirado en: Objective-C y JavaScript.
  • Instalación:

    1. Descarga y descomprime
    2. Prueba la instalación abriendo con el navegador el archivo /Starter/NewApplication/index.html

Ejemplo: Por razones de espacio sólo presento la función que implementa un botón al que con cada clic aumenta en uno el valor de una variable, lo cual se muestra en el navegador. Si la variable rebasa el valor de 10, se reestablece a 0.

 - (void)numeros:(id)sender {
if ([label stringValue] == "Números!!") {
i=i+1;
[label setStringValue:i];
}
else {
i=i+1;
[label setStringValue:i];

if ([label stringValue] == 11) {
[label setStringValue:"Números"];
i=0;
}
}
}

Comentarios.

La elaboración de esta lista estuvo inspirada por la del campamento de lenguajes de programación emergentes de la Open Source Conference sucedida hace muy pocos días. Los lenguajes presentados aquí fueron elegidos por obra del azar —y la curiosidad, siempre.

Como habrán notado ya, la mayoría de los lenguajes son jóvenes, aunque con diferentes niveles de madurez. Se observa una fuerte tendencia a ser construidos encima de plataformas como la Java Virtual Machine y la Common Language Runtime. Muchos de ellos son multiparadigma, pero sobre todo orientados a objetos, siempre con el ánimo de ser expresivos a la vez que sencillos. Smalltalk sigue siendo un modelo a seguir.

Quedaron una inmensidad de lenguajes en el tintero, algunos más raros y experimentales que otros: el flexible ooc, el prudente noop, el humilde coherence, el funcional ur, el concurrente coffescript,… Y muchos más, por supuesto.

Les invito a realizar el ejercicio de probar nuevos lenguajes de cuando en cuando. El conocimiento de nuevos paradigmas enriquecerá su programación con impensables e interesantes formas de modelar el mundo.

Fuente | bitelia.com

Notificaciones al termino de ejecución de una tarea en GNU/Linux.

En 1999 el escritor de ciencia ficción Neal Stephenson escribió el excelente libro “En el comienzo fue la línea de comandos” en el que postulaba que por aquel entonces el mejor sistema operativo era BeOS, por “combinar potencia con buena interfaz gráfica, pues (…) brinda la posibilidad de abrir una ventana a la línea de comandos”. El tiempo pasó (vaya si hubo avances en estos años), Stephenson dijo que su opinión cambió al salir Mac OS X y la idea de la integración entre la línea de comandos y la interfaz gráfica es clave hoy en día tanto en BSD, Linux como Mac OS X.

Es decir, lo que hace a un sistema operativo potente es combinar la usabilidad con la potencia, permitiendo integrar la terminal (“la mejor forma de relacionarse con el mundo“, de acuerdo a Stephenson) en un entorno de escritorio completamente simple de usar. Ahora, es habitual que sihacemos alguna tarea que consuma algo de tiempo en la terminal, sea en background o no, no nos quedemos viendo qué es lo que sucede hasta que termine su ejecución. Podemos estar descargando algún archivo pesado por wget y pasará un buen par de horas hasta que la descarga se complete. En consecuencia, aunque podamos necesitar con relativa urgencia el archivo, nos podemos olvidar por completo de él.

Por eso me encantó un pequeño alias ideado por Dustin Kirkland, desarrollador de Ubuntu Server, que permite ser alertado mediante el panel de notificaciones de Gnome cada vez que termine de ejecutarse un trabajo en la terminal.

Para probarlo, primero asegurémonos de tener instalado libnotify-bin. En caso negativo:

sudo apt-get install libnotify-bin 

Editamos el archivo ~/.bashrc, en el que se encuentran los alias:

gedit ~/.bashrc 

Allí debemos copiar, al final del mismo, lo siguiente:

alias alert_helper='history|tail -n1|sed -e "s/^\s*[0-9]\+\s*//" 
-e "s/;\s*alert$//"' alias alert='notify-send -i
 /usr/share/icons/gnome/32x32/apps/gnome-terminal.png 
"[$?] $(alert_helper)"' 

Y finalmente:

source ~/.bashrc 

Si quieren probarlo y ver cómo funciona, pueden tipear en la consola

sleep 60; alert 

Como verán, lo que cambia es el “;” más el “alert”. Un ejemplo muy práctico en el que podemos ver la utilidad de esta funcionalidad es al compilar un programa, algo que puede tomar unos segundos pero, dependiendo del tamaño de la aplicación, suele llevar unos minutos. En este caso, ejecutaremos en la línea de comandos

make; alert 

De este modo podrán compilar un programa mientras navegan por los blogs de Hipertextual sin estar viendo cada 20 segundos si ya terminó de compilarse, que una vez que termine el sistema operativo les avisará desde el panel de notificaciones que la tarea ha concluido.

Fuente | bitelia.com

Lenguajes de programación emergentes.

Los lenguajes de programación son mi fascinación. No sólo se trata de programar/codificar con ellos. Se trata también de conocer los detalles de las diferentes sintaxis, así como la expresividad que tiene cada uno para resolver problemas de todo tipo. Cada uno, como sucede con cualquier idioma hablado, es una forma de ver y entender el mundo.

En lo que sigue te presento la primera parte de dos sobre 10 lenguajes de programación emergentes. Todos son libres/abiertos. Todos son raros, únicos de alguna manera —allí comienza mi curiosidad—. Casi todos tienen menos de 10 años de vida. Los hay orientados a objetos, funcionales, orientados a pila y más. Y no es que debas probarlos todos, pero sí te invito echarles un vistazo con el mismo espíritu con el que un arqueólogo descubre lenguajes inimaginables. En todos los casos presento una breve ficha técnica, así como un ejemplo: no el clásico “Hello, world!”, sino un pequeño programa para listar los números del 1 a 10. Da clic en los títulos para ir a la página oficial del lenguaje en cuestión.

1. Io

  • Año de creación: 2002.
  • Paradigma: Orientado a objetos, basado en prototipos (como en JavaScript).
  • Descripción: Simple, muy dinámico, introspectivo y concurrente. Multiplataforma y extensible. Fue diseñado para unir la expresividad de Smalltalk con la velocidad de C.
  • Inspirado en: Smalltalk (principalmente), Lisp, Lua, Self.

  • Instalación: En Ubuntu:

    1. Descarga
    2. Descomprime
    3. Ingresa al directorio
    4. mkdir build && cd build
    5. cmake ..
    6. sudo make install
    7. ldconfig
  • Ejemplo:

      for ( i, 1, 10, write(i, " ") )

2. Clojure

  • Año de creación: 2007.
  • Paradigma: Funcional, pero de propósito general.
  • Descripción: Compilado, eficiente, robusto, multihilado, con sistema de macros. Corre sobre dos máquinas virtuales: JVM y CLR.
  • Inspirado en: Lisp, Haskell.
  • Instalación:

    1. En Ubuntu: sudo apt-get install clojure.
    2. De otra forma, descarga el código; entonces compila e instala con ant.
  • Ejemplo:

      (dotimes [i 10] (print (inc i) ""))

3. D

  • Año de creación: 1999.
  • Paradigma: Multiparadigma, pero sobre todo orientado a objetos e imperativo.
  • Descripción: Es muy parecido a C/C++, pero intenta ser mucho más práctico. Gdc y ldc son compiladores libres para el lenguaje D.
  • Inspirado en: C++, Java.
  • Instalación:

    1. En Ubuntu: sudo apt-get install gdc
    2. De otra forma, descarga el código oficial, descomprime y entra a ./dmd/linux/bin.
  • Ejemplo:

      import std.stdio;

    int main()
    {
    for (int i = 1; i <= 10; i++) writef(i, " "); return 0; }

4. Go

  • Año de creación: 2009.
  • Paradigma: Imperativo y concurrente.
  • Descripción: Es como C, pero sin declaración de tipos de datos como en Python. Su sintaxis es sencilla. La compilación es, sin exagerar, excepcionalmente rápida. Ken Thompson, también co-creador de C, ayudó en el diseño.
  • Inspirado en: C, Pascal.
  • Instalación: Cambia el valor de las variables según tu conveniencia. En Ubuntu:

      export GOROOT=$HOME/gosource
    export GOARCH=386
    export GOOS=linux
    export GOBIN=$HOME/gobin
    export PATH=$PATH:$GOBIN

    source ~/.bashrc

    sudo apt-get install bison gcc libc6-dev ed gawk make
    sudo apt-get install python-setuptools python-dev build-essential
    sudo easy_install mercurial

    hg clone -r release https://go.googlecode.com/hg/ $GOROOT

    cd $GOROOT/src
    ./all.bash
  • Ejemplo:

      package main
    import "fmt"

    func main() {

    for i:=1; i<=10; i++ { fmt.Printf("%d ", i) } }

5. Factor

  • Año de creación: 2003.
  • Paradigma: Orientado a pila, concatenativo (sobre todo) y funcional.
  • Descripción: Definición dinámica de los tipos de datos, manejo automático de memoria, compilador o, si se quiere, también interactivo.
  • Inspirado en: Forth, Self.
  • Instalación: En Ubuntu:

    1. Descarga
    2. Descomprime
    3. Ingresa al directorio
    4. ./factor
  • Ejemplo: (Sé que se puede hacer mejor. Ya aprenderé.)

      { 1 2 3 4 5 6 7 8 9 10} [ "" write . ]  each

Fuente | bitelia.com

Finalmente disponible la versión 2.8 de Scala.


A pesar de lo lejos que ha llegado, de ser el lenguaje más utilizado en el mercado y aún siendo GPL, Java es víctima de gran cantidad de críticas, algunas de las cuales están más enfocadas en el modo de trabajo actual que en el lenguaje en sí. Pero que tiene problemas, los tiene y no parece dar señas de avance en un mundo cada vez más competitivo. Se ha vuelto a demorar el lanzamiento de su nueva versión para inicios del próximo año y, si bien presentará algunas innovaciones ineteresantes, tampoco es revolucionario -ni muchísimo menos. Sin embargo, aún los críticos más acérrimos del lenguaje destacan la importancia de la JVM, aunque sea como “curiosidad tecnológica”. En realidad mucho más que eso, la Java Virtual Machine nos permite trabajar con enorme cantidad de lenguajes (por sí mismos o en conjunto con Java), contando con todas las ventajas que ofrece la máquina virtual.

Por ejemplo, IBM utiliza Jython (implementación de sobre la JVM) para realizar scripts sobre WebSphere. Y con el aletargamiento de Java, no sólo se están usando cada vez más otros lenguajes en conjunto con las librerías nativas, sino que se habla directamente del “nuevos Java”, es decir lenguajes que trabajan sobre la máquina virtual que terminarán por imponerse sobre el lenguaje mismo. Entre estos, son tres los más utilizados: Groovy,Clojure (interesantísimo dialecto de Lisp) y Scala. Scala es un lenguaje multiparadigma, un híbrido entre orientación a objetos y funcional que, con una sintaxis no del todo lejana a la de Java, es recomendada para los usuarios del popular lenguaje que quieran aventurarse en nuevos terrenos. Además, con un buen par de años de recorrido, es el que cuenta con mayor proyectos y comunidad, algo importante a la hora de elegir un lenguaje y tampoco está demás recordar que últimamente se está redescubriendo el valor de los lenguajes funcionales a la hora de escribir aplicaciones en las que la concurrencia tenga una importancia crítica. Después de todo, Scala es utilizado por sitios como Twitter yFoursquare.

El asunto que me hace escribir estas líneas es que finalmente, después de una espera bastante grande, acaba de ser anunciado el lanzamiento de la versión 2.8 del lenguaje. Y a pesar de lo que pueda parecer, se trata de un cambio enorme, una actualización importante como la que representó la versión 3.0 de Python. De todos modos, una importante característica de Scala, heredada de Java, es que a pesar de todos los cambios efectuados mantienen prácticamente al 100% la compatibilidad con el código fuente de versiones anteriores. Algunos de los cambios más importantes son:

  • La biblioteca de colecciones fue rediseñada por completo.
  • Se ha simplificado el manejo de arrays.
  • Argumentos nombrados y por defecto.
  • Anotaciones anidadas.
  • Se ha mejorado a los actores (para concurrencia).
  • Fueron solucionados gran cantidad de bugs.
  • Los paquetes, además de clases y objetos, ahora pueden contener métodos, campos y alias.
  • Se ha mejorado notablemente tanto el REPL como el IDE oficial de Scala para el Eclipse.


Esperado lanzamiento con cambios que, espero, cumplan todas las expectativas generadas. Y para quienes no estén familiarizados para nada con la sintaxis del lenguaje, termino la entrada con el clásico “Hola mundo” escrito en Scala:

object HolaMundo {   def main(args: Array[String]) =     
println("Hola, mundo") }
Fuente | bitelia.com