Categories
Desarrollo y Programación

Solución al ERROR 1698 (28000): Access denied for user

Este problema me ocurrió en un sistema Raspberry Pi con Ubuntu Server y MySQL, a continuación las versiones que utilizo:

  • Ubuntu 20.04 LTS
  • mysql  Server version: 8.0.20-0ubuntu0.20.04.1 (Ubuntu)

Procedimiento para replicar el error

Después de configurar el server MySQL y hacer mysql_secure_installation mi usuario queda configurado, pero al intentar conectarse con el comando:

 mysql -u root -p

Nos muestra el error:

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Soluciones Alternativas:

La mayoría de las soluciones te piden deshabilitar las funciones que vienen en MySQL 8.0 habilitadas por defecto ¿que beneficio tiene quitar las opciones de seguridad por utilizar un sistema obsoleto?

Solución:

Ingresar a MySQL con el comando sudo

 sudo mysql -u root

Listar todos los usuarios que se tienen para validar el tipo de autenticación.

SELECT User, Host, plugin FROM mysql.user;

Lo que nos muestra una lista de usuarios como:

+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

El usuario que creamos con el asistente de mysql_secure_installation tiene un tipo de autenticación auth_socket lo que no nos permite iniciar sesión.

Crear usuario con el SHA-2

Recuerden otorgar los permisos correspondientes de acceso.

CREATE USER 'elporfirio'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'MyPassword2020*';

Editar usuario para cambiar a SHA-2

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'MyPassword2020*';

¿Problemas con un password poco seguro? Revisa la información más abajo.

Nuestro usuario ya debería aparecer abajo el ejemplo con el creado y el editado, notar que root tiene ahora el nuevo plugin:

mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| elporfirio       | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

Ahora que el usuario ya tiene el plugin: caching_sha2_password ya puedes iniciar sesión normalmente con el usuario que decidas:

mysql -u elporfirio -p

Solucionado y listo para utilizar tu base de datos MySQL en su última versión.

Problemas con la seguridad de la contraseña

Puedes revisar el medium de micheleberardi para tener mas informción de las politicas de seguridad.

Referencias:

Categories
Desarrollo y Programación

Importar y Exportar con Javascript ES6

Bienvenidos a otra valiosa información en internet totalmente en español, en esta ocasión vamos a ver cómo importar y exportar variables, funciones, expresiones y clases con JavaScript.

Actualizaciones:
– Elimine paréntesis de la declaración de clases

Exports Default

Cuando se utiliza un default para exportar, se puede utilizar cualquier nombre para importar.

Función Anónima

// helpers.js
export default function() {
  // Do something
}

// index.js
import Awesomeness from './helpers'

console.log(Awesomeness); // ƒ(){}

Función

// helpers.js
export default function hiDude() {
  // Do something
}

// index.js
import Awesomeness from './helpers'

console.log(Awesomeness); // ƒ hiDude(){}

No es posible tener más de un “export default” en un archivo, así que no lo intentes en casa.

– La comunidad PRO de JavaScript

Clase Anónima

Recordar que las clases son un tipo de objeto con superpoderes.

// classes.js
export default class {
  // rest of class
}

// index.js
import ImportantClass from './classes'

console.log(ImportantClass); // ƒ _default(){}

Clase

// classes.js
export default class Person {
  // rest of class
}

// index.js
import ImportantClass from './classes'

console.log(ImportantClass); // ƒ Person(){}

Variables

// constants.js
const PI = 3.1416;
export default PI;

// index.js
import PIValue from './constants'

console.log(PIValue); // 3.1416

Otro método para exportar variables:

// constants.js
const PI = 3.1416;
export {PI as default};

// index.js
import PIValue from './constants'

console.log(PIValue); // 3.1416

Este último también sirve para las funciones:

// constants.js
function getPI(){
  return 3.1416
}
export {getPI as default};

// index.js
import PIValue from './constants'

console.log(PIValue); // ƒ getPI(){}

Named Exports

A diferencia de los default, en este tipo si es necesario dar un nombre a nuestra variable, método, etc.

Exportar por separado

export function add(){
  // add something
}

export class Person {
  // class definition
}

export const PI = 3.1416;

export let car = {
  paintColor: 'red'
}

Exportar todo en una sentencia

function add(){
  // add something
}

class Person {
  // class definition
}

const PI = 3.1416;

let car = {
  paintColor: 'red'
}

export { add, Person, PI, car };

Para importar estos elementos (cualquiera de las 2 formas anteriores) es necesario utilizar el nombre que se les dio al momento de exportar:

import { add, Person, PI, car } from './helpers'

console.log(add); // ƒ add(){}
console.log(Person); // ƒ Person(){}
console.log(PI); // 3.1416
console.log(car); // { paintColor: 'red' }

Exportar named y default

En el caso de las named, deben importarse entre los corchetes y el default queda fuera de los corchetes.

// important.js
export add() {
  // do add
}

export const maxValue = 999;

export default class Calculator {
  // Calculator class
}
// index.js
import Calc, { maxValue, add } from './important'

// Recordar que el default no importa el nombre
console.log(Calc); // ƒ Calculator() {}
console.log(maxValue); // 999
console.log(add); // ƒ add() {}

No es posible hacer un “named export” con una función anónima o una expresión. Siempre es necesario que tenga un nombre.

– La comunidad PRO de JavaScript

Exportar con un nombre diferente (alias)

En algunos casos nos puede ayudar darle un nombre diferente a nuestros exports.

function add(){
  // add something
}

function divide(){
  // divide something
}

export { add as plus, divide as split };

Al momento de importar es necesario importar con ese nuevo nombre que le asignamos, sin embargo nuestros métodos conservaran la referencia a su nombre original.

import { plus, split } from './calculator.js'

console.log(plus); // ƒ add() {} <-- add en vez de plus
console.log(split); // ƒ divide() {}

Exportar desde otros archivos

Si aunque el uso de este tipo no es muy común, es posible hacerlo. Supongamos que tenmos un archivo pruncipal:

export default add() {
  // add something
}

export multiply() {
  // multiply something
}

ahora podemos tener un exportador que agrupe de uno o diferentes archivos:

export {
  default,
  multiply
} from './calculator'

Ahora podemos importar del nuevo archivo:

import add, { multiply } from './operations'

console.log(add); // ƒ add() {}
console.log(multiply): // ƒ multiply {}

Exportar desde otros archivos con alias

De igual forma que antes podemos utilizar alias para exportar y renombrar.

export {
  default as plus,
  multiply
} from './calculator'

Ahora que nuestros default pasaron a ser named, es necesario importarlos con ese nuevo nombre:

import { plus, multiply } from './operations-alias'

console.log(plus); // ƒ add() {}
console.log(multiply): // ƒ multiply {}

Importar con alias

Es posible también agregar un alias al momento de importar.

import { plus as suma, multiply as multiplicar } from './operations-alias'

Esto es útil cuando importamos métodos con el mismo nombre que vengan de distintos archivos. A continuación 2 métodos con el mismo nombre pero en distintos archivos:

export getAge() {}
export getAge() {}

Ahora si queremos utilizarlos podemos asignarles un alias:

import { getAge as grandFatherAge } from './grandfather';
import { getAge as fatherAge } from './father';

console.log(grandFatherAge);
console.log(fatherAge);

Exportar todo

Es posible utilizar el comodín “*” para exportar todos los elementos, tomemos como ejemplo el siguiente archivo.

export function add(){
  // add something
}

export class Person {
  // class definition
}

export const PI = 3.1416;

export let car = {
  paintColor: 'red'
}

export default helloWorld(){
  // say hello
}

Y al momento de exportar solo necesitamos lo siguiente:

export * from './examples';

Al hacer un export con * , el método default no se exporta por lo que debe exportarse por separado.

– La comunidad PRO de JavaScript

Para exportar además el método default necesitamos lo siguiente:

export { default } from './examples';
export * from './examples';

En caso de existir más de un default es necesario utilizar los alias.

Importar todo

Al importar con * es necesario asignar un alias, este alias ahora será un objeto con todo lo importado (incluido el default):

import * as exampleMethods from './examples';

console.log(exampleMethods.add); // ƒ add(){}
console.log(exampleMethods.Person); // ƒ Person(){}
console.log(exampleMethods.PI); // 3.1416
console.log(exampleMethods.car); // { paintColor: 'red' }
console.log(exampleMethods.default); // ƒ helloWorld() {}

Es posible importar el default por separado, aunque de igual forma existirá en nuestro objeto:

import exampleDefault, * as exampleMethods from './examples';

console.log(exampleMethods.default); // ƒ helloWorld() {}
console.log(exampleDefault); // ƒ helloWorld() {}

Ahora si a andar desnudos por la casa

Ahora que sabes todas las formas de importar y exportar modulos, variables, etc. es hora de mostrarle al mundo que estas a punto de ser un ninja del Javascript o que ya eres un ninja avanzado.

Si te gusto el post o tienes alguna duda deja tu comentario y no olvides seguirme por el resto de redes sociales.

Un saludo 😀 y nos vemos en la siguiente publicación.

Categories
Desarrollo y Programación

Mis herramientas de desarrollo en Mac

De nuevo le hice una instalación de sistema operativo a mi iMac (19D76) para actualizar a la versión 10.15 MacOS Catalina.

Así que en esta ocasión les compartiré todas las aplicaciones que instalo al año 2020 para mi trabajo como desarrollador web y aplicaciones.

Instalar MacOS Catalina desde un USB

Se requiere tener una USB de 16Gb para crear el instalador, para crear la usb mágica seguir el tutorial oficial de Apple aquí.

La instalación es un proceso sencillo, pero el resto toma tiempo de descarga, de buscar y personalizar herramientas.

Instalar XCode Mandatorio

Para herramientas de desarrollo como Git y comandos como CURL o WGET necesitamos una extensión para la terminal, además de otras librerías. Instalar Xcode es la opción más sencilla y más pesada, así que mientras instala sugiero ver o leer algo que no consuma internet.

Necesitamos abrir Xcode al menos una vez para aceptar los términos y generar la licencia.

Habilitar la instalación de cualquier aplicación en Mac

Aplicaciones de terceros no son permitidas en Mac desde la versión 10.13, para habilitarlas necesitamos un comando en la terminal

sudo spctl --master-disable

La terminal definitiva

La terminal que viene con el Mac tiene muchas cualidades pero si queremos sacarle jugo debemos optar por la iTerm Terminal

Esteroides adicionales a la terminal

Ahora que tenemos iTerm Terminal, podemos trabajar libremente con bash, o meterle más potencia y trabajar con zsh, para más placer vamos a instalar OhMyzsh.

Gestor de Paquetes

Si has desarrollado ultimamente conocerás cosas como NPM, Yarn, Maven, Composer, etc. Bueno pues para Mac existe Brew: un gestor de paquetes que hace lo mismo pero para utilidades de desarrollo, desde Git hasta MySQL.

Este paquete además instala los Command Line Tools de Xcode

Un IDE para controlarlos a todos

Aquí todo depende de tus gustos, así que cualquier IDE que te acomode es el mejor para instalar, en mi caso utilizo los de Jetbrains, con su herramienta Toolbox, solo es elegir la aplicación requerida e instalar.

Control de versiones con Git + Sourcetree

El control de versiones lo hago con línea de comandos, pero cuando tenemos prisa podemos cometer errores que no se pueden ver tan fácilmente, para verlos recomiendo Sourcetree que nos facilita algunas tareas.

Chrome el mejor Navegador para Mac

Por supuesto google chrome es el navegador definitivo para Mac, Safari tiene unas herramientas de desarrollo complicadas, Firefox tiene errores con atajos de teclado y otros tienen una pésima compatibilidad

Y es todo por ahora

A partir de aquí depende en que tecnología vas a desarrollar pues las aplicaciones varían para un Nativo iOS, Android, o un react-native, PHP, angular, etc.

Y ustedes ¿Qué herramientas utilizan? dejenla en los comentarios.

Categories
Desarrollo y Programación

React dar formato a números

Hola, bienvenidos a otro tutorial en esta ocasión con React a dar formato a un número para mostrarlo en pantalla.

Vamos a trabajar en el aspecto visual deseado sin necesidad de cambiar el dato original, es decir meramente vamos a trabajar con la estética del número.

Este material está basado en la información que encontré en este hilo de Stackoverflow.

Para esto dejo el siguiente videotutorial, espero que les sea útil como material de apoyo.

Además dejo el código final en la parte de abajo para que revisen si algo no funciona como debe.

Pueden dejar sus dudas o comentarios en está publicación o en el video, nos leemos en el siguiente tutorial.

Feliz día a todos 😄

Referencias

Categories
Desarrollo y Programación

Como hacer peticiones http en PHP sin CURL

Vamos a hacer peticiones a servicios http o APIs con PHP sin CURL, este último muchas veces está bloqueado por el hosting y no es posible hacer peticiones a enlaces externos.

Vamos a utilizar la librería Requests for PHP en nuestro entorno de desarrollo local, así que es importante tener el manejador de dependencias: composer.

Instalación de Requests

Para instalar la librería es necesario ejecutar el siguiente comando:

composer require "rmccue/requests"

Nuestro composer.json debería verse como la siguiente imagen

composer.json (ejemplo)

Así debería lucir el árbol de dependencias y archivos:

Dependencias

Peticiones HTTP Get con PHP

Y listo a partir de ahora podemos solicitar datos a servicios y APIs externos, yo tuve esta necesidad pues algunos servicios de los que consumo no permiten solicitudes desde el browser.

Peticiones HTTP Post con PHP

Si queremos enviar datos, debemos colocarlos dentro de un array. Es importante conocer el tipo de envío que debemos hacer en post, ya sea para un multipart/form-data o un application/json.

Este dato debemos revisarlo con el proveedor del servicio, si es necesario enviar llaves de autenticación u otro dato en las cabeceras, podemos agregar este dato en otro array.

Peticiones HTTP PUT, PATCH y DELETE con PHP

El resto de peticiones se pueden hacer con los métodos:

Requests::put($url, $headers, $data, $options);
Requests::patch($url, $headers, $data, $options);
Requests::delete($url, $headers, $options);

Status Code y Headers de Peticiones HTTP con PHP

Para obtener el codigo de estado se obtiene de la variable de respuesta:

$response->status_code

En el caso de la cabecera es necesario agregar el nombre de la cabecera requerida. NOTA: no distingue entre mayusculas y minusculas

$response->headers['Date'];

Comentarios Finales

Esta por demás decirlo, pero siempre que importen la librería al proyecto es necesario subirla a su host para que funcione, así que la carpeta vendor ahora debería estar incluida en el servidor.

Las cabeceras de autenticación se envían en el array de $headers, pero se debe consultar con el proveedor del servicio cuales se deben enviar.

Y listo ya no es necesario preocuparse por que el servidor tenga soporte para CURL, que tengan felices proyectos y que todo vaya sin bugs, un Saludo afectuoso y nos vemos en el siguiente tutorial.

Categories
Desarrollo y Programación

Sumar Radio button con Javascript

Este problema lo obtuve de los foros de cristalab del usuario mariassssss, el usuario busca sumar los valores de unos input radio con javascript:

Aquí el post original: http://foros.cristalab.com/javascrip-t122822/

Me tomé la libertad de corregir el codigo, quitar las funciones que no estaban en uso y hacer la operación que necesita sin moverle mucho.

A diferencia del código original no es necesario ir a recuperar el valor por input, si no obtener todo el formulario y sacar los valores necesarios.

Es algo primitivo pero este formData estaría listo para enviar a en una request y obtener los datos a partir de este elemento y sus correspondientes names.

Entre las mejoras se puede poner un array para obtener los datos requeridos, pero como no estaba la problemática descrita, pues decidí omitir.

Categories
Desarrollo y Programación

WebStorm Color Themes – base16 [2019]

Que tal coders, en esta ocasión voy a compartir mi tema de color para el editor WebStorm, reciente el editor entró en la versión 2019.2 cambiando ajustes.

Estos ajustes ahora permiten establecer colores para otras variables, sintaxis y palabras reservadas.

Javascript Class

Mi tema esta basado en los colores de Base16 que pueden encontrar aquí http://chriskempson.com/projects/base16/ y he cambiado mayormente los colores para trabajar con Javascript y react.js

ReactJS Component

Quizá no se vea tan bien como otros temas o schemes pero está listo para trabajar con pantallas muy brillantes, donde a veces el color parece que va a incendiar las pupilas

Node JS

Sin más aquí dejo el enlace al archivo:

Si por alguna razón no funciona, también lo dejo en Google drive:

https://drive.google.com/file/d/1Ef9_o5d2yXP5n7XCncKZs_u5BHs0qfUP/view?usp=sharing

Cómo importar Webstorm color themes

Para importar este o cualquier otro tema, necesitan un archivo *.icls para poder importarlo. Después ir a Archivo > Preferencias > Editor > Color Scheme

Webstorm 2019.x Preferences

Elegir la opción Import Scheme… del icono de configuración, para finalizar elegir el archivo, aplicar y aceptar los cambios. Y listo 😄

Si tienen algún ajuste para cambiar o mejorar el tema compartanlo en los comentarios. Muchas gracias y nos vemos en el siguiente post.

Categories
Desarrollo y Programación

jQuery mostrar y ocultar div con animación

En esta ocasión vamos a mostrar y ocultar div con jQuery para practicar el funcionamiento base de la librería. vamos a asignar eventos a dos botones que nos permitan interactuar con la visualización de un componente.

En esta ocasión traigo la actualización de un código que hice hace unos siete años para este blog, el cual hice un tutorial en youtube:

El código completo y funcional está aquí:

Refactorizar código Javascript

Ahora también tenemos una actualización de un refactor que pueden ver en el siguiente video:

Este último video trata de seguir buenas prácticas para evitar el uso innecesario de variables y agregar nombres legibles a las clases e identificadores de HTML y Javascript.

Si tienen alguna duda ponganla en los comentarios 😎