Mostrando las entradas con la etiqueta Programacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Programacion. Mostrar todas las entradas

miércoles, octubre 16, 2024

Could not load file or assembly

Había estado teniendo este problema en una aplicación que desarrollé hace años, pero que recientemente se tuvo que implementar Modern Authentication, y en consecuencia el uso de nuevas librerías.

El error que me encontré, y que me hizo dedicarle algunas horas, era el mensaje de 

"Could not load file or assembly [ NombreDLL  ]  " y el NombreDLL era alguna de las siguientes:

System.ValueTuple

Azure.identity

Azure.Core

System.Memory


Hice algunos intentos de mi parte que creí que lo solucionarían, como el de agregar las librerías desde el NuGet Package Manager, actualizar a las versiones más recientes, recrear el instalador, pero seguía apareciendo el error, si no era una era otra.

Así que apliqué la receta que todo programador conoce y es buscar en internet y en particular en Stackoverflow.

Encontré varios enlaces que me dieron pistas, pero no la solución, aquí pongo los enlaces que me dieron algunas pistas:

https://stackoverflow.com/questions/70585425/how-to-resolve-could-not-load-file-or-assembly-azure-core

https://nickcraver.com/blog/2020/02/11/binding-redirects/

https://stackoverflow.com/questions/4469929/could-not-load-file-or-assembly-or-one-of-its-dependencies

https://stackoverflow.com/questions/70585425/how-to-resolve-could-not-load-file-or-assembly-azure-core


Como nada resolvía mi problema, y varios resolvían su problema, pensé que en mi caso particular había algo diferente, así que fue comenzar desde cero, e hice lo siguiente:

  1. Desinstalar todas las versiones del programa (usando el instalador de Windows).
  2. Recrear el archivo de instalación agregando el proyecto (no el EXE).
  3. Instalar la última versión de .NET, en este caso el 8.
  4. Instalar el programa con la nueva versión.


y después de eso, ya no se presentó el problema.


 


 






jueves, noviembre 21, 2013

Fin de Winamp?



He leído la noticia que Winamp llega a su fin y que ya no estará disponible para descarga a partir del 20 de diciembre del 2013.

Realmente es una pena que esto suceda siendo que Winamp es para mí sin duda, hoy por hoy, el mejor reproductor multimedia y organizador multimedia que existe.
Este reproductor lo vi y use por primera vez a fines de 1999 y lo que más me atrajo fue su ecualizador y la simplicidad de su interface, que a la vez se podía minimizar.

Actualmente sigo usando Winamp, es el único que me permite tener organizada la música como realmente la quiero, se carga rápido, es ligero, no es obstrusivo, y permite todavía minimizarlo sin ocupar espacio en la barra de tareas. Esto sin contar con los cientos de "skins" disponibles.
 
Ciertamente existe mucha competencia, y aplicaciones similares vienen precargadas por default (léase  iTunes o Windows Media Player); pero creo que aun cuando Winamp no ha tenido un desarrollo o avances de grandes magnitudes, es bastante bueno y diría mejor que sus contrapartes.

Al parecer a Winamp le llega el ciclo... 15 años de estar "online" sin haber cambiado el nombre ni cambios sustanciales, realmente es mucho tiempo para un programa de software, lo cual habla de que es realmente un buen programa que estableció una marca.

Aunque el simple hecho de que AOL no haya dicho el por qué da de baja Winamp...  será que realmente lo dará de baja?, o será un truco para llamar la atención? Esperemos al 20 de diciembre a ver que pasa.




jueves, abril 19, 2012

Desplegar una imagen en Crystal Reports desde VB 2010


El problema era que tenia que imprimir un gafete con la imagen de la persona.

El punto era como podria indicarle al campo de imagen cual archivo tomar? Ya que no se puede acceder a las propiedades de un objeto insertado tan facilmente.

Aunque esto ya lo habia hecho con Crystal Reports allá como a mediados de los 90's, la verdad es que no me acordaba, pero despues de jugar un rato con CrystalReports y su editor de formulas, me acordé:

La solución que implementé es la siguiente:

1. Crear un campo de formula en el reporte, en mi caso lo nombré "PicFileName".
2. Insertar un "OLE Object" del tipo Paintbrush Picture.
3. Darle formato al objeto OLE, en el tab de Picture, en "Graphic Location:" puse algo como
    "My-directorio-donde-almaceno-las-fotos\" + {@PicFileName}

En la sección del código, el que se ejecuta para desplegar el reporte, (en mi caso el evento Click) puse algo como:
...
frmCRBadge.CrystalReport.DataDefinition.FormulaFields("PicFileName").Text = "'" & Nombre-del-Archivo-de-Imagen & ".jpg'"
...

Y listo, cada vez que selecciono un registro diferente se muestra el reporte con su correspondiente imagen.

NOTA: Nombre-del-Archivo-de-Imagen  yo uso el ID del registro que le corresponde, así cada vez que se selecciona un registro diferente, el Nombre-del-Archivo-de-Imagen se actualiza solito.




martes, enero 04, 2011

Ciclo de Vida de Desarrollo de Software - Scrum & Waterfall-

Recientemente he visto acerca de las metodologías para el desarrollo de sistemas/software/programas. Y lo que me ha llamado la atención es que existe un debate acerca de la metodología Scrum vs. En Cascada (Scrum vs. Waterfall).

Lo que se ha criticado fuertemente a la metodología En Cascada es que ahora reúne todo lo malo lo que una metodología puede tener: mucha documentación, es muy costosa, requiere mucho tiempo, desgasta a los equipos de trabajo, no hay unión entre líder/gerente-programador/desarrollador,  estresa a la persona, y si eso no fuera poco, el producto resultante por lo general termina enlatado o no funciona del todo.

Por el otro lado quienes apoyan a la metodología "Scrum"... si, efectivamente según reune todo lo opuesto a lo antes mencionado.
Scrum es una metodología dentro del desarrollo de software "Agil" (Agile).


Aun a pesar de lo anterior, hay quienes dicen que la metodología "en cascada" todavía se sigue usando aunque otros dicen que ya no se usa o que solo se usa en proyectos super-mega gigantescos y/o con un presupuesto de similares magnitudes.

Si algo puedo decir de ambas metodologías, es que no creo que "En Cascada" este en desuso, pero tampoco creo que "Scrum" sea la solución de todos los males.
Cada una tiene sus ventajas y desventajas, cada una puede tener sus adaptaciones, y cada una puede ser apropiada para determinado tipo de proyecto.

"Scrum" asume o parte de que el recurso humano está comprometido con el proyecto, o que no va a "desperdiciar" los recursos de la empresa. Eso no es siempre cierto y no siempre sucede.

Por el otro lado, "en cascada", sí requiere de mayor esfuerzo en cuanto a planeación, y diseño. Creo que uno de los graves problemas de "en cascada" es porque asume que el sistema una vez definido este no cambia.


Bien, no quiero seguir con un debate interminable, o decir que una metodología es mejor que la otra; sino simplemente dar un punto de vista, hacer mi aporte y describir la metodología que he seguido -y sin ser arrogante- realmente me ha dado excelentes resultados.

El debate que percibo, parece que dan por sentado que solo estas dos metodologías son las unicas o las principales: Scrum o En Cascada.
Pero evidentemente existen muchas más, incluso pudieran entenderse que una es una variante de otra, o que una clasifica a otras, por ejemplo: Espiral, Iteraciones, Prototipo Rápido, Modelo V, RAD, etc.

Que es lo que me ha servido o funcionado?
No es cascada, ni tampoco Scrum, lo que me ha funcionado es una combinación de metodologías.
Cuando tengo que realizar un sistema, antes de seleccionar la metodología y seguirla, primero debo entender el objetivo principal del sistema, y saber qué es lo que se espera del sistema, de igual forma saber los limitantes en cuanto a tiempo y recursos tanto económicos, humanos y tecnológicos.

Efectivamente, no podría aplicarse la misma metodología para un programa en el que tienes dos desarrolladores, a uno que tienes 20, o uno que tiene 500 dólares en presupuesto, a uno de 50 mil dólares, o un sistema donde solo una persona lo va a manejar y tienes todo el tiempo que necesites para terminarlo, que un sistema donde 100 personas lo van a usar y necesita estar terminado en tres meses.

Existen muchos factores a tomar en cuenta para seleccionar la o las metodologías a usar.
Creo que en la mayoría de los proyectos, se usa una metodología hibrida, o como dije anteriormente analizar el proyecto y seleccionar la adecuada.

Por mencionar un ejemplo sencillo de uno que desarrollé, era para una empresa maquiladora (no daré el nombre por privacidad) pero esta empresa tenía un software que manejaba 'casos de clientes', cada caso era simplemente un archivo que se descargaba mediante FTP y al terminar el proceso al que se sometia, se volvía a subir por FTP. Ellos ya tenían un programa que les administraba los casos, pero me llamaron para mejorarlo (como no tenían el código fuente, tuve que volverlo a hacer).
El requerimiento de ellos fue tan simple como:
"Queremos que el nuevo programa haga lo que hace el actual, mas aparte..." y era una lista con alguna docena de requerimientos adicionales.
También fueron claros en cuanto a la interface, ellos dijeron --No queremos que se modifiquen las pantallas, estamos acostumbrados a ellas, y queremos que sean iguales-. y mencionaron el tiempo y el presupuesto al que debería sujetarse el proyecto.

Tenía que adherirme a su presupuesto y tiempo. Hice un breve análisis y planeación, emplear la metodología de Prototipos, Scrum, En Cascada, o Espiral, no fue necesaria. Y la metodología principal que apliqué fue RAD (Rapid Application Development), ya que simplemente era re-hacer las pantallas (el programa que ellos tenían era mi prototipo), programarlas, e implementar los requerimientos adicionales. No querían entregas parciales, querían el producto en producción pero totalmente terminado.
En 45 días tenían el programa funcionando, en producción ya probado y sin bugs. No hubo iteraciones, no hubo sprints, no hubo juntas diarias, simplemente porque no era necesario,  hacerlo era retrasar el proyecto.

El resultado final y real: lograron manejar de entre 600-800 casos diarios que hacian con el anterior programa, a cerca de 1000 a 1200 diarios, y el proyecto fue terminado en la mitad de tiempo y presupuesto.

El desarrollo de software no es tan simple como escoger lo último en tecnologia, con lo último de metodología para asegurar el éxito; en muchos casos, sino es que en todos, el análisis, la planeación y el factor humano son decisivos.

martes, noviembre 02, 2010

SQL Filtro de Registros por Hora

Tenia un SQL que filtraba registros por hora -sin fecha-, o basado en un horario.
El caso era, obtener el nombre del horario en el cual una persona deslizaba/marcaba su gafete/badge.


Funcionaba en Access sin problemas:
" SELECT -campos-" +
" FROM   -tabla-   "+
" WHERE  HoraInicial < #" + DateTime.Now.ToShortTimeString() + "#" +
" AND HoraFinal> #" + DateTime.Now.ToShortTimeString() + #'";

Donde "DateTime.Now.ToShortTimeString()" es la hora en que la persona deslizaba su gafete.

Pero ahora que modifico el programa -en C# - y leer los datos desde SQL Server, esto pues no funciona, creí que solo reemplazando los # (gatitos o pound o sharp) por ' (comilla simple) funcionaria, pero no fue así.

Para no reinventar la rueda, googleé por unos minutos, pero las respuestas que encontraban no me satisfacian porque se tenia que crear funciones y agregarlas a la base de datos, cosa que para este caso no es lo recomendable y hubo otras que estan completamente equivocadas. por ejemplo no distinguen entre AM y PM, o bien tienes que hacer malabares con la fecha para obtener la hora, etc .

Después de haber visto algunas otras soluciones, hubo una que me ayudo a completar el filtro que necesitaba, finalmente quedo :
" SELECT -campos-" +
" FROM -tabla-" +
" WHERE " +
" CONVERT(VARCHAR,HoraInicial ,108) <= '" + DateTime.Now.ToString("HH:mm:ss:") + "' " +
" AND " +
" CONVERT(VARCHAR,HoraFinal ,108) >= '" + DateTime.Now.ToString("HH:mm:ss:") + "'";

Esto es para mi futura referencia, y por si caso a alguien mas le pueda servir.

domingo, diciembre 20, 2009

Programar o Desarrollar Rápido

En el sitio http://codigodemaquina.org, hicieron la pregunta "¿Cómo programar o desarrollar más rápido?", hice mi pequeña aportación dando algunos puntos que me han ayudado a desarrollar y terminar aplicaciones en un muy corto lapso de tiempo.
Actualmente no soy desarrollador o programador, hace ya algunos años fuí, de hecho esos fueron mis primeros trabajos, como 'Programador', 'Software Engineer' y 'Project Leader', actualmente ya no es mi principal actividad, pero sí es algo que me ha gustado, creo que es porque todos mi proyectos fueron terminados exitosamente. Y me ha gustado al grado que he estado trabajando en un proyecto en mis tiempos libres,y próximamente estaré anunciando el lanzamiento de ese programa.

Bueno, quiero listar esos puntos en este espacio con un poco de mas detalle,como una forma de compartir el conocimiento y espero sirvan a más de uno -osease aparte de mi-.

Los puntos que me han ayudado a programar mas rápido son:



  1. Tener un bosquejo de lo que vas a hacer primero en papel. Ya sea una función, una pantalla, un procedimiento, una clase, etc.
    No me ha funcionado el ir rápidamente y sentarme a programar, cuando hacía eso, muchas veces tenia que rediseñar lo que habia hecho;  El tenerlo en papel, y literalmente en papel, es porque me permite llevarme el diseño de lo que estoy haciendo a todos lados, y hacer modificaciones segun sea necesario o hacer comentarios al momento.



  2. Definir bien lo que hará tu programa, de preferencia hacer un listado de las funciones o requerimientos que debe de hacer tu programa, y ponle fechas de implementación o cuándo ya deben de estar implementadas/programadas.
    Tener un objetivo, claro y simple de lo que hace tu programa, aunque muchas veces puede pensarse que es obvio, por ejemplo, diseñar/hacer un "Sistema de Inventarios", aunque sea eso, trato de definir un objetivo de ese sistema, por ejemplo, el sistema de inventarios, cual sería su principal objetivo?... facil se piensa en "tener control de las existencias de las mercancias", pero muchas veces las empresas piden un sistema porque tiene un problema identificado... si la empresa dice "necesito un sistema porque se me pierde la mercancia", entonces ese seria un primer objetivo, o bien otro seria "necesito un sistema porque me quedo sin mercancias y nos damos cuenta muy tarde", entonces el diseño del sistema se enfocaría en esos aspectos... cuando ya el sistema esta desarrollado, muchas de estas cosas estarían incluidas, pero cuando tienes que decidir entre qué prestanciones debe de tener el sistema, tu objetivo principal te dirá cuales deben de implementarse, y cuales debe de posponerse. Las funciones o requerimientos deben de apoyar a ese objetivo principal, y junto a esas funciones deben de tener una fecha de implementación o de cuándo estarían listas.


  3. Tener una maquina rapida y multicore (tengo una quad core), ya que te permite el verdadero multitasking.
    Suena obvio, pero es preferible tener el equipo mas rápido posible, el multicore o la máquina que actualmente tengo, ha sido una maravilla, puedo tener ejecutando una máquina virtual donde este 'testeando' una aplicación, instalando varias aplicaciones y evitar basura en mi maquina principal, etc. Y evitar esos saltos que hace como que se congela la maquina por algunos instantes. A veces esas lentitudes, hacen que se pierdan segundos, o perder el hilo al ritmo que llevas.

  4.  Aprenderte de memoria atajos de teclado, tanto de Windows como de editores o de cualquier programa común que uses.
    No esta de mas decir que cuando estas haciendo algo con el teclado, resulta en perdida de algunos segundos el tener que ir a agarrar el mouse, solo para, por ejemplo, compilar, o ver las propiedades del proyecto, o cambiar a otra ventana, o etc... El teclear y aprenderse atajos o comandos, -debo reconocer- es algo que he aprendido de los 'linuxeros'.

  5. No pierdas tiempo programar-surfear-programar-surfear, mejor dedícate un tiempo solamente para programar, y despues surfeas en la red.
    Para algunos les funciona, para otros son vicios, pero en lo personal, hay momentos en los que puedo estar programando y surfeando, pero en la mayoría de los casos, he sido más productivo cuando solo me concentro en programar.

  6. No programes cansado.
    Como casi en toda actividad, el trabajar estando cansado, simplemente no funciona, no avanzas y estas propenso a cometer errores. En mi experiencia, no tan solo afectas el trabajo que haces, sino tambien al equipo en el que estas trabajando, tu humor ya no es el mismo.

  7.  Lleva una bitácora de lo que haces, de lo que harás, y de lo que has hecho. Te sorprenderás la cantidad de tiempo que te ahorras en acordarte y memorizarte cosas cuando inicies a programar.
    Creo que esta sugerencia, deberia de ser la primera, el llevar listas de pendientes, o cosas por hacer o de ideas, ayuda mucho. Te ahorras tiempo en recordar, y memorizar, cuando desarrollas; entre mas pequeño sea el equipo de desarrollo, más cosas tienes que tener en la mente, tienes que trabajar con más cosas al mismo tiempo. Una agenda o un simple cuaderno de notas, evita la pérdida de tiempo.. incluso sugeriria que esa agenda fuera siempre de una o maximo dos hojas que liste los puntos por hacer, o que recientemente hiciste, o ideas a revisar. Si tienes más hojas que esas, trata de reducirlas.No debe de caerse en ahora tener que perder tiempo en administrar la 'agenda' o perder tiempo en pasar hoja tras hoja tras hoja buscando cosas.
    Con tan solo ver una página o dos, debes de tener toda la información necesaria de tu proyecto y programa.


  8. Ten a la mano lápiz y papel cerca (como no uso dos monitores, el papel y lápiz me ayuda bastante).
    Todavia no tengo dos monitores, espero el próximo año tenerlos, pero mientras tanto, el tener papel y lápiz a la mano me ayuda bastante, el hacer diagramas rápidos, el hacer anotaciones que me pueden servir más adelante, me ha ahorrado mucho tiempo en estar haciendo clicks en ventanas o abrir y cerrrar aplicaciones.
    He pensado y probado los desktops virtuales, pero me quitan recursos, y no me han funcionado ya que dejo de ver la pantalla principal. Si tienes dos monitores, tal vez esto no te ayude mucho, pero en mi caso, me ha servido.

  9. Lee libros, te ayudará a no reinventar la rueda y aprenderás cómo hacer las cosas más rápido.
    No tan solo te ayuda a ver soluciones de algo que pudieras necesitar más adelante, sino tambien te da ideas de cómo hacer las cosas, y otra forma de hacerlas, y es más te ayuda a verificar si tus métodos son buenos o necesitan mejorar.

  10. Si te tardas en implementar algo, déjalo y comienza otra cosa, despues regresa y verás que lo puedes solucionar más rápido.
    Es como despejar la mente, es como salir de un "loop", si en algo te atoras, simplemente déjalo para mas tarde, date un 'break', inicia otra cosa, avanza en esas cosas fáciles y rápidas que se pueden hacer y terminar pronto; después regresa a eso que esta llevando tiempo y dedícaselo, cumpliendo con el punto 6 anteriormente listado.


  11. Tener un buen ambiente que te permita concentrarte sin interrupciones.
    A algunos nos gusta programar con musica, unos con musica clásica, otros con musica estridente,cada quien puede definir su "buen ambiente", el punto es que permita tu concentración y que no te interrumpan, muchas veces tienes la idea, solo es cuestion de trabajarla, o incluso ya encontraste la solucion y estas implementando, en mi caso, cuando me interrumpen, siento una sensacion de aquellas, que cuando esta a punto de romper el record o llegar a la final del videojuego, se va la luz. Es algo frustrante. Muchos preferimos trabajar en la madrugada, otros ya muy noche, otros encerrarnos en la oficina, esto con el propósito de concentrarse y avanzar sin interrupciones.

  12. Tener equipo que te haga sentirte cómodo, pantalla grande, buen teclado, silla comoda.
    En la medida de las posibilidades, tener todo que te haga sentirte cómodo; por ejemplo: pantalla grande, buen teclado, buen mouse, etc. En mi caso, quisiera tener una silla Aeron, pero a veces no se puede, y para cumplir con este punto, de sentirse cómodo, mejor adquirí uno de estos (para la silla que uso), que a juzgar de lo que he probado, no tiene nada que pedirle a una Aeron. En fin, trata de tener o hacer todo para que tengas un entorno agradable, y que te haga sentirte cómodo.

  13. Y aunque suene obvio, aprende a teclear sin ver el teclado.
    Suena obvio y lógico, entre más rápido escribas más rápido programas.
Para ver el post original en codigodemaquina.org, sigue el link.

jueves, mayo 07, 2009

Error detected by export DLL

Al tratar de exportar un reporte de Crystal Reports a excel, obtuve este mensaje de error:
"Error detected by export DLL"
Error in File .rpt: Error detected by export DLL

Se arregló al instalar el siguiente patch:
ftp://ftp1.businessobjects.com/outgoing/CHF/crnet11win_en.zip

lunes, abril 06, 2009

Fecha en formato relativo (Relative Time)

Debido a que estoy mejorando unas características de un sistema de Help Desk Interno, una de esas mejoras es mostrar la fecha en formato relativo, o en otras palabras en el formato "NN DDD Ago" donde DDD= Days, Months, Years.

La aplicación esta en VB .NET, pues empecé a jugar un poco con Datediff y varios IFs, tambien googlee un rato, encontré que ya habia algo hecho, pero hasta donde ví, era para C# y otros lenguages, así que tomando una idea de ahi, y basado en lo que habia comenzado. -Realmente era poca la diferencia en cuanto a la logica, lo que tomé de ahí era que todo lo manejaban en segundos, mi primer version convertía a horas, despues a dias, luego a meses y finalmente a años, esto para ahorrarme la multiplicacion de segundos, y la division por cada unidad de tiempo- pero bueno, aún con eso, quedó mas simple:



Mejoras pueden hacerse, las cuales son bienvenidas.

domingo, enero 25, 2009

Apuntadores en C o C++ -Ejemplo-

Debido a una peticion de poner un ejemplo acerca de el uso de apuntadores ver post Apuntadores en C o C++ -Conceptos-, expondré un ejemplo práctico del uso de apuntadores.

Este ejemplo trataré de que sea sencillo, simplemente es una lista donde se almacenan números,
se dan de alta y se pueden dar de baja y se pueden listar. Eso es todo lo que haría el programita.

Primero mostraré el ejemplo ejecutándose, y al finalizar mostraré el código fuente.
Como es por demas evidente, la importancia de esto no es el "qué", sino el "cómo", en otras palabras, no se usará ningun programa visual, ni UI ni mucho menos.


Este seria la pantalla principal












Al seleccionar la opcion 1, podemos insertar el numero, digamos el 100
El programa lo inserta en la lista, y si hay más de uno lo insertará al final.
Insertemos algunos numeros...







Los listamos














Digamos que ahora queremos borrar el dato
"102" que ocupa la posicion 3 de la lista.
(no me salgas que es la posicion 2 OK?)










Los volvemos a listar:









Ahora el codigo fuente:

void Menu();

void Insertar();

void Eliminar();

int MostrarDatos();

void Salir();



typedef struct Lista

    {

       int dato;

       struct Lista *siguiente;

     } tipoNodo;

     

Lista *Inicio;  //Apuntador al inicio de la lista

tipoNodo *pNodo;

typedef tipoNodo *List;



int main(int argc, char* argv[])

{

    Menu();

    getch();

    return 0;

}



//--- Funciones --------------

void Menu(){

int opc;

clrscr();

cout<<"1.- Insertar elemento en la lista"<<endl;

cout<<"2.- Eliminar Elemento de la lista"<<endl;

cout<<"3.- Mostrar datos de la lista"<<endl;

cout<<"4.- Salir"<<endl;

cin>>opc;



   switch(opc){

      case 1:

          Insertar();

          getch();

          Menu();

          break;

       case 2:

          Eliminar();

          MostrarDatos();

          getch();

          Menu();

          break;

       case 3:

          MostrarDatos();

          getch();

          Menu();

          break;

      case 4:

          Salir();

          break;



      default:

       cout<<"Esa opcion no existe, elige una de las disponibles"<<endl;

       getch();

       Menu();

       break;

 }

}



void Insertar(){

    tipoNodo *ante, *ptr;

    /// ante    apuntador que apunta al registro anterior

    // ptr apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    Lista *tmpNodo= new(tipoNodo);

    // tmpNodo  apuntador temporal,  es el nuevo registro que se va a insertar.

    if(!tmpNodo)  //verifica si pudo obtener memoria

    {

    cout<<"Memoria Agotada";

    return;

    }

     cout<<"Ingresa el numero"<<endl;

     cin>>tmpNodo->dato;

     cout<< "Dato Ingresado: ";

     cout<< tmpNodo->dato;



    if (!pNodo)

    { /*si esta vacia la lista, lo pone al inicio*/

        tmpNodo->siguiente=NULL;

        pNodo=tmpNodo;

        return;

    }

    ante=NULL;  //apuntador que apunta al registro anterior

    ptr=pNodo;   //apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    while (ptr)

    {

        ante=ptr;

        ptr=ptr->siguiente;

    }

    /* inserto al final  */

     ante->siguiente=tmpNodo;

     tmpNodo->siguiente=NULL;

     return;

}

void Eliminar(){

    int DatoAEliminar, contador, numelementos;

    tipoNodo *ante, *ptr;

    contador=0;

    ante=NULL;  //apuntador que apunta al registro anterior

    ptr=pNodo;   //apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    numelementos=MostrarDatos(); //Muestra los datos como referencia al usuario.

    cout<< "\n\r  Dame el # del dato a eliminar: ";

    cin>> DatoAEliminar;

    if (DatoAEliminar>numelementos){

    cout<< "Elemento no existe, seleccione uno de la lista";

    return;

    }



    while (ptr)

    {

        ++contador;

        if (contador == DatoAEliminar){ // lo encontro, entonces lo borra



            if (pNodo->siguiente == NULL) {  //Es el primer elemento y el unico

                pNodo=NULL;

                return;

            }

            if (pNodo->siguiente == ptr->siguiente){ //es el primero, pero hay otros enlazados

                pNodo=ptr->siguiente;

                return;

            }

            if (ptr->siguiente != NULL){ // es alguien de enmedio a borrar

                ante->siguiente=ptr->siguiente;

                ptr=NULL;

                return;

            } else {     //es el ultimo

                ante->siguiente=NULL;

                ptr=NULL;

                return;

            }

        }

        //se va al siguiente

        ante=ptr;

        ptr=ptr->siguiente;

    }

    return;

}



int MostrarDatos(){

    tipoNodo *ptr, *ante;

    int contador;

    contador=0;



    ptr=pNodo;

    clrscr();

    cout<< "- Listado - \n\r";

    cout<< "\n\r";

    cout<< " # : Dato \n\r";

    cout<< "---  ----- \n\r";

    while(ptr)

    {

        ante=ptr;

        cout<< ++contador;

        cout<< "  : ";

        cout<<ante->dato;

        cout <<"\n\r";

        ptr=ptr->siguiente;

    }

    return contador;

}

void Salir(){

    cout<<"Pulsa una tecla para salir"<<endl;

}

viernes, octubre 31, 2008

Apuntadores en C o C++ -Conceptos-

Hace algunos días un amigo (hola Moi!) me pidió ayuda acerca de como usar apuntadores en C++. El esta estudiando su carrera en sistemas computacionales y le pidieron hacer un programa que manejara listas, listas doblemente enlazadas, listas circulares doblemente enlazadas, y listas -con otros nombre extraños-.

El caso es que le redacté un documento breve de qué son los apuntadores, y como podría usarlos, así como darle uno que otro tip para usarlos.
Empecé a hacer memoria de lo que nos habían enseñado en el Tec, y este es el documento resultante.

- Si he cometido alguna imprecisión, por favor háganla saber ya que fueron hace algunos años que lleve 'estructura de datos' donde me vi "obligado" a aprender el lenguaje C y C++. -
Creo que el documento sí le sirvió ya que pudo terminar su programa sin problemas -tengo su acuse de recibo-.

Este es el contenido del documento:
=================================================================
Un apuntador no es más que un indicador a una dirección de memoria.

Para entender un poco esto, digamos que la memoria (La memoria RAM), tiene dos valores principales. 1. Su contenido, y 2. Su dirección.

El contenido es para saber que valor esta almacenando en la memoria.
La dirección es para saber en qué parte o ubicación de la memoria esta ese valor.

Por ejemplo, una variable guarda el valor. Un apuntador apunta la dirección.
NOTA: Con un apuntador también puedes consultar el contenido de la memoria (sin necesidad de usar una variable).

Pero a diferencia de la variable, un apuntador te da más ‘poder’ o ‘control’ sobre tus recursos, en este caso la memoria.
Con una variable puedes guardar valores fijos.
Con un apuntador tu límite es la capacidad de la memoria RAM. (es decir tu puedes usar o manejar la memoria a conforme la necesites).

Supongamos que declaras una variable de tipo char y la declaras como “chrLugar”, y le asignas el valor de “ZIHUA”.
Y supongamos que declaras un apuntador *prtLugar y apunta a la dirección donde comienza ZIHUA.
Si vemos eso en la memoria RAM seria algo asi:
Con la variable, tu accederías a ZIHUA, la variable ve como un todo, y no te interesa saber en qué parte de la memoria está siendo usada.

Si accedes a ZIHUA con un apuntador, usarías *prtLugar.
NOTA: *prtLugar te da el contenido. Con &prtLugar te da la dirección.

Para comparar y diferenciar:
Variable = chrLugar valor: ZIHUA
Apuntador= *prtLugar valor: ZIHUA
Direccion= &prtLugar valor: 1018

NOTA: Aunque el apuntador *prtLugar apunta a una dirección… realmente te devuelve el contenido.
Eso es lo básico para entender apuntadores.

Para entender listas enlazadas (de cualquier tipo, ya sea circular, doblemente enlazada, doblemente enlazada circular, etc.)

Es necesario entender dos cosas:
1 Apuntadores.
2 Estructuras (cómo definir un struct en C)

Y aparte debes de tomar en cuenta lo siguiente que es muy importante sobre todo en listas doblemente enlazadas:
El orden de insertar o agregar un elemento en la lista.
El orden de quitar o remover un elemento en la lista.

(Debe de revisarse siempre el orden en que se agrega o se remueve un elemento).

Ejemplo de una lista, supongamos que tenemos un listado de Nombres y teléfonos.
Debemos de manejar siempre un apuntador que apunte a la raiz (root) o el primer elemento.
Y debemos de tener un apuntador que hará los barridos o recorridos.



De lo anterior tenemos una lista.

Un apuntador raiz (*root) que apunta al primer elemento (Juan).
En la estructura tenemos un apuntador (*sig) que apunta al siguiente elemento.

El último elemento (Luis), su apuntador sig, apunta a NULL. Ya que no hay mas elementos en la lista.

Cuando queramos insertar un nuevo registro en la lista, debemos de buscar a “*sig” y que sea NULL, entonces a ese lo apuntaremos, de NULL al nuevo elemento.

Cuando queramos borrar un elemento, debemos de buscar el valor por ejemplo queremos borrar a Hugo, y hacemos que el apuntador de Juan, apunte a Luis. Y haciendo eso, Hugo esta removido de la lista.


Si quieres mas detalles avísame

lunes, octubre 20, 2008

Entorno de desarrollo local WAMP (Windows, Apache, MySQL y PHP) 2da Parte


Instalacion de Virtual PC 2007 SP1
La instalacion, es igual que la instalación de cualquier otro programa. solo hacer doble click en el ejecutable, y hacer click en "Next" hasta "Finish".









Creación del ServidorVirtual en VPC 2007 SP1.
Mucho dependerá de las características del equipo existente.







Creo que el 25% de la memoria para las funciones de servidor local, es suficiente.

solo va a haber un usuario conectado.

Yo tengo 2GB en mi PC.










Si le dedicas de 5-10GB iniciales a tu servidor, tambien serán suficientes, aunque si la aplicación a construir tendrá videos, fotos, etc. entonces será necesario dejarlo que crezca dinámicamente.










Instalación de Apache

La instalación de apache, tambien es sencilla, pero son necesarias ciertas configuraciones adicionales.

Da click en "Next" siempre.










Al llegar a esta opción, teclea la info requerida.
Si estas usando un MB con dual network card. o posees dos tarjetas de red, tendrias que ver qué IP address obtiene el servidor virtual. Puedes ver la IP local con el comando "ipconfig" tecleadolo en la ventana de comandos.
En otro caso, puedes usar "localhost".

Esa misma IP address se pone en Network y Server Name.




Como podrás ver, apache funciona una vez configurado.
Si notas, el servidor virtual esta como "localhost" pero fuera del Virtual Server, el explorador apunta a la IP address (esto es porque tengo doble tarjeta de red).









Como configuración final, tendrias que ir al directorio conf del directorio donde se instaló Apache, y buscar por:

DirectoryIndex index.html

y agregar "index.php" despues de index.html
adicionalmente ubicar el directorio de los archivos html o .php cambiando las lineas:




DocumentRoot “C:/Program Files/Apache Software Foundation/Apache2.2/htdocs”

a algo asi como:
DocumentRoot “C:/MYDIRECTORY”

donde MYDIRECTORY es el directorio donde estaremos ubicando todos los archivos del website.

Instalación de MySQL

Como en la mayoria de las instalaciones, haz click en "next".
Selecciona "Typical Install"
Selecciona "Standard Configuration"
Checa "Install As Windows Service"

Cuando te pregunte la instalacion por un password, introduce uno, el cual sera para usar el cliente de la linea de comandos de MySQL






Configuracion adicional para MySQL
tendrias que crear la base de datos (CREATE DATABASE MiBaseDeDatos)
y agregar un usuario donde le das acceso a la base de datos.
Una vez terminado eso, puedes crear las tablas, relaciones, etc.







Instalacion de PHP.


Igual... click en "Next"











Selecciona la version del HTTP Server que estaras usando, en nuestro caso Apache 2.2.x.












Se tendria que especifcar qué base de datos se estará usando para ser incluida.
En nuestro caso MySQL.








Listo, ya se tiene todo instalado y listo para empezar a desarrollar.

Puedes apoyarte del FileZilla tanto del cliente como del servidor para tener todo el entorno completo para transferir archivos. Asi ya que tengas tu website listo, solo cambiarias las IP Address, y todo funcionaria exactamente igual. Es decir ahora estarias apuntando a tu servidor en internet que al servidor virtual local.




Debo reconocer que parte de este post, fue basado en.

lunes, octubre 13, 2008

Entorno de desarrollo local WAMP (Windows, Apache, MySQL y PHP)

Entorno de desarrollo local WAMP (Windows, Apache, MySQL y PHP)

Hace algunos meses, tenía la curiosidad de desarrollar algo en PHP, pero no había tenido tiempo. Realmente no se mucho de PHP, conozco ASP, ahora recuerdo que sin saber ASP, realicé toda una aplicación en15 días (trabajos de freelance nunca están de mas), debo decir que le dedique una tarde para aprender lo básico, y de ahí en adelante, empecé el desarrollo en ASP, desde su administración, ABC de usuarios, empresas y demás entidades relacionadas para la aplicación.
Bueno, y ahora quiero saber un poco de PHP, en primera por una necesidad personal, y otra porque realmente quiero saber.

Así que documentaré como hice el setup del entorno de desarrollo, para en caso de que lo olvide ;) aquí lo tengo de referencia.


Esta es la primer parte, en cómo hacer setup de un entorno de desarrollo local usando Windows, Apache, MySQL y PHP.
Sí, hay más diversión con LAMP (Linux en lugar de Windows), pero hay diversas razones por las que prefiero Windows en lugar de Linux esta vez.

Por ejemplo:
1. Por practicidad que requiero y tengo en Windows. (evitar reiniciar la PC cuando requiero algo de Windows).
2. Para desarrollo local, no requerimos robustez o estabilidad que ofrece Linux.

Bueno, dejémonos de excusas y hagamos la lista de software que se requiere...

1. Microsoft Virtual PC
Aunque puedes tener todo el software instalado en un solo sistema operativo en la misma máquina, recomendaría que usaras MS Virtual PC, para que sea tu "Servidor Virtual", de esa forma tienes instalado todas las aplicaciones de un servidor en un lado, y tu desarrollo en otro lado. Así cuando no vayas a desarrollar, no es necesario estar terminando servicios o tener la PC lenta por los demás programas en el background.

2. Windows
Windows XP.

3. Apache
Se instalará en el Virtual Server

4. MySQL
See instalará en el Virtual Server

5. PHP
Se instalará en el Virtual Server

6. FTP Server
Recomiendo FileZilla Server.
Este se instalará en el Virtual Server

7. FTP Client
Recomiendo FileZilla Client
Para "subir" las paginas editadas; este es opcional, en caso de que se use un editor o programa que tenga incorporado el FTP.

8. Editor de Textos
Recomiendo Notepad++ o bien Programmer's notepad.
Para editar las páginas PHP.

9. Algun editor de imágenes.
Puedes usar el que tengas. Uno que ocasionalmente uso es el Gimp

La próxima entrega, será de cómo hacer la instalación y setup de todo eso, para que funcione y hagamos los primero pininos.