<?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: GeoannyCode</title>
    <description>The latest articles on DEV Community by GeoannyCode (@geoannycode).</description>
    <link>https://dev.to/geoannycode</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%2F823171%2Fa6355259-c117-4190-a10b-3bdb7af216d8.jpg</url>
      <title>DEV Community: GeoannyCode</title>
      <link>https://dev.to/geoannycode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geoannycode"/>
    <language>en</language>
    <item>
      <title>Conceptos Avanzados de Python 🐍 para ser un profesional en el lenguaje</title>
      <dc:creator>GeoannyCode</dc:creator>
      <pubDate>Sun, 18 Dec 2022 16:39:48 +0000</pubDate>
      <link>https://dev.to/geoannycode/conceptos-avanzados-de-python-para-ser-un-profesional-en-el-lenguaje-1l7o</link>
      <guid>https://dev.to/geoannycode/conceptos-avanzados-de-python-para-ser-un-profesional-en-el-lenguaje-1l7o</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Cómo funciona Python?&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Python es un &lt;strong&gt;lenguaje interpretado&lt;/strong&gt; lo que significa que tu código es transformado por el intérprete (máquina virtual de Python) a &lt;em&gt;bytecode&lt;/em&gt; antes de ser ejecutado por un ordenador con &lt;em&gt;x&lt;/em&gt; sistema operativo.&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%2Fyky7sawt7xlh1gjoleok.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%2Fyky7sawt7xlh1gjoleok.png" alt="Tipos de lenguaje" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  El bytecode
&lt;/h3&gt;

&lt;p&gt;Es un lenguaje de programación de más bajo nivel que puede ser leído por un intérprete.&lt;/p&gt;

&lt;p&gt;Aquí un ejemplo de una función pasando a bytecode.&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%2Fr10smxm2joub2lezbdf9.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%2Fr10smxm2joub2lezbdf9.png" alt="python-bytecode" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Interprete
&lt;/h3&gt;

&lt;p&gt;Es la máquina virtual, traduce el bytecode a código máquina (ceros y unos).&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%2Feenjy82kep8a44wj3npt.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%2Feenjy82kep8a44wj3npt.png" alt="python-maquinavirtual" width="567" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Los lenguajes interpretados son más lentos?&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;La respuesta se puede resumir en la siguiente frase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;C&lt;/strong&gt; cuando se debe y &lt;strong&gt;Python&lt;/strong&gt; cuando se puede.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Garbage collector
&lt;/h3&gt;

&lt;p&gt;Recuerda que el &lt;em&gt;garbage collector&lt;/em&gt; toma los objetos y variables que no están en uso y los elimina.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Qué es la carpeta Pycache?&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;_pycache _&lt;/strong&gt; Es el directorio (carpeta) que contiene el &lt;em&gt;bytecode&lt;/em&gt; (el código intermedio) que crea Python para que lo pueda leer la máquina y no tenga que convertirlo de nuevo a bytecode.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Cómo organizar las carpetas de tus proyectos?&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Paquetes y módulos&lt;/p&gt;

&lt;h3&gt;
  
  
  Módulo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Es cualquier archivo de &lt;strong&gt;Python.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Generalmente, contiene código que se puede reutilizar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Paquete
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Es un conjunto de módulos en una carpeta.&lt;/li&gt;
&lt;li&gt;Siempre posee el archivo &lt;code&gt;__init__.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ejemplo:
&lt;/h3&gt;

&lt;p&gt;Proyecto de exploración espacial:&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%2Ffgnlb7ds2d5iqp9uno79.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%2Ffgnlb7ds2d5iqp9uno79.png" alt="proyecto_exploracion" width="422" height="416"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Módulos:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;code&gt;nave.py&lt;/code&gt; → Explica el funcionamiento de la nave. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;destino.py&lt;/code&gt;→ Calcular las coordenadas del destino.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;plataforma.py&lt;/code&gt;→ Permite manipular la plataforma.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lanzamiento.py&lt;/code&gt;→ Cualidades que necesita la nave.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;test.py&lt;/code&gt;→ Contiene funciones de prueba.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;validacion.py&lt;/code&gt;→Verifica identidad de los pasajeros.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Cómo se vería esto en una estructura de carpetas?&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&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%2Fhj88m80m64l0gdxaah7g.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%2Fhj88m80m64l0gdxaah7g.png" alt="estructura_carpetas" width="753" height="792"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Donde:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;README&lt;/code&gt; → Como trabajar con este proyecto.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt;→ Ignorar archivos en repositorios GIT&lt;/p&gt;

&lt;p&gt;&lt;code&gt;venv&lt;/code&gt;→ Entorno virtual&lt;/p&gt;

&lt;p&gt;&lt;code&gt;exploracion_espacial&lt;/code&gt;→ Paquete que contiene el: &lt;code&gt;__init__.py&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;¿Qué son los tipados?&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;💻 Los tipados es una clasificación de los lenguajes de programación, tenemos cuatro tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estático&lt;/li&gt;
&lt;li&gt;Dinámico&lt;/li&gt;
&lt;li&gt;Débil&lt;/li&gt;
&lt;li&gt;Fuerte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El tipado del lenguaje depende de cómo trata a los tipos de datos.&lt;/p&gt;

&lt;p&gt;El tipado estático es el que levanta un error en el tiempo de compilación, ejemplo en JAVA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String str = "Hello" // Variable tipo String
str = 5 
// ERROR: no se puede convertir un tipo de dato en otro de esta forma.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El tipado dinámico levantan el error en tiempo de ejecución, ejemplo en Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;str = "Hello" # Variable tipo String
str = 5 # La variable ahora es de tipo Entero, no hay error

## TIPADO FUERTE
x = 1
y = "2"
z = x + y # ERROR: no podemos hacer estas operaciones con tipos de datos distintos entre sí
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El tipado débil es el que hace un cambio en un tipo de dato para poder operar con él, como lo hace JavaScript y PHP.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🐍 Python es un lenguaje de tipado 👾 Dinámico y 💪 Fuerte.&lt;/p&gt;
&lt;/blockquote&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%2F9zhg7jj0eivdnhdu54op.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%2F9zhg7jj0eivdnhdu54op.png" alt="tipados_notipados" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Tipado estático en Python (Static Typing)&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Asignar tipos a las variables de Python:&lt;/p&gt;
&lt;/blockquote&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%2Fj256l85sz9qswsiy0hvk.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%2Fj256l85sz9qswsiy0hvk.png" alt="tipos_variables1" width="412" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Asignar tipos en funciones:&lt;/p&gt;
&lt;/blockquote&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%2Frtfgn2su4hjp3e6tx427.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%2Frtfgn2su4hjp3e6tx427.png" alt="tipos_variables2" width="406" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trabajando con estructuras de datos: &lt;/p&gt;
&lt;/blockquote&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%2Fkwauc39ppz6p2y89sru9.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%2Fkwauc39ppz6p2y89sru9.png" alt="tipos_variables3" width="317" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Trabajar con tipos
&lt;/h3&gt;

&lt;p&gt;Importar de la librería &lt;code&gt;typing&lt;/code&gt; las clases &lt;code&gt;Dict&lt;/code&gt; y &lt;code&gt;List&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Definir una lista de enteros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;positives&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lista de diccionarios con llaves y valores&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Las ventajas de utilizar tipado estático en Python:&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Nos aporta claridad del código.&lt;/li&gt;
&lt;li&gt;Nos da calidad a lo que estamos programando.&lt;/li&gt;
&lt;li&gt;Nuestro código va a ser más entendible a otros programadores si trabajamos con tipos.&lt;/li&gt;
&lt;li&gt;Nos va a devolver los errores antes del que programa se ejecute.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Scope: alcance de las variables&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;El Scope es el alcance que tienen las variables. &lt;/li&gt;
&lt;li&gt;Depende de donde declares o inicialices una variable para saber si tienes acceso. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local Scope
&lt;/h3&gt;

&lt;p&gt;Es la región que corresponde el ámbito de una función, donde podremos tener una o más variables, las variables van a ser accesibles únicamente en esta región y no serán visibles para otras regiones&lt;/p&gt;

&lt;h3&gt;
  
  
  Global Scope
&lt;/h3&gt;

&lt;p&gt;Al escribir una o más variables en esta región, estas podrán ser accesibles desde cualquier parte del código.&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%2Fluvg0q3wc9470nusi7hp.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%2Fluvg0q3wc9470nusi7hp.png" alt="scope" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Closures&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Es una forma de acceder a variables de otros Scopes a través de una nested function. Se retorna la nested function y esta recuerda el valor que imprime, aunque a la hora de ejecutarla no este dentro de su alcance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nested Functions (Funciones anidadas)
&lt;/h3&gt;

&lt;p&gt;Funciones creadas dentro de otra función:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def main():
    a = 1
    def nested(): 
        print(a)
    return nested

my_func = main()
my_func()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reglas para encontrar un Closure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Debemos tener una nested function.&lt;/li&gt;
&lt;li&gt;La nested function debe referenciar un valor de un scope superior.&lt;/li&gt;
&lt;li&gt;La función que envuelve a la nested function debe retornarla también.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Decoradores&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Un decorador es una función que recibe como parámetro otra función, le añade cosas y retorna una función diferente. &lt;br&gt;
Tienen la misma estructura que los &lt;code&gt;Closures&lt;/code&gt;, pero en vez de variables lo que se envía es una función. &lt;br&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;def decorador(func):
    def envoltura():
        print("Esto se añade a mi función original.")
        func()
    return envoltura

def saludo():
    print("¡Hola!")

saludo()
# Salida:
# ¡Hola!

saludo = decorador(saludo) # Se guarda la función decorada en la variable saludo
saludo()                   # La función saludo está ahora decorada
# Salida:
# Esto se añade a mi función original.
# ¡Hola!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se puede hacer de manera más sencilla, con azúcar sintáctica (sugar syntax): Cuando tenemos un código que está embellecido para que nosotros lo veamos de una manera más estática, ayudando a entender de manera más sencilla el código. &lt;/p&gt;

&lt;p&gt;De esta manera, tenemos el código anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def decorador(func):
    def envoltura():
        print("Esto se añade a mi función original.")
        func()
    return envoltura

def saludo():
    print("¡Hola!")
saludo = decorador(saludo) # Se guarda la función decorada en la variable saludo (se decora)

saludo()                   # La función saludo está ahora decorada

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def decorador(func):
    def envoltura():
        print("Esto se añade a mi función original.")
        func()
    return envoltura

# De esta manera se decora la función saludo (equivale a saludo = decorador(saludo) de la última línea, quedando ahora en la línea inmediata superior ):
@decorador
def saludo():
    print("¡Hola!")

saludo()                   # La función saludo está ahora decorada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite ahorrar código al implementar características (decoradores) comunes a diferentes funciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def decorator_upper(func):                  # Función decoradora
    def wrapper(text):                      # Función anidada
        return func(text).upper()           # Operación que realiza el decorado a la función (func), inserta el texto a la función original. Convierte todo a mayúsculas.
    return wrapper                          # Devuelve wapper como indica la regla de los Clousures

@decorator_upper                            # Decora la función message
def message(name):
    return f'{name}, recibiste un mensaje'  # Esto es lo que realiza la función message, previo a ser decorada.

@decorator_upper                            # Decora la función warning
def warning(name):
    return f'Usa solo mayúsculas {name}'  # Esto es lo que realiza la función warning, previo a ser decorada.

print(message("Cesar")) # Output: CESAR, RECIBISTE UN MENSAJE
print(warning("Cesar")) # Output: USA SOLO MAYÚSCULAS CESAR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Iteradores&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Antes de entender qué son los &lt;code&gt;iteradores&lt;/code&gt;, primero debemos entender a los iterables.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Son todos aquellos objetos que podemos recorrer en un ciclo. - Son aquellas estructuras de datos divisibles en elementos únicos que yo puedo recorrer en un ciclo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero en Python las cosas no son así. Los iterables se convierten en &lt;code&gt;iteradores&lt;/code&gt;.&lt;/p&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;# Creando un iterador

my_list = [1,2,3,4,5]
my_iter = iter(my_list)

# Iterando un iterador

print(next(my_iter))

# Cuando no quedan datos, la excepción StopIteration es elevada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Creando un iterador

my_list = [1,2,3,4,5]
my_iter = iter(my_list)

# Iterando un iterador

while True: #ciclo infinito
  try:
    element = next(my_iter)
    print(element)
  except StopIteration:
    break
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Momento impactante: El ciclo “&lt;code&gt;for&lt;/code&gt;” dentro de Python, no existe. Es un &lt;code&gt;while&lt;/code&gt; con &lt;code&gt;StopIteration&lt;/code&gt;. 🤯🤯🤯&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_list = [1,2,3,4,5]

for element in my_list:
  print(element)

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;evenNumbers.py&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class EvenNumbers:
  """Clase que implementa un iterador de todos los números pares,
  o los números pares hasta un máximo
  """

  #* Constructor de la clase
  def __init__(self, max = None): #self hace referencia al objeto futuro que voy a crear con esta clase
    self.max = max


  # Método para tener elementos o atributos que voy a necesitar para que el iterador funcione
  def __iter__(self):
    self.num = 0 #Primer número par
    #* Convertir un iterable en un iterador
    return self

  # Método para tener la función "next" de Python
  def __next__(self):
    if not self.max or self.num &amp;lt;= self.max:
      result = self.num
      self.num += 2
      return result
    else:
      raise StopIteration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ventajas de usar iteradores:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nos ahorra recursos.&lt;/li&gt;
&lt;li&gt;Ocupan poca memoria.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Generadores&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Sugar syntax de los iteradores. Los generadores son funciones que guardan un estado. Es un iterador escrito de forma más simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def my_gen():

  """un ejemplo de generadores"""

  print('Hello world!')
  n = 0
  yield n # es exactamente lo mismo que return pero detiene la función, cuando se vuelva a llamar a la función, seguirá desde donde se quedó

  print('Hello heaven!')
  n = 1
  yield n

  print('Hello hell!')
  n = 2
  yield n


a = my_gen()
print(next(a)) # Hello world!
print(next(a)) # Hello heaven!
print(next(a)) # Hello hell!
print(next(a)) StopIteration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora veremos un generator expression (es como list comprehension pero mucho mejor, porque podemos manejar mucha cantidad de información sin tener problemas de rendimiento):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Generator expression

my_list = [0,1,4,7,9,10]

my_second_list = [x*2 for x in my_list] #List comprehension
my_second_gen = ()x*2 for x in my_list]) #Generator expression
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Sets&lt;/em&gt;&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Un set es una colección desordenada de elementos únicos e inmutables.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se crean los sets?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_set = {1, 2, 3, 4, 5}
print("my_set =", my_set)

my_set2 = {"Hola", 2.4, False, True}
print("my_set2 =", my_set2)

my_set3 = {3,3,2}
print("my_set3 =", my_set3)

my_set4 = {[1,2,3], [4,5,6],4}
print("my_set4 =", my_set4)
## Este último da error porque una lista es un elemento mutable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una llave sin los dos puntos crea un set&lt;/p&gt;

&lt;p&gt;Se puede crear sets vacíos…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;empty_set = {}
print(type(empty_set)) #&amp;lt;class 'dict'&amp;gt;

empty_set = set()
print(type(empty_set)) # &amp;lt;class 'set'&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Datos a tener en cuenta&lt;/em&gt;&lt;/strong&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python trata las llaves como un diccionario&lt;/li&gt;
&lt;li&gt;Se usa la función set() para indicar que es un set&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Casting con set
&lt;/h3&gt;

&lt;p&gt;Convertir un set a otra estructura de datos, o una estructura de datos a un set.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_list = [1,1,2,3,45,324]
my_set = set(my_list)
print(my_set)

my_tulpe = ("hola", "hola", "hola", 1)
my_set2 = set(my_tulpe)
print(my_set2)
# {1, 2, 3, 324, 45}
# {1, 'hola'}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Datos a tener en cuenta&lt;/em&gt;&lt;/strong&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Para transformar una lista y una tupla. solo tenemos que usar el set() sobre la variable&lt;/li&gt;
&lt;li&gt;El set() elimina los elementos que se repiten.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Añadir elementos a un set
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_set = {1,2,3}
print(my_set)

#añadir un elemento

my_set.add(4)
print(my_set)

#añadir múltiples elementos
my_set.update([1,2,5])

#añadir múltiples elementos
my_set.update([1,7,2], {6,8})
print(my_set)
# {1, 2, 3}
# {1, 2, 3, 4}
# {1, 2, 3, 4, 5, 6, 7, 8}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Datos a tener en cuenta:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;acá podemos apreciar de que hay métodos que se pueden combinar con los set, por ejemplo .add() y .update(). el .add para agregar un elemento y el update para agregar múltiples elementos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Borrar elementos de un set
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_set = {1,2,3,4,5,6,7}
print(my_set)

#Borrar un elemento existente
my_set.discard(1)

my_set.discard(2)
print(my_set)

#borrar un elemento inexistene
my_set.discard(10)

my_set.remove(12)
print(my_set)
# {1, 2, 3, 4, 5, 6, 7}
# {3, 4, 5, 6, 7}
# Traceback (most recent call last):
#   File "python.py", line 28, in &amp;lt;module&amp;gt;
#     my_set.remove(12)
# KeyError: 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se usan los métodos &lt;strong&gt;discard&lt;/strong&gt; y &lt;strong&gt;remove&lt;/strong&gt;&lt;br&gt;
Si el elemento no existe con remove, lanza un error de tipo KeyError. Remove, es más exigene.&lt;/p&gt;

&lt;p&gt;Para eliminar elementos aleatorios se usa el &lt;strong&gt;&lt;code&gt;pop()&lt;/code&gt;&lt;/strong&gt; y para eliminar todos los elementos del set se usa &lt;strong&gt;&lt;code&gt;.clear()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Operaciones con sets
&lt;/h3&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%2Fv01iq8vzsq8g81yksj54.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%2Fv01iq8vzsq8g81yksj54.png" alt="Operaciones con sets" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Métodos Set&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from platform import system
from os import system as console_command


# Utility
def clean_screen() -&amp;gt; None:
  """This function is responsible for cleaning the screen."""

  if system() == 'Windows': console_command('cls')
  else: console_command('clear')


def sets() -&amp;gt; None:
  """Multiple Operations with sets"""
  my_set1 = {'🍎', '🍊', '🍇', '🍓', '🍈'}
  my_set2 = {'🍉', '🍊', '🍒', '🍓', '🍋'}
  print("  →  Set 1:", my_set1)
  print("  →  Set 2:", my_set2)
  print('')
  # Union
  my_set3 = my_set1 | my_set2
  print("     Union                  :", my_set3)
  # Intersection
  my_set4 = my_set1 &amp;amp; my_set2
  print("\n     Intersection           :", my_set4)
  # Difference
  my_set5 = my_set1 - my_set2
  print("\n     Difference set1 - set2 :", my_set5)
  my_set6 = my_set2 - my_set1
  print("\n     Difference set2 - set1 :", my_set6)
  # Symmetric Difference
  my_set7 = my_set1 ^ my_set2
  print("\n     Symmetric Difference   :", my_set7)


if __name__ == '__main__':
  clean_screen()
  print("*** O P E R A T I O N S    W I T H    S E T S ***\n")
  sets()

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Manejo de fechas&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;datetime&lt;/code&gt; es un módulo de manejo de fechas aquì un ejemplo de su uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import datetime

my_time = datetime.datetime.now() # hora local de mi PC u hora universal
my_date = datetime.date.today() # fecha actual

my_day = datetime.date.today()

print(my_time)
print(my_date)

print(f'Year: {my_day.year}')
print(f'Month: {my_day.month}')
print(f'Day: {my_day.day}')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tabla de códigos de formato para fechas y horas(los más importantes):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Formato&lt;/th&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Año&lt;/td&gt;
&lt;td&gt;%Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mes&lt;/td&gt;
&lt;td&gt;%m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Día&lt;/td&gt;
&lt;td&gt;%d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hora&lt;/td&gt;
&lt;td&gt;%H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minutos&lt;/td&gt;
&lt;td&gt;%M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segundos&lt;/td&gt;
&lt;td&gt;%S&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from datetime import datetime

my_datetime = datetime.now()
print(my_datetime)

latam = my_datetime.strftime('%d/%m/%Y')
print(f'Formato LATAM: {latam}')

usa = my_datetime.strftime('%m/%d/%Y')
print(f'Formato USA: {usa}')

random_format = my_datetime.strftime('año %Y mes %m día %d')
print(f'Formato random: {random_format}')

formato_utc = datetime.utcnow()
print(f'Formato UTC: {formato_utc}')

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

&lt;/div&gt;



&lt;p&gt;Este código importa la clase datetime del módulo datetime, que proporciona diversas funciones para trabajar con fechas y horas.&lt;/p&gt;

&lt;p&gt;La primera línea crea un objeto datetime que representa la fecha y hora actual. Luego, se imprime en pantalla utilizando la función &lt;code&gt;print()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La siguiente línea utiliza el método &lt;code&gt;strftime()&lt;/code&gt; para dar formato a la fecha y hora actual en un formato específico. El método &lt;code&gt;strftime()&lt;/code&gt; toma una cadena de formato como argumento, que indica cómo se deben mostrar los distintos componentes de la fecha y hora (día, mes, año, etc.). En este caso, el formato especificado es &lt;code&gt;'%d/%m/%Y'&lt;/code&gt;, que indica que se deben mostrar el día, mes y año en ese orden, separados por barras.&lt;/p&gt;

&lt;p&gt;La siguiente línea hace lo mismo, pero con un formato distinto: &lt;code&gt;'%m/%d/%Y'&lt;/code&gt;, que indica que se deben mostrar el mes, día y año en ese orden, separados por barras.&lt;/p&gt;

&lt;p&gt;La línea siguiente también utiliza el método &lt;code&gt;strftime()&lt;/code&gt;, pero con un formato más personalizado: &lt;code&gt;'año %Y mes %m día %d'&lt;/code&gt;, que muestra el año, mes y día en ese orden, con las palabras "año", "mes" y "día" incluidas en la cadena de formato.&lt;/p&gt;

&lt;p&gt;Por último, se crea un nuevo objeto datetime que representa la fecha y hora actual en el formato UTC (Coordinated Universal Time, o Tiempo Universal Coordinado), que es una referencia de tiempo uniforme utilizada a nivel internacional. Luego, se imprime en pantalla utilizando la función &lt;code&gt;print()&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;¡Gracias por leer este post!😊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha parecido útil o interesante, puedes darle un like 💙 para motivarme a seguir compartiendo contenido así. Si tienes la oportunidad y quieres apoyar mi trabajo, puedes hacerlo a través de un pequeño donativo 💸 ¡Un café virtual sería un gran detalle! ☕ Puedes hacerlo a través de &lt;a href="https://ko-fi.com/geoannycode" rel="noopener noreferrer"&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además, si te gustaría seguir mis actualizaciones y contenido en redes sociales, puedes encontrarme en &lt;a href="https://twitter.com/GeoannyCode" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; y &lt;a href="https://www.youtube.com/channel/UC18KaeuDNfUi9mt9xhNjDyw" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; como "GeoannyCode" 📱💻 Espero verte por allí! 😊 ¡Gracias por tu apoyo! ❤️"&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>☁ Alojar un servidor de Terraria 🌳 en la nube con Linode</title>
      <dc:creator>GeoannyCode</dc:creator>
      <pubDate>Mon, 23 May 2022 19:11:41 +0000</pubDate>
      <link>https://dev.to/geoannycode/alojar-un-servidor-de-terraria-en-la-nube-con-linode-2mjn</link>
      <guid>https://dev.to/geoannycode/alojar-un-servidor-de-terraria-en-la-nube-con-linode-2mjn</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Linode?
&lt;/h2&gt;

&lt;p&gt;Es uno de los más importantes proveedores de computación en la nube, ofreciendo varios servicios web como son: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPS&lt;/li&gt;
&lt;li&gt;Alojamiento de internet &lt;/li&gt;
&lt;li&gt;Servicios de computación en la nube&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;y otros productos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Herramientas para desarrolladores&lt;/li&gt;
&lt;li&gt;Servidores SSD Linux.&lt;/li&gt;
&lt;li&gt;Alojamiento de aplicaciones&lt;/li&gt;
&lt;li&gt;Alojamiento de servidores de juego. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfocándonos en este último, Linode cuenta con una tienda de aplicaciones que nos permite facilitar la creación de estos servidores de juegos, entre estos Minecraft, CSGO, Rust, Valheim y por supuesto &lt;strong&gt;Terraria.&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Creando un servidor de Terraria 🌳 en la nube
&lt;/h2&gt;

&lt;p&gt;1.- Lo primero que necesitamos es una cuenta en &lt;a href="https://www.linode.com/es/"&gt;Linode&lt;/a&gt; para lo cual solo debemos registrarnos, actualmente si te registras &lt;strong&gt;Linode te regala 100 dólares en crédito&lt;/strong&gt; para que comiences a usar sus servicios, podemos usar este crédito para nuestro servidor. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L1oGU-kF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/op38y5qec1ce2b8g7mic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L1oGU-kF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/op38y5qec1ce2b8g7mic.png" alt="Linode subscribe" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.- Una vez que ingresamos a nuestra cuenta creamos un nuevo Servidor de Linode (SSD Linux server)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_beeXrTa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4evzgsotrpcb624yj1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_beeXrTa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4evzgsotrpcb624yj1z.png" alt="create linode" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.- Nos dirigimos a &lt;strong&gt;marketplace&lt;/strong&gt;, buscamos Terraria y lo seleccionamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cn8hyPWu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5zv76nj88uzrw675wab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cn8hyPWu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5zv76nj88uzrw675wab.png" alt="Linode marketplace" width="880" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bggURLXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhgdg7xkvi54ywuskxy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bggURLXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhgdg7xkvi54ywuskxy9.png" alt="Terraria server linode" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.- Bajamos hasta &lt;strong&gt;Terraria Options&lt;/strong&gt; Aquí ingresamos los siguientes datos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre de usuario de Steam&lt;/li&gt;
&lt;li&gt;Contraseña de nuestra cuenta de Steam&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hoQtdxRU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/580hcpu742bio56pram1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hoQtdxRU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/580hcpu742bio56pram1.png" alt="user name" width="880" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Debemos tener desactivado Steam Guard y el envío de claves al correo de lo contrario podría bloquearse nuestra cuenta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Los siguientes datos, podemos dejarlos con sus valores por defecto &lt;strong&gt;Word Name, Server Password, Message of the Day, Difficulty Level, Maximun Players, Port, seed&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Estos datos los cambiaremos luego dentro del servidor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9KUqgvHH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtabbbliu8k02rqc6sax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9KUqgvHH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtabbbliu8k02rqc6sax.png" alt="Advanced options" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En la opción &lt;strong&gt;Select a image&lt;/strong&gt;, la dejamos igual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p9G0EPJC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoqlp1kktam6cd3ya9e0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p9G0EPJC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoqlp1kktam6cd3ya9e0.png" alt="select image" width="880" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elegimos una región que se encuentre cerca de nuestro país.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nKoGa_zT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qr2739gw7dm0owqv9fo8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nKoGa_zT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qr2739gw7dm0owqv9fo8.png" alt="Region linode" width="880" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En la opción &lt;strong&gt;Linode Plan&lt;/strong&gt; elegimos el primer plan, en caso de que nuestro servidor se ponga lento lo podemos cambiar después. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WT-ydLCg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cyt5gtiybg2ywt4scdwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WT-ydLCg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cyt5gtiybg2ywt4scdwo.png" alt="Linode plan" width="880" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linode Label&lt;/strong&gt; y &lt;strong&gt;Add Tags&lt;/strong&gt; los dejamos por defecto. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1QDiQaoC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvmqkejwabatcbwlafzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1QDiQaoC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvmqkejwabatcbwlafzi.png" alt="linode label" width="880" height="137"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Importante&lt;/code&gt; Escribimos una contraseña fuerte en la opción &lt;strong&gt;Root Password&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vRaoQr4I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r3h1l3of3tzds6wqzim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vRaoQr4I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r3h1l3of3tzds6wqzim.png" alt="root password" width="880" height="238"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5.-Le damos clic en &lt;strong&gt;Create Linode&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1YFlyKEn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81haya3bdhzqpr99yn5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1YFlyKEn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81haya3bdhzqpr99yn5l.png" alt="create linode" width="880" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.-Tenemos creado nuestro servidor Linux, ahora tenemos que configurarlo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GG-n9E-i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jj7ladrmr55j4w4p4egr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GG-n9E-i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jj7ladrmr55j4w4p4egr.png" alt="Linode server" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.- Nos conectamos mediante SSH a nuestro servidor&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para conectarse en SSH, es necesario instalar o activar un programa en algunos sistemas operativos:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Terminal (macOs y Linux)&lt;br&gt;
Putty (Windows)&lt;br&gt;
Cliente SSH de Windows 10 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Copiamos el acceso SSH de nuestro servidor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BN3GlH3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b42mggrsslgkkhr973m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BN3GlH3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b42mggrsslgkkhr973m.png" alt="ssh access" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se verá así pero con los valores de tu servidor
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@198.169.109.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Lo ejecutamos en nuestra terminal o cliente ssh y nos mostrará un mensaje como el siguiente
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@198.169.109.20 
Are sure you want to continue connecting (Yes/no/[fingerprint])?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Escribimos &lt;strong&gt;Yes&lt;/strong&gt; para continuar
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@198.169.109.20 
Are sure you want to continue connecting (Yes/no/[fingerprint])?
Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Nos pedirá la contraseña del servidor
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@198.169.109.20 password: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;No aparecerán los caracteres que digitamos al ingresar la contraseña ni en forma de *&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Al ingresar veremos una serie de datos de nuestro servidor
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@198.169.109.20's password: 
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-109-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon 23 May 2022 05:49:56 PM UTC

  System load:           0.03
  Usage of /:            4.6% of 78.19GB
  Memory usage:          15%
  Swap usage:            0%
  Processes:             133
  Users logged in:       1
  IPv4 address for eth0: 198.169.109.20
  IPv6 address for eth0: 

8 updates can be applied immediately.
3 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable


*** System restart required ***

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

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

&lt;/div&gt;


&lt;p&gt;8.- Creamos un usuario con privilegios de administrador&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para crear un usuario usamos el siguiente comando:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adduser nombreusuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TRS45VVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd6cwbta7djvhsey0lca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TRS45VVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd6cwbta7djvhsey0lca.png" alt="" width="740" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Le ponemos una contraseña y dejamos los otros campos que nos pide vacíos, solo le damos a enter hasta que nos pida una confirmación: &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0MdPXRm7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6p0uy1h83ka25ch0uas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0MdPXRm7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6p0uy1h83ka25ch0uas.png" alt="" width="740" height="556"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ponemos "Y" y listo tenemos creado un nuevo usuario, para verificar podemos ver los usuarios con el comando&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -l /home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Auqe1tpG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fc1gvv2rnqm3fk1jks0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Auqe1tpG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fc1gvv2rnqm3fk1jks0g.png" alt="" width="740" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ahora debemos darle privilegios de administrador, usamos el comando
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usermod -aG sudo nombreusuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZHciRdV8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p3g2hykjlq4akp8zae4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZHciRdV8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p3g2hykjlq4akp8zae4u.png" alt="" width="740" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cambiamos al usuario que creamos
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;su - nombreusuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Iyjpko4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv0uuxckfrzizvqiuy1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Iyjpko4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv0uuxckfrzizvqiuy1r.png" alt="" width="740" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hacemos un update para comprobar los privilegios del usuario nuevo
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Ingresamos la contraseña y si funciona todo listo podemos cerrar el terminal.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_FLlcR8j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ggjqb4cngbhft8cj2uy.png" alt="" width="740" height="556"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;9.- configuramos el servidor de Terraria desde la **LISH Console **de Linode&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o96Vpr93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wajb2v4hht3d3j1mx3q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o96Vpr93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wajb2v4hht3d3j1mx3q8.png" alt="LISH console" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al abrir la consola de nuestro servidor de Linode observaremos una pantalla como la siguiente&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--77XcbUo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gg2nifc7za4fjnh0413.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--77XcbUo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gg2nifc7za4fjnh0413.png" alt="" width="880" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aquí ingresamos el usuario y luego la contraseña del usuario que creamos mediante SSH&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recuerda que en linux al ingresar una contraseña los caracteres no se digitan en pantalla ni en forma de *&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;una vez dentro ingresaremos a la carpeta que contiene los archivos de terrariaserver usamos el comando CD&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /home/terrariaserver/serverfiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Kis1sei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1p3e3fmrmhnzrsnhlfq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Kis1sei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1p3e3fmrmhnzrsnhlfq6.png" alt="Image description" width="452" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Donde encontramos una serie de archivos si digitamos &lt;code&gt;ls -l&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dXm9owED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3iyewkb5b2plbp7dqafs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dXm9owED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3iyewkb5b2plbp7dqafs.png" alt="" width="880" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activamos el servicio de TerrariaServer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En este punto ejecutamos el archivo con el nombre &lt;code&gt;TerrariaServer.bin.x86_64&lt;/code&gt; 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;./TerrariaServer.bin.x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto iniciamos el servicio de terrariaserver &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Digitamos n para crear un nuevo mapa &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--94KzY9xb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ve54jy2fw5n4uld8ppzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--94KzY9xb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ve54jy2fw5n4uld8ppzr.png" alt="Image description" width="880" height="481"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seleccionamos el tamaño del mapa, en este caso yo elegiré la tercera opcion (large) &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VfJmjZE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ntjcpsotnn4v84c5hkwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VfJmjZE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ntjcpsotnn4v84c5hkwd.png" alt="" width="453" height="374"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elegimos la dificultad&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UK-J_XvL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/boiq8xc4uc92oyay9jkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UK-J_XvL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/boiq8xc4uc92oyay9jkr.png" alt="Image description" width="455" height="343"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Le asignamos un nombre al mapa &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P8pKmTWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wjsnkblhnvbregbz49t6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P8pKmTWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wjsnkblhnvbregbz49t6.png" alt="Image description" width="455" height="332"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Si queremos usar una semilla (código para generar el mapa) la ponemos en esta parte, dejamos en blanco para una semilla aleatoria.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EhF7pYeG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g61gb5e1vbhfq2s5ppx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EhF7pYeG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g61gb5e1vbhfq2s5ppx4.png" alt="Image description" width="454" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Comenzará a generarse el mapa &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nxERaYMC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tmlpv6crzt7hvh9y5y6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nxERaYMC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tmlpv6crzt7hvh9y5y6l.png" alt="" width="455" height="485"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Al finalizar la creación del mapa lo seleccionamos &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6htGB7ud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkpfpm5fucstjqb8ljk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6htGB7ud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkpfpm5fucstjqb8ljk4.png" alt="Image description" width="460" height="369"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elegimos el máximo de jugadores &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GOfRiQDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1t895rgt5qqz7ttuxt5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GOfRiQDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1t895rgt5qqz7ttuxt5.png" alt="Image description" width="452" height="235"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seleccionamos el puerto, podemos dejarlo como 7777&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QZdPAl2D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enola6b6v6q6twph2ne4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QZdPAl2D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enola6b6v6q6twph2ne4.png" alt="Image description" width="459" height="326"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Si queremos ponerle una contraseña al intentar ingresar en el Terraria lo ingresamos aquí o podemos dejarlo sin contraseña&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eb-5pwvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t7ndrwd60q0lvlob02v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eb-5pwvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t7ndrwd60q0lvlob02v2.png" alt="Image description" width="457" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Al ver el mensaje &lt;strong&gt;Server Started&lt;/strong&gt; ya podremos ingresar mediante IP a nuestro servidor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aq-HldS0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bqid7vjlf5zlgjwzlpz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aq-HldS0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bqid7vjlf5zlgjwzlpz7.png" alt="" width="456" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abre Terraria y haz clic en Multijugador.&lt;/li&gt;
&lt;li&gt;Has clic en " Join via IP".&lt;/li&gt;
&lt;li&gt;Se te pedirá que selecciones un personaje, o que crees uno nuevo si no tienes ninguno. Selecciona o crea un personaje.&lt;/li&gt;
&lt;li&gt;Digita tu dirección IP y dale clic en Aceptar.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Aquí encuentras la ip de tu servidor en Linode&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--smD9o7-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkzr9dr9eh8ua7312x5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--smD9o7-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkzr9dr9eh8ua7312x5g.png" alt="" width="880" height="209"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5.- Se te pedirá que introduzcas el puerto de tu Terraria One-Click App. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7qPDKcQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ckprvushj84ax0kjiy80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7qPDKcQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ckprvushj84ax0kjiy80.png" alt="" width="880" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puedes cerrar la terminal de linode terraria se seguira ejecutando, si desear apagar el servidor usa el comando &lt;code&gt;exit&lt;/code&gt; en la terminal.&lt;/p&gt;

&lt;p&gt;Para guardar sin cerrar usa el comando &lt;code&gt;save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Revisa todos los comando usando &lt;code&gt;help&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;¡Gracias por leer este post! 😊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha parecido útil o interesante, puedes darle un like 💙 para motivarme a seguir compartiendo contenido así. Si tienes la oportunidad y quieres apoyar mi trabajo, puedes hacerlo a través de un pequeño donativo 💸 ¡Un café virtual sería un gran detalle! ☕ Puedes hacerlo a través de &lt;a href="https://ko-fi.com/geoannycode"&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además, si te gustaría seguir mis actualizaciones y contenido en redes sociales, puedes encontrarme en &lt;a href="https://twitter.com/GeoannyCode"&gt;Twitter&lt;/a&gt; y &lt;a href="https://www.youtube.com/channel/UC18KaeuDNfUi9mt9xhNjDyw"&gt;YouTube&lt;/a&gt; como "GeoannyCode" 📱💻 Espero verte por allí! 😊 ¡Gracias por tu apoyo! ❤️"&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>linux</category>
      <category>cloud</category>
      <category>spanish</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>🤔💻 ¿Necesito una Mac para programar? 📝Guía que computador usar para desarrollo.</title>
      <dc:creator>GeoannyCode</dc:creator>
      <pubDate>Mon, 14 Mar 2022 16:01:33 +0000</pubDate>
      <link>https://dev.to/geoannycode/necesito-una-mac-para-programar-una-guia-para-saber-que-computador-comprar-1kdc</link>
      <guid>https://dev.to/geoannycode/necesito-una-mac-para-programar-una-guia-para-saber-que-computador-comprar-1kdc</guid>
      <description>&lt;h2&gt;
  
  
  ¿Necesito una Mac para programar?
&lt;/h2&gt;

&lt;p&gt;Cuando quieres iniciar en el desarrollo y la programación siempre surgen 2 dudas que se repiten mucho:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. ¿Con que lenguaje empezar?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. ¿Qué computador necesito para desarrollar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El primero lo dejaremos para otro post (próximamente), pero el segundo punto no se pude responder con un simple compra una Mac y ¿Cuál Mac seria?, ¿la ultima?, ¿Estas familiarizado con el sistema MacOS? son preguntas que debes hacerte después de decidir comprar una, si te fijas en grandes influencias del mundo del desarrollo la mayoría usan una Mac pero no es necesario en todos los casos usar la marca de la manzana aunque te cubre en la mayoría de casos, antes de elegir un computador primero mira tus necesidades y responde a estas preguntas:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Qué pretendo hacer con ella?&lt;/li&gt;
&lt;li&gt;¿En que lenguaje voy a programar?&lt;/li&gt;
&lt;li&gt;¿La necesito para otras tareas? &lt;/li&gt;
&lt;li&gt;¿Cuál es mi presupuesto para comprar/armar una pc?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una ves que pensamos en esto podemos tomar en cuenta diversos puntos claves: &lt;/p&gt;

&lt;h2&gt;
  
  
  Si tienes la posibilidad compra una Mac
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e2scLLx6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aoj9chgbilffxwjcyzva.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e2scLLx6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aoj9chgbilffxwjcyzva.jpg" alt="Macbook" width="880" height="582"&gt;&lt;/a&gt;&lt;br&gt;
Hay cuatro modelos principales de MacBook disponibles actualmente en Apple:&lt;/p&gt;

&lt;p&gt;MacBook Air – $999 dólares&lt;br&gt;
MacBook Pro 13 – $1,199 dólares&lt;br&gt;
MacBook Pro 14 – $1,999 dólares&lt;br&gt;
MacBook Pro 16 – $2,499 dólares&lt;/p&gt;

&lt;p&gt;Todas estas opciones te cubren en casi todo tipo de desarrollo ya sea web, móvil, aplicaciones de escritorio incluso algunos videojuegos pero para este último lo mejor es un "PC-gamer", además son muy buenas para creación multimedia, si necesitas portabilidad las MacBook son muy ligeras y tienen bastante autonomía destacan en su pantalla y otros aspectos, a menos que prefieras un sistema Windows por ejemplo para jugar un MAC puede ser tu mejor opción. &lt;/p&gt;

&lt;h2&gt;
  
  
  Casi cualquier computador se puede usar para Desarrollo Web
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zTOcOqNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdekr1aa12dsd0kstonj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zTOcOqNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdekr1aa12dsd0kstonj.jpg" alt="laptop vintage" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
Un computador sencillo, modesto incluso con poca memoria RAM te puede servir, requisitos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Correr un navegador.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Soportar editores de texto.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se puede usar incluso computadores antiguos yo he usado una laptop de hace 10 años con un procesador AMD(1ghz) sin problemas con un sistema Linux ligero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desarrollar aplicaciones móviles requiere de un sistema más robusto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rQJP9Vqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5xctu1c5la4l835i26o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rQJP9Vqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5xctu1c5la4l835i26o.jpg" alt="Desarrollo movil" width="880" height="587"&gt;&lt;/a&gt;&lt;br&gt;
Un problema recurrente en desarrollo móvil es el rendimiento de las herramientas de desarrollo por ejemplo Android Studio requiere de algunos requisitos incluso algunos computadores nuevos de gama media se les dificulta correr estas herramientas emular un celular es muy pesado y consume mucha RAM recomendaciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 o más GB RAM&lt;/li&gt;
&lt;li&gt;Un procesador Inteli5/ryzen5 o superior&lt;/li&gt;
&lt;li&gt;Un disco de estado solido siempre ayuda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos también sirven para el desarrollo de aplicaciones de escritorio.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Uso una laptop Ryzen5 con 8 de RAM y me es casi imposible usar Android Studio y emular un sistema Android al mismo tiempo.&lt;/em&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  El desarrollo de videojuegos requiere de una "PC-Gamer" pero no siempre
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tly7jORg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2lhcneem7n0q812ok9v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tly7jORg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2lhcneem7n0q812ok9v.jpg" alt="PC gamer" width="880" height="416"&gt;&lt;/a&gt;&lt;br&gt;
No es raro jugar en un computador pero existe una diferencia entre el correr juegos ligeros y de pocos requisitos con correr los juegos de ultima generación o poder llevar a los 60 FPS (fotogramas por segundo) en videojuegos más o menos actuales y sobre todo un factor que influye mucho en este aspecto es la tarjeta grafica o tarjeta de video requisito indiscutible para denominar a una PC como "gamer", pero no es el único en este caso, también son muy buenas para realizar directos y multimedia,  si vas a desarrollar juegos que exigen mucho gráficamente en gráficos 3D tu grafica debe tener una potencia considerable a diferencia del  desarrollo de juegos con gráficos 2D (no tan exigentes), puedes guiarte con las siguientes recomendaciones: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Juegos con Gráficos 2D&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarjeta grafica AMD Vega8 (equivalente) o superior &lt;/li&gt;
&lt;li&gt;8GB de memoria RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Juegos con Gráficos 3D&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarjeta grafica GT1050ti/RX780 o superior&lt;/li&gt;
&lt;li&gt;16 GB de memoria RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Gracias por leer&lt;/em&gt; 🤗 &lt;em&gt;espero te sirva de mucho no olvides investigar más por tu cuenta y dejarme tu opinión en los comentarios&lt;/em&gt; 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🛡Vulnerabilidad en login con PHP💉Ataque SQL INJECTION</title>
      <dc:creator>GeoannyCode</dc:creator>
      <pubDate>Tue, 08 Mar 2022 23:14:46 +0000</pubDate>
      <link>https://dev.to/geoannycode/ejemplo-basico-de-sql-injection-9e1</link>
      <guid>https://dev.to/geoannycode/ejemplo-basico-de-sql-injection-9e1</guid>
      <description>&lt;p&gt;Para realizar esta prueba de vulnerabilidad se utilizó una página web que maneja la base de datos con SQL, en este caso utilizando XAMPP en un servidor local. &lt;/p&gt;

&lt;h2&gt;
  
  
  Base de datos:
&lt;/h2&gt;

&lt;p&gt;Se usa una base de datos SQL que contiene el usuario y la contraseña&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;usuario&lt;/th&gt;
&lt;th&gt;contraseña&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;diego&lt;/td&gt;
&lt;td&gt;1234&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fiw1l483c4w2gio6tpjl1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fiw1l483c4w2gio6tpjl1.png" alt="base de datos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vista del login
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fz4ack7oiy6l49ffbrcgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fz4ack7oiy6l49ffbrcgh.png" alt="Vista del login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Código de PHP que realiza la comprobación
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'db.php'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$contraseña&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'contraseña'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$conexion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;mysqli_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$consulta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SELECT*FROM usuarios where usuario='&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;' and contraseña='&lt;/span&gt;&lt;span class="nv"&gt;$contraseña&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$resultado&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;mysqli_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$conexion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$consulta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$filas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;mysqli_num_rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resultado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filas&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;

    &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"location:home.php"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"index.html"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bad"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ERROR DE AUTENTIFICACION&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;mysqli_free_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resultado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;mysqli_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$conexion&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Ingresando correctamente los datos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvsjyacd0cm4mi7pxo6ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvsjyacd0cm4mi7pxo6ye.png" alt="login php"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Pantalla de bienvenida y error
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fj6jspfoliionm3p8owgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fj6jspfoliionm3p8owgv.png" alt="bienvenida"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta pantalla aparecerá solamente si los datos ingresados son correctos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F22ip730ibmmpul6d1rh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F22ip730ibmmpul6d1rh8.png" alt="error de ingreso de datos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta pantalla muestra el error al colocar datos erróneos. &lt;/p&gt;
&lt;h2&gt;
  
  
  Aplicación de ataque SQL Injection
&lt;/h2&gt;

&lt;p&gt;Para realizar el ataque se utilizo la siguiente línea de código:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="s1"&gt;'OR '&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s1"&gt;' = '&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Tanto en el campo de usuario como de contraseña&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F37eim5lprvccvsrr5x55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F37eim5lprvccvsrr5x55.png" alt="sql injection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De este modo la línea que codigo de nuestro archivo PHP que realiza la validación de usuario y contraseña nos queda así &lt;/p&gt;

&lt;p&gt;Antes del ataque:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$consulta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SELECT*FROM usuarios where usuario='&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;' and contraseña='&lt;/span&gt;&lt;span class="nv"&gt;$contraseña&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Después del ataque&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$consulta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SELECT*FROM usuarios where usuario=''OR '1' = '1' 
and contraseña=''OR '1' = '1'"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Agregando a la consulta cuando 1 sea igual a 1 es decir verdadero siempre dándonos acceso y mostrando la pantalla de bienvenida como si los datos fueran correctos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fie7007ayc1g197lbdh1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fie7007ayc1g197lbdh1i.png" alt="correcto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adicionalmente se puede ingresar utilizando un solo campo utilizando la siguiente línea de comandos &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="n"&gt;diego&lt;/span&gt;&lt;span class="s1"&gt;' --


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

&lt;/div&gt;

&lt;p&gt;de esta forma no importa lo que se envíe en el campo de contraseña.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F19gxgx9pcc8q8ilhglzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F19gxgx9pcc8q8ilhglzg.png" alt="sql injection 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dando acceso de igual forma&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Flhcilucis4exvq7nzaus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flhcilucis4exvq7nzaus.png" alt="vulnerabilidad aplicada"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;¡Gracias por leer este post!😊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha parecido útil o interesante, puedes darle un like 💙 para motivarme a seguir compartiendo contenido así. Si tienes la oportunidad y quieres apoyar mi trabajo, puedes hacerlo a través de un pequeño donativo 💸 ¡Un café virtual sería un gran detalle! ☕ Puedes hacerlo a través de &lt;a href="https://ko-fi.com/geoannycode" rel="noopener noreferrer"&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además, si te gustaría seguir mis actualizaciones y contenido en redes sociales, puedes encontrarme en &lt;a href="https://twitter.com/GeoannyCode" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; y &lt;a href="https://www.youtube.com/channel/UC18KaeuDNfUi9mt9xhNjDyw" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; como "GeoannyCode" 📱💻 Espero verte por allí! 😊 ¡Gracias por tu apoyo! ❤️"&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>sql</category>
      <category>php</category>
      <category>cybersecurity</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
