domingo, 21 de septiembre de 2008

Sqlite con Code::Blocks

Otra de instalaciones!
Esta vez se trata de SQLite, una librería que nos permite manejar datos desde una BBDD dentro de nuestra propia aplicación de una forma muy sencilla.

Con SQLite podemos almacenar y recuperar datos usando sentencias SQL, olvidándonos completamente de las funciones de manejo de archivos y de realizar rutinas de búsqueda de datos (esto último se agradece bastante).

En esta entrada describiré el proceso que seguí para usar SQLite desde Code::Blocks (bajo Windows XP).
He usado Code::Blocks 8.02 para el proceso, y mientras escribo este articulo la versión actual de SQLite es la 3.6.2.

Descargamos los siguientes ficheros desde la página de SQLite:
http://www.sqlite.org/
Precompiled Binaries for Windows
  • sqlite-3_6_2.zip : Esto no nos servirá para usar SQLite con Code::Blocks pero nos será muy útil para debugar, pues con esta aplicación podremos consultar y modificar nuestras bases de datos.
  • sqlitedll-3_6_2.zip : La DLL para windows, sin ella la aplicación compilada no se ejecutará. También fabricaremos la libreria .a para Mingw (el compilador que usa Code::Blocks).
Source Code
  • sqlite-amalgamation-3_6_2.zip: Aqui se encuentra el fichero sqlite3.h que deberemos incluir en nuestra aplicación.

Una vez todo descargado, el primer paso es obtener la libreria en formato .a para poder linkar con nuestro programa.
Descomprimimos el fichero sqlitedll-3_6_2.zip en un directorio y abrimos una línea de comandos.
Nos dirigimos al directorio donde descomprimimos sqlitedll-3_6_2.zip y ejecutamos:

dlltool -D sqlite3.dll -d sqlite3.def -l libsqlite3dll.a

Ahora, crea dentro de tu directorio favorito donde almacenes tus librerias llamado SQLite, y dentro suyo los directorios include y lib.
Yo tengo un directorio donde almaceno todas las librerias que uso habitualmente (C:\libs\), pero puedes omitir este paso y colocar los ficheros en los directorios de Code::Blocks:
X:\{DIRECTORIO_INSTALACION_CODEBLOCKS}\MinGW\include
X:\{DIRECTORIO_INSTALACION_CODEBLOCKS}\MinGW\lib

Bien, descomprime el fichero sqlite-amalgamation-3_6_2.zip dentro del directorio include.
El fichero libsqlite3dll.a colocalo dentro del directorio lib.

Ahora solo nos queda crear el proyecto con Code::Blocks.
Crea un nuevo proyecto,
-"Console application"
-Marca C++ como lenguaje de programación
-Indica el directorio donde guardar el proyecto.

Si NO guardaste los ficheros dentro del directorio de Code::Blocks sigue estos pasos:
-Project/Build options: En el panel de la izquierda marca el nombre del proyecto (no debe estar marcado "debug" ni "release").
-En la pestaña "Linker settings", haz click sobre el botón "Add" y busca el fichero "libsqlite3dll.a" que generamos anteriormente. Con esto Code::Blocks linkara la libreria con nuestro programa.
-En la Pestaña "Search Directories", dentro de la pestaña "Compiler" haz click sobre "Add" y selecciona el directorio "include" donde se descomprimió el fichero sqlite-amalgamation-3_6_2.zip. Así el compilador encontrará el fichero "sqlite3.h"


Si guardaste los ficheros dentro del directorio Code::Blocks:
-Project/Build options: En el panel de la izquierda marca el nombre del proyecto (no debe estar marcado "debug" ni "release").
-En la pestaña "Linker settings", en el cuadro de texto "Other linker options" escribe:
-libsqlite3dll

Bien, para probar que todo funciona correctamente copia el siguiente código y trata de compilarlo:


#include
#include
using namespace std;

int main()
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;

rc = sqlite3_open("test.db", &db);
if( rc==SQLITE_OK )
{
cout << "Yeah!";
}
sqlite3_close( db );
}

Y eso es todo, mucho más sencillo que con QT y GTK!! Así da gusto.

miércoles, 25 de junio de 2008

Instalar QT con Code::Blocks

Ahora es el turno de jugar con QT /Cute/ (previamente lo hicimos con GTK y su dichosa instalación) y empezamos con lo más tedioso y es su instalación, que aunque no es tan complicada como la de GTK, tiene su miga.
QT
, para quienes no lo sepan es una librería con una interfaz en C++ que orientada a la creación de aplicaciones de ventana multiplataforma.

Recientemente (17 de junio 2008) Nokia ha comprado a Trolltech para potenciar aún más su faceta multi-sistema y continuar con QTopia (imagino para usarlo en sus nuevos teléfonos mobiles.

Remarco que este tutorial esta orientado para su instalación bajo windows, aunque en linux debería ser exactamente lo mismo.

La primera diferencia respecto a GTK la vemos al descargar la librería: nos viene toda en un mismo paquete; pues si bien GTK se apoya sobre otras librerías de terceros, QT es principalmente todo un bloque, por lo que a la hora de descargarlo suma un punto en facilidad (haz sitio para 120MB). Otra diferencia es la licencia de uso, no podemos usar QT para desarrollar aplicaciones comerciales (sin antes pasar por caja claro), aunque siempre podemos usar su librería. para proyectos opensource.

El link para la versión opensource lo tenéis aquí (v4.4):
http://trolltech.com/downloads/opensource

Una vez descargado el tocho de librería, lo descomprimimos alli donde queramos dejarla instalada.

Atención!: Recomiendo acortar el nombre del directorio a qt4.4, pues el nombre por defecto es demasiado largo y puede dificultar los siguientes pasos (bueno vale, no me gustan los nombres de directorios largos).

Para ejecutar el siguiente paso debemos tener instalado MinGW (Si usáis Code::Blocks, seguramente tengáis un directorio llamado MinGW dentro de su directorio de instalación).

Añadimos el directorio MINGW/bin a la variable de entorno PATH.
Por seguridad, crea también la variable QMAKESPEC con valor "win32-g++" (sin las comillas).
De esta manera forzamos a usar el compilador g++ en caso de tener más de uno instalado.

Abrid una consola y os dirigís al directorio donde hayáis descomprimido QT y ejecutáis:
configure

Esto empieza a compilar la aplicación qmake. Un poco de paciencia porque puede llegar a tardar un poquillo (5min-30min, mas incluso...).

Una vez compilado qmake, faltará ejecutar:
make
quién por fin empezará a compilar las librerías.
Si qmake tardó, agárrate porque esto puede llevar toda una tarde. Así que tranquilamente puedes salir a pasear al perro porque a menos que tengas un pc ninja te vas a aburrir mirando el proceso.

Ya compiló? Pues te recomiendo un ultimo comando:
make clean
esto eliminará archivos temporales creados durante el proceso (muuuuuchos MB).

Bien, ahora abre Code::Blocks y crea una nueva variable global:
Settings/Global variables

Llámala "qt".
  • Rellena el campo base con la ruta en donde se encuentra la libreria
  • Rellena los campos "include" y "lib" con la ruta a "include" y "lib" respectivamente.
  • En User-defined fields usa una nueva fila y rellénalo de esta forma:

    • Campo izquierdo: mkspecs

    • Campo derecho:$(#qt)/mkspecs

Con esto hemos creado una variable llamada "qt" que podemos usar a lo largo de las opciones de configuración de Code::Blocks para apuntar fácilmente a los directorios "include" y "libs".

Lo ultimo es crear un nuevo proyecto (consola o ventana, como mas guste, pero que sea C++).

Para compilar aplicaciones QT hay que usar el Makefile creado por qmake.
Para indicarlo:
Project/Properties/Project Settings
Marcamos la casilla "This is a custom Makefile".

Vamos a especificar los directorios donde se encuentra la librería:
Project/Build Options

Con el nombre del proyecto seleccionado en la parte izquierda de la ventana, entramos en la pestaña Search Directories:
En la subpestaña Compiler escribimos:
$(#qt.include)
Y en la subpestaña Linker:
$(#qt.lib)

Y ya tenemos todo el tinglado montado.
Hay que tener una cosa en cuenta, y es que antes de compilar hay que crear un archivo make con qmake. Qmake hace uso de los archivos de proyecto .pro. Estos archivos le indican a qmake que ficheros utiliza nuestro proyecto para poder compilar correctamente. Paradójicamente qmake puede crear nos uno automáticamente:
qmake -project
Siempre y cuando todo esté bien referenciado en el código fuente. Con el .pro creado, simplemente un:
qmake
creará el archivo makefile y ya podremos compilar sin problemas con Code::Blocks. Ten en cuenta que cada vez que añadas un nuevo fichero a tu proyecto (o quites uno) debes actualizar el archivo makefile. Ignoro si este proceso puede ejecutarse automáticamente desde Code::Blocks, pero seguiré investigando ;)

martes, 27 de mayo de 2008

Cinta adhesiva en el oceano

Debe de tratarse de cinta adhesiva especial: se pega incluso en el océano!!

http://maps.google.com/...

jueves, 22 de mayo de 2008

Herramientas de programador I: Control de versiones

Tener organizado las diferentes versiones de nuestro software es indispensable para todo programador mínimamente ordenado. Almacenar cada versión en un directorio compartido no es la mejor opción, y menos aún cuando varios desarrolladores meten mano al código y se pisan entre ellos.

Para evitar esto existen aplicaciones que nos permiten aplicar una trazabilidad al proceso de producción/mantenimiento del software. Una de ellas es Subversion un servidor open source con licencia Apache/BSD disponible tanto para Windows, Linux y Mac OSX.

Usar esta herramienta nos permite:

  • Ver todos los cambios realizados al código fuente

  • Conocer el autor de cualquier modificación

  • Revertir siempre que queramos a una versión anterior

  • Ramificar una versión estable para realizar pruebas sin tener que tocar el origen

  • Unir varias ramas

  • Bloquear el acceso al código hasta que hayamos terminado con él (evitamos que nadie pise nuestro trabajo)


Entre muchas otras características.

Instalar un servidor Subversión es muy sencillo. Describiré el proceso para Windows XP.

  1. Lo primero es descargarnos el programa servidor: Descarga Subversion


  2. Necesitaremos también el cliente, llamado Tortoise, el cual se integra con la shell de windows (explorador de archivos) mostrando un nuevo menú de opciones en el menú contextual: Descarga Tortoise

  3. Para poder ejecutar el servidor Subversion como servicio de windows necesitaremos el programa SrvAny distribuido con Windows Server 2003 Resource Kit Tools, aunque mejor descargar este paquete distribuido por Eugene Lazutkin en su blog: http://lazutkin.com/download/SrvAny.zip.



Bien una vez descargado todo lo necesario, procedemos a instalar el servidor Subversion. Como toda instalación de aplicaciones Windows no tiene ningún secreto... siguiente, siguiente y siguiente. Haz lo mismo con Tortoise. Después de instalar Tortoise se te pedirá que reinicies Windows.

Una vez reiniciado el sistema, escoge un lugar donde almacenar el repositorio (lugar donde se almacenarán todos los ficheros). Crea un directorio y dale un nombre (por ejemplo, "repositorio"). Entra dentro y pulsa el botón derecho del ratón, y dentro del menú TortoiseSVN selecciona la opción Create repository Here. Esto creará los archivos necesarios para empezar.

La parte más complicada es la de configurar Subversion como servicio de Windows, para iniciarlo automaticamente al iniciar el sistema.
Para ello utilizaremos la aplicación SrvAny pues se encarga de registrar aplicaciones como servicios. Si hemos descargado SrvAny de la pagina de Eugene, descomprimimos el fichero en el directorio de nuestra elección, y bajo la línea de comandos ejecutamos:

InstSrv svnserve C:\SrvAny\SrvAny.exe
Reemplaza "C:\SrvAny\" por el directorio donde hayas descomprimido el paquete
Con esto hemos registrado subversion como servicio, ahora falta decirle a Windows donde se encuentra Subversion instalado; para ello debemos modificar el registro de Windows.

Ejecuta RegEdit (Inicio/Ejecutar/Regedit.exe) y navega hacia:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\svnserve.

  1. Haz click derecho sobre la carpeta svnserve y selecciona Nueva»Clave, dale al nuevo directorio creado el nombre "Parameters"

  2. Dentro de este directorio crea dos Valores alfanúmericos:

    • Nombre: Application Valor: C:\Archivos de programa\Subversion\bin\svnserve.exe (Ruta al archivo svnserve.exe)

    • Nombre: AppParameters Valor: -d -r C:\repositorio (Ruta al directorio que creaste para usar como repositorio)




Por ultimo, configuraremos el servidor para dar acceso publico de escritura/lectura.
Dentro del directorio repositorio, existe una carpeta llamada conf, dentro hay varios archivos:

  • svnserve.conf: En este fichero especificamos los permisos generales de los usuarios anónimos y logueados.

    anon-access = read ##Damos permiso solamente de lectura a los usuarios anonimos
    auth-accesss = write ##Damos permiso de escritura y lectura a los usuarios autentificados

  • passwd: En este fichero se listan los usuarios junto con sus contraseñas. De esta manera cuando alguien intente conectarse a nuestro repositorio solo podrán acceder a él aquellos usuarios listados en el fichero (siempre y cuando bloqueemos el acceso a los usuarios anonimos en svnserve.conf

    [users]
    usuario = contraseña




Con esto ya tenemos listo el sistema para empezar a trastear con Subversion.
Para probarlo, abre una ventana del explorador de Windows y escribe en la barra de direcciones:

svn://IP_DEL_SERVIDOR



Tortoise hará acto de presencia mostrándote la estructura de directorios y su contenido del servidor SVN.

Por hoy lo dejamos aquí, si tienes mas hambre sobre el uso correcto de Subversion puedes revisar la documentación incluida con la instalación. Si te da pereza espera mi próxima entrada en la que explicaré como utilizar de forma estructurada esta fantástica herramienta.

miércoles, 21 de mayo de 2008

El rastro de las hormigas


Imagen obtenida de: http://www.flickr.com/photos/choomengfoo/328040255/

En los años de mi infancia pasé una temporada jugando al videojuego para PC SimAnt, un simulador de hormigas lanzado el año 1991 en el que debías tomar el mando de una colonia y asegurar su supervivencia en un hostil jardín.

Si mi memoria no me falla el juego tenía su punto educativo, pues además de manejar las hormigas mostraba algo de información sobre estos seres vivos (eso sí, en inglés).
Una de las cosas que quedó grabada en mi mente es que resulta que las hormigas van dejando un rastro químico para marcar rutas hacia alimentos, enemigos o el propio hormiguero para no perderse. Estos rastros son usados tanto por la hormiga que lo genera como por sus compañeras. Es fácil ver estas rutas cuando son muchas las hormigas que las emplean, se ve claramente que todos individuos siguen un camino invisible.

Ahora que ha llegado el verano y con él el despertar de estos insectos, me propuse realizar un sencillo experimento (sin ninguna base científica todo hay que decirlo).
El experimento consiste en localizar una ruta de hormigas y tratar de borrar el rastro para ver como se comportan.
Para buscar una ruta, basta con localizar una zona por la que las hormigas sean asiduas a pasearse, pues seguramente ahí exista "el rastro".
Una vez localizada la ruta probamos a frotar con el dedo, si el terreno lo permite pues no recomiendo frotar el dedo por el asfalto, para tratar de borrar este rastro invisible.

He probado esto en varias ocasiones y lugares y siempre he visto el mismo comportamiento: las hormigas al llegar a la zona "borrada" se detienen, tantean el terreno dubitosas de seguir.
En ocasiones dan media vuelta, en otras intentan bordear la zona vacía para encontrar la continuación del "rastro".

Mi experimento no confirma que frotando se borre el rastro, podría ser que la zona quedase mas caliente debido a la fricción y a las hormigas no les guste ese cambio de temperatura.

A continuación os dejo un vídeo que al fin he podido realizar, pues no conseguía encontrar ningún "rastro".


Un porcentaje muy bajo de individuos pasan "la barrera" sin ningún problema, pero la gran mayoría se para en seco al encontrarsela, dando varios tumbos hasta encontrar un camino alternativo.

No he podido grabarlo pero en la corteza de un aveto que tengo en casa el efecto aún es mas fuerte, durando "la barrera" mucho más tiempo que sobre la tierra.

miércoles, 23 de abril de 2008

Listar archivos de un directorio con C/C++

En la aplicación que estoy trabajando actualmente me ha surgido la necesidad de listar los archivos existentes en un directorio dado y listarlos en un "combo box". Dado que estoy desarrollándola para Windows, era obvio buscar una solución para este sistema.

Lo que encontré fue lo siguiente:

HANDLE hFind;
WIN32_FIND_DATA w32fd;
hFind = FindFirstFile( "fonts/*.*", &w32fd );
vector archivos;
if( hFind!=INVALID_HANDLE_VALUE )
{
do
{
TCHAR* Tfilename = w32fd.cFileName;
if( filename.size()>3 )
{
archivos.push_back( filename );
}
}while( FindNextFile( hFind, &w32fd ) );
FindClose(hFind);
}

Esta solución funciona, aunque para mi gusto depende demasiado de las definiciones (chungas) de Microsoft.
Sin embargo, otro acercamiento mucho mas independiente del sistema sería la siguiente, que hace uso de la librería Glib, la cual forma parte de GTK+ y compone multitud de estructuras de datos y funciones preparadas para ser compatibles tanto en windows como en linux.

La solución al listado de los archivos contenidos en un directorio usando las funciones de Glib es la siguiente:


GDir* dir = g_dir_open( folder, 0, NULL );
const gchar* file;
if( !g_file_test( folder, G_FILE_TEST_IS_DIR ) )
{
g_error( "Error: Directory not found FFFFFFFFFFFFF" );
}
else
{
while( file=g_dir_read_name( dir ) )
{
cout << "Fichero encontrado: " << file << endl;
}
g_dir_close( dir );
}

En esta ocasión no dependemos de otra librería más que de glib, disponible tanto para Linux como para Windows. Además de una ganancia en la claridad del código, pues no se usa ninguna estructura extraña (de esas que tanto le gustan a Microsoft). Lo único raro que podemos ver es ese tipo de datos gchar (es simple y llanamente un char) y GDir la cual es una estructura de la que no nos tenemos que preocupar ya que de su manejo se ocupa completamente Glib.

Para más información sobre estas funciones: página de referencia.

miércoles, 16 de abril de 2008

Firefox 3 y los Favicons

Firefox 3 está a la vuelta de la esquina (aunque ya corre la beta hace tiempo) y con él parece que al fin se acabó con uno de los fallos más tontos que tenía este navegador (y creo recordar que también sufria IExplorer): la visualización de los favicons al lado de cada url de nuestros marcadores.

Los favicons son los pequeños iconos gráficos que tienen (pueden tener) las páginas web y que normalmente los navegadores muestran justo al lado de la dirección en la barra de urls.

Firefox 1/2 mostraba este icono también en nuestros "marcadores" ("favoritos" para los profanos), pero a menudo ocurría que el favicon mostrado no era el correcto, ocurriendo incluso que varias direcciones intercambiasen sus iconos.
Pues bien, parece ser que con Firefox 3 esto se acabó! Eso sí, si hemos importado los marcadores de una versión anterior y tenemos algún icono traspapelado deberemos visitar esa página para que el gráfico se arregle.

Lo sé, era de lo mas tonto y podía esperar, pero a la tercera va la vencida.

viernes, 11 de abril de 2008

El mundo sin humanos

Soy leyenda [I'm a Hero] rescató la idea de un mundo sin humanos.
Life after people y Population Zero son dos documentales producidos por History Channel y National Geographic respectivamente que profundizan en este interesantísimo tema.

En ambos se parte de una repentina desaparición de la especia humana; no queda ni un solo humano en pie. A partir de ahí se analizan por un lado el constante deterioro de todo aquello que hemos creado y por otro, el avance imparable de la naturaleza con el objetivo de recuperar lo perdido.

Uno de los temas más curiosos es la cantidad de seres vivos que dependen directamente de nuestra existencia: mascotas, ratas, cucarachas (sí, cucarachas). Aunque siguen habiendo muchos otros que su supervivencia depende de justo lo contrario, nuestra no-existencia. Las diferentes razas de perros sufren la ley del más fuerte, en la que los individuos mas de ir por casa sucumben ante los más fuertes. Los insectos que invaden nuestros hogares dejan de tener un invierno cálido donde refugiarse y poco a poco se ven forzados a volver a sus hábitats naturales.

Los dos documentales son muy similares, ya que casualmente tratan los mismos aspectos en muchas ocasiones.
Quizás Population Zero se centre mas en el comportamiento de la naturaleza, pero también da muchos detalles sobre el deterioro de nuestro patrimonio que Life after people deja por alto y viceversa. En resumen, ambos se complementan perfectamente.

miércoles, 9 de abril de 2008

Instalar GTK+

GTK+ es una librería escrita en C para la construcción de interficies gráficas con la peculiaridad que es multiplataforma, esto es, que con cambios mínimos es posible portar un programa de Windows a Linux (y viceversa). Al menos en lo que respecta a la interficie de usuario.

domingo, 6 de abril de 2008

CHIP-8

A mediados de los años 70 se creó un lenguaje de programación interpretado para su uso en los micro-ordenadores de 8-bits COSMAC VIP y Telmac 1800.
Como en Java, los programas escritos en CHIP-8 eran ejecutados usando una máquina virtual que interpretaba las instrucciones al vuelo. Este lenguaje fue utilizado (y creado) para escribir de una manera sencilla video-juegos compatibles para los sistemas mencionados.

20 años después, algunas calculadoras gráficas incluyeron interpretes de dicho lenguaje permitiendo usar los juegos existentes en estas calculadoras.

CHIP-8 tuvo una "ampliación", denominada SCHIP (Super Chip) que permitía una resolución un poco más alta que la de su antecesor: 128 x 64 píxels. Como curiosidad, en 2007 se introdujo una nueva extensión al lenguaje (MCHIP) permitiendo una resolución mayor (256x192) así como usar colores y sonido.

En la actualidad existen multitud de emuladores (o interpretes) de este sistema. Una larga lista la encontramos en Let's emu CHIP-8.
De los últimos en aparecer se encuentra el de Etk que hace poco escribió un emulador para la consola Nintendo DS en pocos días.
Téneis un enlace a su página web en Mis enlaces, o aquí: http://etk.scener.org/


La pequeña cantidad y relativa sencillez de las instrucciones de CHIP-8 lo convierten en un "sistema" sencillo de emular, siendo uno de los más recomendados por los que empezar para los que se inician en este mundo.

The Big Bang Theory

The Big Bang Theory es una comedia americana aparecida el pasado año 2007 de la cual no se habla demasiado pero que apunta maneras.


Leonard y Sheldon son dos jóvenes con mentes prodigiosas destinadas a realizar grandes avances en sus respectivos campos científicos. Por otro lado son unos ineptos para las relaciones sociales y junto a sus colegas Howard y Rajesh pasan los días echando partidas a juegos de rol por internet, ir a cenar a restaurantes temáticos y escribir largas formulas en pizarras vileda.

Todo cambia cuando llega Penny (la rubia guapa que cada serie debe que tener) al edificio:
los chicos quedan prendados de ella y empieza la aventura por cortejarla.

The Big Bang Theory tiene muchos toques frikies y eso puede hacer que a no todo el mundo le hagan gracia sus escenas, pero si os gusta la ciencia, navegáis a menudo por internet u os gustan las rubias, no dudéis en buscar esta serie en los habituales lugares de subministros.
La serie sufrió el parón de los guionistas sufriendo una pausa en su capítulo número 10, pero hace pocas semanas ha vuelto en antena y actualmente se emite cada lunes.

Podéis encontrar subtítulos en wikisubtitles.

viernes, 4 de abril de 2008

La loca del futuro

Año 2006.
Un viajero del tiempo llega a nuestros días anunciando a bombo y platillo que nos trae la salvación venida del futuro. ¿Una vacuna que lo cura todo? ¿Energía limpia? ¿Un sistema económico más justo?
No señores, la chica nos trae: ¡¡La lejía del futuro!!!!

La chica está loca, se ha escapado de un manicomio (un loquero del futuro claro), ha robado una maquina del tiempo y ha viajado al pasado a mostrar su obsesión más profunda; Las cualidades maravillosas de la lejía: No salpica, no amarillea, no diluye colores, anti-roturas... es la lejía perfecta.

A ver señores, a quien le entra en la cabeza que alguien venga del futuro a traernos lejía en vez de darnos la combinación ganadora de la primitiva del próximo jueves?

Este mi blog

Otro blog más.

Este en concreto va a servir para verter todas las reflexiones que me vengan a la cabeza sobre lo que se ve cada día.

Aunque también publicaré otras cosas relacionadas con la programación (mi actual ocupación), internet y todo ese tecnológico.

Y ya está, solo era eso.