Amaury J. Rodríguez Pérez / amaury08015@vcl.jovenclub.cu

Por años, la visión de lo que el desarrollo de software pudiera ser ha estado tentando a muchos. Los desarrolladores han esperado las ansiadas rápidas técnicas de desarrollo de aplicaciones que prometen los prototipos, unidos al vertiginoso desarrollo por medio de interfaces visuales; la programación modular y reutilización de código; unido al nacimiento de frameworks para construir aplicaciones para el escritorio bajo el concepto de rich-client, todo ello resultando en un ecosistema acelerador en la velocidad de soluciones modernas para el software contemporáneo.

Durante los últimos años, las llamadas Rich Client Platform (RCP) han acrecentado gradualmente su popularidad. Al frente de esta tendencia han estado hasta la actualidad NetBeans Platform y Eclipse RCP, las cuales han posibilitado la creación de aplicaciones de escritorio genéricas adecuadas para cualquier propósito.

Nativas vs. Web

“El mayor error que cometimos como empresa fue apostar demasiado en HTML5″…»Nosotros quemamos dos años». Así, se expresaba Mark Zuckerberg el líder y genio creador de Facebook, en una presentación para Disrupt SF 2012, en el mes de septiembre en la propia ciudad de San Francisco, California. Zuckerberg dejó estupefacto a no pocos de los tantos que han creído que apostar por la Web lo es todo. Sus palabras sacudieron y angustiaron a muchos, porque si bien para Facebook, la creación de aplicaciones nativas era básicamente tan sólo un envoltorio para experimentar rápidamente con el estándar Web para móviles, resultó que tal capa de envoltorio provocara que las aplicaciones se ejecutasen demasiado lentas. Por si fuera poco, la interpretación de muchos de los analistas de la industria respecto a lo que el genio de Facebook en realidad quiso decir fue básicamente lo siguiente: “El mayor error que cometimos como empresa fue no invertir lo suficiente en lo nativo”.

Esto valida la tesis para muchos de que la Web es algo grande, con navegadores para móviles y frameworks bastante avanzados, además de que algunas funciones están muy bien establecidas para aplicaciones Web, y la efectiva e indiscutible ubiquidad de los navegadores, también existen disímiles preocupaciones, entre las que asoman lo relativo a la seguridad de las páginas Web; las cuales son generalmente interfaces para aplicaciones manipuladas a través de servidores; son a menudo insuficientes para las necesidades de los usuarios finales, al mismo tiempo de que no todas las aplicaciones necesitan de una conexión a Internet constante y algunas necesitan funcionar offline.

Todo lo anterior, llega a confabularse con aquellos que afirman que el software de escritorio no se convertirá en algo obsoleto o pasado de moda por el momento, y que las aplicaciones nativas son el camino de hoy.

Sobrados ejemplos podríamos mencionar para ilustrar la aceptación del software de escritorio en nuestros días, comenzando con un admirable y funcional software que encierra substanciales prestaciones como es el iTunes de Apple, hasta llegar a las llamadas apps que viven en el interior de Smartphones, Tablets y cuanto nuevo dispositivo móvil podríamos utilizar a diario. A pesar de ello, algunos aseveran que la explicación a todo este fenómeno gira alrededor de la simbiosis negocio-mercado.

Sin embargo, existe una substancial razón tecnológica que no debemos obviar, porque el elemento trascendental que permitirá a desarrolladores construir grandes o pequeñas aplicaciones de tipo rich-client son las conocidas RCP. Estas son el trayecto para obtener y reutilizar disímiles facilidades, unida a la resultante flexibilidad durante todo el proceso de desarrollo hasta llegar a conseguir un software de escritorio con un elevado nivel profesional.

Otra faceta que ha influido en el avance, progresión y uso del software rich-client, ha estado siempre ligado a las mejoras y avances de los trascendentes Ambiente o Entorno de Desarrollo Integrado (IDE-Integrated Development Enviroment), a partir de los cuales germinaron las RCP aportando herramientas en lo alto de su infraestructura. Mientras Eclipse RCP basa sus jergas y conceptos convenientemente a través de SWT y JFace, por otra parte NetBeans Platform descansa íntegramente sobre la API estándar de Java, a través de AWT y Swing, siendo esto importante debido a la perfecta integración en los conceptos de JSE (Java Standard Edition).

En cualquier caso, muchas de las características de infraestructura, ventajas de simplificación para el desarrollo de aplicaciones rich-client; a través de un número de técnicas, patrones y un completo juego de componentes Swing en NetBeans Platform, atraen a una buena parte de la comunidad de desarrolladores considerándola una atractiva e importante elección.

Enfocarnos en ofrecer aquellos elementos que son relevantes en el contexto de la arquitectura de NetBeans Platform que facilitan la creación de aplicaciones rich-client, es nuestro objetivo para este artículo, siguiendo las principales y más notables características conceptuales de su arquitectura que posibilitan el desarrollo de las más genéricas aplicaciones para el escritorio moderno.

RCP: El punto de entrada a las aplicaciones rich-client

Los usuarios del mundo hoy continúan haciendo uso de un prototipo de software de habitual interés, habitual denominado software rich-client, este ha traspasado desde la Web hasta el escritorio. En la actualidad, los dominios y escenarios son mucho más complejos como consecuencia del incremento exponencial del volumen de datos a mostrar, manipular y visualizar, además de la persistente necesidad de integración con otros sistemas y plataformas.

La potencialidad del software rich-client va mucho más allá del deseo de una interfaz enriquecida y agradable a los ojos de los usuarios, los que reclaman estar móviles, trabajar por momentos offline, integrar sus contenidos y flujos de trabajo, colaborar, y tomar las ventajas que les ofrece el hardware local.

El software rich-client ofrece al usuario final, una experiencia de muy alta calidad para cada dominio en particular, entregando no solamente una riqueza de interfaz gráfica, sino la combinación de procesamiento local de alta velocidad, soporte de metáforas nativas de escritorio (tales como arrastrar-y-soltar), portapapel del sistema (clipboard), navegación y personalización.

Las RCP y sus herramientas, han permitido a los desarrolladores desafiar la complejidad ante tales aplicaciones, reutilizando “bloques de construcción” y reduciendo los tiempos en el proceso de desarrollo. Este tipo de enfoque de ensamblaje, es una muy bien orquestada combinación de plataforma incorporada a un considerable juego de código reutilizable que ha madurado con el transcurso de los años, y que su uso posibilita concentrarse en la lógica real de aplicación mientras se reutiliza infraestructura, frameworks y bibliotecas, siempre escritas y facilitadas por otros.

Si miramos parte de este escenario desde la perspectiva de la complejidad del software, es conocido que el desarrollo de software es un cúmulo de problemas, y si a partir de nuestras necesidades al crear software empleamos dicho enfoque y filosofía de ensamblaje, entonces este será bienvenido e inteligente, porque nunca más escribiremos software en su totalidad en casa. Además, hay ciertos aspectos en la construcción de software moderno que pueden ser mejor hechos por otros que por nosotros mismos, y si los tenemos a mano, por cuanto no debemos dudar en utilizarlos. Ya no existe la necesidad de gastar tiempo creando y escribiendo infraestructura; en su lugar reutilizaremos frameworks y ventajosas bibliotecas producidas por otros, un fruto de la inteligencia colectiva.

La esencia para aplicar este nuevo modelo está fundada en el uso de esos grandes bloques de construcción recopilados a partir de proyectos globales de software que nos permiten reutilizarlos tanto como sea posible. La génesis de este modelo está plenamente compuesto de un conjunto de ofertas open-source que históricamente se iniciaron con kernels como el de Unix, las bibliotecas C básicas, diversas utilidades de línea de comandos; que con el pasar de los años, continuaron con servidores y navegadores Web, utilidades para Java como Ant, Tomcat, JUnit, JavaCC hasta finalmente llegar a las NetBeans Platform y Eclipse RCP.

Una Plataforma en el núcleo de un IDE

Comprender los orígenes de la plataforma NetBeans nos revelará como esta ha alcanzado su estado actual, y como ha estado evolucionando para soportar más adecuadamente el desarrollo de aplicaciones rich-client.

Lo que hoy es NetBeans, comenzó en la Republica Checa en 1996 como un proyecto estudiantil universitario para construir un IDE para Java muy similar a Borland Delphi, pero totalmente escrito en Java. El proyecto cautivó tanto el interés, que aquel grupo de estudiantes se dieron a la tarea de crear una pequeña compañía en torno a dicho proyecto después de haber dejado la universidad.

El plan de negocios original era desarrollar componentes JavaBeans para redes, los cuales la compañía nombró NetBeans. Un tiempo después, cuando emerge  la especificación Enterprise Java Beans, el grupo decidió que tendría más sentido trabajar con el estándar de dicha especificación en lugar de competir con esta, sin embargo, ellos mantuvieron el nombre de NetBeans. Para finales de 1999, Sun Microsystems (finalmente adquirida por Oracle) adquirió la compañía y planeó hacer NetBeans su “buque insignia” para su juego de herramientas Java.

Cuentan los “dioses” que crearon NetBeans, que las personas comenzaron construyendo aplicaciones usando el núcleo de tiempo de ejecución de NetBeans y los propios plugins de aplicaciones que no eran en ese momento del todo herramientas para el desarrollo. De hecho, esto se convirtió rápidamente en un mercado. En entre el 2000 y 2001, un gran volumen de trabajo estuvo dedicado a excluir piezas que supuestamente llevaban a la conclusión que una aplicación construida sobre NetBeans fuera un IDE, por lo que la plataforma debería ser una adecuada aplicación de escritorio genérica para cualquier propósito. Este trabajo resultó también ser saludable para el código base del IDE, fomentando un limpio diseño de la API y por consiguiente derivando en una ausencia de preocupaciones. Otro importante acontecimiento fue la idea de hacer NetBeans open-source, lo cual fue discutido en varias oportunidades en la mesa de los ejecutivos de Sun Microsystems, hasta que en Junio de 2000 era lanzada la naciente NetBeans.org.

El equipo de NetBeans introdujo APIs para hacer su IDE modularizado y así facilitar hacer su desarrollo más flexible y extensible. Para ello, en el núcleo del IDE incluyeron NetBeans Platform, un framework de aplicación extensible y modular, haciendo el IDE es una combinación muy bien orquestada de Plataforma unida a un colosal arreglo de módulos.

Como podemos observar en la Figura 1, NetBeans Platform es la base que sustenta propiamente al IDE, permitiendo a los desarrolladores construir aplicaciones de todos los tamaños y complejidades. Como tal, la Plataforma NetBeans es una base muy robusta, estable y poderosa que los programadores usarán para sus propias aplicaciones y el IDE por sí mismo es un ejemplo de una atractiva aplicación rich-client.

Figura 1. Arquitectura conceptual del IDE NetBeans.

La modularidad de NetBeans Platform ha sido muy atractiva para los desarrolladores de software a nivel mundial, quienes continúan creando un gran número de diferentes aplicaciones sobre esta. El IDE NetBeans es el mejor conocido de los dos, pero NetBeans Platform está siendo usada como la base para el desarrollo de aplicaciones en considerables y diversos dominios tales como Defensa, Aeroespacial, Transporte y Logística, Servicios de Petróleo y Gas, Geospacial y Agricultura, Biología y Quimioinformática, Modelación Científica, Monitoreo y Análisis, Salud, Finanzas, Gestión de Redes y Sistemas de Comunicaciones, Diseño Gráfico y Manipulación de Imágenes, Música, Juegos y Entretenimientos llegando hasta Aplicaciones y Proyectos estudiantiles, entre los que es interesante destacar a Maltego (http://www.paterva.com/web6/products/maltego.php), una aplicación forense e inteligente de código abierto, la cual ofrece minería de datos y características de recolección de información, así como la representación de dicha información en un formato de agradable comprensión. Otro fenomenal ejemplo es Pyrus (http://netbeans.dzone.com/nb-petroleum-engineering), una aplicación del dominio de la ingeniería del petróleo, su misión es brindar una interfaz de usuario para mostrar y representar los resultados de algoritmos sísmicos. En ambas aplicaciones, se combinan la madurez y sus ventajas lo que demuestra la masiva audiencia potencial que posee Netbeans Platform.

El Software Rich-Client y Plataforma

El término rich-client fue acuñado a principio de 1990 con la prisa para construir aplicaciones usando los gustos de Visual Basic y Delphi. El dramático aumento en el número y popularidad de estas aplicaciones cliente fue en parte debido al deseo una rica experiencia del usuario.

Es el momento para entrar en los elementos conceptuales que comprenden el término rich-client. En una arquitectura cliente servidor el término rich-client es usado para clientes donde el procesamiento ocurre principalmente sobre el lado del cliente, a esto le podemos adicionar que el cliente también se encargará de brindar la interfaz gráfica de usuario. A menudo, los rich-client son aplicaciones que son extensibles a través de los llamados plugins y módulos. De este modo, los rich-clients son capaces de solucionar más de un problema.

Típicamente, el software rich-client es desarrollado sobre un framework, el cual permite el punto de partida básico a partir del cual el usuario puede ensamblar aquellas partes relacionadas lógicamente para la aplicación que intenta construir, dichas partes son conocidas con el nombre de módulos.

Por encima de todo lo anterior, el software rich-client goza de la ventaja de ser fácilmente distribuido y actualizado, a través de vías como una función  que posibilitará una actualización en línea automática, o a través de un mecanismo que permita al mismo iniciarse sobre internet, un ejemplo de ello es el uso de Java Web Start.

Entre las tantas características que lo hace una bien establecida opción para el proceso de desarrollo de aplicaciones contemporáneas, podemos señalar su arquitectura de aplicación flexible y modular, independencia de plataforma, adaptabilidad hacia el usuario final, habilidad para trabajar tanto online como offline, distribución simplificada hacia el usuario final y actualización simplificada del cliente.

En la otra cara de la moneda, aparece NetBeans Platform, la cual desde el punto de vista conceptual es sencillamente un ambiente para el ciclo de vida de una aplicación, es la base para aplicaciones de escritorio, ya que la mayoría poseen similares características, tales como, menús, barras de herramientas, barras de estado, visualizaciones de progresos, visualización de datos, configuraciones de personalización, almacenamiento y carga de datos específicos al usuario, pantallas de inicio, cajas Acerca de…, internacionalización, sistemas de ayuda, entre otras muchas más. De modo que, si miramos nuestras necesidades a la hora de construir aplicaciones para el cliente con típicas características o avanzadas, una RCP nos ofrece un framework con el cual tales características podrán combinarse uniéndolas de manera simple y rápida.

Por cuanto, en una aplicación construida sobre una RCP, el proceso de configuración y extensibilidad es el escenario central y más relevante para un framework de este tipo, en otras palabras, este facilitará entradas de menú declarativamente para dicha aplicación en un archivo texto, posteriormente el menú será cargado automáticamente por el framework, esto significa que el código fuente se convierte considerablemente en mucho más enfocado y adaptable, y por consiguiente los desarrolladores serán capaces de concentrarse sobre las necesidades reales de la aplicación, mientras el menú es íntegramente configurable.

El aspecto más importante de una RCP es su arquitectura, la misma determina que las aplicaciones establecidas sobre cualquier RCP deberán ser escritas en forma de módulos, dentro de la cual aquellas partes lógicamente coherentes de las aplicaciones se hayan aisladas. Es importante comprender que un módulo es descrito declarativamente y automáticamente cargado por la propia plataforma. El resultado de lo anterior descansa en que, no existe un enlace explicito necesario entre el código fuente y la aplicación. De este modo, una relación de relativa pérdida de acoplamiento es establecida entre módulos funcionando independientemente, por medio de lo cual la extensibilidad dinámica de la aplicación y la habilidad para intercambiar sus partes constituyentes serán enormemente simplificadas.
Así se perfila NetBeans Platform, una manera muy fácil para ensamblar aplicaciones específicas a un usuario o dominio a partir de módulos individuales.

Por tanto, una RCP libera también a los desarrolladores de preocupaciones con aquellas tareas que poco tienen que ver con la lógica de negocio de la aplicación. Al final del ciclo de desarrollo los desarrolladores lograrán una merecida y moderna arquitectura de aplicación.

Estructura de Netbeans Platform 7. Su Arquitectura.

Toda disciplina real necesita una teoría detrás de esta, la posibilidad de poder comprender la estructura de una aplicación rich-client y las relaciones con NetBeans Platform, hace necesario comprender la teoría que sustenta la estructura y por consiguiente la arquitectura de NetBeans Platform, por lo que se nos hace imprescindible relacionarnos con un vocabulario común que nos permita identificar cada uno de los componentes de la plataforma y sus relaciones. Basándonos en estos fundamentos conceptuales, más adelante podremos llegar a conclusiones más exactas que nos permitirán llegar al objetivo final de construir aplicaciones de tipo rich-client con el apoyo de esta Plataforma.

El continuo incremento en la complejidad y tamaño de las modernas aplicaciones que hoy usamos no se ha detenido. Al mismo tiempo, las aplicaciones contemporáneas necesitan ser flexibles, por encima de todo, para ello, las mismas necesitan ser extensibles. Esto necesariamente obliga a dividir una aplicación en diferentes partes. Específicamente, en NetBeans Platform, como resultado, cada parte diferente es un bloque de construcción que constituye su arquitectura modular. Estas distintas partes pueden ser independientes, exportando interfaces muy bien definidas que serán usadas por otras partes de la misma aplicación, con características que las otras partes de la aplicación podrán extender y usar.

El propio hecho que la aplicación esté dividida en módulos, los cuales son partes interdependientes, es el producto en una enorme mejoría del diseño de la aplicación con una arquitectura mucho más flexible y simple de mantener. Esto es exactamente el aspecto central para las aplicaciones cliente modernas que apoya NetBeans Platform.

El conjunto de conceptos y estructuras de NetBeans Platform apoyan el desarrollo y la conceptualización de aplicaciones modulares. Así, llegaremos un elemento crucial de la Plataforma, el módulo, siendo este una colección de clases funcionalmente relacionadas unidas a una descripción de interfaces que el propio módulo exterioriza, además de una descripción de los demás módulos que este necesita para funcionar. Curiosamente, NetBeans Platform y cualquier aplicación construida sobre la misma, están divididas en módulos.

Estos módulos serán cargados por el núcleo de NetBeans Platform, el cual es conocido como NetBeans runtime container.

La función del NetBeans runtime container es cargar de modo automático y dinámico los módulos de la aplicación, y seguidamente hacerse responsable de la ejecución de la propia aplicación. Todo lo anterior, redunda en ofrecer enormes ventajas debido a que la aplicación podrá ser extendida por módulos adicionales, y adaptada a las necesidades de específicos usuarios, permitiendo que aquellos módulos que no serán utilizados puedan ser desactivados.

Para posibilitar que nuestras aplicaciones estén atadas a este nivel de modularidad, NetBeans Platform por un lado hace disponible aquellos conceptos y mecanismos que facilitan que los módulos sean extensibles por otros módulos, y además, que estos se comuniquen unos con otros sin ser dependientes entre sí, a esto llamamos pérdida de acoplamiento entre módulos de una aplicación.

Una característica importante recae en el encapsulamiento del código dentro de los módulos, lo cual es vital y necesario dentro de un sistema modular, para ello, NetBeans Platform brinda su propio sistema cargador de clases (classloader), el cual fue diseñado para que cada módulo sea cargado por su cargador de clases, permitiendo en este proceso crear una unidad disponible e independiente del código. Como resultado a esto, un módulo podrá explícitamente hacer sus paquetes disponibles, con funcionalidades específicas que serán exhibidas a otros módulos.

De modo que para usar la funcionalidad desde otros módulos, un módulo deberá declarar dependencias sobre otros módulos, dichas dependencias serán declaradas en el archivo manifest del propio módulo y serán resueltas por el NetBeans runtime container en tiempo de ejecución, así se asegura que la aplicación siempre se inicie en un estado consistente; igualmente, una vez más vemos asoma su cara lo que llamamos pérdida de acoplamiento, jugando su rol en el concepto declarativo de Netbeans Platform.

Un beneficio tangible en la práctica de programación, es hacer las definiciones tanto como sea posible en los archivos de configuración y descripción de nuestra aplicación, así evitamos una fuerte conexión de estos conceptos con el código fuente Java.

Un módulo es descrito por su archivo de datos manifest, unido a los datos que aparecen descritos en otros archivos XML relacionados, y por tanto no necesariamente necesitan ser explícitamente adicionados a NetBeans Platform. El uso de estos archivos XML, le permite a NetBeans Platform conocer los módulos que están disponibles, además de sus ubicaciones y los contratos que dichos módulos necesitan que sean cumplimentados para habilitar su carga.

En la figura 2 podemos observar con precisión la composición de NetBeans Platform por un núcleo de módulos, los cuales son necesarios y vitales en el proceso de inicio para una aplicación además de definir su interfaz de usuario.

Figura 2. Arquitectura conceptual de NetBeans Platform.

Para este fin, NetBeans Platform proporciona la disponibilidad de numerosos módulos API (Application Programming Interface) y módulos SPI (Service Provider Interface), lo cual redunda de manera formidable en la simplificación durante el proceso de desarrollo.

Por ejemplo, la API Actions, basada en las interface de Swing toolkit; ActionListener o Action, y que hace disponible las clases de acción que a menudo se pudieran necesitar; la poderosa API Nodes; y la SPI Options, las cuales ayudan con aquellas opciones de diálogos propias para que sean fácilmente integradas dentro de una aplicación. En adición a lo anterior, también existen componentes totalmente reutilizables en NetBeans Platform, tales como los módulos OutputWindow y Favorites, este último permite que mostrar datos aleatorios y estructuras de directorio e influir en sus acciones a través la API Data Systems.

Por tanto, el proceso de codificación modular posibilita luchar contra la complejidad debido a que las aplicaciones están creciendo en tamaño y funcionalidad, se hace necesario separar las mismas en piezas individuales (podrían llamarse “componentes”, “módulos”, o “plugins”), y cada una de estás piezas aisladas deberán exportar e importar interfaces bien definidas convirtiéndose además en  elementos de esta arquitectura modular.

La solución tecnológica a los retos del desarrollo distribuido es la modularización, este es un mecanismo para coordinar el trabajo de muchas personas alrededor del mundo, gestionar dependencias entre las diferentes partes de un proyecto y ensamblar sistemas muy complejos de un modo razonable.

Como mencionamos anteriormente, la existencia de NetBeans Platform y Eclipse RCP para el desarrollo de aplicaciones de escritorio bajo el concepto de rich-client, unidas a sus ventajas y desventajas, continúan siendo una excelente opción para lograr aplicaciones modernas que cumplan con las mayores exigencias del cliente y del software moderno de hoy. Sin embargo, consideramos a Netbeans Platform como la mejor elección para el desarrollador de aplicaciones, por ofrecer  oportunidades que son de las mejores basadas en JSE, sin olvidarnos de sus intrínsecas e inevitables complejidades descritas por aquellos al expresar que la Plataforma es excesivamente compleja, lo cual deviene en una de las principales razones que ha imposibilitado que las RCP no se hayan establecido como un estándar para el desarrollo de aplicaciones cliente.

En la práctica, Netbeans Platform proporciona un jugoso juego de módulos que permiten la construcción de aplicaciones que abarquen dominios específicos de modo simple, contrario a si intentáramos su construcción a partir del uso de la API nativa de Java. Todo lo anterior, es el fruto de la entrega desde NetBeans Platform de numerosas APIs, las cuales ofrecen soluciones prácticas para problemas y desafíos que acontecen frecuentemente en el desarrollo de aplicaciones cliente.

En nuestro próximo artículo intentaremos reflejar aquellos elementos conceptuales relacionados con los módulos del núcleo que componen NetBeans Platform, y los primeros pasos que nos permitirán comenzar la construcción de nuestras aplicaciones rich-client.

Referencias Bibliográficas:

1- Adam Myatt. Pro NetBeans IDE 6 Rich Client Platform Edition. Apress 2008.
2- Heiko Böck. The Definitive Guide to NetBeans Platform. Apress 2009.
3- Heiko Böck. The Definitive Guide to NetBeansTM Platform 7. Apress 2012.
4- Jaroslav Tulach. Practical API Design: Confessions of a Java Framework Architect. Apress 2008.
5- Jeff McAffer, Jean-Michel Lemieux, Chris Aniszczyk. Eclipse Rich Client Platform.—2nd ed.Pearson Education 2010.
6- Jürgen Petri. NetBeans Platform 6.9 Developer’s Guide.Packt Publishing 2010.
7- Rhawi Dantas.NetBeans IDE 7 Cookbook. Packt Publishing 2011.
8- Tim Boudreau, Jaroslav Tulach, Geertjan Wielenga. Rich Client Programming: plugging into the NetBeans platform. Prentice Hall 2007.
9- Vladimir Silva. Practical Eclipse Rich Client Platform Projects. Apress 2009.
10- http://netbeans.org/
11- http://platform.netbeans.org/tutorials/
12- http://netbeans.org/features/platform/showcase.html
13- http://wiki.apidesign.org/wiki/Main_Page
14- http://techcrunch.com/2012/09/11/zuckerberg-the-leader/
15- http://news.cnet.com/8301-1023_3-57511142-93/html5-is-dead-long-live-html5/
16- http://techcrunch.com/2012/08/23/facebook-for-ios-faster/
17- http://www.planetnetbeans.org/index.html
18- http://platform.netbeans.org/
19- http://netbeans.org/kb/trails/platform.html
20- http://netbeans.dzone.com/nb-petroleum-engineering
21- http://www.paterva.com/web6/products/maltego.php

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *