Translate

domingo, 16 de agosto de 2009

Linux como plataforma de desarrollo

Hoy en día, utilizar un sistema Linux es una posibilidad real a la hora de implementar un sistema. Dada su filosofía encontramos muchos programas cuyo código fuente podemos observar para aprender y tomar ideas. Aunque es algo más complicado en algunos casos, también es posible corregir o extender esos programas para adaptarlos a nuestra necesidades.

Linux demostró ser una plataforma seria para el desarrollo. Nos provee un sin fin de soluciones y además la capacidad de crecer continuamente por medio de su comunidad. Poder aprender y compartir conocimiento nos hace libre y Linux representa la Libertad.



Formas de distribución de aplicaciones en GNU/Linux

Cuando terminamos nuestro proyecto y deseamos realizar su distribución, debemos pensar en la forma de empaquetarlo y buscar la manera de que el usuario final pueda instalarlo sin dificultades.

GNU Autotools

El GNU build system conocido también como Autotools es un conjunto de herramientas producido por el proyecto GNU. Estas herramientas están diseñadas para ayudar a crear paquetes de código fuente portable a varios sistemas Unix. El GNU build system forma parte de GNU toolchain y se usa mucho para desarrollar software libre. Aunque las herramientas que contiene el GNU build system son GPL no existe ninguna restricción para crear software portable no libre con él.

El conjunto de herramientas GNU autotools (autoconf, automake & libtool) es el más utilizado cuando se habla de distribuir programas mediante el código fuente. Éstas nos permiten automatizar el proceso de compilación de forma tal que sea sencillo compilar nuestro programa en cualquier máquina.

Una gran cantidad de programas se distribuyen utilizando este mecanismo.

El paso clásico para instalar un programa esta ejecutar: ./configure para que revise nuestro sistema y controle que tenga todas las bibliotecas y demás necesidades especificas de la aplicación (este se crea mediante autoconf). Si todo sale bien podemos hacer:

make

make install

Donde el primer paso(make) compilara nuestra aplicación y el segundo ubicara los binarios y los archivos de datos en los directorios correspondientes.

Junto con este paquete de herramientas se suele utilizar mucho tar y gzip. La primera sirve para crear un paquete , mientras que le segundo permite comprimirlos.

De esta forma se distribuyen paquetes con extensiones .tgz o .tar.gz y generalmente cuando hablamos de distribuir programas estas extensiones indican que se esta instalando un programa desde el código fuente.

RPM

Otro método habitual de distribución de aplicaciones el el RPM un sistema adoptado por varias distribuciones.

RPM Package Manager (o RPM, originalmente llamado Red Hat Package Manager) es una herramienta de administración de paquetes pensada básicamente para Linux. RPM es el formato de paquete de partida del Linux Standard Base.

Originalmente desarrollado por Red Hat para Red Hat Linux, en la actualidad muchas distribuciones GNU/Linux lo usan, dentro de las cuales las más destacadas son Fedora Linux, MandrivaLinux, SuSE Linux y Conectiva Linux. También se ha portado a otros sistemas operativos.

Un RPM es un archivo binario que contiene todo lo que queremos distribuir (binario, código fuente, documentación, etc) pero no es un gran paquete como un tgz. En cambio, un Rpm tiene una cabezara que indica dependencias que posee dicho programa o sea los paquetes que le hacen falta para funcionar. De esta manera, se asegura que el sistema sea consistente para instalar el programa en cuestión y que funcione apropiadamente.

Nos permite no solo instalar RPMs, sino que también podemos actualizar automáticamente, como así eliminarlos.

La desventaja es que esta solución no esta presente en todas las distribuciones. Por lo cual debemos también conocer el gestor de paquetes deb.

Deb

Deb es la extensión del formato de paquetes de software de Debian (utilizado por todos sus derivados) , y el nombre más usado para dichos paquetes.

El programa predeterminado para manejar estos paquetes es dpkg, generalmente via el sistema APT. Nos permite las mismas ventajas que el sistema rpm.

Klik

Un método nuevo de distribución es klik. si bien aun no esta completamente difundido, la idea que lleva consigo es muy buena.

Klik es un proyecto en fase experimental todavía que nos permite instalar programas en nuestro GNU/Linux sin tener que preocuparnos por la administración de los paquetes de software que implica dependencias, compatibilidades de versiones y algunas otras cosas que si bien programas como Synaptic o Urpmi manejan bastante bien Klik las elimina.

Solo es necesario descargar un archivo con extensión .cmg que contiene todo lo necesario para ejecutar el programa en cuestión. Para desinstalar algún programa solo es necesario eliminar el propio archivo .cmg.

Otra característica que posee klik es que se puede ejecutar como un usuario normal, es decir que no hace falta tener la clave del administrador, como suele suceder cuando tratamos de instalar un rpm o deb. Esto es posible porque todo esta en un archivo.

Lenguajes de programación en Linux

Si por algo se ha caracterizado siempre los entornos UNIX es por su diseño orientado a la programación. Mientras otros sistemas operativos como Windows o Mac OS están orientados a la ejecución de programas, todos los sabores de UNIX permiten acceder a los compiladores, las librerías, el control de procesos con gran naturalidad.

Cuando queremos programar en Windows o Mac OS necesitamos lo que se llama un IDE (Integrated Development Environment). Son herramientas tan populares como el Microsoft Visual Studio (con soporte para la mayoría de los lenguajes de programación), los entornos de Borland, el X Code en Mac OS. Cuando nos preguntamos por los IDEs en Linux nos viene a la cabeza un gran vacío.

Los hay, sin duda. Son poco conocidos. Kdevelop, Anjuta, Eclipse. Y son poco conocidos porque un sistema operativo tipo UNIX es en sí un entorno de programación.

A continuación, describiremos los lenguajes más populares en la plataforma Linux y las herramientas disponibles para cada uno de ellos.


C / C++

¿Cuál es el lenguaje más popular en Linux? Probablemente sea C. UNIX se basa en ese lenguaje. El mismo núcleo Linux está escrito enteramente en C, así como la mayoría de las aplicaciones. También cabe destacar C++, que ha sido siempre considerado como una extensión natural de C. La mayoría de las aplicaciones modernas, se escribe en C++. Este es un lenguaje orientado a objeto y es la base de la bibliotecas gráficas estándar (QT, GTK).

Podemos decir que C++ es un lenguaje fuertemente tipado y que debe compilarse a un binario nativo, lo cual no favorece su portabilidad. Además, al quedar todo estáticamente enlazado, no nos permite hacer uso de algunas técnicas modernas como reflection.

Al tener tanto tiempo de vida, este lenguaje esta muy difundido y existen toneladas de libros, tutoriales e información en el mundo como para sentirnos satisfechos.

Algo importante para destacar es que, en cualquier distribución de Linux, siempre están disponibles el compilador C. Si por una cosa se caracteriza el sistema GNU es por estar, en la mayoría de los casos, compilado con la colección de compiladores gcc. Gcc, the GNU Compiler Collection. Como su nombre indica, gcc es la colección de compiladores libre y gratuita del sistema GNU.

Uno de los motivos por los que Linux es software libre hoy en día fue porque Linus decidió usar el compilador de C del GCC (por aquel entonces el único lenguaje soportado) para crear los ejecutables de su kernel.

Hoy en día es el compilador de referencia en cualquier sistema operativo. No es de ningún modo el mejor compilador. No es el más rápido ni el que mejor optimiza, pero te asegura una máxima portabilidad entre plataformas y sistemas operativos, algo muy importante a tener en cuenta.

Además todas las distribuciones traen herramientas básicas que nos facilitan el desarrollo (makefile, editores, etc.)

Si optamos por programar en C/C++, obtendremos otra pequeña ventaja: si consideramos que las bibliotecas más “pesadas” parten de código C/C++, no necesitamos intermediarios para usarlas, sino que se integran directamente.

Uno de los entornos más completos es Kdevelop (www.kdevelop.org). Este proyecto, que suele venir con la mayoría de las distribuciones, es un entorno que reúne todas las necesidades del desarrollador.

El Proyecto KDevelop surgió en 1998 con el fin de desarrollar un IDE (Entorno de desarrollo integrado) fácil de usar para KDE. Desde entonces, el IDE KDevelop está públicamente disponible bajo la GPL y soporta muchos lenguajes de programación.

El mismo nombre alude a su perfil: KDevelop - KDE Development Environment (Entorno de Desarrollo para KDE).

KDevelop 3.0 ha sido reconstruido completamente desde los cimientos, se dio a conocer junto con KDE 3.2 en diciembre de 2003.

A diferencia de muchas otras interfaces de desarrollo, KDevelop no cuenta con un compilador propio, por lo que depende de gcc para producir código binario.

Su última versión se encuentra actualmente bajo desarrollo y funciona con distintos lenguajes de programación como C, C++, Java, Ada, SQL, Python, Perl y Pascal, así como guiones para el intérprete de comandos Bash.

Para GNOME existe un proyecto similar, Anjuta. Anjuta (actualmente Anjuta DevStudio) es un entorno integrado de desarrollo (IDE) para programar en los lenguajes C, C++, Java y Python, en sistemas GNU/Linux. Su principal objetivo es trabajar con GTK y en el escritorio GNOME, además ofrece un gran número de características avanzadas de programación. Anjuta es software libre, liberado bajo la licencia GPL.

Incluye un administrador de proyectos, asistentes, plantillas, depurador interactivo y un poderoso editor que verifica y resalta la sintaxis escrita.

Java.

Uno de los lenguajes más populares del momento es sin duda, java. Es portable por lo que no es de sorprender que se encuentre en Linux.

Java debe su fortaleza a que es un lenguaje interpretado y compilado. Compilado por que se compila a bytecode que es solo entendible por la maquina virtual (que no es igual al binario entendido por el procesador) Luego la maquina virtual interpreta el bytecode y transforma a código entendible para la maquina. De hay que java sea multiplataforma. El bytecode necesita la maquina virtual para se ejecutado, de esta forma el bytecode es independiente del sistema operativo. La maquina virtual si es dependiente del sistema operativo pero existe al menos una para sistema operativo.

Con esta arquitectura, Java nos provee nos provee una buena solución para aplicaciones que tengan GUI y corran en cualquier sistema operativo sin modificaciones. Si bien existe framework para desarrollar estas aplicaciones es necesario conocer a fondo estas bibliotecas (swing, AWT, SWT...). Por lo tanto estas aplicaciones no son del todo simples.

Otro punto fuerte de java son las aplicaciones son las aplicaciones Web. En este caso nos plantea una vuelta distinta a todas las otras alternativas en la programación web, ya que permite nuestros objetos vivos mientras el servidos este levantando. Además cuenta con un sin fin de herramientas y frameworks (JSF, struts, wicket, tapestry, GWT, etc) que nos abstraen de los inconvenientes de dichas aplicaciones.

El lenguaje de programación java es totalmente orientado a objetos y nos fuerza a trabajar de esta forma. La cantidad de herramientas que existen para él es muy grande y variada.

Es imprescindible para trabajar en java tener fuertes conocimientos del paradigma orientado a objeto.

La IDE que cobro con más fuerza con el correr de los años es Eclipse. Eclipse es un entorno de desarrollo integrado de código abierto multiplataforma para desarrollar lo que el proyecto llama "Aplicaciones de Cliente Enriquecido", opuesto a las aplicaciones "Cliente-liviano" basadas en navegadores. Esta plataforma, típicamente ha sido usada para desarrollar entornos de desarrollo integrados (del inglés IDE), como el IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados también para desarrollar el mismo Eclipse). Sin embargo, también se puede usar para otros tipos de aplicaciones cliente, como BitTorrent Azureus.

Eclipse es también una comunidad de usuarios, extendiendo constantemente las áreas de aplicación cubiertas. Un ejemplo es el recientemente creado Eclipse Modeling Project, cubriendo casi todas las áreas de Model Driven Engineering.

Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundación Eclipse, una organización independiente sin ánimo de lucro que fomenta una comunidad de código abierto y un conjunto de productos complementarios, capacidades y servicios.

Eclipse hoy es un entorno de desarrollo multilenguje, basado en plugins, se puede desarrollar en los lenguajes más populares PHP, C/C++, Ruby, etc.

Netbeans es la IDE oficial de java, proveeida por sun, netbeans a crecido enormemente estos últimos años.

Netbeans es un proyecto de código abierto de gran éxito con una gran base de usuarios, una comunidad en constante crecimiento, y con cerca de 100 socios en todo el mundo. Sun MicroSystems fundó el proyecto de código abierto Netbeans en junio 2000 y continúa siendo el patrocinador principal de los proyectos.

Un proyecto de código abierto no es nada más ni nada menos que un proceso. Toma tiempo encontrar el equilibrio. El primer año, fue crucial como inicio. Los dos años siguientes, se orientó hacia código abierto. Como muestra de lo abierto que era, en los primeros dos años había más debate que implementación.

Con Netbeans 3.5 se mejoró enormemente en desempeño, y con la llegada de Netbeans 3.6, se reimplementó el sistema de ventanas y la hoja de propiedades, y se limpió enormemente la interfaz. Netbeans 4.0 fue un gran cambio en cuanto a la forma de funcionar del IDE, con nuevos sistemas de proyectos, con el cambio no solo de la experiencia de usuario, sino del reemplazo de muchas piezas de la infraestructura que había tenido Netbeans anteriormente. Netbeans IDE 5.0 introdujo un soporte mucho mejor para el desarrollo de nuevos módulos, el nuevo constructor intuitivo de interfaces Matisse, un nuevo y rediseñado soporte de CVS, soporte a Sun ApplicationServer 8.2, Weblogic9 y JBoss 4.

En Netbeans 6 se puede programar en C++, PHP, y Ruby. Netbeans esta en constante crecimiento.

PHP

Este lenguaje nació como una mejora para la programación web estática de hace unos años. En un principio, su idea fue meter código dentro de paginas html para hacerlas más dinámicas.

Desde entonces el lenguaje evoluciono enormemente. Hoy en día es un lenguaje muy completo que permite programar en forma estructurada o orientada a objetos.

PHP se distribuye con licencia Open Source, tuvo un espacio muy grande dentro del mundo linux. Allí es donde cobro mucha fuerza ya que se acopla muy bien con el servidor web de apache. La combinación LAMP (Linux + Apache + MySql + PHP) es un paquete comúnmente muy pedido en el mercado actual.

PHP es un lenguaje de programación interpretado, diseñado originalmente para la creación de páginas web dinámicas. Es usado principalmente en interpretación del lado del servidor (server-side scripting) pero actualmente puede ser utilizado desde una interfaz de línea de comandos o en la creación de otros tipos de programas incluyendo aplicaciones con interfaz gráfica usando las bibliotecas Qt o GTK+.

PHP es un acrónimo recursivo que significa PHP Hypertext Pre-processor (inicialmente PHP Tools, o, Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementación principal de PHP es producida ahora por The PHP Group y sirve como el estándar de facto para PHP al no haber una especificación formal. Publicado bajo la PHP License, la Free Software Foundation considera esta licencia como software libre.

PHP es un lenguaje interpretado de propósito general ampliamente usado y que está diseñado especialmente para desarrollo web y puede ser embebido dentro de código HTML. Generalmente se ejecuta en un servidor web, tomando el código en PHP como su entrada y creando páginas web como salida. Puede ser desplegado en la mayoría de los servidores web y en casi todos los sistemas operativos y plataformas sin costo alguno. PHP se encuentra instalado en más de 20 millones de sitios web y en un millón de servidores, aunque el número de sitios en PHP ha compartido algo de su preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005. Es también el módulo Apache más popular entre las computadoras que utilizan Apache como servidor web.

Son muchos los desarrolladores que trabajan con Zend Studio, es posiblemente uno de los mejores IDE del momento. Se trata de un programa de la casa Zend, uno de los mayores impulsores de PHP, orientada a desarrollar aplicaciones web, como no, en PHP. Zend Studio es un editor de texto para páginas PHP que proporciona un buen número de ayudas desde la creación y gestión de proyectos hasta la depuración del código. Uno de los puntos en contra de este entorno es el hecho de no ser libre y no poder contar con el código fuente.

Open Komodo Project:Es un proyecto bastante singular porque se basa en la creación de aplicaciones Web que corran bajo Firefox, además de estar construidas con el Komodo IDE.

Así, la compañía creadora del proyecto se asegura estar presente en la lucha contra la Web cerrada, al igual que otros, como es el caso del conocido Mozilla.

El Open Komodo Project responde a las exigencias de las herramientas para el desarrollo de la tecnología de web libre, promoviendo la innovación en web y la libertad de elección para los desarrolladores y usuarios finales.

Con la creación del Open Komodo Project, ActiveState se une a otros defensores como Mozilla en la promoción de la web abierta. La filosofía de web abierta pretende mantener la integridad de la web como un espacio público neutral en cuanto a plataforma, idioma y navegador.

Quanta Plus (Quanta+) es una herramienta libre de desarrollo de páginas web diseñado para el proyecto KDE. Su versión actual es la 3.5. Forma parte del paquete kdewebdev.

PEAR, el repositorio oficial de PHP. aquí hay muchos add-ons para PHP que pueden ser instalados convenientemente desde la utilidad que viene junto con el paquete de PHP. Esta utilidad es de lines de comandos, muy similar a apt-get para instalar paquetes en debian. Por lo tanto, PEAR tiene gran ventaja de que instalar paquetes extras en una tarea muy simple y no propensa a errores.

Mono

Mono es la respuesta del mundo Open Source a la plataforma .Net de Microsoft. La documentación del proyecto mono está empezando a aparecer en muchas partes de la web. Mono permite desarrollar en el lenguaje C# para la plataforma Windows y Linux, con un valor agregado; es Libre.

Mono es el nombre de un proyecto de código abierto iniciado por Ximian y actualmente impulsado por Novell (tras la adquisición de Ximian) para crear un grupo de herramientas libres, basadas en GNU/Linux y compatibles con .NET según lo especificado por el ECMA.

Mono posee importantes componentes útiles para desarrollar software:

  • Una máquina virtual de lenguaje común de infraestructura (CLI) que contiene un cargador de clases, un compilador en tiempo de ejecución (JIT), y unas rutinas de recolección de memoria.

  • Una biblioteca de clases que puede funcionar en cualquier lenguaje que funcione en el CLR (Common Language Runtime).

  • Un compilador para el lenguaje C#, MonoBasic (la versión para mono de Visual Basic), Java y Python.

  • El CLR y el Sistema de tipos común (CTS) permite que la aplicación y las bibliotecas sean escritas en una amplia variedad de lenguajes diferentes que compilen para byte code

  • Esto significa que si, por ejemplo, se define una clase que realice una manipulación algebraica en C#, ésta pueda ser reutilizada en cualquier lenguaje compatible con CLI. Puede crear una clase en C#, una subclase en C++ e instanciar esa clase en un programa en Eiffel.

  • Un sistema de objetos único, sistema de hilos, bibliotecas de clases y sistema recolector de memoria pueden ser compartidos por todos estos lenguajes.

  • Es un proyecto independiente de la plataforma. Actualmente Mono funciona en GNU/Linux, FreeBSD, UNIX, Mac OS X, Solaris y plataformas Windows.

MonoDevelop es un entorno de desarrollo integrado libre y gratuito, diseñado primordialmente para C# y otros lenguajes .NET como Nemerle, Boo, y Java (via IKVM.NET). MonoDevelop originalmente fue una adaptación de SharpDevelop para Gtk#, pero desde entonces se ha desarrollado para las necesidades de los desarrolladores de Mono. El IDE incluye manejo de clases, ayuda incorporada, completación de código, Stetic (diseñador de GUI), soporte para proyectos, y un depurador integrado.

Aunque MonoDevelop solo puede ejecutarse en Mac y distintas distribuciones de Linux.

Perl

Este lenguaje es el bueno, el feo y el malo, todo a la vez. Digamos que Perl nos permite hacer muchas cosas de muchas formas distintas, por lo que se gana todos los títulos.

Surgió como una herramienta para procesar texto y generar reportes, pero esto fue hace demasiado tiempo. Hoy en día, es un completo lenguaje de programación, que soporta características de un lenguaje estructurado, orientado objeto y algunas características de la programación funcional.

Perl se utiliza mucho crear scripts administrativos de servidor. Dado que posee muchas facilidades pare procesar texto (las expresiones regulares están completamente integradas dentro del mismo lenguaje) es muy apto para manejar configuraciones dentro del servidor. Además se integra muy bien con los comandos, de modo que es posible combinarlo con aplicaciones externas de forma muy simple.

En cuanto a los entornos para programar, no existe alguno en particular que se destaque, dado que, en general, se utiliza dentro de un servidor. La mayoría de las personas termina utilizando Emacs o vi, que son entornos muy completos y potentes, aunque poco visuales e intuitivos. Ambos, si bien son muy diferentes, resultan muy prácticos una vez que se han aprendido a dominarlos pero la curva de aprendizaje es grande al principio).

Ruby

Un lenguaje de programación dinámico y de código abierto enfocado en la simplicidad y productividad. Su elegante sintaxis se siente natural al leerla y fácil al escribirla.

Ruby es un lenguaje de programación interpretado, reflexivo y orientado a objetos, creado por el programador japonés Yukihiro "Matz" Matsumoto, quien comenzó a trabajar en Ruby en 1993, y lo presentó públicamente en 1995. Combina una sintaxis inspirada en Python, Perl con características de programación orientada a objetos similares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. Ruby es un lenguaje de programación interpretado en una sola pasada y su implementación oficial es distribuida bajo una licencia de software libre.

Rails es un framework hecho en ruby que ha cambiado la forma de hacer webs dinámicas. Este framework impulso a ruby y expendio su uso, nos permite hacer web dinámicas rápidamente basado en conceptos como andamiaje, convención antes que configuración, etc.

RadRails es un editor basado en eclipse muy completo que soporta muchas tareas de Ruby on Rails que normalmente se las haría por consola.

Vim+Cream es la conminación del editor Vim con la interfase gráfica provista por Cream. Esta conminación sumada con algunos plugins para el Vim con soporte para Ruby on Rails, dan como resultado un potente editor para RoR.

Jedit es un editor hecho en Java que con algunos plugins con soporte para Ruby lo hacen un editor bien práctico para programar en RoR.

Python

Python es apto para cualquier programa de propósito general, desde una aplicación web, hasta programas gráficos nativos, scriping o desarrollo de juegos.

Python es considerado como la "oposición leal" a Perl, lenguaje con el cual mantiene una rivalidad amistosa. Los usuarios de Python consideran a éste mucho más limpio y elegante para programar.

Python permite dividir el programa en módulos reutilizables desde otros programas Python. Viene con una gran colección de módulos estándar que se pueden utilizar como base de los programas (o como ejemplos para empezar a aprender Python). También hay módulos incluidos que proporcionan E/S de ficheros, llamadas al sistema, sockets y hasta interfaces a GUI (interfaz gráfica con el usuario) como Tk, GTK, Qt entre otros...

Python es un lenguaje de programación interpretado, lo que ahorra un tiempo considerable en el desarrollo del programa, pues no es necesario compilar ni enlazar. El intérprete se puede utilizar de modo interactivo, lo que facilita experimentar con características del lenguaje, escribir programas desechables o probar funciones durante el desarrollo del programa. También es una calculadora muy útil.

El principal objetivo que persigue este lenguaje es la facilidad, tanto de lectura, como de diseño.

En cuanto a Ides no hay ninguna que se destaque, muchos optan por usar Emacs o vi por los mismos motivos descriptos en Perl. Se puede utilizar eclipse con un plugin llamado PyDev que provee debugger, refactoring, análisis de sintaxis.

Eric podría ser otra solución, es una ide con interfaz sobre cargada, que nos brinda todas las ventajas de una ide moderna.

Linux y Windows

Cuando se decide desarrollar por costumbre, por inercia, o por creer que la mayoría de los clientes va a usar windows se utiliza este sistema. En la actualidad, no hay tanta diferencia entre las prestaciones que puede dar un sistema operativo u otro. Tanto Linux como Windows implementan los lenguajes más populares y poseen herramientas completas.
Lo que suele tener Linux son muchas alternativas para cada solución, por lo que siempre encontraremos una que se adecúe más a nuestro problema especifico o podremos adaptar una existente, por que los códigos fuente en general están disponibles (siempre si usamos soluciones GPL)
Por el otro lado, Windows, suele ser más uniforme. Los sistemas de instalación son similares, y la mayoría de los Windows son iguales. En Linux, cada distribución se organiza de manera diferente y no todo es tan portable entre diferentes distribuciones. Entonces, compilar un programa en diferentes distribuciones puede llegar a ser algo no tan trivial.
Si bien existen, y han existido, varios intentos por crear un estándar entre las diversas distribuciones para que todo esta no ocurra, aun se esta lejos de lograrlo.
Otra ventaja es el costo que se debe pagar por licencias. La mayoría de las distribuciones de Linux, las herramientas que utilizamos para el desarrollo y los entornos que se usan luego para correr la aplicación se distribuyen, normalmente, bajo alguna licencia abierta. Esto implica no solo que el costo será cero (o muy bajo) sino que también obtendremos el código fuente, que podremos adaptar a nuestra necesidades. El costo nulo o muy bajo de una licencia ayudará a disminuir el costo total del proyecto.
En algunos casos, ambos sistemas pueden convivir felizmente dentro de una organización. Un ejemplo común son las aplicaciones web desarrolladas en PHP, Pyton, Perl, Ruby, Java, etc. que corren en un servidor Linux pero los clientes utilizan Windows y acceden a la aplicación por un navegador web.

Bibliotecas en lenguajes de scripting

Cuando estamos programando en un lenguaje de script, la visión cambia completamente. En principio nuestro programa no es binario , sino solo texto. El único binario que interviene es el del interprete.

Por lo tanto, la forma de utilizar una biblioteca en un lenguaje de script depende, exclusivamente, de la forma en que este preparado dicho lenguaje. De todos modos, todos poseen lógica similares. La idea de usar una biblioteca aquí es la de poseer su código y de alguna forma poder utilizarla como un modulo dentro de nuestro programa.

Por lo general, las bibliotecas o módulos aquí son, simplemente, similares a lo que escribimos nosotros en una aplicación. Lo que haremos desde nuestro programa será incluir, según especifique el lenguaje, el modulo que queremos usar.

De todas formas, aquí suele ser más sencillo utilizar un modulo, que las bibliotecas para crear binarios. Como extra, podemos decir que esto es más portable porque, al ser un archivo de texto, funciona en cualquier maquina y solo hay que ponerlo en el directorio correcto. Luego, es más fácil de administrar ya que no suele haber dependencias entre distintas bibliotecas.

En algunos lenguajes, hasta existen herramientas que permiten bajar e instalar automáticamente los módulos necesarios (el CPAN en Perl, Pear para PHP).

Bibliotecas en programas compilados en Linux


Cuando estamos programando bajo Linux y deseamos crear un programa ejecutable binario nativo (lo más probable en C o C++) necesitaremos usar algunas bibliotecas, por dos motivos. Algunas cosas son obligatorias y necesitan bibliotecas (para programar en C/C++ usamos siempre las libc, que son la implementación del estándar de C). Las bibliotecas son, en definitiva, otro pedazo de código binario que escribió una persona. La ventaja de usarlas es que no tenemos que escribir lo que ya esta escrito por nosotros mismos o otra persona.
Para compartir código binario (o sea, usarlo en otro programa) tenemos de dos posibilidades: hacer de él una biblioteca estática o una dinámica.
Cuando una biblioteca es estática, significa que , al vincular nuestros archivos objeto a ella, obtendremos un único binario, que contiene tanto el código de la aplicación como el de la biblioteca. Entonces, el compilador enlazará las llamadas a la biblioteca en llamadas dentro del mismo archivo, que será levantado como una pagina más del proceso que ejecute el programa. Además obtendremos un binario que puede ejecutarse en forma autónoma, con el costo de que sera mucho más grande.
Si utilizamos una biblioteca dinámica esto cambia drásticamente. La idea de usar una biblioteca compartida es, en principio, no tener su código dentro de nuestro binario. Por lo tanto, el compilador marcara en el que biblioteca necesita (con su versión) y donde se haga una referencia dentro de nuestro código, la dejara sin resolver. Esto es un enlace dinámico . Cuando el programa este en ejecución, el kernel se encargara de enlazar dinámicamente la llamada a la biblioteca con el código correspondiente.
Esto trae aparejada otra ventaja. Ya que la biblioteca no esta dentro del binario, sino aparte, puede ser utilizadas por dos programas en ejecución. Es decir, la biblioteca es también compartida, dado que dos aplicaciones pueden usar el mismo código y por ende, el sistema operativo solo debe cargarla y mantenerla en memoria una vez.
Una característica que nos ofrece el kernel es que nos permite cargar código en runtime. O sea, nos permite cargar código binario sin que sea enlazado dinámicamente, de esta manera, podemos realizar un programa con un plugins escrito en un lenguaje que se compile.

Archivos Ejecutables en Linux

Linux utiliza como archivos ejecutables , los ELF (Executable and Linkable Format) Este formato nos permite tener archivo binario separado en segmentos de datos y e encabezado ELF, que describe como es el archivo binario propiamente dicho. Cuando se ejecuta el programa, se ira cargando una cantidad determinada de segmentos (no necesariamente todo el ejecutable) que ira variando dependiendo de su ejecución. Así, no hace falta que todo el binario esté cargado en memoria al mismo tiempo.

De esta manera, la unidad de ejecución en Linux son los procesos. Cuando se ejecuta un programa, se crea un proceso nuevo en el que se ejecutara y que sera identificado por su PID (Process ID). El kernel permite, luego que un programa tenga varios procesos o varios threads. Además, soporta distintos mecanismos de comunicación y sincronización, entre los que podemos encontrar sockets, semáforos, memoria compartida y tuberías.

El formato ELF (Executable and Linkable Format) es un formato de archivo para ejecutables, código objeto, librerías compartidas y volcados de memoria. Fue desarrollado por el UNIX System Laboratory (USL) como parte de la ABI. En principio fue desarrollado para plataformas de 32 bits, a pesar de que hoy en día se usa en gran variedad de sistemas.
Es el formato ejecutable usado mayoritariamente en los sistemas tipo UNIX como GNU/Linux, BSD, Solaris, Irix. Existen otros formatos soportados en algunos de estos sistemas pero ELF es sin duda el más usado.
Dentro del formato ELF podemos distinguir varias partes.
En primer lugar la cabecera ELF, que contiene información general sobre el ejecutable. En él se indican las posiciones de las tablas de cabeceras de sección y cabeceras de programa.
Cada una de estas cabeceras indican dónde se encuentran los datos de cada una de las secciones. Las cabeceras de programa definen las regiones del ejecutable o librería que es necesario cargar para crear la imagen del proceso e iniciar su ejecución. Las cabeceras de sección contienen información importante para el enlazado y la relocalización.
Las secciones tienen nombres que suelen coincidir en todos los sistemas. Por ejemplo:
.data Contiene datos inicializados del programa.
.debug Contiene información para ayudar a la depuración.
.ctors Contiene punteros a constructores de C++.
.dtors Contiene punteros a destructores de C++.
.dynamic Contiene información relevante para el enlazado dinámico.
.dynsym Contiene la tabla de símbolos para el enlazado dinámico.
.fini Contiene código de finalización del programa.
.init Contiene código de inicialización del programa.
.shstrtab Contiene una tabla de strings con los nombres de las secciones.
.strtab Contiene una tabla de strings normalmente usada para nombrar los elementos de la tabla de símbolos.
.symtab Contiene una tabla de símbolos.
.text Contiene la parte ejecutable de un programa.
Readelf es un programa UNIX que muestra la información sobre un archivo ELF.
Está implementado bajo licencia GPL en las GNU Binary Utilities.

Desarrollo en GNU/Linux

Gente linda voy a aprovechar a publicar el trabajo práctico que hice para el aprobar el curso de linux: http://cursos.gugler.com.ar/ que se dicta en oro verde.

Hay va:

El secreto del éxito de cualquier sistema operativo es que existan buenas herramientas de desarrollo de aplicaciones para él. Y cuando decimos buenas nos referimos a que los desarrolladores puedan trabajar con libertad, expresarse creativamente y cooperar en el desarrollo, sin pensar en los problemas que pueda llegar a tener su plataforma de programación o el sistema operativo. Las aplicaciones “son mejores” cuando el programador se concentra en crear, en vez de suplir las falencias (técnicas, visuales, funcionales, etc.) del sistema operativo o de la plataforma de desarrollo que esta utilizando.

Los desarrolladores de Linux gozan de dos tranquilidades. La primera es saber que están trabajando sobre una de las plataformas más estables del mundo (UNIX), en la que no existen virus, puertas traseras, “el registro” y las caóticas dll's. La segunda es que disponen de todo un abanico de excelentes herramientas de desarrollo soportadas por enormes comunidades de usuarios y corporaciones, como por ejemplo: Mono, Eclipse, Python, Ruby on Rails, y la lista seria interminable. Todas son de altísima calidad profesional y constantemente se están desarrollando excelente aplicaciones, lo que asegura un prospero futuro para la plataforma. Y los usuarios, agradecidos, por que esta variedad de plataformas de desarrollo, en general, es causa de una “variedad de soluciones” para un mismo problema, por lo cual siempre tenemos múltiples opciones a la hora de elegir una aplicación. Claramente, el desarrollo bajo plataforma GNU/Linux esta de moda, no solo por programadores independientes, sino también en el ámbito corporativo. Y esto es solo el comienzo, porque estamos en una etapa de pleno crecimiento en la adopción de Linux. El futuro es realmente prometedor.

Linux es un SO que está viviendo sus mejores momentos desde que fuera creado en 1991. El que este sistema operativo venga preinstalado en computadoras de DELL y Lenovo (Asia) está ayudando muy positivamente a que se consolide como un gran competidor a Windows. Además, es muy estable, gratuito (si no se compra versiones de pago) y libre. Linux se está convirtiendo en una perfecta plataforma para programar, véase .NET (gracias a Mono) , Java y Gtk/Gtk+ o Qt. Qt4 es una plataforma ideal, no solo por la eficiencia sino por el soporte de bindings para Java y C#. Además, esta última revisión ha mejorado de forma muy notable la potencia en gráficos (además de estar muy bien documentada).

Java sigue siendo el líder de los lenguajes al ser el más usado. Y en Linux no iba a ser menos. Java por supuesto que también es una muy buena alternativa multiplataforma, ya no solo por estar muy instaurado sino porque la documentación es buena y sus bibliotecas muy completas. Eso sí, el inconveniente que plantea es la eficiencia, que en Linux no es un problema ya que la maquina virtual java corre muy bien en este sistema operativo.

Las herramientas de desarrollo en Linux son de código abierto. Son proyectos “inmortales”, mantenidos por grupos de usuarios que día a día trabajan para mejorar cada uno de sus aspectos. Y así se convierten en plataformas dinámicas, cada día más capaces, cada día más útiles, cada día más estables. Esto es bueno, porque, al igual que en el desarrollo del sistema operativo Linux, aquí también se mantiene la esencia de “crear”, “compartir” y “disfrutar”: una formula que es, cada vez, más exitosa.

sábado, 15 de agosto de 2009

Rest con Restlet

Restlet es un framework que lleva el concepto de los servlet para generar servicios web. Si vamos a una definición de Rest (http://diegograf.blogspot.com/2009/08/una-alternativa-mas-simple-soap-en-lo.html) veremos que la idea principal es hacer servicios web simples.

La simpleza puede verse de quien consume el servicio web. Restlet hace simple el desarrollo de web services. Veamos un “hola Mundo” usando Restlet 2.0

1. package firstSteps;

2.

3. import org.restlet.resource.Get;

4. import org.restlet.resource.ServerResource;

5.

6. /**

7. * Resource which has only one representation.

8. *

9. */

10. public class HelloWorldResource extends ServerResource {

11.

12. @Get

13. public String represent() {

14. return "hello, world";

15. }

16.

17. }

Vemos que hemos creado un recurso el cual se va a publicar por medio del método GET. Ahora hagamos una aplicación:

1. package firstSteps;

2.

3. import org.restlet.Application;

4. import org.restlet.Restlet;

5. import org.restlet.routing.Router;

6.

7. public class FirstStepsApplication extends Application {

8.

9. /**

10. * Creates a root Restlet that will receive all incoming calls.

11. */

12. @Override

13. public Restlet createRoot() {

14. // Create a router Restlet that routes each call to a

15. // new instance of HelloWorldResource.

16. Router router = new Router(getContext());

17.

18. // Defines only one route

19. router.attach("/hello", HelloWorldResource.class);

20.

21. return router;

22. }

23. }

Como vemos creamos un router el cual es el encargado de publicar nuestro servicio web. Ahora configuramos el contexto para que cuando le enviemos un pedido a una URL, nuestro servidor lo delegue al servlet de rest.

1. <?xml version="1.0" encoding="UTF-8"?>

2. <web-app id="WebApp_ID" version="2.4"

3. xmlns="http://java.sun.com/xml/ns/j2ee"

4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

5. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

6. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

7. <display-name>first steps servlet</display-name>

8.

9. <context-param>

10. <param-name>org.restlet.application</param-name>

11. <param-value>

12. firstSteps.FirstStepsApplication

13. </param-value>

14. </context-param>

15.

16.

17. <servlet>

18. <servlet-name>RestletServlet

19. <servlet-class>

20. org.restlet.ext.servlet.ServerServlet

21. </servlet-class>

22. </servlet>

23.

24. <!-- Catch all requests -->

25. <servlet-mapping>

26. <servlet-name>RestletServlet</servlet-name>

27. <url-pattern>/*</url-pattern>

28. </servlet-mapping>

29. </web-app>

Bueno con eso estamos, mmm…

Todavía nos faltan los jars por suerte se pueden importar con maven. Dejo el link para configurar el repositorio de restlet http://www.restlet.org/downloads/maven

Si no podemos instalar los jars necesitamos 2 :

org.restlet.jar

org.restlet.ext.servlet_2.5.jar

Lo pueden bajar de http://www.restlet.org/downloads/2.0/restlet-jse-2.0m4.zip e instalar de esta forma :

mvn install:install-file -DgroupId=org.restlet -DartifactId= org.restlet -Dversion=2.0.0 -Dpackaging=jar -Dfile=dondeDejasteElJar/elJar.jar

mvn install:install-file -DgroupId=org.restlet -DartifactId= org.restlet.ext -Dversion=2.0.0 -Dpackaging=jar -Dfile=dondeDejasteElJar/elJar.jar

1. <dependency>

2. <groupId>org.restlet</groupId>

3. <artifactId>org.restlet</artifactId>

4. <version>2.0.0</version>

5. </dependency>

6. <dependency>

7. <groupId>org.restlet</groupId>

8. <artifactId>org.restlet.ext</artifactId>

9. <version>2.0.0</version>

10. </dependency>

Levanten el jetty o tomcat y luego http://127.0.0.1/contexto/ hello y hay esta nuestro servicio!!