Entries Tagged 'Programacion' ↓

Maldita sea…!

Un sabor amargo me queda despues de hoy!

Sucede que estamos en medio de la implantación de un pequeño software en la Municipalidad de Puno y hace algunas horas nos dimos con la sorpresa que el tipo de dato time_t incrustado en la clase CTime solo soporta fechas desde 01/01/1970 al 31/12/2039… maldita sea!

Tendremos que trabajar algunas horas extra solucionando ese “problemita”.

Se había tomado la decisión de guardar las fechas en segundos para poder hacer mejor los cálculos posteriormente, creo que eso no va a cambiar. Pero se trabajo de igual manera con el resto de campos de tipo fecha. (craso error)

El problema saltó cuando se intentó registrar a alguien que había nacido en el año 1949: ¡Horror!

¿Por que no nos dimos cuenta? Aun que el problema pueda ser solucionado con unas cuantas líneas de código y previa modificación del modelo de la base de datos, ¿Por qué no pensaron en esto? (Esto se parece al problema de la memoria base de 256K) Creo que echarle la culpa a otros es de malos amigos, así es que dejémoslo ahí.

De ahora en adelante, utilizaremos la clase COleDatetime que evitarán sorpresas futuras y post’s como éste.

PD. Hay que estar preparados para el año 2039.

Articulos enviados en Marzo

Las semanas que pasaron nuestro servidor ha estado muy inestable, perdimos 2 meses de activad y muchos archivos, pero finalmente nos recuperamos del desastre y seguimos adelante con Latindevelopers.com

Teníamos pendientes 4 articulos por publicar:

Shell para Simulación

LaPetite - La Aplicación M.F.C. mas Pequeña

ImageCtrl

CARGAR JPG, GIF, BMP todo en uno

Espero que no vuelva a suceder el mismo desastre o que no afecte tanto a la comunidad.

Las proximas semanas vamos a terminar de implementar algunas secciones del site.

Problema solucionado ODBC Connector

MySQL Generalmente me conecto a MySQL con ayuda del controlador ODBC que provee el mismo MySQL. Como sabemos todo MySQL esta en pledo desarrollo, ocurre que se presentan situaciones que no fueron contempladas, por consiguiente hay errores que perjudican el desarrollo haciendo que uno tome precausiones antes de utilizar un codigo especifico. Muchos hemos crecido con MySQL y creo que si no hubiera sido asi lo hubieramos desechado por detalles como este que les voy a mostrar a continuacion.

Para no darle mas vueltas al asunto concretamente el problema es como sigue:

Cuando se intentaba leer un campo varchar (o relacionado) que este vacio o NULL, el controlador ODBC lo reconocía como UNKNOWN, evidentemente no podía realizarse el paso de valores al tipo CString o char* del Visual C++.

Para evitar ese problema se tenía que averiguar la longitud del campo que se va a leer, algo asi como esto:

ULONG len = 0;
rs.GetAccessor()->GetLength(2,&len); // segundo campo
if(len > 0)
{
	rs.GetFieldValue(2,sValue);
	//...
}

Esto sucedia con las versiones del ODBC Connetor inferiores a la 3.51.12. Ahora el codigo anterior se reduce a la linea que lee el campo y hace el paso del valor a la variable.

CString Trim

Quienes programamos en MFC Visual C++ algunas veces hemos tenido que eliminar los espacios en blanco de una cadena y sucede que la clase CString no tenia una sola funcion trim, sino las funciones TrimLeft y TrimRight.

Nose por que diablos demoraron tanto (o no se dieron cuenta) en agregar esa funcioncita.

Lo que se hacia normalmente es:

m_sCadena.TrimLeft();

m_sCadena.TrimRight();

Esto ahora ha causado un problema de compatibilidad con las versiones anteriores y no creo que sea la unica.

Leer datos MySQL desde C++ sobre Linux

Tux Programming Resulta que algunas veces es necesario acceder desde C++ a MySQL, razones hay muchas…. el asunto es como hacerlo.

Esta mañana intenté hacer una conexion sobre Fedora Core 3 con C++, tengo instalado MySQL 5.0.17, y mysql-devel 5.0.18 ( Todo eso lo pueden descargar de http://dev.mysql.com )

El codigo no es gran cosa, pero puede servir a muchos.

Enjoy!

//conexion.cpp

#include <iostream.h>
#include <mysql.h>

int main()
{
    MYSQL mysql;

    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql
		,"localhost"
		,"root"
		,""
		,"munipuno",0,NULL,0))
    {
        cerr<<"Horror ! : "
			<<mysql_error(&mysql));
    }
    char *query = "select * from maestro_departamentos";

    mysql_real_query(&mysql,query,strlen(query));
    MYSQL_RES *res = mysql_store_result(&mysql);
    MYSQL_ROW row;

    while ((row = mysql_fetch_row(res)))
    {
            cout << row[0] << ” ” << row[1] << endl;
    }

    mysql_close(&mysql);
    return 0;
}

Parametros gcc para compilar este programa.

gcc conexion.cpp -o conexion -Wno-deprecated
           -I/usr/include/mysql -L/usr/lib/mysql
           -lmysqlclient -lstdc++ -lz

El resultado de este programa es el siguiente:

[ivancp@servidor1 cpp]# ./conexion
01 AMAZONAS
02 ANCASH
03 APURIMAC
04 AREQUIPA
05 AYACUCHO
06 CAJAMARCA
07 CALLAO
08 CUSCO
09 HUANCAVELICA
10 HUANUCO
11 ICA
12 JUNIN
13 LA LIBERTAD
14 LAMBAYEQUE
15 LIMA
16 LORETO
17 MADRE DE DIOS
18 MOQUEGUA
19 PASCO
20 PIURA
21 PUNO
22 SAN MARTIN
23 TACNA
24 TUMBES
25 UCAYALI

SIAF GL sobre Linux

Es conocido por todos los que alguna vez pasaron por el sector publico que el Sistema Integrado de Administración Financiera (SIAF) es un software al que no podemos pasar por alto, a pesar de que esta hecho en Visual Fox y se presentan errores en el funcionamiento periódicamente. Pero nos guste o no tenemos que utilizarlo, de todas maneras el SIAF es la norma hecha Software.

Desde hace algunos meses vengo trabajando en la Oficina de Informática de la Municipalidad Provincial de Puno, y definitivamente tener funcionando el SIAF sobre un Servidor de Archivos Windows es vivir en zozobra.

Los virus, colgadas inesperadas, y innumerables pantallas azules indicando Error numero 0xADFD21244 y mas bla bla bla; me hicieron desechar el sistema operativo Windows del servidor y pasarme a Linux Fedora Core 3 con Samba para que los usuarios del SIAF no se den cuenta del cambio.

Cuando los residentes del SIAF o los del staff de soporte técnico venían a actualizarlo no sabían que hacer con el servidor, incluso preguntaban “¿Que Windows es éste?”

Desde aquel historico día, los problemas solo fueron del mismo SIAF ya no del sistema operativo. Aunque no esta muy difundido esto del Linux en las Instituciones Publicas del Perú, deberían tomarlo en cuenta, por que además de que ademas de ahorrar miles de dólares en licencias también se ahorran las molestias que causa Windows frecuentemente.

A todo esto, en las instituciones publicas es muy difícil implantar el software libre en los equipos usuario, por que ya están mentalizados en utilizar Word para sus documentos, Excel para sus hojas de calculo, por solo citar dos ejemplos. El software libre vive normalmente en el entorno académico, depende de nosotros que esto cambie.

Si desean asistencia en la instalacion de SIAF sobre Linux pueden escribir a ivancp [AT] latindevelopers.com

Los MVP’s

MVP Logo
Microsoft Most Valuable Professional (MVP) es una especie de galardon de reconocimiento a quienes destacan en el desarrollo y/o uso de aplicaciones Microsoft. Generalemente se encuentra a los MVP’s en los foros y comunidades de desarrollo.

Pueden encontrar mas al respecto en http://www.mvps.org/

Los MVP’s que a mi me interesan son los de Visual C++. Hay MVP’s de casi todas las aplicacioes de Microsoft.

MVP’s Visual C++:

Girish Bharadwaj http://www.gbvsoft.com

Rodrigo Corral http://rcorral.mvps.org

James Curran http://www.NovelTheory.Com

Ricardo González http://www.devsynergy.net/

Richard Grimes http://www.grimes.demon.co.uk

Alok Gupta http://www.thatsalok.com

Doug Harrison http://www.eluent.com

David Lowndes http://www.jddesign.co.uk/

Randy Charles Morin http://www.kbcafe.com/

Katy Mulvey http://www.mulveyfamily.com/~katy

Thomas Wai Ho Phan http://www.entersys.com/Twhphan.aspx

Tomas Restrepo http://www.winterdom.com/

Bliss Sloan http://www.ertin.com/sloan.html

Thomas Woelfer http://www.woelfer.com/

Coding Standards

Al empezar con esto de la programacion uno adopta una forma de escribir el codigo. Este codigo no siempre es bien visto por quienes tiene experiencia (como si se tratara de caligrafia).

No habia nada dicho al respecto de los estandares de codigo fuente, pero muchos se animaron a establecer estandares de “caligrafia” para el C/C++.

En este enlace pueden encontrar reglas que pueden seguir sin miedo para escribir sus programas en C/C++:

Coding Standards
http://www.possibility.com/Cpp/CppCodingStandard.html

GNU tiene sus propios estandares que hay que seguir para escribir codigo para GNU Linux. Se podria decir que es lo mismo, pero en este caso estas reglas estan hechas no solo para escribir codigo limpio sino tambien para que otros programadores entiendan lo que uno ha programado.

GNU Coding Standards
http://www.gnu.org/prep/standards/standards.html

Por mi parte puedo contarles que no me agrada mucho escribir las funciones de esta manera:

void
funcion (var1,var2)
int var1,
int var2
{
  //...
}

Por otro lado es mejor tener los corchetes bien acomodados para entender los bloques.

Prefiero que se vea asi:

int main(int argc, char *argv[])
{
	char str[80];
	while(cin.getline(str,80))
	{
		int len = strlen(str);
		cout<<endl;
		for(int i = 0 ; i < len ; i++)
		{
			cout<<ind(str[i],0,44);
		}
	}
	return 0;
}

que asi:

int main(int argc, char *argv[]){
	char str[80];
	while(cin.getline(str,80)){
		int len = strlen(str);
		cout<<endl;
		for(int i = 0 ; i < len ; i++)
		 cout<<find(str[i],0,44);
	}
	return 0;
}

Nuevo Articulo: Same Game

En una de esas encontré el problema del SameGame en la ACM. [Ver : http://acm.uva.es/p/v7/758.html]

Despues de resolverlo me animé a programar el juego en Visual C++ 6.0. Ya que hace mucho tiempo no programaba juegos y cosas asi para poder desestresarme. Espero que les guste.

Para poder resolver este problema utilicé un algoritmo de búsqueda recursiva simple, hace un tiempo atras (varios años) programé el juego de Bubble Puzzle ,con listas de listas y listas doblemente enlazadas, toda una complicación para aprobar el curso de Estructuras de Datos en el cual se eliminaban las bolitas de igual forma.

SameGame


SameGame.exe

El codigo fuente del juego lo pueden descargar de SameGame - Visual C++. Le hacen falta muchas mejoras, como por ejemlo: implementar la animación de la eliminación de los elementos, almacenar el score de los jugadores, mejorar la animación al estilo SameGame para linux, implementar una versión para linux, etc, etc.

Si alguien se anima a mejorarlo o ha encontrado un bug, puede enviarme un mail con las mejoras y volverlo a publicar.

Update:

Ahora pueden descargarse el juego compilado. (si presenta errores al momento de ejecutar envienme un mail)

Minesweeper - Busca minas

Minesweeper es uno de los cientos de problemas de la ACM, la idea es basicamente elaborar un algoritmo para resolver el problema del buscaminas. Pueden ver los detalles del problema en esta pagina: http://acm.uva.es/p/v101/10189.html

El problema planteado solamente tiene una entrada simple, pero pueda que la solucion que esten elaborando no resuelva todas las posibilidades. Para ello implementé un programita en c++ para generar entradas del tamaño que se indique, puede serles de mucha utilidad para testear sus programas.

#include <iostream.h>
int main(int argc, char* argv[])
{
    if(argc < 3)
    {
       cout<<”\nUso:\t”<<argv[0]<<” [N] [M] “;
       return 1;
    }

    int n = atoi(argv[1]);
    int m = atoi(argv[2]);
    cout<<n<<” “<<m<<endl;
    for(int i = 0; i < n ;i++)
    {
       for(int j = 0; j < m ;j++)
       {
          if(rand()%14 == 0)
          {
             cout<<”*”;
          }else
          {
             cout<<”.”;
          }
       }
       cout<<endl;
    }
   cout<<”0 0″;
	return 0;
}

Le programa produce la siguiente salida.

15 30
...............*.....*........
.*.....*......................
.................*.*...*......
...*.......*.*.....*..........
....................*.........
.............*...............*
........*.................*...
*.....*...*........*..........
..............*....*......*...
.*............................
.........*..........*.........
.......*.*....................
................*.............
..*.*....*....*..*.........*..
..............................
0 0

La salida de sus soluciones debería ser como sigue:

Field #1:
111000111000001*10001*10000000
1*10001*1000001121212121100000
11211011101121101*3*201*100000
001*1000001*2*10113*3111100000
00111000001132200012*100000011
0000000111001*100001110001111*
11000112*21111100011100001*111
*10001*212*10111002*2000022200
22100111011101*1002*200001*100
1*1000001110011100122100011100
111000113*2000000001*100000000
0000001*3*20000111011100000000
0112111132200112*2100000001110
01*2*1001*1001*22*100000001*10
011211001110011111100000001110