<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RGT</title>
    <description>The latest articles on DEV Community by RGT (@fynio).</description>
    <link>https://dev.to/fynio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482209%2Fbb1a6b96-1c70-40df-8361-9c287a406ef5.jpg</url>
      <title>DEV Community: RGT</title>
      <link>https://dev.to/fynio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fynio"/>
    <language>en</language>
    <item>
      <title>JWT con Node y Express</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Mon, 16 Oct 2023 02:41:57 +0000</pubDate>
      <link>https://dev.to/fynio/jwt-con-node-y-express-6dh</link>
      <guid>https://dev.to/fynio/jwt-con-node-y-express-6dh</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;Hola a todos hoy les traigo un minitutorial para poder utilizar JWT en Express y Node&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;

&lt;p&gt;Instalamos con npm ejecutando el comando &lt;br&gt;
npm install jsonwebtoken&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3y53s89yczfapa6uuvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3y53s89yczfapa6uuvu.png" alt="Instalación de jwt" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;También utilizaremos un par de librerías más como crypto y dotenv &lt;/p&gt;

&lt;p&gt;npm install crypto dotenv express&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2ef9yltk0dvt05j1f2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2ef9yltk0dvt05j1f2q.png" alt="npm install crypto dotenv express" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  crypto
&lt;/h3&gt;

&lt;p&gt;Este módulo permite a los desarrolladores trabajar con operaciones criptográficas, como el cifrado y descifrado de datos, la generación de claves, la creación de resúmenes criptográficos (hashes) y más.&lt;/p&gt;

&lt;p&gt;Este modulo lo utilizaremos para crear una clave para JWT para ello utilizaremos un metodo llamado randomBytes() el cual genera una secuencia de bytes aleatorios de longitud 64 utilizando una fuente de números aleatorios seguros proporcionada por la biblioteca criptográfica de Node.js. Los bytes generados son aleatorios y se consideran seguros para su uso en aplicaciones que requieren datos aleatorios, como claves criptográficas, tokens de autenticación, números de sesión y más.&lt;/p&gt;
&lt;h3&gt;
  
  
  dotenv
&lt;/h3&gt;

&lt;p&gt;La dependencia dotenv es una herramienta comúnmente utilizada en aplicaciones Node.js para cargar variables de entorno desde un archivo llamado .env en el entorno de desarrollo. Estas variables de entorno suelen contener información sensible o configuración específica de la aplicación, como credenciales de bases de datos, claves de API, configuraciones de puerto, entre otros.&lt;/p&gt;

&lt;p&gt;Una vez explicado lo que necesitamos y para que sirve pues &lt;strong&gt;Manos a la obra&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En nuestro proyecto de node creamos un archivo para poder generar esta contraseña que servira como clave para generar nuestro jwt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Este archivo es temporal solo nos servirá para poder generar nuestra contrasena, posteriormente si asi lo desean pueden eliminarlo&lt;/p&gt;

&lt;p&gt;Archivo: encriptar.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const crypto = require('crypto');
const Password = crypto.randomBytes(64).toString('hex');
console.log(Password);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lo guardamos con el nombre &lt;strong&gt;encriptar.js&lt;/strong&gt; y lo ejecutamos con node de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node encriptar.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El cual nos retornara la contraseña  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1z83m9hjcm81d9w0m7zf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1z83m9hjcm81d9w0m7zf.png" alt="token" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora teniendo la contrasena la guardamos en un archivo .env el cual debe quedar de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Archivo: .env&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgro4775zqxn6tg50i6du.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgro4775zqxn6tg50i6du.png" alt=".env" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta ahora vamos bien, comenzaremos por crear nuestro archivo index.js &lt;/p&gt;

&lt;p&gt;Importaremos todas las dependencias que hemos instalado&lt;/p&gt;

&lt;p&gt;Archivo: index.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// importamos express
const express = require('express');
const app = express();
const router = express.Router();
// importamos jwt
const jwt = require('jsonwebtoken');

// importamos dotenv
const dotenv = require("dotenv");
// ejecutamos .config() el cual nos va a permitir acceder al archivo .env
dotenv.config();


// configurarmos el puerto donde correra nuestro servidor
//
app.set('port', process.env.PORT || 9090);


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ruta encriptar
&lt;/h2&gt;

&lt;p&gt;Creamos una ruta llamada &lt;strong&gt;encriptar&lt;/strong&gt; utilizando el método &lt;strong&gt;GET&lt;/strong&gt; que recibe como parametro un nombre&lt;/p&gt;

&lt;p&gt;Recibiremos mediante el parametro &lt;strong&gt;:nombre&lt;/strong&gt; el valor a encriptar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.get('/encriptar/:nombre', async (req, res)=&amp;gt;{
    try{

    // Recibimos como parametro el nombre
    const nombre = req.params.nombre;

    // Accedemos a la variable TOKEN_SECRET que guardamos en .env
    const SecretToken = process.env.TOKEN_SECRET;


    // Creamos el token proporcionandole lo que vamos  a encriptar, La llave, y el tiempo de expiración
    const token = jwt.sign({nombre:req.params.nombre}, SecretToken, {expiresIn:'1000s'});


    // Retornamos el token;
    res.status(200).send({msg:`El nombre es ${nombre}`, token:`${token}`})



    }
    catch(e){
    console.log("Ocurrio un error ", e);
    }

})



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Posteriormente ponemos a la escucha el servidor el cual configuramos el puerto 9090&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ponemos a la escuchar el servidor creado
app.listen(app.get('port'), () =&amp;gt;{
    console.log(`Server on port ${app.get('port')}`);
})

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Middleware
&lt;/h2&gt;

&lt;p&gt;Los middlewares se utilizan comúnmente en aplicaciones web para procesar y manipular las solicitudes del cliente antes de que lleguen a la capa de la aplicación principal, lo que permite realizar tareas como la validación de datos, la seguridad y la gestión de sesiones&lt;/p&gt;

&lt;p&gt;Crearemos un middleware para validar el token creando la funcion authenticateToken el cual recibe miente el header Authorization el token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt; para enviar el token se realiza mediante el header Authorizacion y el parametro Beared + token&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//  MIDDLEWARE 

function authenticateToken(req, res, next) {

  // Recibe el token mediante el header authorization
  const authHeader = req.headers['authorization']

  // obtiene el token 
  const token = authHeader &amp;amp;&amp;amp; authHeader.split(' ')[1]

  // Se valida que el token sea enviado en caso contrario manda un error
  if (token == null) return res.status(401).send({msg : 'No ha ingresado un token'})

  jwt.verify(token, process.env.TOKEN_SECRET, (err, user) =&amp;gt; {

    // VERIFICAMOS QUE EL TOKEN COINCIDA CON LA CONTRASENA
    if (err) return  res.status(403).send({msg : 'Token invalido'})
    req.token = user
    next()
  })
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilizando el middleware  authenticateToken
&lt;/h2&gt;

&lt;p&gt;Creamos una nueva ruta llamada &lt;strong&gt;desencriptar&lt;/strong&gt; donde agregamos el &lt;strong&gt;middleware&lt;/strong&gt; que creamos. El cual nos retornara el token ya &lt;strong&gt;desencriptado&lt;/strong&gt; y lo podemos utilizar mediante el parametro &lt;strong&gt;req.token&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Descencriptando
&lt;/h2&gt;

&lt;p&gt;Mediante el método post creamos la ruta desencriptar pasandole el middleware el cual retorna el valor descencriptado&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; El usuario debera enviar el token a descencriptar mediante el &lt;strong&gt;HEADER&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.post('/desencriptar', authenticateToken,  async (req, res)=&amp;gt;{
    try{

    let Nobre = req.token.nombre;
    // Retornamos el token;
    res.status(200).send({msg:`El nombre es Nobre`})
    }
    catch(e){
    console.log("Ocurrio un error ", e);
    }

})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bueno, ya teniendo esto ya tenemos listo todo nuestro código&lt;/p&gt;

&lt;p&gt;para correr nuestro servidor ejecutamos&lt;/p&gt;

&lt;p&gt;node index.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgqy313clxmn4bbzrb9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgqy313clxmn4bbzrb9x.png" alt="ejecutando" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Encriptando
&lt;/h2&gt;

&lt;p&gt;Una vez corriendo el servidor utilizare &lt;strong&gt;POSTMAN&lt;/strong&gt; para hacer pruebas.&lt;/p&gt;

&lt;p&gt;Utilizamos el método get y como parámetro le envió un &lt;strong&gt;nombre&lt;/strong&gt; en este caso &lt;strong&gt;rodrigo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofp039ss6pcnqquguerr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofp039ss6pcnqquguerr.png" alt="Postman 1" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto retorna el valor a encriptar y el &lt;strong&gt;token&lt;/strong&gt; que se genera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desencriptando
&lt;/h2&gt;

&lt;p&gt;Para poder descencriptar necesitamos enviar el token que obtuvimos mediante el metodo get y lo enviamos en los headers con el metodo Authorization y el parametro Beared&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5heswoddtp2wdzrkfl1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5heswoddtp2wdzrkfl1h.png" alt="post postman" width="765" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto retorna el token descencriptado.&lt;/p&gt;

&lt;p&gt;Y eso es todo.&lt;/p&gt;

</description>
      <category>jwt</category>
      <category>español</category>
    </item>
    <item>
      <title>Iniciar sesion en mongodb con usuario y contraseña | Mongodb</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Thu, 12 Oct 2023 20:59:20 +0000</pubDate>
      <link>https://dev.to/fynio/iniciar-sesion-en-mongodb-con-usuario-y-contrasena-mongodb-3lfg</link>
      <guid>https://dev.to/fynio/iniciar-sesion-en-mongodb-con-usuario-y-contrasena-mongodb-3lfg</guid>
      <description>&lt;h2&gt;
  
  
  Hola a todos
&lt;/h2&gt;

&lt;p&gt;Hoy les traigo un nuevo minitutorial de como crear usuario y contrasena en mongodb&lt;/p&gt;

&lt;p&gt;primero que nada entramos a la base de datos que deseamos colocarle la contreana para ello ejecutamos el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongosh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;una vez dentro de mongo seleccionamos el nombre de la base de datos donde queremos crear el usuario&lt;/p&gt;

&lt;p&gt;para ello ejecutamos el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
use NOMBRE_DE_LA_BASE_DE_DATOS

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez dentro ejecutamos el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.createUser(
{
user: "AQUI VA EL NOMBRE DEL USUARIO",
pwd: "AQUI VA LA CONTRASEÑA",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora solo resta activar la opcion para que permita usar la contrasena para ello nos vamos a la configuracion de mongo&lt;/p&gt;

&lt;p&gt;En el caso de mac debería de estar en&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/local/etc/mongod.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;en el caso de Ubuntu&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/mongodb.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;agregamos las siguientes lineas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;security:
  authorization:enabled 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Posteriormente reiniciarmos el servicio de mongodb-community&lt;/p&gt;

&lt;p&gt;en el caso de mac&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew services restart mongodb-community
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart mongod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ahora para poder conectarnos ejecutamos el siguiente comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongodb://NOMBRE_DEL_USUARIO:CONTRASENA@localhost:27017/NOMBRE_DE_LA_BASE_DE_DATOS

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ESO ES TODO &lt;/p&gt;

&lt;p&gt;LOS QUIERO&lt;/p&gt;

&lt;p&gt;SALE BYE&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>connection</category>
      <category>db</category>
      <category>espanol</category>
    </item>
    <item>
      <title>Poner contrasena a PDF | qpdf</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Sat, 07 Oct 2023 21:07:49 +0000</pubDate>
      <link>https://dev.to/fynio/poner-contrasena-a-pdf-qpdf-126b</link>
      <guid>https://dev.to/fynio/poner-contrasena-a-pdf-qpdf-126b</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;El dia de hoy le enseñare como pueden poner contrasena a sus archivos de pdf de una manera muy sencilla.&lt;/p&gt;

&lt;p&gt;Para ello necesitaremos instalar qpdf &lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Que es QPDF?
&lt;/h2&gt;

&lt;p&gt;qpdf es una herramienta de código abierto utilizada para trabajar con archivos PDF (Portable Document Format). Proporciona una serie de funcionalidades para manipular y modificar archivos PDF, incluyendo la capacidad de dividir, fusionar, cifrar, descifrar, comprimir y reparar archivos PDF. También puede utilizarse para convertir documentos en otros formatos a PDF y viceversa.&lt;/p&gt;

&lt;p&gt;Algunas de las tareas comunes que se pueden realizar con qpdf incluyen:&lt;/p&gt;

&lt;p&gt;Dividir un archivo PDF en varios archivos más pequeños.&lt;br&gt;
Fusionar varios archivos PDF en uno solo.&lt;br&gt;
Cifrar un archivo PDF con una contraseña para proteger su contenido.&lt;br&gt;
Descifrar un archivo PDF protegido por contraseña.&lt;br&gt;
Comprimir imágenes dentro de un archivo PDF para reducir su tamaño.&lt;br&gt;
Reparar archivos PDF dañados o corruptos.&lt;br&gt;
Convertir documentos en otros formatos (como archivos de texto o imágenes) a PDF.&lt;br&gt;
Realizar manipulaciones avanzadas en la estructura interna de un archivo PDF.&lt;br&gt;
qpdf es una herramienta de línea de comandos y se utiliza principalmente en entornos de desarrollo y administración de sistemas. Es especialmente útil cuando se necesita automatizar tareas relacionadas con archivos PDF o realizar manipulaciones específicas en estos archivos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install qpdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Fin.&lt;/p&gt;

&lt;p&gt;jajajaj&lt;/p&gt;
&lt;h2&gt;
  
  
  Encriptar
&lt;/h2&gt;

&lt;p&gt;Para poder utilizar qpdf para poner una contrasena se realiza de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qpdf --encrypt "TUCONTRASENA" "TUCONTRASENA" 256 -- "NOMBRE_DE_TU_ARCHIVO_PDF" "NOMBRE_DE_TU_ARCHIVO_PDF_ENCRIPTADO";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente es todo lo que necesitas para encriptar. Como pueden ver es demasiado facil utilizar esta herramienta y bastante intuitiva&lt;/p&gt;

&lt;p&gt;A continuación les muestro un ejemplo de como utilizar qpdf para encriptar todos los archivos de una carpeta utilizando bash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#/bin/bash

# Directorio que contiene los archivos PDF a encriptar
directorio_pdf="./"
# Contraseña para encriptar los archivos PDF
contrasena="AQUIVATUCONTRASENA"

# Titulo
echo "Encriptador de PDFS"

# Itera sobre todos los archivos PDF en el directorio
for archivo_pdf in "$directorio_pdf"/*.pdf; do
    if [ -f "$archivo_pdf" ]; then

    # NOMBRE DEL ARCHIVO A ENCRIPTAR
    nombre_archivo=$(basename "$archivo_pdf")

    # NOMBRE DEL ARCHIVO ENCRIPTADO
    archivo_temporal="${nombre_archivo}_encriptado.pdf"

    echo "----------------"
    echo "Encriptando el archivo: $archivo_pdf"


    if qpdf --encrypt "$contrasena" "$contrasena" 256 -- "$archivo_pdf" "$directorio_pdf/${archivo_temporal}"; then
        echo "El comando se ejecuto correctamente"

        rm "$directorio_pdf/${nombre_archivo}"
        cp "$directorio_pdf/${archivo_temporal}" "$directorio_pdf/${nombre_archivo}"
        rm "$directorio_pdf/${archivo_temporal}"

    else
        echo "Ocurrio un error al ejecutar el comando"
    fi
    #echo "Encriptado: $archivo_pdf -&amp;gt; ${nombre_archivo}_encriptado.pdf"
    fi
done

echo "Proceso completado."


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bash</category>
    </item>
    <item>
      <title>SQL | Cifrar datos</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Sun, 24 Sep 2023 14:29:32 +0000</pubDate>
      <link>https://dev.to/fynio/sql-cifrar-datos-dnh</link>
      <guid>https://dev.to/fynio/sql-cifrar-datos-dnh</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;Hoy les quiero compartir un código hecho en php para poder cifrar los datos de su base de datos y poder descencriptarlos esto con la finalidad de mejorar la seguridad de sus BD.&lt;/p&gt;

&lt;p&gt;Quiero aclarar que este codigo lo obtuve de el video de lastDragon solo lo mejore un poco&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=8jW0CvtBg8c" rel="noopener noreferrer"&gt;Link del video de last dragon&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
class Encriptar
{
    private $llave;
    private $vector;

    public function __construct($llave = 'AQUI VA TU LLAVE', $vector = 'AQUI VA TU VECTOR TIENE QUE TENER SOLO 16 CARACTERES')
    {
        $this-&amp;gt;llave = $llave;
        $this-&amp;gt;vector = $vector;
    }

    public function cifrar($texto)
    {
        // Convertir el texto a base64 para manejar comillas simples y caracteres especiales
        $textoCodificado = base64_encode($texto);
        $cifrado = openssl_encrypt($textoCodificado, 'aes-256-cbc', $this-&amp;gt;llave, OPENSSL_RAW_DATA, $this-&amp;gt;vector);
        if ($cifrado === false) {
            throw new Exception('Error al cifrar los datos.');
        }
        return base64_encode($cifrado);
    }

    public function descifrar($cifrado)
    {
        $descifrado = openssl_decrypt(base64_decode($cifrado), 'aes-256-cbc', $this-&amp;gt;llave, OPENSSL_RAW_DATA, $this-&amp;gt;vector);
        if ($descifrado === false) {
            throw new Exception('Error al descifrar los datos.');
        }
        // Decodificar desde base64 para obtener el texto original
        return base64_decode($descifrado);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejemplo de uso
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
    include_once "encriptar.php";

    $Encriptar= new Encriptar();
    $encriptado =  $Encriptar-&amp;gt;cifrar("Texto a encriptar");

    echo "Texto cifrado es: " . $encriptado;

    // DESCENCRIPTANDO ...
    echo "Texto descifrado es: " .$Encriptar-&amp;gt;descifrar($encriptado);


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Que es OPENSSL_ENCRYPT?
&lt;/h2&gt;

&lt;p&gt;openssl_encrypt es una función en PHP que se utiliza para cifrar datos utilizando la biblioteca OpenSSL. OpenSSL es una biblioteca de código abierto que proporciona implementaciones de varios protocolos de seguridad, incluyendo SSL (Secure Sockets Layer) y TLS (Transport Layer Security), así como algoritmos de cifrado y funciones criptográficas.&lt;/p&gt;

&lt;p&gt;La función openssl_encrypt se utiliza para cifrar datos utilizando diferentes algoritmos de cifrado simétrico, como AES (Advanced Encryption Standard), DES (Data Encryption Standard), y otros. Permite cifrar datos utilizando una clave secreta y, opcionalmente, un vector de inicialización (IV) para mejorar la seguridad.&lt;/p&gt;

&lt;p&gt;Aquí tienes un ejemplo simple de cómo se utiliza openssl_encrypt en PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$data = "Hola, mundo!";
$clave = "MiClaveSecreta";
$iv = random_bytes(16); // Vector de inicialización aleatorio

$cifrado = openssl_encrypt($data, 'AES-256-CBC', $clave, 0, $iv);

echo "Texto cifrado: " . $cifrado;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, estamos cifrando el mensaje "Hola, mundo!" utilizando el algoritmo AES-256 en modo CBC (Cipher Block Chaining) con una clave secreta y un IV generados aleatoriamente.&lt;/p&gt;

&lt;p&gt;Es importante destacar que el uso seguro de openssl_encrypt implica la gestión adecuada de las claves y otros parámetros de seguridad, así como el almacenamiento seguro de dichas claves. El cifrado es una parte fundamental de la seguridad de datos, y su implementación incorrecta puede llevar a vulnerabilidades de seguridad.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>lastdragon</category>
      <category>ciberseguridad</category>
    </item>
    <item>
      <title>Conectar con ssh de mac a ubuntu</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Sun, 10 Sep 2023 18:13:00 +0000</pubDate>
      <link>https://dev.to/fynio/conectar-con-ssh-de-mac-a-ubuntu-93i</link>
      <guid>https://dev.to/fynio/conectar-con-ssh-de-mac-a-ubuntu-93i</guid>
      <description>&lt;h2&gt;
  
  
  Hola a todos
&lt;/h2&gt;

&lt;p&gt;Hoy traigo un nuevo tutorial, en este caso es para conectar por ssh una computadora mac a una con ubuntu. Pero se puede hacer para cualquier S.O.&lt;/p&gt;

&lt;p&gt;Bueno, pues, a darle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurar SSH en la computadora Ubuntu:
&lt;/h3&gt;

&lt;p&gt;Asegúrate de que el servicio SSH esté instalado y en ejecución en tu computadora Ubuntu. Puedes hacerlo ejecutando los siguientes comandos en la terminal de Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install openssh-server
sudo systemctl start ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto instalará el servidor SSH y lo pondrá en funcionamiento en tu computadora Ubuntu.&lt;/p&gt;

&lt;p&gt;Obtener la dirección IP de la computadora Ubuntu:&lt;/p&gt;

&lt;p&gt;Necesitarás conocer la dirección IP de tu computadora Ubuntu en la red local. Puedes obtenerla ejecutando el siguiente comando en la terminal de Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip a | grep inet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Busca una línea que comience con "inet" y tenga una dirección IP que se parezca a 192.168.x.x o 10.x.x.x. Esta es la dirección IP de tu computadora Ubuntu en la red local.&lt;/p&gt;

&lt;h3&gt;
  
  
  ufw
&lt;/h3&gt;

&lt;p&gt;Firewall o reglas de seguridad:&lt;/p&gt;

&lt;p&gt;Es posible que un firewall o reglas de seguridad estén bloqueando las conexiones SSH. Asegúrate de que el puerto 22 (el puerto predeterminado para SSH) esté abierto en el firewall de tu servidor. Puedes utilizar el siguiente comando para ver las reglas de firewall activas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ves que el puerto 22 está en la lista de reglas denegadas, debes agregar una regla para permitirlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw allow 22/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, reinicia el firewall:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso es todo lo que debemos de configurar en la computadora ubuntu&lt;/p&gt;

&lt;h3&gt;
  
  
  MAC
&lt;/h3&gt;

&lt;p&gt;Para la computadora mac solo tenemos que conectarnos con ssh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh NOMBREUSUARIO@IP_DEL_SERVIDOR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@192.168.1.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Te pedira la contrasena que es la misma del usuario de ubuntu&lt;/p&gt;

</description>
      <category>recordar</category>
      <category>espanol</category>
      <category>ssh</category>
    </item>
    <item>
      <title>Deployar en una subcarpeta React con React-Router-Dom en servidor Nginx con Vite</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Fri, 18 Aug 2023 21:12:26 +0000</pubDate>
      <link>https://dev.to/fynio/deployar-en-una-subcarpeta-react-con-react-router-dom-en-servidor-nginx-con-vite-341p</link>
      <guid>https://dev.to/fynio/deployar-en-una-subcarpeta-react-con-react-router-dom-en-servidor-nginx-con-vite-341p</guid>
      <description>&lt;h2&gt;
  
  
  Hola a todos
&lt;/h2&gt;

&lt;p&gt;En esta ocasión les traigo un nuevo tutorial para poder deployar su aplicación en una subcarpeta&lt;/p&gt;

&lt;h3&gt;
  
  
  NGINX
&lt;/h3&gt;

&lt;p&gt;Dentro de Nginx debemos de configurar nuestro servidor de la siguiente manera&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        location /[AQUÍ VA EL NOMBRE DE LA SUBCARPETA]{
            try_files $uri $uri/ /[SUBCARPETA]/index.html?$args;
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro del location tendremos que poner el nombre de la subcarpeta para cuando accedan ahí cargue los archivos necesarios accediendo a   Nombre de la subcarpeta/index.html y que cargue el archivo html.&lt;/p&gt;

&lt;p&gt;Con esto garantizamos que se carguen los archivos que queremos al momento de acceder a una ruta de la subcarpeta&lt;/p&gt;

&lt;h3&gt;
  
  
  vite.config.js
&lt;/h3&gt;

&lt;p&gt;Si no existe el archivo de configuración lo creamos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  base: 'https://[RUTA DEL SERVIDOR]/[Nombre de la subcarpeta]/',
  plugins: [react()],
})

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota: La ruta del servidor es ejemplo: rodrigo.hgo.mx&lt;/p&gt;

&lt;h3&gt;
  
  
  main.jsx
&lt;/h3&gt;

&lt;p&gt;En el main.jsx de nuestra aplicacion debemos de definir el publicPath para todas nuestras rutas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const publicPath = '/[NOMBRE DE TU SUBCARPETA]/';

const router = createBrowserRouter([
  {
    path: publicPath,
    element: &amp;lt;Root/&amp;gt;,
    errorElement: &amp;lt;ErrorPage /&amp;gt;, 
  },
  {
    path: `${publicPath}encuesta`,
    element: &amp;lt;Contact /&amp;gt;,
  },

]);



// AQUI EN EL ROUTER PROVIDER DEBEMOS DE PONER EL BASENAME 

ReactDOM.createRoot(document.getElementById('root')).render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;RouterProvider router={router} basename="/[NOMBRE DE TU SUBCARPETA]"&amp;gt;
    &amp;lt;/RouterProvider&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>nginx</category>
      <category>reactrouter</category>
      <category>react</category>
    </item>
    <item>
      <title>Como subir un proyecto de laravel con nginx</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Tue, 15 Aug 2023 18:15:27 +0000</pubDate>
      <link>https://dev.to/fynio/como-subir-un-proyecto-de-laravel-con-nginx-20h0</link>
      <guid>https://dev.to/fynio/como-subir-un-proyecto-de-laravel-con-nginx-20h0</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;En este post quiero compartirles como le hice para subir mi proyecto hecho en &lt;strong&gt;Laravel&lt;/strong&gt; con un servidor &lt;strong&gt;nginx&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Nginx
&lt;/h2&gt;

&lt;p&gt;Primero modifique mi configuración de mi servidor nginx de la siguiente manera&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    server {
        client_max_body_size 604M;
        listen 80;
        server_name localhost;
        proxy_read_timeout 3000;
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;

    #index index.php index.html index.htm;
   index index.php index.html index.htm;


        location / {
            root html;
        try_files $uri $uri/ /PruebaLaravel/public/index.php?$is_args$args;

        }

        location ~ \.php$ {
            root html;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;

        }


    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como notaran en la sección location &lt;br&gt;
tengo el siguiente código&lt;/p&gt;

&lt;p&gt;try_files $uri $uri/ /PruebaLaravel/public/index.php?$is_args$args;&lt;/p&gt;

&lt;p&gt;Este código sirve para que cuando entren a PruebaLaravel public les cargue las rutas correctamente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Laravel
&lt;/h2&gt;

&lt;p&gt;Para la sección de laravel lo unico que hice fue subir mi proyecto y configurar el archivo .env que por defecto al momento de subirlo (con git) el archivo cuenta con un .gitignore el cual elimina vendor y el archivo .env&lt;/p&gt;

&lt;p&gt;Pór lo que primero debemos de ejecutar el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Posteriormente debemos de editar el archivo .env.example lo único que hice fue con el comando cp ejecutar lo siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego de ejecutar ese comando que lo que hace es crear el archivo .env con la configuración del .env.example&lt;/p&gt;

&lt;p&gt;posteriormente debemos de crear el apikey, para esto debemos de ejecutar el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan key:generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Que lo que hace básicamente es generarnos una clave en base64 y colocarla en el archivo .env automaticamente.&lt;/p&gt;

&lt;p&gt;debe quedar nuestro archivo .env de la siguiente manera&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_KEY=base64:nwS6IQobORgUqweqweqw1UVPMox8YBmuaffm/3ZvCOdasdasd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  nginx
&lt;/h2&gt;

&lt;p&gt;Les recomiendo proteger su configuracion de .env con nginx de la siguiente manera&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    location = /PruebaLaravel/.env{
        autoindex off;
        deny all;
        return 404;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;P.D. No olviden asignar los permisos necesarios para acceder a la carpeta.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>nginx</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Curso | Solidity | modifier</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Mon, 07 Aug 2023 15:23:03 +0000</pubDate>
      <link>https://dev.to/fynio/curso-solidity-modifier-22jp</link>
      <guid>https://dev.to/fynio/curso-solidity-modifier-22jp</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;Hoy les traigo un minitutorial del curso de solidity que estoy tomando, al finalidad de esto es que aprendamos juntos ya que no soy experto en solidity si no que estoy apenas aprendiendo y la idea es explicar lo que he entendido con el objetivo de aprender-enseñando&lt;/p&gt;

&lt;h2&gt;
  
  
  modifier
&lt;/h2&gt;

&lt;p&gt;El término "modifier" se refiere a una característica que te permite definir una serie de comprobaciones o condiciones que deben cumplirse antes de que una función pueda ser ejecutada. Los modificadores son una forma de modularizar y reutilizar lógica en tus contratos inteligentes, lo que hace que el código sea más claro y fácil de mantener.&lt;/p&gt;

&lt;p&gt;Los modificadores son particularmente útiles para aplicar lógica de verificación o validación antes de permitir que una función realice su tarea. Pueden utilizarse para verificar que ciertas condiciones se cumplan antes de que una función cambie el estado del contrato o realice alguna acción importante. Al utilizar modificadores, puedes evitar la duplicación de código y garantizar que ciertas validaciones se apliquen consistentemente en diferentes partes de tu contrato.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo simple para ilustrar cómo se utiliza un modifier en Solidity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pragma solidity ^0.8.0;

contract Ejemplo {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier soloOwner() {
        require(msg.sender == owner, "¡Solo el propietario puede ejecutar esta función!");
        _;  // Esta línea indica dónde se ejecutará el cuerpo de la función una vez que se valide el modifier.
    }

    function hacerAlgo() public soloOwner {
        // El código de la función se ejecutará solo si el modifier "soloOwner" valida.
        // Hacer algo interesante aquí...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, el modifier &lt;strong&gt;soloOwner&lt;/strong&gt; verifica si la dirección que llama a la función es la misma que la dirección del propietario del contrato. Si no lo es, la función no se ejecutará y arrojará una excepción. Si la comprobación del &lt;strong&gt;modifier&lt;/strong&gt; pasa, la función &lt;strong&gt;hacerAlgo&lt;/strong&gt; se ejecutará normalmente.&lt;/p&gt;

&lt;p&gt;En resumen, los modificadores en &lt;strong&gt;Solidity&lt;/strong&gt; son una herramienta poderosa para agregar condiciones de validación y lógica reutilizable a tus funciones de contrato inteligente, lo que ayuda a mejorar la seguridad y la claridad del código.&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>ethereum</category>
      <category>remix</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Curso | Solidity| require</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Thu, 03 Aug 2023 15:47:30 +0000</pubDate>
      <link>https://dev.to/fynio/curso-solidity-require-48ld</link>
      <guid>https://dev.to/fynio/curso-solidity-require-48ld</guid>
      <description>&lt;h2&gt;
  
  
  Hola a todos
&lt;/h2&gt;

&lt;p&gt;Hoy les traigo un minitutorial del curso de solidity que estoy tomando, al finalidad de esto es que aprendamos juntos ya que no soy experto en solidity si no que estoy apenas aprendiendo y la idea es explicar lo que he entendido con el objetivo de aprender-enseñando&lt;/p&gt;

&lt;p&gt;// SPDX-License-Identifier: MIT&lt;br&gt;
pragma solidity 0.8.18;&lt;/p&gt;

&lt;p&gt;contract Variables{&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function PruebaRequire(uint valor) public pure returns(bool)
{
    require(valor==5, "EL VALOR NO ES IGUAL A 5");
    return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Este contrato contiene una función llamada "PruebaRequire" que toma un valor como parámetro y verifica si ese valor es igual a 5 utilizando la función require. Si la condición se cumple, la función devuelve true. Si el valor no es igual a 5, la función se detiene y muestra un mensaje de error.&lt;/p&gt;

&lt;p&gt;Al momento de deployar el contrato podremos observar que al enviar un 5 en el valor este no retorna ningún error;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5734u1t0lr0hmu6q0ml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5734u1t0lr0hmu6q0ml.png" alt="" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y podremos ver más información dando clic donde dice CALL para ver que retorna un valor bool que dice true.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyzvoq541xsu97q9dbol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyzvoq541xsu97q9dbol.png" alt="" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pero en caso de enviar un numero diferente se notificara de esta manera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhj3fs9uk26217l1gpb7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhj3fs9uk26217l1gpb7f.png" alt="" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso es todo por el dia de hoy&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1nphn2n3qualy2zm8nw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1nphn2n3qualy2zm8nw.png" alt="" width="627" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>require</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Curso| Solidity | funciones</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Mon, 31 Jul 2023 04:13:17 +0000</pubDate>
      <link>https://dev.to/fynio/curso-solidity-funciones-4c01</link>
      <guid>https://dev.to/fynio/curso-solidity-funciones-4c01</guid>
      <description>&lt;h2&gt;
  
  
  Hola
&lt;/h2&gt;

&lt;p&gt;Continuando con el curso hoy toca funciones&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

contract Funciones{

    function suma(uint a, uint b) external pure returns(uint){

        return a + b;

    }

    function resta(uint a, uint b) external  pure returns(uint)
    {
        return a - b;

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SPDX-License-Identifier: MIT: Esta es una directiva especial llamada "SPDX-License-Identifier" que se utiliza para especificar la licencia bajo la cual se distribuye el contrato inteligente. En este caso, el contrato está bajo la licencia MIT, que es una licencia de software libre muy común y permite que otros puedan utilizar, modificar y redistribuir el código con ciertas condiciones.&lt;/p&gt;

&lt;p&gt;pragma solidity 0.8.13: Esta es otra directiva que especifica la versión del compilador de Solidity que se debe utilizar para compilar el contrato. En este caso, se está utilizando la versión 0.8.13 de Solidity.&lt;/p&gt;

&lt;p&gt;contract Funciones: Aquí se define el contrato inteligente llamado "Funciones".&lt;/p&gt;

&lt;p&gt;function suma(uint a, uint b) external pure returns(uint): Esta es una función llamada "suma", que toma dos parámetros de tipo uint (números enteros sin signo) y devuelve un resultado uint. La palabra clave "pure" indica que esta función no modifica el estado del contrato ni lee datos del mismo; es decir, es una función que solo realiza cálculos internos y no interactúa con el blockchain de Ethereum.&lt;/p&gt;

&lt;p&gt;function resta(uint a, uint b) external pure returns(uint): Esta es otra función llamada "resta", que también toma dos parámetros de tipo uint y devuelve un resultado uint. Al igual que la función "suma", es una función "pure" que solo realiza cálculos internos.&lt;/p&gt;

&lt;p&gt;Ambas funciones son declaradas como "external", lo que significa que pueden ser llamadas desde fuera del contrato (por ejemplo, desde otros contratos o desde una transacción externa a través de una interfaz de usuario).&lt;/p&gt;

&lt;p&gt;En resumen, este contrato inteligente proporciona dos funciones, "suma" y "resta", que realizan operaciones matemáticas simples y no modifican el estado del contrat&lt;/p&gt;

&lt;p&gt;Para poder ejecutar la funcion tenemos que pasarle los datos en este caso se pasan los parametros separados por una coma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbczxe0pzr3vj85h36f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbczxe0pzr3vj85h36f0.png" alt="Image description" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Clase 2| SOLIDITY | Creación de variables</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Mon, 31 Jul 2023 02:36:51 +0000</pubDate>
      <link>https://dev.to/fynio/clase-2-solidity-creacion-de-variables-28em</link>
      <guid>https://dev.to/fynio/clase-2-solidity-creacion-de-variables-28em</guid>
      <description>&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;

&lt;p&gt;Continuando con el curso de solidity vamos a ver los tipos de variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;


contract Variables {

    string public miNombre = "Rodrigo";
    int256 public entero = 12313123;
    int8 public otro_entero = 2;
    address public direccion = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En resumen, este contrato define cuatro variables públicas:&lt;/p&gt;

&lt;p&gt;miNombre: Es una variable de tipo string (cadena de caracteres) y tiene asignado el valor "Rodrigo". Esta variable es pública, lo que significa que cualquier persona o contrato que interactúe con este contrato puede leer su valor.&lt;/p&gt;

&lt;p&gt;entero: Es una variable de tipo int256 (entero de 256 bits) y tiene asignado el valor 12313123. Al igual que la anterior, esta variable es pública y su valor puede ser leído por cualquiera.&lt;/p&gt;

&lt;p&gt;otro_entero: Es una variable de tipo int8 (entero de 8 bits) y tiene asignado el valor 2. También es pública y su valor es accesible por cualquier persona o contrato.&lt;/p&gt;

&lt;p&gt;direccion: Es una variable de tipo address (dirección de Ethereum) y tiene asignado el valor 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4. Al ser pública, la dirección almacenada puede ser consultada por cualquiera.&lt;/p&gt;

&lt;p&gt;Las variables tipo direccion sirve para tener la dirección de una cartera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpmy715agr19zftyfaar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpmy715agr19zftyfaar.png" alt="Image description" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Clase 1|SOLIDITY| Hola mundo</title>
      <dc:creator>RGT</dc:creator>
      <pubDate>Mon, 31 Jul 2023 00:17:22 +0000</pubDate>
      <link>https://dev.to/fynio/cursos-de-solidity-121n</link>
      <guid>https://dev.to/fynio/cursos-de-solidity-121n</guid>
      <description>&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Hola a todos
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Voy a comenzar a estudiar solidity nuevamente y por lo tanto voy a utilizar dev.to para guardarlo como un blog para recordar mi codigo&lt;/p&gt;

&lt;p&gt;Primero debemos de conectarnos a &lt;a href="https://remix.ethereum.org" rel="noopener noreferrer"&gt;Remix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1k1yxvtizugrhmajxbgm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1k1yxvtizugrhmajxbgm.png" alt="Image description" width="800" height="484"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

contract HolaMundo {
string public miNombre = "Rodrigo";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SPDX-License-Identifier: MIT
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Este comentario es un identificador de licencia que se utiliza para especificar qué tipo de licencia se aplica al código fuente. En este caso, indica que el código está licenciado bajo la Licencia MIT. La Licencia MIT es una licencia de código abierto muy permisiva que permite a cualquiera usar, modificar, distribuir y compartir el código bajo ciertas condiciones. El uso de este identificador facilita la comprensión de la licencia del código por parte de otras personas que quieran utilizarlo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  pragma solidity 0.8.13;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Esta declaración pragma indica la versión del compilador de Solidity que se debe utilizar para compilar el contrato. En este caso, se está utilizando la versión 0.8.13 de Solidity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este contrato se llama "HolaMundo" y contiene una sola variable llamada miNombre, que es de tipo string. La variable está declarada como pública, lo que significa que es accesible desde fuera del contrato.&lt;/p&gt;

&lt;p&gt;La línea string public miNombre = "Rodrigo"; inicializa la variable miNombre con el valor "Rodrigo". Al ser pública, se genera automáticamente una función de lectura (getter) que permite a otros usuarios leer el valor de miNombre desde fuera del contrato.&lt;/p&gt;

&lt;p&gt;En resumen, este contrato es bastante simple y su única funcionalidad es almacenar y permitir la lectura del nombre "Rodrigo" en la variable miNombre. Es común encontrar ejemplos de "Hola Mundo" cuando se presentan lenguajes de programación o contratos para mostrar la estructura básica y la sintaxis. Sin embargo, en aplicaciones descentralizadas más complejas, los contratos pueden tener funcionalidades mucho más avanzadas y útiles.&lt;/p&gt;

&lt;p&gt;Despues de tener nuestro código listo debemos de compilarlo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtc29v2s7mgsdtjjr8dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtc29v2s7mgsdtjjr8dw.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder compilarlo debemos dar clic en las opciones que se encuentran en el lado izquierdo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3kakjr2ytnupe3693tt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3kakjr2ytnupe3693tt.png" alt="Image description" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despues de estar compilado debemos deployarlo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn67hz4idtr1sji0316v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn67hz4idtr1sji0316v.png" alt="Image description" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despues de deployarlo podremos ver la variable que creamos dando clic en minombre&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flihylzwkoqmbvqcjsibk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flihylzwkoqmbvqcjsibk.png" alt="Image description" width="640" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y automaticamente nos debe de mostrar el nombre de nuestra variable&lt;/p&gt;

</description>
      <category>solidity</category>
    </item>
  </channel>
</rss>
