jueves, 28 de junio de 2018

Jugando con Knex - parte 4

Ha pasado mucho tiempo y he me quedado estancado ordenando el código e integrando controles con JSON Web Token para verificar usuarios en las funciones de la aplicación.

Lo dejaré en pausa, mientras estudio un poco más de TypeScript, que he me hace falta. Definitivamente no he terminado con la aplicación, me falta evaluar mejor los roles para permitir el acceso a ciertas aplicaciones. Pero el código está disponible en GitHub - Youtube intro to Knex para quien desee reir un rato por mi pésimo código

jueves, 31 de mayo de 2018

Jugando con Knex - parte 3

Al salir el error: Error: ER_TABLE_EXISTS_ERROR: Table 'login' already exists, la mejor opción es borrar las tablas manualmente.

Para añadir nuevas funciones al sistema, se está creando una tabla más, 'login', y cambiando el contenido de la tabla 'users' que contendrá información del usuario. Parece que debido al enlace entre las tablas 'users' y 'todos' no es tan sencillo borrar e incluir las nuevas tablas, pero luego de borrar las tablas manualmente con phpMyAdmin, el proceso con Knex se puede hacer sin problemas.

martes, 15 de mayo de 2018

Jugando con Knex - Parte 2

Siguiendo con la lucha. Al ejecutar el filtrado de TODOS por id de usuario, Knex devuelve un resultado malformado. El id de la respuesta absorve el valor del id del usuario y la lista no se puede identificar adecuadamente, no está ordenado por el id de TODOS.

Resultado:
[{
"id":3,
"title":"go to the gym",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"stop the damn leafblowers",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get the mail",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get some headphones",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
}]

Comprobé el error en phpMyAdmin, ejecutando el código SQL:

SELECT * FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3

Donde se muestran todas las columnas de las tablas.
Para corregir el problema, escogí establecer las columnas que debería devolver Knex, como en este SQL:

SELECT `todos`.`id`, `todos`.`title`, `todos`.`completed`, `todos`.`created_at`, `todos`.`updated_at`, `users`.`name`, `users`.`email` FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3

Para eso se usa .column. Ciertamente más sencillo de construir con Knex que con SQL y el backtick.

El resultado es diferente:

[{
   "id":3,
   "title":"go to the gym",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":4,
   "title":"stop the damn leafblowers",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":5,
   "title":"get the mail",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":6,
   "title":"get some headphones",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
}]

lunes, 7 de mayo de 2018

Jugando con Knex - Parte 1

Siguiendo con la lucha para dominar JS, TypeScript, Node y poder manipular RDBMS.

Encontré este ejemplo con knex[GitHub], haciendo las respectivas modificaciones para usar MySQL en lugar de PostgreSQL, pero he estado sufriendo para poder ejecutarlo correctamente.

Usando el código tal cual, sale el siguiente error:
~knex-intro/youtube-intro-to-knex/db> knex migrate:make create_users_and_todos_tables
module.js:471
    throw err;
    ^

Error: Cannot find module './dialects/[object KnexClient]/index.js'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Knex (/home/ikari/workshop/OWN/knex-intro/youtube-intro-to-knex/node_modules/knex/lib/index.js:55:15)
    at initKnex (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:69:10)
    at Command. (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:116:22)
    at Command.listener (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:315:8)
    at emitTwo (events.js:106:13)
    at Command.emit (events.js:191:7)
    at Command.parseArgs (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:651:12)
    at Command.parse (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:474:21)
    at Liftoff.invoke (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:186:13)
    at Liftoff.execute (/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:203:12)
    at module.exports (/usr/local/share/.config/yarn/global/node_modules/flagged-respawn/index.js:51:3)
    at Liftoff. (/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:195:5)
    at /usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:165:9
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:108:14
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:35:14
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:47:7
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
El error se encuentra en el archivo knexfile.js, ya que al cambiarlo por lo que tengo disponible, el error no es visible. Y también por que encontré que el autor consultó al respecto: Knex migrate and seed CLI commands throwing error [Github]. Aplicando el cambio requerido, no hay problema en la ejecución del comando.

jueves, 8 de marzo de 2018

openSuSE Leap 42.3 + Redis


Y una nueva aventura, instalando Redis en openSuSE Leap no podría ser más sencillo ya que Redis está disponible en los repositorios de la distribución.

Sin embargo para arrancarlo no basta con:

systemctl start redis.target

que parece no tuvo uso. Recien cuando ejecuté:

sudo redis-server

arrancó el servicio y pude tener acceso al cliente

redis-cli

Sin embargo el servidor presentó los siguientes mensajes:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 
... 
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 
* The server is now ready to accept connections on port 6379

Las instrucciones están incluidas, pero si da flojera leer, StackOverflow tiene algo de información, aquí: Tech and me - Performance tips for Redis Cache Server

 Para el primer mensaje:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Se debe escribir en consola:

sysctl -w net.core.somaxconn=65535

pero para ahorrarse el trabajo de tener que hacerlo cada vez que se inicia el sistema, se debe editar el archivo:

/etc/rc.d/boot.local

Para el segundo mensaje:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

se require editar el archivo:

/etc/sysctl.conf

para añadir la línea solicitada:

vm.overcommit_memory=1

Para la tercera línea:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot.

Se necesita editar nuevamente el archivo:

/etc/rc.d/boot.local
 
y añadir la línea:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

El texto continúa con una descripción para dejar de usar TCP, puerto 6379, y usar el socket UNIX, "transmisión interna", para acelerar la respuesta en caso de que el servidor Redis se encuentre en el mismo equipo del cliente. Lo cual preferí no llevar a cabo.

Es recomendable revisar el tutorial interactivo disponible en la web de Redis. Es una manera sencilla para conocer la mayoría de comandos de Redis y la imortancia de los hashes.

Tomar en consideración que para la edición de los archivos necesarios para la ejecución correcta de Redis, es necesario disponer de permisos de usuario root, (su -) y saber usar un editor como nano o vim facilita el trabajo.

martes, 27 de febrero de 2018

[Fullstack] Node + PostgreSQL

Ya hice algo de trabajo de esta forma, pero en lugar de PostgreSQL fue con MongoDB. Que registraré luego, lo que estoy registrando ahora es una parte.

No es que haya falta de documentación, pero no está organizada.
Hay información para crear API de NodeJS con PostgreSQL:
RisingStack - Node Hero: Node.JS Database Tutorial, pero no está actualizada para usar versiones de la librería pg (Node) actualizada. Lo que varia la sintaxis a usar. Pero los comentarios de ese artículo ayudan a:
Hay información para instalar y usar PostgreSQL en mi distro favorita (openSuSE), que es mejor que la disponible en los recursos únicos de la distribución. Incluye información para poder usar pgAdmin y phpPgAdmin: How to install PostgreSQL nd phpPgAdmin on openSuSE Leap 42.1, usable for v42.3. Sin embargo no tiene detalles y recomendaciones para asegurar adecuadamente la instalación.

También se encontró otro recurso, similar al mencionado primero, pero este no es parte de un tutorial para aprender del uso de Node.JS. Este enseña a usar Node.JS con la librería "pg" para crear un API REST que se comunicará con un frontend Angular JS: PostgreSQL and NodeJS.

Sin embargo, hasta el momento no he encontrado casualmente información de las partes y condiciones para un sistema API REST que proporcione CRUD.

También me hace falta repasar la parte de Angular (Angular 5) para proporcionar una interfaz adecuada y que optenga los datos necesarios del sistema API.