viernes, 26 de abril de 2019

Metodologías Ágiles en VFP de las Historias de Usuario al código - ppt descargar

Metodologías Ágiles en VFP de las Historias de Usuario al código - ppt descargar: ¿Quién soy? Martín Salías Arquitecto de Software Latinoamérica, USA, Canadá, Australia y Escandinavia Microsoft Consulting Services Microsoft MVP Editor en Jefe Universal Thread Magazine (3 años) Level Extreme .Net Magazine (actual) Miembro de la Agile Alliance Orador y colaborador de MSDN Cono Sur

miércoles, 17 de abril de 2019

Parser JSON para FOX (JSONFOX)

Hace unos meses comencé un proyecto llamado "El zorro peregrino" el cual consiste en mostrar el camino a través de la practica, a los foxeros que ya tienen sus años trabajando con este maravilloso lenguaje de programación; el camino mencionado es el de las nuevas tecnologías o tendencias de desarrollo.

He dicho por largo tiempo en grupos de debates y opiniones que la tecnología sube por ascensor y nosotros (los foxeros) subimos por escalera, esto quiere decir que cada dia literalmente nos hacemos más obsoletos y menos cotizables en el monstruoso mercado laboral.

Aún recuerdo aquella vez cuando fui a una entrevista de trabajo para desarrollador y me preguntaron que si hacía servicios web, entre mi dije, ¡Vaya, que será servicios web!, ¿será que son páginas web?, si digo que si entonces puede que me pregunten algo sobre eso y voy a quedar mal, más vale ser ignorante por 1 minuto que por toda la vida, mejor pregunto.

Les pregunté que si era hacer páginas web, me dijeron que sí entonces les dije que si sabia pero que no era mi fuerte. Más tarde me di cuenta de que me habian dicho que si solo porque ya no les interesaba y les daba igual mi respuesta.

Desde ese entonces sufri una gran decepción conmigo mismo porque no estaba al dia con los avances tecnológicos; me quedé estancado depurando errores en una empresa de software que terminaron cegándome al punto de sentir temor si algún dia me decidía a salirme del yugo patrono-empleado y comenzar mi carrera como freelancer.

Me di cuenta de que estaba muy por debajo del nivel que exigía el mundo tecnológico en ese momento asi que me dediqué a leer y actualizarme poco a poco, claro que siguiendo con Visual FoxPro porque era el que daba de comer (de hecho sigue dando).

Es por eso que comencé el proyecto El zorro peregrino, para que los programadores tengan una guia de como realizar la transición a este mundo moderno, seguramente muchos de los foxeros están desactualizados como me pasó a mi, lo puedo apostar porque en ese entonces era un venteañero, ahora tengo 33, soy un Foxero joven considerando los años que lleva el lenguaje y la cantidad de empresas de software que aún hoy dia siguen sostenidas por su software desarrollado en Visual FoxPro, lo cual se traduce en foxeros esparcidos por el mundo con un minimo de 15 años y un minimo de 45 años de edad.

Si fue dificil para mi adaptarme a las nuevas tendencias entonces no lo supone para ellos?

Bueno, dejemos tanta chachara y veamos el JSONFox

Es una libreria de código abierto que permite parsear JSON a un objeto o representación string, lo interesante de la librería es que nació de la necesidad de intercambiar información con las aplicaciones de Fox separadas en capas, por lo tanto era indispensable conseguir algún medio de transporte e intercambio de data entre los componentes de las capas y, sabiendo que Fox tiene compatibilidad bidireccional con Cursores y XML entonces se me ocurrió la idea de hacer el parser de JSON a XML y viceversa.

De esta manera ya tendríamos cubierta la necesidad de transportar data en formaro XML para luego serializar a un cursor (los cursores no se deben transferir entre capas)

Descarga la librería de github

https://github.com/Irwin1985/JSONFox

Hasta la próxima!!!



viernes, 5 de abril de 2019

Exclusiones de Archivos en un .gitignore

Aquí un archivo .gitignore que contiene los tipos de extensiones que debemos excluír del control de versiones con git.

Copia el siguiente contenido y pega en un archivo que deberás guardar en tu carpeta raíz como .gitignore

NOTA: debes usar un editor de textos como notepad++ ya que windows no te dejará guardar un archivo sin nombre.


# Contine la lista de los archivos y carpetas a ignorar
# Ignorar proyecto
*.pjx
*.PJX
*.pjt
*.PJT
# Ignorar todos los programas compilados, fomularios, menues y clases
*.scx
*.sct
*.SCX
*.SCT
*.mnt
*.MNT
*.mnx
*.MNX
*.mpr
*.MPR
*.vct
*.VCT
*.vcx
*.VCX
*.fxp
*.FXP
# Ignorar bases de datos, tablas, indices
*.dbf
*.DBF
*.cdx
*.CDX
*.dbc
*.DBC
*.dct
*.DCT
*.fpt
*.FPT
*.dcx
*.DCX
*.irt
*.IRT
*.tbk
*.TBK
# Ignorar reportes
*.frx
*.FRX
*.frt
*.FRT
# Ignorar archivos temporales
*.bak
*.BAK
# Archivos ejecutables
*.exe



Extraído de: https://github.com/ircsasw/VFPconGit/blob/master/.gitignore

martes, 2 de abril de 2019

Imprimir un PDF usando Adobe Reader

Extraído de: https://www.foxite.com/archives/print-a-pdf-file-0000080476.htm

lcOldPrinter = SET('Printer',2)
lcPrinter = GetPrinter()
IF lcOldPrinter <> lcPrinter
   DECLARE Integer SetDefaultPrinter IN WINSPOOL.DRV String
   IF SetDefaultPrinter(lcPrinter) = 0
      messagebox("Cannot change default Windows Printer")
   ENDIF
ENDIF

DECLARE INTEGER ShellExecute IN SHELL32.DLL ;
        INTEGER lnHWnd, ;
        STRING lcAction, ;  
        STRING lcFileName, ;
        STRING lcExeParams, ;
        STRING lcDefDir, ;
        INTEGER lnShowWindow

DECLARE Sleep ;
  IN WIN32API ;
  INTEGER nMillisecs

IF ShellExecute(0,"open", FULLPATH(This.cDefaultOutputFile),"","",1) > 32 
   oShell = CreateObject("WScript.Shell")
   IF VARTYPE(oShell) = "O"
      *wait for Acrobat reader
      lntimeout=60
      lnstarttime=SECONDS()
      DO WHILE not (oShell.AppActivate("Adobe Reader") OR oShell.AppActivate("Adobe Acrobat")) AND ;
                      SECONDS()-lnstarttime<lntimeout
         sleep(2000)
      ENDDO

      IF oShell.AppActivate("Adobe Reader") OR oShell.AppActivate("Adobe Acrobat")
         oShell.SendKeys("^p")   && print the file
         lnstarttime=SECONDS()
         DO WHILE NOT oShell.AppActivate("Print") AND SECONDS()-lnstarttime<lntimeout
            sleep(2000)
         ENDDO
         IF oShell.AppActivate("Print")
            oShell.SendKeys("{ENTER}")
         ENDIF
         lnstarttime=SECONDS()

         * While printing, Acrobat reader cannot be closed; so repeat attempts to close it.
         DO WHILE (oShell.AppActivate("Adobe Reader") OR oShell.AppActivate("Adobe Acrobat")) AND ;
                           SECONDS()-lnstarttime<lntimeout
            oShell.SendKeys("^q")   && try to close Acrobat reader
            sleep(2000)
         enddo
      endif

      oShell=.null.
   ENDIF
ELSE
   MESSAGEBOX("There's a problem with the Acrobat Reader.",64,'Reader problem')
ENDIF

IF lcOldPrinter <> lcPrinter
   * Reset back to original printer default
   SetDefaultPrinter(lcOldPrinter)
ENDIF