Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas

viernes, 12 de febrero de 2010

/ IDEs para C++



Estaba un poco cansada de las ventanas de Eclipse o NetBeans para trabajar con C++, la mayoría de ellas no aportan demasiado, además de ser entornos pesados.
Decidí analizar otros entornos open source para desarrollar en C++ y encontré dos que han sustituído, para proyectos importantes, a code::Block.

> CodeLite, viene con MinGW por defecto para Windows,
multiplataforma, viene con plugin para crear proyectos con wxWidgets , soporte para plugins, depurador integrado, autocompletado de código (code::Block no lo trae por defecto) y soporta varios compiladores, entre otras cosas.

> wxDev, sólo para Windows (es una extensión de Dev-C++) con caraterísticas similares al anterior, pero menos completo, la ventaja es que tiene una interfaz visual para crear proyectos con wxWidget.

El que más me ha gustado es CodeLite por ahora.
No tengo decidido sustituir completamente a Eclipse/Netbeans por estos "nuevos" aun, pero para cierto tipos de proyectos prefiero esta opción.





miércoles, 2 de diciembre de 2009

/pasando ArrayList o Vectores mediante webServices (Java)



Debía comunicar datos remotamente, los mismos "viajaban" mediante valores de retorno de las operaciones de webservices.
Los datos estaban en estructuras pertenecientes a bibliotecas de Java, como ArrayList.
El problema es que al recibir los datos, no respetaba el comportamiento de dicha clase (o estructura ArrayList), esto es, no tenía operaciones que me permitieran acceder a sus datos, ni recorrerlos. Como por ejemplo, iterator().

Solución: debí fabricarme un vector con los datos.



@WebMethod
public DataLicenciaWeb[] getLicenciasxConductor(@WebParam(name = "ci") int ci,@WebParam(name = "idInt") String idInt)
{
.........................
//Declaro el ArrayList
ArrayList vLic = new ArrayList();
.
.
.
Iterator itl = null;
DataLicenciaWeb dlw = null;

while (it.hasNext())
{

while (itl.hasNext())
{
dlw = (DataLicenciaWeb)itl.next(); //dlw de tipo DataLicenciaWeb
if (dlw.getId().substring(0,1).equals(i.getPrefijo()))
vLic.add(dlw); // esta es la parte que importa
}
}
}

//Aqui viene la creación del vector.

DataLicenciaWeb []ret = new
DataLicenciaWeb [vLic.size()];

vLic.toArray(ret);
return ret; //No devuelve ArrayList, sino
un array de DataLicenciaWeb

}


Me queda por investigar este tema, es una solución paliativa, entendí que esto no debería suceder.







miércoles, 3 de junio de 2009

/instalando bibliotecas JEDI



Quizás esto le acorte el camino a algunos. Instalando las bibliotecas JEDI para Delphi 7 en Windows XP, al instalar las JCL (paso previo requerido para instalar sus componentes visuales JVCL), al elegir el directorio donde instalar los archivos .bpl me salía el siguiente error.

"Unable to create directory - JEDI installer"

El "error" estaba en que debo elegir la carpeta bpl que trae la instalación de Delphi, ya que me impedía crear una nueva. No probé si se debía a había un tema de permisos para poder instalarlo donde quisiera, pero me parece raro porque no he tenido ese problema con otros programas que he instalado.

Nota: No tuve este problema instalando estos componentes bajo Windows Vista.





miércoles, 11 de marzo de 2009

/data interesante (para desarrolladores)



Al menos para mi, un amigo por msn me pasa el link de un foro checo para mirar algunas cosas. Aunque es bilingue, su lenguaje oficial es inglés, y suele ser bastante serio para lo que se ve en los sitios donde se publican cracks (contenido sin virus, ni pedido de troyanos, etc, típico sitio para desarrolladores con urgencias :p). Para ver el contenido es necesario registrarse, lo que es gratuito por si hace falta aclarar.

Hay todo tipo de información, principalmente para desarrolladores o diseñadores web, desde e-books, descargas con cracks-serials, hasta información sobre drivers. Vale la pena referenciarlo.

Andaba buscando algo acerca de Delphi Architect 2009, sigan el thread, porque asi tienen la info completa, incluso los updates.

Y esto para el que le interese el Ms Visual Studio 2008.





domingo, 8 de marzo de 2009

/tutoriales javascript y photoshop



En mi recorrida por Smashingmagazine, resalté de las muchas estas dos cosas.

40 bibliotecas JavaScript muy livianas creadas para usos específicos , y catalogadas según su fin, que a diferencia de las mas conocidas (jQuery, MooTools, et ) que también cubren estos requerimientos lo hacen en detrimento del tamaño del archivo que aumenta bastante.
Puede complementarse con estas técnicas JavaScript, aqui.

Una recopilación de técnicas para trabajar textos con Photoshop, interesante para ver las nuevas tendencias y la explicación de sus autores.





jueves, 6 de noviembre de 2008

/declaración de variables en Firebird



Estoy usando Firebird como motor de base de datos (open source, liviana, rápida, y considerablemente completa).

Situación: estaba creando procedimientos almacenados y disparadores, en ellos necesitaba declarar variables locales.
Cuando compilo el script, me sale error en la declaración de la variable. Leo la documentación que provee el sitio, y para mi sorpresa estaba respetando la sintaxis.
Para aislar el error, comenté el resto, y en efecto, la parte conflictiva estaba en la declaración de variables.

La documentación consultada fue: Developers Guide, Embedded SQL, Language Reference.

En un foro me dan la respuesta, la documentación tiene impresiciones, la declaración de la variable debe ir antes del cuerpo del procedimiento/disparador, o sea antes del BEGIN:

Este es un ejemplo del código correcto y que funciona:


CREATE OR ALTER trigger pacientes_bi0 for pacientes
active before insert position 0
AS
DECLARE VARIABLE clave_pac INTEGER; /* Aqui debe ir antes del BEGIN*/
begin
if (new.cod_pac is Null) then
begin
EXECUTE PROCEDURE getcodpac 'Pacientes' RETURNING_VALUES :clave_pac;
new.cod_pac = clave_pac + 1;
end
/* Trigger text */
end



NOTA: No solo ya viene con Ubuntu, es además sumamente popular en Brasil, Italia y y otros países europeos, especialmente entre los desarrolladores Delphi, permite embeber la base de datos en un sólo archivo .DLL junto con su aplicación.





sábado, 1 de noviembre de 2008

/resolviendo problemas en delphi



Expongo aqui algunos problemas a los que me enfenté desarrollando en Delphi 7, movida principalmente porque la información en español es prácticamente nula.

Desconozco si estos problemas fueron solucionados en las versiones posteriores.


Herencia visual

Haciendo un framework para una aplicación, estoy en la siguiente situación. El Form padre tiene un dbgrid (grilla orientada a datos provenientes de alguna sentencia SQL).
Este form es una clase base, prácticamente una clase abstracta donde se definen sus controles y eventos de manera virtual.
La grilla no tiene definido los campos porque no sabe qué tabla será mostrada, éstos campos se definirán en el formulario hijo que es donde se ejecuta la sentencia SQL.

En el formulario hijo conecto el dbgrid con la fuente de datos usando ClientDataSets. Decido borrar uno de los campos, no me interesa que se vea. Lo hago desde el visor de propiedades del objeto dbgrid de la clase heredada:

y me sale el siguiente error:

"Selection contains a component introduced in an ancestro form which cannot be deleted"



Lo raro es que los campos no estaban definidos en el Form padre, pertenecen al form heredado, tendría que poder borrarlos. El lío parece estar por lo que pude ver en cómo maneja Delphi la clase TCollection (en este caso la de los campos), por lo menos hasta esa versión.

La solución la encontré modificando a mano, el archivo .dfm. Es un archivo de texto, fácilmente editable, donde Delphi guarda el código de las clases de los componentes visuales que hay en un form.
Lo que está marcado en azul, es lo que borré, luego grabé los cambios y voilá.


Puede pasar que deban reiniciar Delphi, quizás porque en mi caso no me di cuenta que estaba conectada a la base de datos, entonces al ejecutarlo sin salir aparecía otro error. Reiniciando se soluciona.


ClientDatasets

El dataSetprovider del clientDataSet estaba unido a una ibquery, componente que tiene la consulta con parámetros. Base de datos: Firebird.
De todos modos no importa el motor de base de datos, lo que importa es como deben estar ligados los parámetros de ClientDataSet y el ibquery que realiza la consulta.

ibquery.Sql :=
'Select campo1, campo 2 From Tabla where campo1 = :campo1 or campo2 = :campo2'

Mi idea inicial era cambiar el SQL asignando diferentes valores a los parámetros segun un criterio de búsqueda (por un parámetro u otro).
Los parámetros de ambos componentes se definieron en tiempo de diseño.

Cambiaba la sentencia SQL, pero no la cantidad de parámetros definidos (dos), ya que estos no cambiaban, solo variaba los que se usaban en la sentencia SQL:
Podría ser:
'Select campo1, campo 2 From Tabla where campo1 = :campo1'
o
'Select campo1, campo 2 From Tabla where campo2 = :campo2'

Cuando cambiaba el valor de los parámetros en tiempo de ejecución salía el siguiente error : "XSQLDA index out of range"

El código problemático era:

//asigno nuevo parámetro
cdsPacientes.params.ParamByName('CI').AsString := ci_pas;

//reabro para que realice la búsqueda con el
ibquery.sql := texto_sql;
cdsPacientes.Close;
cdsPacientes.Open;


Harta de buscar en internet, y como siempre en sitios en inglés, polacos o alemanes, que no se adaptaban a la situación que desencadenó mi problema, me avive siguiendo las sábanas de código que tiene Delphi.

El error estaba en que el ClientDataSet (que es 'alimentado' por los datos de la consulta ibquery), tenía mayor cantidad de parámetros definidos que los usados en la consulta SQL del ibquery. Deben tener la misma cantidad de parámetros. Si no hay concordancia entre los que usa el SQL y los definidos en el ClientDataSet, sale error.

Para mantener los parámetros, intenté poniendo valores inexistentes en los parámetros por los cuales no deseaba buscar. Pero no entiendo porqué ofrece problemas de filtrado. Decidí sencillamente omitir los parámetros, una pena porque pierdo cierto nivel de abstracción. La idea era modificar los parámetros sin tocar la sentencia SQL.






martes, 16 de setiembre de 2008

/programar juegos



Comparto unos links que pueden servir como punto de partida para la programación de juegos. La info en ellos es introductoria, pero de un abordaje lo suficientemente amplio y claro del tema.

para celulares: http://koderko.dk/J2METutorial/
nivel introductorio, pero muy claro, lo suficiente como para continuar avanzando con buena base.


para pc:
(todos orientados a C/C++ y de nivel introductorio)

http://www.tar.hu/gamealgorithms/index.html, técnicas y algoritmos para la creación de juegos. Centrado en las técnicas claves de las diferentes áreas, como la gráfica, red, y no exhaustivamente en cada una de ellas.
De todos los que menciono es el que aporta una visión mas global del game programming, describe su estructura, las etapas, etc.

http://lazyfoo.net/SDL_tutorials/index.php, este sí tiene un enfoque orientado
estrictamente a la programación: uso de SDL, openGL con C++.

sitios de referencia:
gamasutra, artículos, entrevistas, estado del video juego, recursos, foro, etc.
gamedev, de nivel mas introductorio que el anterior, pero tiene un foro activo, y artículos interesantes para quien recién se inicia.
gameprducer, contiene artículos relacionados a esta disciplina, foro, y pueden obtener un libro en .pdf sobre la producción de video juegos.
papers de pixar, no recuerdo donde encontré este link, de nivel-medio avanzado, es un blog de pixar donde además de hablar de sus películas, hace público el acceso a una serie de papers sobre programación gráfica, y de matemática aplicada al desarrollo de juegos. Recomendable.






domingo, 31 de agosto de 2008

/backup y restore desde aplicación Delphi



Hace poco el requerimiento de una aplicación era restaurar/respaldar una base de datos MySQL desde una aplicación Delphi.

De las opciones open source como interfaz entre MySQL y Delphi, los componentes Zeos me parecen los mejores, pero no tienen implementada la opción de backup/restore.

Personalmente recomiendo, además, un administrador externo para estas tareas por la independencia de la base de datos respecto a la aplicación que la utiliza.
De hecho el que viene con el motor MySQL es muy eficiente y gratuito: http://www.mysql.com/products/tools/administrator/. Permite hacer respaldos automáticos (mediante script FTP), o bien de forma manual.
Alternativamente MySQL ya provee algunas características incorporadas para respaldos en cada versión: http://www.mysql.com/products/backup/.

En definitiva cubrí las tareas de respaldo/restauración en los dos frentes, desde la aplicación, y un administrador externo.


Componentes:

Hay componentes que pueden incorporarse a Delphi para realizar esta tarea.
MyDAC, no es gratuito, solo versión de prueba. (Y no lo probé, total, no se iba a comprar)
ZlawMySQLBackup, gratis, para Delphi 7 al menos, no pude conseguirlo, por lo que leí está en fase de prueba. Por lo tanto no es aconsejable para producción.
Aun así, por las características que describe parece interesante, aunque engorroso de instalar (si es que lo encuentran).
MySQL BackUp Component, probado para Delphi 5, funciona también para Delphi 7.

Desaconsejo cualquier copia desde un simple administrador de archivos, el administrador de la base de datos, sabe qué estructuras copiar, y como modificarlas en caso que sea necesario.

Programación:
Otra forma es hacerlo desde código, sin usar componentes, que es por la que opté (de momento). Simplemente por simplicidad.
(Doy por hecho que el path del motor está en la variable de entorno PATH del sistema)

Respaldo

procedure TFormBackUpRestore.btnBackUpClick(Sender: TObject);
begin
ShellExecute(handle,'open', 'cmd.exe',
Pchar('/c "C:\MySql\Bin\mysqldump.exe" -h localhost -R
-u username -ppassword databasename > mibackup.sql ')
,nil,
SW_SHOW );
end;

Restaurar (cambio el redireccionamiento "<")

procedure TFormBackUpRestore.btnRestoreClick(Sender: TObject);
begin
ShellExecute(handle,'open', 'cmd.exe',
Pchar('/c "C:\MySql\Bin\mysqldump.exe" -h localhost -R
-u username -ppassword databasename < mibackup.sql ')
,nil,
SW_SHOW );
end;


ShellExecute, de la unidad ShellAPI se sigue usando por motivos de compatibilidad, lo invocado corre como una aplicación (arquitectura de 16 bits) y no de proceso.
Pero funciona.

Para arquitectura de 32 bits, debería usarse CreateProcess (unidad WinAPI), pero hay que adaptar su sintaxis a Delphi, en el help el ejemplo aun viene para C, lo que muchas veces ahuyenta a los que programan en Delphi.
En Delphi Corner hay un ejemplo de CreateProcess.







/saludables prácticas de programación (.NET)



Siempre es recomendable pasar por la sección Patterns & Practices de la MSDN, ha tenido algunos cambios estéticos para mejor, y mejoras en el tipo de contenido, como videos.
Entre tanto material de buena calidad y extenso, se incluye Software Factories para Web Clients y Web Services ya orientados específicamente a VS2008.

Lo mejor, y que recomiendo, es entrar al Catálogo completo y encontrar, el siguiente apartado Improving .NET Application Performance and Scalability que se puede descargar libremente (1150 páginas).





/embeber dll en proyecto .NET



En el trabajo se me presentó ese problema: importar una clase de una biblioteca C++ a .NET.
Hasta donde se, no se puede hacer de forma directa, sino que hay 2 posibilidades, y ambas complicadas por sus propios motivos.

a) Usar "ThisCall" en los atributos de las definiciones del Interop. En este caso hay que usar lo que se llama nombres ofuscados del C++: si el método se llama GetValue, hay que usar algo como GetValue@12%32..etc

b) Hacer un ensamblado en C++/CLI que envuelva a la clase de la DLL y luego usarlo en la aplicación como su fuera una clase C# común y corriente. Gran problema, pelearme con C++/CLI.
Me decidí por esta opción porque tiene la ventaja que puede ser utilizado por otros lenguajes.

No encontré demasiados libros sobre el tema, pero menciono dos en formato PDF que me aportaron bastante sobre el tema (ambos en inglés).

Principiante:
Pro Visual C++/CLI and the .NET 2.0 Platform, Stephen R. G. Fraser, Apress
Descargar

Principiante/Intermedio
C++/CLI in Action, Nishant Sivakumar, Manning
Descargar

Artículo de codeproject que sirve de introducción al tema.

(Si alguien tiene otra opción o libro a recomendar, avise, gracias)







domingo, 15 de junio de 2008

/taller de introducción a Processing



El taller de introducción a processing "...está dirigido a artistas visuales, diseñadores, músicos, arquitectos y a todas aquellas personas interesadas en la programación como medio creativo."


vía krahd






/funciones defaulted - C++




Caí bajo ciertos mitos acerca de C++ que me costaron 12 kg menos. Lo expongo porque quizás a alguien le ayude y le ahorre minutos valiosos.

Contexto: trabajando en C++, g++ bajo linux (SuSE).
Mito: asumir que el compilador siempre crea el constructor por defecto.

Situación: clase C con constructor por copia, sin constructor por defecto declarado.


class C
{
public:
C(const C& arg);
};



Luego cuando en el código declaramos objC:

C objC; //error: "no default constructor exists for class C"
C * pobjC= new C; //mismo error

Cuando se declara un constructor por copia el compilador no declara el constructor por defecto.

Esto puede solucionarse de dos maneras:

1- Creando manualmente el constructor

class C
{
public:
C(const C& arg);
C() {} // declaración y definición manual
};


C obj; // Funciona correctamente

A quienes les interese la eficiencia, declarar manualmente el constructor suele ser menos eficiente que la definición implícita del compilador.

Por eso se menciona la solución 2: funciones defaulted (es eficiente)


Class C
{
  inline C()=default;
};


Raras veces me he visto en la necesidad de apelar a una eficiencia tan ultra, por lo que suelo definir el constructor como vacío.
De todos modos es bueno saberlo, porque hay situaciones donde es necesario. El artículo de informit está interesante para entender varios tips sobre C++.


vía informit








miércoles, 14 de mayo de 2008

/aplicaciones XO (Proyecto Ceibal)



Paso el contenido de un mail que recibí hoy, por si a alguien pueda interesarle.

Llegó la hora de generar aplicaciones para los laptops XO. Uruguay se encuentra en una posición privilegiada, debido a la alta densidad de estos equipos de que estamos disponiendo, lo que da una gran base instalada sobre que puede utilizar nuestro software. Dicho de otra manera, los programadores uruguayos tienen el doble beneficio de poder brindar soluciones prácticas a las necesidades educativas (y, por qué no, de otros tipos) de nuestro país y al mismo tiempo, que estas puedan explotar por el mundo entero.

Para favorecer este intercambio, con el apoyo del LATU y la Facultad de Ingeniería se está organizando para este fin de semana un encuentro de programadores interesados en desarrollar para las XO: Ceibal Jam! La información se está actualizando constantemente en el wiki, donde es posible registrarse y participar.

El objetivo del encuentro es establecer un contacto inicial entre los interesados en trabajar en esta plataforma y comenzar a trabajar en algunos desarrollos de interés. Para ello, se van a hacer algunas charlas-talleres introductorios y luego nos organizaremos en equipos planteándonos pequeños objetivos de desarrollo. En particular, hay una iniciativa de desarrollar un sistema para facilitar la realización de blogs desde el laptop, que permita aumentar la producción de bolgs en las escuelas del país.

Los "Jam!" se realizan mucho en el primer mundo y consisten en juntar gente con intereses comunes y trabajar intensivamente por cierto período de tiempo para crear. Su origen está en los grupos de Jazz, que se realizan lasgas sesiones de improvisación, "Jam sessions", generalmente luego de un concierto. Es una nueva modalidad en nuestro país, pero esperamos que no sea el último encuentro de este tipo que se realice.

¡No dejes de concurrir!

Por información pueden ver estas páginas:
http://wiki.laptop.org/go/Ceibal_Jam

http://proyecto-ceibal.blogspot.com/





miércoles, 2 de abril de 2008

/error usando TClientDataSets (loading midas.dll)



Los TClientDataSets en Delphi, actúan como buffers del contenido de los datos de cualquier base de datos, logrando no solo un grado interesante de abstracción, porque su manejo es independiente de la base de datos que está detrás, sino que además suele mejorar la performance (ya que los datos están en memoria). Son imprescindibles para el desarrollo en capas.
Trabajando en un proyecto en Delphi y repentinamente, por esas insólitas probabilidades que atentan contra los pronósticos, comienzo a tener el siguiente mensaje de error, lo que me impedía trabajar con la base de datos. Mecachendieu.


En otras ocasiones, cuando algo similar me pasaba con una dll lo primero que hago es registrarla (al menos para determinar mejor el error, si es eso u otra cosa).

Luego de un Inicio -> ejecutar regsvr32 midas.dll funcionó.

Esta dll debe ser suministrada en el release de la aplicación, no es algo demasiado costoso ya que esa puede ser tarea del instalador. En caso que deseen omitirla para tener una instalación mas "limpia" deben incluir la Unit MidasLab, claro que el exe final se incrementará en unos 200kb.






/emprendimiento para Movistar



En el boletín de la ORT hay información sobre un llamado de Movistar (Telefónica), es abierto a profesionales independientes, estudiantes próximos a recibirse, o empresas nacionales para que presenten un proyecto (fuertemente) orientado a celulares.
Cada participante puede presentar mas de un proyecto siempre que los mismos sean independientes.

El plazo es hasta el 29 de abril. Mas info en el sitio de movistar. (No vi nada parecido en el sitio de Movistar Argentina, pero chequeen)

Relacionado con esto, por si alguno se anima menciono mobile.processing, un entorno de programación basado en java (j2me) open source, que puede facilitarles las tareas de desarrollo para móviles.
En particular imprescindible una vuelta por Exhibitions (donde hay varios ejemplos con código), y especialmente por la web de marlon manrique quien tiene algunas bibliotecas desarrolladas.







viernes, 7 de marzo de 2008

/Visual Studio 2005 + C#



Como ya se viene Visual Studio 2008, y recordando todo lo que pasé para desinstalar la versión express para instalar VS 2005, dejo aqui, cómo desinstalar VS2005, quizás ayude.

Además, una reseña breve a una de las características mas interesantes para C# 3.0, la inicialización rápida de objetos.






jueves, 21 de febrero de 2008

/Curso web gratuito (SUN)



Apoyando las tareas de incrementar el número de usuarios de su nuevo IDE multilenguaje y multiplataforma Netbeans 6 y de dar a conocer nuevas tecnologias basadas en Java, Sun ha comenzado a ofrecer, mediante su sitio Student Courses, un training online denominado "Real World Technologies: NetBeans GUI Builder, JRuby, JavaFX, and JavaME". Tal como su titulo lo indica, este curso cubre las bases de estas 4 tecnologías:

  • GUI Builder: este componente de Netbeans 6 permite la rápida y sencilla creación de interfaces para aplicaciones de escritorio mediante la utilización extensiva del mecanismo de drag & drop, garantizando además el correcto espaciado y ubicación de los elementos con la inclusión de guias de diseño que se ajustan al sistema operativo en el que se ejecuta la aplicación. Permite también una sencilla vinculación de los datos y los componentes de la interfaz mediante la incorporación en el IDE de la tecnología Beans Binding.
  • JRuby: una implementación 100% java del lenguaje de programación Ruby, ampliamente utilizado para la creación de aplicaciones web mediante el conocido Framework Ruby on Rails.
  • JavaFX: un nuevo lenguaje de scripting basado en Java utilizado para desarrollar contenido multimedia e interactivo para diferentes entornos. Al igual que el lenguaje en el que esta basado, garantiza la característica de portabilidad "write once, run anywhere".
  • JavaME: la plataforma mas conocida y utilizada en el desarrollo de aplicaciones para dispositivos móviles. Instalada en mas de dos billones de dispositivos, entre los que se encuentran: celulares, PDAs, impresoras y equipos para TV, JavaME incluye robustas características de seguridad, protocolos de red, interfaces flexibles y ayudas para sobrellevar las diferencias entre dispositivos.

El curso se encuentra en http://www.sunstudentcourses.com/course/, y puede accederse al mismo luego de pasar por un sencillo proceso de registro de usuario. El programa del curso incluye una introducción general, una introducción a cada una de las tecnologías, desarrollo de los contenidos mediante interesantes ejercicios (entre los que podemos destacar la creación de una aplicación JRuby on Rails que se conecta al servicio de Flickr y la creación de un sencillo juego para teléfonos celulares utilizando JavaME) y un homework a entregar por cada tópico desarrollado. Es interesante destacar que luego de entregar los cuatro homeworks, podrá accederse a un certificado en forma gratuita, que garantiza que poseemos los conocimientos brindados en el curso.

De más esta decir que las características del curso (online, gratuito, actual y certificado) lo hacen lo suficientemente interesante como para inscribirse y completarlo.

Saludos,
Equipo Juguy





jueves, 29 de noviembre de 2007

/redireccionamiento a red desde FoxPro 2.5 (DOS)



Si, es patético, pero bueno, cuestiones laborales, sigo padeciendo la mutación de un sistema en foxpro de monousuario a red como ya comenté.
FoxPro herramienta de desarrollo que ni siquiera su versión visual consigue entusiasmarme, herramienta cuyo uso quiero desalentar a toda costa.

Al asunto. Comparto la solución porque vi la pregunta en mas de un foro, y anduve por muchos, y siempre sin respuestas, pero sí con muchas 'vistas'. Quizás por lo trivial, pero cuando no sabés desconoces la trivialidad de tu duda.
Situación: aplicación monousuario desarrollada en FoxPro, como será compartida en red, se crea un servidor en una computadora que corre con Windows XP. En el mismo se crea la carpeta \\server\folder donde irán las tablas.
Necesito indicar en la aplicación, el path donde irán las tablas (esta versión desconoce de motor de base de datos, y sería mucho trabajo migrar a una mas nueva).

Aplico el comando set default to \\server\folder, primer problema, FoxPro no permite el redireccionamiento a redes (no acepta cadenas con \\).

Solución: montar el recurso compartido en una letra d
e unidad, es decir una letra de unidad mapeada a una ruta.
MiPC->botón secundario->Conectar a unidad de red
Asignar una letra, y debajo la ruta.
Ejemplo, letra Z y la ruta \\server\folder.




Habilito la opción 'Conectar al iniciar sesión' para que se conecte cada vez que se encienda la computadora.
Este procedimiento debe hacerse en todas las máquinas que corren la aplicación.
Todas apuntan al mismo lugar, X, en sus respectivos archivos de configuración ahora puedo escribir set default to x

Desventaja: la unidad Z queda disponible desde el explorador de Windows, no hay demasiadas opciones si no se cuenta con una base de datos en serio.
Cifrar la carpeta no serviría, desde consola podría entrarse, hay varios programas para poner passwords a las carpetas, ninguno logró entusiasmarme, y ninguno es del todo seguro.

cryptoforge (en español) y MyPrivateFolder, utilidad gratuita de Microsoft que require instalar el genuine validator (validar que tu copia sea original).







lunes, 19 de noviembre de 2007

/debugger con delphi - caso omiso al breakpoint



Ingominia de los bugs!, escena: desarrollando con Delphi 7, no anda una función que acabo de desarrollar. Acción a seguir: poner un breakpoint para comenzar a 'seguir' la función y encontrar su error.
Compilo, ejecuto, espero que se detenga en el break, ¡chan! nada, sigue de largo, no respeta los breakpoints, mi programa sigue de largo con un 'Access violation....'

Delphi tiene la particularidad, cuando se compila, en el margen izquierdo al comienzo de cada línea aparecen unos puntitos azules.
Esta vez no estaban. Decido hacer un build, ya que lo que hace es un compilado total sobre escribiendo las unidades incluso ya compiladas. Nada, siguen sin aparecer los puntos azules, por lo tanto iba seguir sin
poder depurar el programa.

Línea en rojo, donde está el breakpoint, los puntos azules, no están :p



Al menú: Project->Otpions->Compiler


En el apartado de Debugg tengo todo seteado como corresponde, 'Debugg information' seleccionado (aunque luego lo saqué, no era ese el problema).

Nota:
Es importante que en la etapa de desarrollo la información de Debug esté disponible, facilita el seguimiento del código en eventuales fallas.
Una vez que el código esté pronto para ser liberado, es conveniente deshabilitar las opciones de debug, disminuye considerablemente el tamaño del ejecutable final (y dejamos menos rastros para la ingeniería inversa).

El problema estaba en 'Code generation', debí deshabilitar la casilla de 'optimization' (marcado dentro de un rectángulo rojo). Cuando lo seleccionamos, el compilador elimina bucles innecesarios, variables que no se usan, etc.
Pero es importante deshabilitarlo para poder detectar errores.

Es muy raro esto que pasó, ya que el código donde puse el breakpoint era en un evento que debía ejecutarse necesariamente, no veo porqué el compilador lo optimizaría.
Esas modificaciones de configuración funcionaron. Programar, entender compiladores, se está volviendo una cuestión de fe.

Pero he visto que este tipo de traspié también puede deberse a un bug que sale a flote cuando se están llegando a las 65000 líneas de código, que no era mi caso (apenas 260).
En este foro de Borland comentan acerca de ese bug.