El Framework ZK, es una buena opción para manejar interfaces RIA desde nuestros proyectos en J2EE usando AJAX. A continuación presento la lista de pasos para hacer un pequeño ejemplo en TomCat.
1. Creamos el directorio zktest dentro el directorio webapps para que sea nuestro proyecto de pruebas.
2. Creamos el directorio WEB-INF dentro del directorio zktest.
3. Opcionalmente, agregamos un contexto para nuestro proyecto de prueba en el archivo conf/server.xml antes de finalizar el tag server.
<Context path="/zktest" docBase="zktest" reloadable="true">
</Context>
4. Desempaquetamos el archivo zk-bin-xxx.zip en un directorio temporal.
5. Copiamos los jars que se encuentran en el directorio dist/lib a la raíz directorio WEB-INF/lib de nuestro proyecto, incluyendo los que se encuentran en los subdirectorios ext y zkforge.
6. Agregamos el siguiente código al archivo web.xml habitual para que quede de la forma:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<!-- ZK -->
<listener>
<description>Used to clean up when a session is destroyed</description>
<display-name>ZK Session Cleaner</display-name>
<listener-class>org.zkoss.zk.ui.http.HttpSessionListener</listener-class>
</listener>
<servlet>
<description>ZK loader for ZUML pages</description>
<servlet-name>zkLoader</servlet-name>
<servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>
<init-param>
<param-name>update-uri</param-name>
<param-value>/zkau</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>*.zul</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>*.zhtml</url-pattern>
</servlet-mapping>
<servlet>
<description>The asynchronous update engine for ZK</description>
<servlet-name>auEngine</servlet-name>
<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>auEngine</servlet-name>
<url-pattern>/zkau/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.zul</welcome-file>
<welcome-file>index.zhtml</welcome-file>
</welcome-file-list>
</web-app>
7. Con esta configuración, ya podemos hacer nuestro primer ejemplo. Grabamos el archivo index.zul en la raiz del directorio zktest:
<window title="Mi Primera ventana" border="normal" width="200px" sizeble="true" closabe="true">
Hello, World!
</window>
8. Es todo... a diseñar pantallas.
Para mí, una de las razones para considerar seriamente a boost en cualquier proyecto en C++ es su implementación de functores. Realmente facilita mucho la creación de funciones "callback" y "delegates" sin causar mucha penalización en el rendimiento de un programa.
¿Porqué facilita el trabajo si los callbacks bien se pueden hacer con tan solo un apuntador a función? La respuesta es fácil si estas trabajando con un enfoque orientado a objetos. Para usar un apuntador a una función miembro, esta necesita ser estática o ser llamada con ayuda de su objeto. Las dos cosas bastante engorrosas.
Veamos como se sortea estos inconvenientes usando boost:
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace std;
class Callback {
public:
void set_callback_function( boost::function<void()> function ) {
this->callback_function = function;
}
void execute_callback_function() {
if( !callback_function.empty() )
callback_function();
}
private:
boost::function<void ()> callback_function;
};
class MiClase {
public:
void funcion() {
cout <<"¡iujú! ¡Si se llamó!" <<endl;
}
};
int main() {
Callback callback;
MiClase miclase;
callback.set_callback_function( boost::bind( &MiClase::funcion, &miclase ) );
callback.execute_callback_function();
return EXIT_SUCCESS;
}
Probando el código en línea
En la siguiente URL, puedes probar este programa en línea: http://www.ideone.com/hbMXbtFR
La biblioteca TinyXML es muy liviana y permite parsear rapidamente XMLs sin tener que hacer mucho formalismo. En este post presento un código de ejemplo:
El xml que queremos parsear como ejemplo es el siguiente:
<?xml version="1.0">
<ELEMENT attribute="attribute">
<CHILD>child</CHILD>
</ELEMENT>
Lo grabamos con el nombre ejemplo.xml.
A continuación el programa en c++ que realiza el parseo:
#include <iostream>
#include "tinyxml.h"
using namespace std;
int main() {
TiXmlDocument doc;
if ( !doc.LoadFile( "ejemplo.xml" ) ) {
cout <<"Error: Can't load file ejemplo.xml" << endl;
return EXIT_FAILURE;
}
string attribute, child_value;
TiXmlElement *element;
element = doc.FirstChildElement( "ELEMENT" );
if ( element->Attribute( "attribute" ) != NULL )
attribute = string ( element->Attribute( "attribute" ) );
cout <<"attribute: " <<attribute <<endl;
TiXmlElement* child = element->FirstChildElement("CHILD");
if ( child != NULL )
child_value = string( ( ( child->FirstChild() )->ToText() )->Value() );
cout <<"child value: " <<child_value <<endl;
return EXIT_SUCCESS;
}
Lo grabamos como main.cpp y lo compilamos con:
g++ -o main main.cpp -ltinyxml
En este post, iré poniendo mis libros favoritos que traten sobre programación y computadoras. Desafortunadamente, muchos de ellos se irán haciendo obsoletos con el paso del tiempo. Los trataré de mantener conforme sigan vigentes.
|
Sistemas Emergentes
Este libro de Steven Johnson nos explica como la naturaleza se organiza para crear comportamientos inteligentes en sus elementos primitivos y los más "evolucionados" como el hombre. Ya sea con sólo individuos de una sola especie o interactuando varias especies de millones de seres cada una. A esto que se le conocía como "inteligencia colectiva" y lo podemos apreciar ya sea en un hormiguero o en una metrópolis aparentemente caótica como la Ciudad de México.
Por supuesto que este entendimiento es aplicable a la informática y nos explica como es posible que dentro del caos del Internet, sitios como la Wikipedia que esta dispuesta al libre albedrío de los internautas sea ahora una de nuestras fuentes de conocimiento más valiosa y fracasen esfuerzos como su contra-parte Encarta. Hay otros ejemplos como el Internet vs MSN ¿A la larga pasará lo mismo con aplicaciones cerradas con el surgimiento del software libre?
Las aplicaciones son tremendas en video-juegos y han funcionado para recomendar libros en sitios como Amazon. Además el libro tiene mucha historia de personajes claves como Turing. Altamente recomendado.
|
|
Gödel, Escher, Bach - Una eterna trenza dorada
Este libro lo conocí gracias a mi hermano, que lo estaba leyendo él cuando estudiaba en la universidad. Me intrigó y lo leí. Conforme pasaba las hojas, descubría muchas cosas que ya intuía de la naturaleza y otras que modificaron mi forma de ver el mundo desde esos días. Con él comprendí los alcances de la ciencia y los paralelismos de las leyes de la naturaleza en campos tan distantes como matemáticas, budismo zen, música, programación e Inteligencia Artificial.
Desafortunadamente, el tiempo no pasa en vano y ya hay muchos avances tecnológicos que por obvias razones no se tocan y algunos de los conocimientos se sienten un poco atrasados para los nuevos lectores. Aún así lo considero un excelente libro.
|
|
Los tres pilares del zen
Este libro no es propiamente de programación, pero si de una filosofía que tiene métodos de entrenamiento que pueden ser muy útiles para las personas que necesitan abstraer la esencia de las cosas o que necesitan acallar los pensamientos que distraen y conseguir así una mente ordenada.
Philip Kapleau logra con éxito explicar e introducirnos al zen a nosotros los profanos, sin desviarnos de lo que realmente es y sin dar falsas imágenes eruditas o seudocientíficas. Debo confesar que además de las técnicas de concentración, su filosofía me gusta mucho porque tiene muchas coincidencias con mi propia cosmovisión.
|
|
Sistemas Operativos
La primera edición de este libro la leí aproximadamente en el año de 1992 y me permitió entender como funcionaba la multitarea y los sistemas de manejo de memoria como la paginación. Afortunadamente ya había visto estos conceptos en acción desde 1988 con mi Color Computer porque el MS-DOS que use después no llegaba a tanto. Hice algunos pequeños experimentos con el procesador Z80 que usaba en aquella época para probar algunos de los conocimientos adquiridos.
Desafortunadamente, este libro ya no esta a la venta y es una verdadera pena porque el autor explica los conceptos de una manera sencilla. Quizás las nuevas técnicas para construir kernels lo opacarían hoy en día, pero tengo mis dudas porque estoy seguro que su valor sigue siendo vigente para entender los conceptos y para el uso de micro-controladores que no requieren hacer un Linux desde cero.
|
|
Computer Organization and Design
Otro libro para conocer los adentros de las estas máquinitas que cambiaron al mundo. Es un excelente libro introductorio y contiene toda la información necesaria no sólo para entender los partes de las computadoras sino también para diseñarlas. Gracias a este libro yo construí mi propio microprocesador.
Incluye apéndices y un CD con mucha información extra de igual valor a la de este excelente libro.
|
|
The C++ Programing Language
Sin duda, este es uno de los mejores libros para comprender al lenguaje C++; aunque no sea propiamente para principiantes. El mismo creador del lenguaje C++ nos explica su filosofía y las razones detrás de su diseño con justificaciones y ejemplos. Sólo por esto, vale la pena su lectura.
Además es un excelente manual donde se puede consultar hasta el aspecto más oscuro o extraño que se le pueda ocurrir al programador más inquieto.
|
|
Data Structures with C++ using STL
A estas alturas del partido, este libro ya está algo obsoleto, no es propiamente de STL y quizás el estilo de programación de los autores no sea el mejor. Pero, es un tutorial que nos enseña los principios de las estructuras de datos y al mismo tiempo tiene los ejemplos más comunes de la STL. Yo a la fecha, siempre lo tengo en mi escritorio y no es raro que lo este consultando constantemente.
|
Boost es una excelente librería con todo lo que un buen programador de C++ pudiera necesitar. Además está desarrollada para hacer la programación sencilla, elegante y rápida. A continuación incluyo un ejemplo simple de una clase que encapsula el manejo de hilos usando Boost y que puede servir de prototipo en diversos proyectos:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
class Hilo {
public:
Hilo() : keepgoing( true ), thread( boost::bind( &Hilo::do_work, this ) ) { };
~Hilo() {
keepgoing = false;
// Necesitamos esperar a que el hilo se acabe
thread.join();
}
private:
bool keepgoing;
boost::thread thread;
void do_work() {
// Aquí es donde se lleva a cabo toda la acción.
while( keepgoing ) {
std::cout <<"Hilo" << std::endl;
sleep(1);
}
}
};
int main( void ) {
Hilo *hilo = new Hilo();
sleep(20);
delete hilo;
return EXIT_SUCCESS;
}
El programa lo podemos compilar con:
g++ -O2 -o main main.cpp -lboost_thread-mt
Notas:
- Como se puede ver esta aproximación es más parecida a como le hace C# que Java.
- El hilo comienza al crearse el objeto.
- No hay manera de controlar manualmente el tamaño del stack
- Si no hay recursos suficientes se lanza una excepción y el objeto no se crea.