From the category archives:

C/C++

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

{ 8 comments }

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.

emergentes100 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.

cod100 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.

{ 5 comments }

SnapShoot: Hilos en C++ a la boost

by Jorge Machin on November 12, 2008 · 1 comment

in C/C++, Snapshots

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.

{ 1 comment }

Ciudad Konec-t fué uno de los proyectos en el cual participé por mi paso por Interalia (8 años). Fue muy divertido colaborar en la programación de la parte del servidor y hacer que soportara sin problemas a más de 2600 usuarios simultáneos con tan sólo dos maquinitas.


Así era en un principio
Así era en un principioFue creciendoUno de los cuartos populares

Las imagenes anteriores son de la primera versión. Después se cambiaron los fondos a un diseño más actual y más 3D.

Actualización:

Fue una campaña publicitaria muy exitosa, duró desde octubre de 2004 a finales de Diciembre de 2009 y se extendio a varios paises latinoamericanos.

{ Comments on this entry are closed }

Snapshot: Hilos en C++ (Windows)

by Jorge Machin on September 26, 2008 · 0 comments

in C/C++, Programación, Snapshots, Windows

Una clase "quick and dirty" para crear hilos en cajas windows.

Encabezado:

#pragma once

#include <windows.h>

class CThread {

   public:

      // Constructor por defecto:

      CThread(void);

      // Destructor virtual
   
      virtual ~CThread(void);

      // Esta función inicia el hilo:

      bool start();

      // Esta función se debe sobrecargar con lo que tiene que hacer el hilo:

      virtual void run() = 0;

      // Esta función espera a que el hilo se detenga. Se debe llamar en el destructor de la clase derivada.

      void join();

   private:

      unsigned long id;

      void *threadHandle;

      static DWORD WINAPI entryPoint( void *pthis );

};

Archivo cpp:

#include "StdAfx.h"
#include "thread.h"

CThread::CThread(void) : threadHandle( NULL ) {

   MessageBox( NULL, "CThread::CThread", "Aviso", MB_OK );

}

DWORD WINAPI CThread::entryPoint( void *pthis ) {

   CThread *pt = ( CThread * ) pthis;
   pt -> run();
   return 0;

}

bool CThread::start() {

   threadHandle = CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) entryPoint, this, 0, &id );
   return true;

}

void CThread::join() {

   if ( threadHandle != NULL )

      WaitForSingleObject( threadHandle, INFINITE );

}

CThread::~CThread(void) {

   MessageBox( NULL, "CThread::~CThread", "Aviso", MB_OK );

   if ( threadHandle != NULL )   

      CloseHandle( threadHandle );

}

Como se dislumbra de los comentarios, para utilizarla es necesario crear una clase que herede de Cthrean y sobrecargar la función run con lo que debe hacer nuestro hilo.

{ 0 comments }