miércoles, agosto 26, 2020

Recuperar contraseña postgres 12 en Linux Mint

En mi equipo tengo instalado Linux Mint 20 y para un proyecto instale PostgreSQL, no lo use por un tiempo y ahora que quiero usarlo me pide contraseña para el usuario postgres. La verdad que no recuerdo haber puesto una contraseña y no encuentro cual es la contraseña por defecto. No soy un guru en este tema por lo que me puse a investigar como restablecer la contraseña, lo dejo aquí por si otro es igual de despistado que yo.

Esto lo hice de la siguiente manera:

Lo primero es editar el archivo pg_hba.conf y agregarle la siguiente línea:

host    all      postgres    127.0.0.1/32     trust


 


Luego de editar el archivo hay que reiniciar el servicio:

service postgresql restart

Luego de reiniciar el servicio pude entrar a cambiar la contraseña del postgres:

psql -h localhost -U postgres

ALTER USER postgres with password 'NuevaPassword';
\q

Después de cambiar el password edite el archivo pg_hba.conf, reinicie el servicio de postgresql nuevamente y pude verificar que efectivamente había podido cambiar la contraseña.




 

 

miércoles, julio 29, 2020

HAPI FHIR for Dummies (20200601)

Cuando estamos arrancando con HAPI FHIR una cosa que me ayudo mucho es que existe un servidor público de test. Para acceder al servidor público tengo que acceder a la siguiente url: http://hapi.fhir.org/


Este servidor de test fue muy útil al comienzo de mi investigación sobre HAPI FHIR.

HAPI FHIR for Dummies (20200701)

Si te encuentras en la etapa de aprender sobre HAPI FHIR aquí va un Tip de los mas básicos.
Cuando te encuentras frente a un servidor HAPI FHIR lo primero que debes hacer para saber que es lo que se encuentra disponible en ese servidor es acceder a su "metadata". Para hacer una prueba puedo acceder al servidor de test de hapi: http://hapi.fhir.org/baseR4/metadata




Ejemplo de la respuesta:


HTTP 200 OK
Response Headers
X-Powered-By: HAPI FHIR 5.1.0-SNAPSHOT REST Server (FHIR Server; FHIR 4.0.1/R4)
Content-Type: application/fhir+xml;charset=utf-8
X-Request-ID: NhDkIGO8AFlOSg6K
Response Body
{
"resourceType": "CapabilityStatement",
"status": "active",
"date": "2020-07-29T15:43:40+00:00",
"publisher": "Not provided",
"kind": "instance",
"software": {
"name": "HAPI FHIR Server",
"version": "5.1.0-SNAPSHOT"
},
"implementation": {
"description": "UHN Test Server (R4 Resources)",
"url": "http://hapi.fhir.org/baseR4"
},
"fhirVersion": "4.0.1",
"format": [ "application/fhir+xml", "application/fhir+json" ],
"rest": [ {
"extension": [ {
"url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-websocket",
"valueUri": "/websocketR4"
} ],
"mode": "server",
"resource": [ {
"extension": [ {
"url": "http://hl7api.sourceforge.net/hapi-fhir/res/extdefs.html#resourceCount",
"valueDecimal": 500
} ],
"type": "Account",
"profile": "http://hl7.org/fhir/StructureDefinition/Account",
"interaction": [ {
"code": "read"
}, {
"code": "vread"
}, {
"code": "update"
}, {
"code": "patch"
}, {
"code": "delete"
}, {
"code": "history-instance"
}, {
"code": "history-type"
}, {
"code": "create"
}, {
"code": "search-type"
} ],
"versioning": "versioned-update",
"conditionalCreate": true,
"conditionalUpdate": true,
"conditionalDelete": "multiple",
"searchInclude": [ "*", "Account:owner", "Account:patient", "Account:subject" ],
"searchParam": [ {
"name": "_language",
"type": "string",
"documentation": "The language of the resource"
}, {
"name": "owner",
"type": "reference",
"documentation": "Entity managing the Account"
}, {
"name": "identifier",
"type": "token",
"documentation": "Account number"
}, {
"name": "period",
"type": "date",
"documentation": "Transaction window"
}, {
"name": "patient",
"type": "reference",
"documentation": "The entity that caused the expenses"
}, {
"name": "subject",
"type": "reference",
"documentation": "The entity that caused the expenses"
}, {
"name": "SearchByMsgDate",
"type": "date",
"documentation": "Search by patient for a MSH.7 agreement, which is stored in Patient Resource"
}, {
"name": "name",
"type": "string",
"documentation": "Human-readable label"
}, {
"name": "_id",
"type": "token",
"documentation": "The ID of the resource"
}, {
"name": "type",
"type": "token",
"documentation": "E.g. patient, expense, depreciation"
}, {
"name": "status",
"type": "token",
"documentation": "active | inactive | entered-in-error | on-hold | unknown"
} ]
}, {
"extension": [ {
"url": "http://hl7api.sourceforge.net/hapi-fhir/res/extdefs.html#resourceCount",
"valueDecimal": 83
} ],
"type": "ActivityDefinition",
"profile": "http://hl7.org/fhir/StructureDefinition/ActivityDefinition",
"interaction": [ {
"code": "read"
}, {
"code": "vread"
}, {
"code": "update"
}, {
"code": "patch"
}, {
"code": "delete"
}, {
"code": "history-instance"
}, {
"code": "history-type"
}, {
"code": "create"
}, {
"code": "search-type"
} ],
"versioning": "versioned-update",
"conditionalCreate": true,
"conditionalUpdate": true,
"conditionalDelete": "multiple",
"searchInclude": [ "*", "ActivityDefinition:composed-of", "ActivityDefinition:depends-on",
"ActivityDefinition:derived-from", "ActivityDefinition:predecessor", "ActivityDefinition:successor" ],
"searchParam": [ {
"name": ....


La lista es muy extensa ya que es el servidor público de hapi pero seguramente el servidor que me encuentro desarrollando tenga una lista menor, por ejemplo mi servidor local tiene la siguiente lista:


http://localhost:7070/hapilocal/fhir/metadata


Al acceder a la "metadata" de mi implementación se muestra lo que tengo disponible hasta el momento.




HTTP 200 OK
Response Headers
X-Powered-By: HAPI FHIR 5.0.2 REST Server (FHIR Server; FHIR 1.0.2/DSTU2)
X-Request-ID: lbcIeZTv5EZMae6L
Response Body
{
"resourceType": "Conformance",
"publisher": "Not provided",
"date": "2020-07-29T12:04:08-03:00",
"kind": "instance",
"software": {
"name": "HAPI FHIR Server",
"version": "5.0.2"
},
"implementation": {
"description": "HAPI FHIR",
"url": "http://localhost:7070/hapilocal/fhir"
},
"fhirVersion": "1.0.2",
"acceptUnknown": "extensions",
"format": [ "application/xml+fhir", "application/json+fhir" ],
"rest": [ {
"mode": "server",
"resource": [ {
"type": "Location",
"profile": {
"reference": "http://hl7.org/fhir/profiles/Location"
},
"interaction": [ {
"code": "read"
}, {
"code": "vread"
}, {
"code": "update"
}, {
"code": "create"
}, {
"code": "search-type"
} ]
}, {
"type": "OperationDefinition",
"profile": {
"reference": "http://hl7.org/fhir/profiles/OperationDefinition"
},
"interaction": [ {
"code": "read"
} ]
}, {
"type": "Organization",
"profile": {
"reference": "http://hl7.org/fhir/profiles/Organization"
},
"interaction": [ {
"code": "read"
} ]
}, {
"type": "Patient",
"profile": {
"reference": "http://hl7.org/fhir/profiles/Patient"
},
"interaction": [ {
"code": "read"
}, {
"code": "vread"
}, {
"code": "update"
}, {
"code": "create"
}, {
"code": "search-type"
} ],
"searchParam": [ {
"name": "family",
"type": "string",
"documentation": "A portion of the family name of the patient"
} ]
}, {
"type": "Practitioner",
"profile": {
"reference": "http://hl7.org/fhir/profiles/Practitioner"
},
"interaction": [ {
"code": "read"
}, {
"code": "vread"
}, {
"code": "update"
}, {
"code": "create"
}, {
"code": "search-type"
} ],
"searchParam": [ {
"name": "family",
"type": "string",
"documentation": "A portion of the family name"
} ]
}, {
"type": "StructureDefinition",
"profile": {
"reference": "http://hl7.org/fhir/profiles/StructureDefinition"
},
"interaction": [ {
"code": "read"
}, {
"code": "search-type"
} ]
} ]
} ]
}
Wrote 2,4 KB (32,6 KB total including HTML) in estimated 16ms

martes, mayo 19, 2020

Actualizar versión de Git en Linux Mint

Estoy en un proyecto que necesito usar Git y me pidieron que usara una versión nueva pero en mi Linux Mint tenía la versión 2.7.4 como muestra la siguiente imagen:


A pesar de que podría haber trabajado con la versión actual seguí el consejo y actualice a la última versión estable de Git. Para hacer esto tuve que agregar un repositorio y actualizar la versión. Para esto tuve que ejecutar el siguiente comando:

cgomez@cgomez-urulinux ~ $ sudo add-apt-repository ppa:git-core/ppa

Luego de agregar el repositorio de git lo que hice fue actualizar git como muestra la siguiente imagen:




Después de actualizar me quedo actualizado Git



domingo, mayo 17, 2020

Hacer un procedimiento sin hacer Unit Test "Es una irresponsabilidad"

El título de este artículo lo tome de la charla que dio Gaston Milano en el GUG Montevideo, la misma se llama: "Gente, Ideas, Herramientas - Gaston Milano sobre App Coronavirus UY".

En la charla Gaston explica el proceso de desarrollo de la aplicación "Coronavirus UY", cuando se refiere al testing que se le hizo a la aplicación hace hincapié en los Unitt Test.  Sin dudas que esto es importante pero en ocasiones hay que lograr que los equipos y las organizaciones se encuentren maduros para sumar al proceso de desarrollo esta buena práctica.

Hace casi un año escribía algunos artículos sobre "Pruebas unitarias en GeneXus", no fue nada técnico pero conté un poco mi proceso para llegar a la necesidad de contar con Unit Test. Tuve un largo camino dado que primero debía lograr migrar a GeneXus 16 para lograr usar GXTest

Tuve que atravesar algunos problemas antes de poder llegar a implementar Unit Test con GeneXus pero luego de migrar la aplicación de GX9 a GX 15 y por último a GX16 pude llegar a comenzar a implementar mis primeros Unit Test.

En nuestra experiencia tuvimos algunos problemas que fuimos resolviendo pero que nos hicieron cambiar de parecer a la hora de hacer pruebas unitarias para cada procedimiento de nuestra KB. Los principales problemas que encontramos fueron los siguientes:

  • La KB creció considerablemente: por defecto se crean tres objetos (Unit Test, SDT y un Data Provider). 
  • Se necesita Licencia para usar GX-Server y para usar con integración continua
  • No es una práctica extendida dentro de los desarrolladores

En realidad el problema mas complejo de resolver es que los unit test no son una práctica extendida dentro de los desarrolladores genexus y esto hace que no se tenga apoyo para poder lograr recursos para usar GX-Test.

El problema del crecimiento de la kb se puede solucionar modificando los unit test en los casos que sea posible (En un próximo artículo voy a explicar como lo hacemos).

El licenciamiento se puede solucionar pero todavía no pude lograr que se vean los beneficios de esto para obtener los recursos necesarios (Estoy en proceso).

En resumen considero que debemos comenzar a utilizar las pruebas unitarias y extender esta práctica entre la comunidad genexus para poder enriquecer la herramienta, logrando que las organizaciones tengan esto como obligatorio.

El principal debe en la utilización de los unit test esta del lado de los desarrolladores que todavía no han integrado esto a su forma de trabajo y esto hace que en equipos grandes sea complejo implementar esta práctica.

En otro artículo voy a explicar como usamos los unit test en una KB grande que esta teniendo liberaciones de versiones a producción de forma mensual.







domingo, abril 12, 2020

Kotlin Bootcamp for Programmers

Dado que estoy por comenzar un proyecto para mobile estoy investigando Kotlin dado la importancia que esta tomando en el desarrollo para Android. Lo primero que hice fue instalar el Android Studio y ahora estoy investigando un poco Kotlin.
La verdad que estoy fascinado por la cantidad de recursos que tenemos disponibles para los desarrolladores, por ejemplo al entrar a la sección de Kotlin se encuentra disponible un curso en UDACITY totalmente gratis llamado "Kotlin Bootcamp for Programmers".
Aprovechando la cuarentena por el COVID-19 lo estoy siguiendo dado que no tenia ni idea de Kotlin.


Espero poder terminarlo para comenzar rápidamente a realizar alguna app, en principio voy a intentar comparar esto con lo que puedo hacer con el Generador Mobile de GeneXus.

Curso GeneXus for mobile

Este lunes comienzo el curso on-line de GeneXus Mobile en GX 16, el cual se esta dando por una iniciativa de GeneXus de poner disponible este curso a la comunidad.
Este curso siempre se encuentra on-line en modalidad auto-estudio pero en esta oportunidad se hizo una publicación en donde los interesados se anotaban para seguir el curso junto al equipo de capacitación de GeneXus.
La verdad que en versiones pasadas había realizado un acercamiento al generador Mobile pero nunca pude avanzar mucho por falta de tiempo, en esta oportunidad voy a sacarle el máximo provecho que pueda.
Lo poco que pude ver hasta el momento veo que se ha mejorado mucho en la ayuda para instalar el ambiente dado que ahora existe "Android Requirements Installer", esto facilita mucho la instalación cosa que antes era todo manual.


Hasta el momento solo configure el ambiente y estoy a la espera de comenzar este curso para poder implementar un proyecto que tengo en mente. Una aclaración es que si se instala la versión trial la parte de Android se instala sola, en mi caso voy a usar la versión que ya tengo por lo que tuve que instalar el ambiente para Android mediante el "Android Requirements Installer".