Jump to content

Nicolas.Tizeira

Members
  • Content Count

    33
  • Joined

  • Last visited

  • Days Won

    6

Nicolas.Tizeira last won the day on January 17

Nicolas.Tizeira had the most liked content!

2 Followers

About Nicolas.Tizeira

  • Rank
    Novato
  • Birthday September 25

Contact Methods

  • Sitio web
    Array

Profile Information

  • Gender
    Array
  • Location
    Array

Recent Profile Visitors

485 profile views
  1. Red de bucle invertido y fin del problema, no necesitas vps ni hamachi.
  2. Buenas gente, para continuar con el tutorial anterior, ya tenemos nuestro servicio web montado con lo basico, ahora faltaria poder tener correo electronicos con nuestro dominio, verdad? Bueno ahora les enseñare como montar un servicio de correos y el cliente para poder ingresar. Para comenzar montaremos un virtual nuevo y crearemos un ALIAS A en el DNS para poder apuntar a este nuevo subdominio. En el administrador de DNS del proveedor donde compraron el dominio agregan un A que sea "@" es decir la ip publica del servidor y que pegue en correo.tu-dominio.com una vez echo eso ya podemos avanzar con lo que nos toca a nosotros manualmente. ingresamos esta serie de comandos: sudo cd /var/www/ sudo mkdir correo sudo chmod -R 7777 correo sudo cd correo sudo nano index.html En el archivo que acabamos de crear agregamos un hola mundo y guardamos. Ahora vamos a crear el site available de la siguiente forma: sudo cd /etc/apache2/sites-available/ sudo nano correo.conf Y en este ponemos lo siguiente: <VirtualHost *:80> ServerAdmin [email protected] ServerName correo.tu-dominio.com ServerAlias www.correo.tu-dominio.com DocumentRoot /var/www/correo ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> Guardamos y vamos a ingresar lo siguiente en el archivos hosts: sudo nano /etc/hosts tu.ip.publica correo.tu-dominio.com Guardamos y vamos a dar de alta el sitio y reiniciar el servicio web: sudo a2ensite correo.conf sudo service apache2 restart Si ingresamos en [Hidden Content] deberian ver el Hola Mundo que ingresaron, significa que el DNS y el virtual esta bien configurados. Ahora vamos a instalar todo lo necesario para el servicio de correos: sudo apt-get install postfix sudo nano /etc/postfix/main.cf Si pregunta le damos a todo Y y cuando estemos editando el archivo vamos abajo de todo y agregamos: home_mailbox = Maildir/ Guardamos y reiniciamos el servicio, a continuación ingresamos los comandos para instalar el pop y imap sudo service postfix restart sudo apt-get install courier-pop sudo apt-get install courier-imap Si pregunta algo le damos Y, en una pantalla grafica nos va a salir una pregunta a esa le damos NO. A continuación habilitamos y iniciamos el authdaemon sudo systemctl enable courier-authdaemon sudo systemctl start courier-authdaemon una vez hecho esto vamos a instalar el cliente para manejar los correos y vamos a configurarlo: sudo apt-get install squirrelmail sudo squirrelmail-configure Si pregunta algo le damos todo Y, a continuación cuando estemos configurando se nos abre un menu le damos a D y escribimos "courier" sin comillas, le damos enter y nos vuelve al menu principal apretamos 2, después 1 y ingresamos nuestro dominio es decir tu-dominio.com (sin el correo adelante, seria el principal), apretamos enter y Q. Con esto ya quedo configurado y pasamos a hacer lo siguiente para que se vea el cliente en nuestro subdominio [Hidden Content] sudo cd /etc/apache2/sites-available/ sudo nano correo.conf Y modificamos el DocumentRoo por DocumentRoot /usr/share/squirrelmail Guardamos y reiniciamos el servicio de apache sudo service apache2 restart Ahora vamos a crear los directorios que requieren las casillas para eso hacemos lo siguiente sudo cd /etc/skel sudo mkdir -p Maildir/new sudo mkdir -p Maildir/cur sudo mkdir -p Maildir/tmp Con esto ya esta todo, para crear correos es creando usuarios, cada usuario es un correo electronico a la vez, por lo tanto con adduser info Y completando los datos que nos pide de información de usuario mas contraseña ya hemos creado un correo [email protected] para chequear ingresamos a [Hidden Content] y de usuario ponemos info y de contraseña la contraseña que le pusiste, y ya podrás enviar y recibir correos desde alli. Eso es todo amigos, espero que les sirva. Esto es muy basico, después veré si voy subiendo tutoriales de como ponerle opciones mas avanzadas, opciones de seguridad, etc.
  3. Hola compañero hoy les voy a enseñar de forma rápida como levantar un servicio web con apache + php + mysql, en otro tutorial voy a enseñar como hacerlo con nginx que es un poco mas completo y moderno que el famoso apache. Primero se los voy a dar por escrito pero también les realice un vídeo rápido de los pasos que hago para que vean que funciona. 1) Vamos a actualizar nuestros paquetes de ubuntu y vamos a instalar apache2 Si están logeados como root no hace falta sudo. sudo apt -get update sudo apt -get install apache2 Le dan a todo Y si les pregunta. Por defecto el apache trae un error de sintaxis le falta definir el ServerName, yo voy a poner localhost por que este dedicado lo monte solo para hacerles la guía y lo vuelvo a eliminar así que no le establecí ningún dominio en el archivo de /etc/hosts en el caso de ustedes van tu-dominio.com que sera el mismo que definieron en hosts. sudo apache2ctl configtest Controlamos la sintaxis veremos el error que les comente anteriormente y pasamos a solucionarlo: sudo nano /etc/apache2/apache2.conf Y abajo de todo agregamos ServerName tu-dominio.com Guardamos y volvemos a revisar la sintaxis: sudo apache2ctl configtest Ahora vemos que nos da directamente: Sintax ok sin ningún mensaje mas. sudo systemctl restart apache2 Reiniciamos el servicio y nos dirigimos a [Hidden Content] o [Hidden Content] y ya deberian ver la web que viene por defecto. 2) Instalación de Mysql Escribimos el siguiente comando y si les pregunta le dan a todo Y. sudo apt-get install mysql-serve les va a preguntar que contraseña ponerle a root, eligen una y continúan. Una vez terminado eso vamos a instalar unos protocolos de seguridad con: sudo mysql_secure_installation Les va a pedir la contraseña de root de mysql, la ingresan, a continuacion le dan Y, les pregunta el nivel de contraseña eligen uno bajo, medio o alto, segun el que elijan les va a decir el % de su fuerza según la contraseña actual a continuación les pregunta si quieren cambiarla si quieren hacerlo dan Y sino le dan a N y continúan.... ahora a todo lo que les pregunta le dan Y, para configurar correctamente las opciones de seguridad, eliminara bases de datos de prueba que vienen por defecto, sacara a root como usuario remoto, entre otras cosas importantes. Con esto ya tenemos MySQL instalado y funcionando. 3) Instalaremos PHP Para eso ingresaremos el siguiente comando: sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql Si les pregunta le dan todo Y y a continuación ingresan: sudo nano /etc/apache2/mods-enabled/dir.conf Se posicionan en la linea: <IfModule mod_dir.c> DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm </IfModule> Y posicionan a .php al principio de tal forma que les quede asi: <IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> Ahora reiniciamos el servicio y chequeamos su estado que diga ok: systemctl restart apache2 sudo systemctl status apache2 Para chequear que php esta funcionando en nuestro servicio web vamos a crear un archivo para eso hacemos el siguiente comando: sudo nano /var/www/html/info.php Y en el archivo que se crea agregamos lo siguiente y guardamos: <?php phpinfo(); ?> Ahora nos dirigimos a [Hidden Content]/info.php o [Hidden Content]/info.php y deberían ver la info del php instalado hace un rato. Eso es todo chicos espero que les sirva. Vídeo de Instalación:
  4. Si, como dijo el compañero esta todo en etc, muy pocas cosas en locale.... Lo que son iconos de armas, armaduras, pociones nuevas o esas cosas creo que las podes hallar en pc (corregidme si me equivoco). Saludos!
  5. Solo debes ajustar el Eternexus en las configuraciones para que descompile .lim y .mt2 ..... y en esos files el root se llama "mob" ... pasame teamviewer y te muestro como hacerlo, saludos.
  6. Hi friend, contact me for buy your service, thx. 

    Good Day.

  7. se activa como dije, y después tráete del cliente oficial de metin2 la carpeta del hackshield y pegala en tu cliente, fiajte que la version sea 5.5.19.1 o busca esa version de HS en google descargala y ponela en el cliente.
  8. open "locale_inc.h" from client source add "#define USE_AHNLAB_HACKSHIELD" define open "HackShield.cpp" change #define METIN2HS_INCLUDE hshield-5.4.8.1 with this #define METIN2HS_INCLUDE hshield-5.5.19.1
  9. Y por si el que pase no lo entendes, este es mucho mas facil y esta mejor ordenado paso por paso.... no tenes ni que saber c+: [Hidden Content] Suerte gente.
  10. [Hidden Content] O investigar, persistir y triunfar..... Suerte.
  11. Bueno como este tema lo pase muy por alto en las clases lo voy a añadir como un extra para los que no llegan a entender lo que significa server side rendering conocido como SSR y que es client side rendering conocido como CSR y sus diferencias entre si. Bueno para no hacerlo muy largo paso a explicarles.... ¿Que es Server Side Rendering? Este es conocido como SSR o renderizado en la parte del servidor, y se puede decir que te da la posibilidad de poder renderizar el HTML de los componentes de tu web application en forma de cadena de texto desde la parte del servidor, en vez de utilizar el lado del cliente. Estas cadenas son las respuestas enviadas a las peticiones de la web application que estamos desarrollando. Es decir, que en ves de manipular del DOM con funciones sobre el navegador, delegamos esta tarea a un paso anterior que seria en el lado del servidor. Esta es la alternativa mas usada hoy en día para poder brindar una falsa idea de una web "rápida" y por que digo falsa idea? por que en realidad lo que hace SSR es devolver en la primer peticion del index.php o index.html un index con contenido ya procesado en el lado del servidor, como un primer esqueleto, y luego ir completándolo.... Es muy utilizado para mentener a los usuarios impacientes en nuestra web application mostrando un poco de contenido piensan que la web cargo entera, pero en realidad aun sigue en proceso desde el lado del servidor. ¿Que es Client Side Rendering? Bueno todo lo contrario, este trabaja desde el lado del cliente y los componentes se renderizan modificando el DOM sobre el navegador atravez de funciones, lo que esto provoca que sea mas lenta la carga del sitio, ya que en la primer petición del index.html a nuestra web application esta debe renderizar el DOM ENTERO, provocando que tarde unos considerables segundos mas que utilizando el método SSR. Y por si no quedo claro miren esta imagen que me las robe de un foro, si, esta vez no las hice yo por que es un tema que quiero explicar rápido y conciso no me voy a demorar preparándolo como cuando preparo las clases que si son 100% echas por mi de principio a fin: Esto es una web application renderizada desde el cliente: Y esto renderizada desde el servidor: Y seguro digas, pero vos estas proponiendo React como tecnología avanzada y este utiliza CSR ya que es front-end y no back-end. Claro que si, pero que pasa REACT JS es especial y lo dije desde el principio, desde que comencé a hablarles sobre esta librería, React Js tiene SU PROPIO DOM VIRTUAL, lo conocido hoy en dia como Virtual DOM, por lo tanto este en los llamados y peticiones no renderizara el DOM ENTERO cada vez que se le realiza una petición, este los mantiene en constante comparacion entre el virtual y el original, en cuanto entra una petición es procesada en el virtual y este solo renderiza la parte modificada, actúa como SSR en la el front-end e incluso se puede decir que es mucho mas rapido y efectivo. Es decir que React utiliza SSR en front-end, y incluso logra agilizarlo mas de lo que ya lo conocíamos. Pueden ver mas sobre Virtual DOM en la clase 2 que hablo sobre el. Saludos y hasta la próxima.
  12. Debería ser al revés si el servidor es bueno y tiene ingresos, el dueño debe pagarle al menos un % a sus administradores en general, todo el staff. Yo haría eso si tuviera un servidor, pero no me dedico a crear servidores, así que paso. Lo que pasa es que la mayoría solo quiere beneficios para ellos mismos y no para el servidor en si.
  13. Handling Events No voy a explicar teoria sobre Handling Events, supongo que todos sabemos lo que es, paso a mostrarles como se realiza en React y nada mas. Conocemos que un Handling Event en Javascript se realiza de la siguiente forma: <button onclick="saludar()"> Click me </button> Pero en React Js se realiza de la siguiente forma: <button onClick={saludar()}> Click me </button> Y dentro de un componente que vimos como crearlos la clase pasada, nos quedaria de la siguiente forma: class BotonSaludar extends Component { saludar = () => { alert('Hello World!'); } render() { return ( <button onClick={this.saludar}> Click me </button> ); } } Entonces esto seria un solo componente, un solo archivo js, como vimos en el ejercicio anterior, y exportandolo, ya podemos usar este boton en cualquier lugar de nuestra web application llamandolo con: <BotonSaludar/> VIRTUAL DOM Virtual DOM es una abstraccion del DOM, y es UNICO de React Js, es una copia fiel del DOM normal que todos conocemos. DOM Es una representación estructurada del documento HTML y define de qué manera los programas pueden acceder al fin de modificar, tanto su estructura, estilo y contenido. Pero... ¿que sucede si se reconstruye el DOM cada vez que hay cambios? Si, se volveria loco nuestro señor pintor jaja, y ESTO es lo que viene pasando EN TODOS los lenguajes de programacion de vistas, como html5. Cada vez que se realiza un cambio en la vista, se recontruye TODO el DOM, y asi millones de veces por cada client. Y aca viene una de las cosas mas novedosas de React Js. React implementa Virtual DOM. React crea una copia ligera del DOM y en cada cambio lo compara con el DOM Real. En lugar de renderizar el DOM completo en cada cambio, los aplica exclusivamente en las partes que varían. Métodos de arrays forEach Ejecuta la función callback una vez por cada elemento presente en el array en orden ascendente. unArray.forEach(function(value, index){ console.log("En el indice: " + index + " está el valor: " + value); }); find Devuelve el valor del primer elemento del array que cumple la función de prueba proporcionada. En caso de no encontrarla, devuelve undefined. var inventario = [ {nombre: 'manzanas', cantidad: 2}, {nombre: 'bananas', cantidad: 0}, {nombre: 'cerezas', cantidad: 5} ]; inventario.find(function(fruta){ return fruta.nombre == 'cerezas' }); Nos devuelve: { nombre: 'cerezas', cantidad: 5 } map map llama a la función callback provista una vez por elemento de un array, en orden, y construye un nuevo array con los resultados. var results = [10,8,9,31].map(function(value){ return value % 2; }); Devuelve: [0,0,1,1] ¿Y si quisiera los resultados por separado? var results = [10,8,9,31].map(function(value){ return value % 2; }); first = results[0]; second = results[1]; third = results[2]; En este caso lo que haremos sera destructurarlo: var results = [10,8,9,31].map(function(value){ return value % 2; }); [first, second, third] = results; var results = [10,8,9,31].map(function(value){ return value % 2; }); [first, second, ...rest] = results; Y el destructurado tambien nos funciona con objetos: var o = {p: 42, q: true}; var {p, q} = o; filter filter llama a la función dada callback para cada elemento del array , y construye un nuevo array con todos los valores para los cuales callback retorna un valor verdadero. [10,8,9,31].filter(function(value){ return value%2==0; }); Devuelve: [10,8] reduce El método reduce() aplica una función a un acumulador y a cada valor de un array (de izquierda a derecha) para reducirlo a un único valor. [3,4,10].reduce(function(accumulator,currentValue){ return accumulator + currentValue; },[initialValue]); Devuelve: 17 Hora de la practica var productos = [ {nombre: 'mouse', categoria: 'computadora', cantidad: 2}, {nombre: 'teclado', categoria: 'computadora', cantidad: 0}, {nombre: 'almohadon', categoria: 'deco', cantidad: 0}, {nombre: 'cartera', categoria: 'moda', cantidad: 0}, {nombre: 'iphone 8', categoria: 'celulares', cantidad: 5} ]; a. Imprimir los nombres de todos los productos por consola. b. Imprimir cantidad disponible de iphone 8. c. Aumentar 2 cantidades en todos los productos. d. Imprimir solo los productos que pertenecen a la categoría computadora. e. Imprimir stock total. Funciones Definición de una función Declaramos una función con un nombre para hacer referencia e invocar la función. function cuadrado(lado) { return lado*lado } cuadrado(5) Devuelve = 25 Expresión de una función Asignamos una función anónima a una variable. Podemos invocar la función utilizando la variable. var cuadrado = function(lado) { return lado*lado } cuadrado (5) Devuelve = 25 function declarations vs function expressions anterior(5); doble(5); var doble = function(num){ return num*2; }; function anterior(num){ return num-1; } anterior(5); //4 doble(5); //Error var doble = function(num){ return num*2; }; function anterior(num){ return num-1; } Scope El alcance de una variable determina su accesibilidad. function next(){ var a = 6; return a+1; } En este caso "a" es una variable LOCAL. var a = 6; function next(){ return a+1; } Y en este caso "a" es una variable GLOBAL. Closure function padre(){ var a = 1; function closure(){ console.log(a); } closure(); } Cuando al anidar funciones, una función crea una variable local y una función interna, ésta función interna es un closure y solo está disponible dentro de la función padre. A diferencia de la función padre, el closure no tiene variables locales y usa las declaradas dentro de padre(). Ahora para ver si entendimos, en el siguiente codigo que imprimiria en la consola? function saludoConVar() { var saludo = "Hola"; if (true) { var saludo = “Chau”; console.log(saludo); } console.log(saludo); } Si efectivamente, en consola imprimiria las dos veces CHAU. Let ES6 Permite declarar variables limitando su alcance (scope) al bloque, declaración o expresión donde se está usando. function saludoConLet() { let saludo = "Hola"; if (true) { let saludo = "Chau"; console.log(saludo); } console.log(saludo); } Y ahora si, nos imprimiria en el primer console.log un Chau y en el siguiente un Hola. Hora de la practica a. Definir una función que reciba un número X e imprima los primeros X números de la sucesión Fibonacci. Los números de Fibonacci deben ser generados por la función. 0,1,1,2,3,5,8,13,21,34,55,... b. ¿Qué creen que imprimirá por consola el siguiente código? ¡No ejecutar el código! var frutas = ["Cereza", "Manzana", "Melón", "Frutilla"]; for(var i = 0; i <= frutas.length; i++){ setTimeout( function(){ console.log(frutas[i]); }, 2000); }. c. Ejecutar el código anterior. ¿Qué imprime por consola y por qué? d. ¿Cómo harían para que imprima por consola cada elemento del array cada 2 segundos? Podemos tratar a las funciones como variables. Esto nos da la posibilidad de: Almacenarla en variables: var doble = function(a){ return a*2; } var doble = function(a){ return a*2; } Retornarla: function vuelto(monto){ precio = 100; function calcVuelto(){ return precio-monto; } return calcVuelto(); } Y pasarla como argumento: function a(){ console.log("a"); } function b(a){ console.log("b"); a(); } Y si te pregunto ¿Que hace esto? ¿Que responderias? function username(unaFuncion){ var name = prompt("Ingrese su nombre"); unaFuncion(name); } function welcome(name){ alert("Bienvenido " + name + "!"); } username(welcome); PARA SEGUIR LA CLASE UNITE A SLACK, AHI RESPONDES ESTAS PREGUNTAS Y YO TE IRE RESPONDIENDO PARA QUE SEPAS QEU VAS ENTENDIENDO. Callback Callback es una función que se pasa por parámetro a otra función y en principio se ejecuta una vez que se haya terminado de ejecutar la función anterior. Cuando enviamos una función anónima a un evento, estamos utilizando Callbacks. Un Callback funciona como un Closure. ¿Y esto que hace? function funcionA(funcionB){ console.log("a"); setTimeout(function(){ funcionB() },1000); console.log("c"); } function funcionB(){ console.log("b"); } funcionA(funcionB); Asincronía en JS Asincronía en JS ◆ Callbacks (ES5) ◆ Promises (ES6) ◆ Async/await (ES7) Callbacks Callback -> Procesos asincrónicos function primero(callback){ setTimeout(function(){ callback(); },1000); } function segundo(){ console.log("Ejecutando callback"); } console.log(‘antes’); primero(segundo); console.log(‘despues’); //antes //despues //Ejecutando callback function primero(callback){ setTimeout(function(){ console.log("Primero"); callback(); },1000); } function segundo(callback){ setTimeout(function(){ console.log("Segundo"); callback(); },1000); } function tercero(){ console.log("Tercero"); } Esto seria: primero(segundo(tercero)); Callback hell primero(function(){ segundo(function(){ tercero(function(){ cuarto(function(){ ... }); }); }); }); Hora de la practica a. Consultar datos de un pokemón haciendo llamado ajax a pokeAPI (Por ejemplo: Pidgey) e imprimir por consola su nombre y peso. [Hidden Content]} b. A partir de la consulta anterior, imprimir por consola el nombre y peso de su próxima evolución (Es decir, Pidgeotto). c. ¿Cómo haríamos si queremos también imprimir los datos de su próxima evolución? (En nuestro ejemplo, Pidgeot). ¿Qué comportamiento se repite? Promises Promises Una Promesa es un objeto que representa la terminación o el fracaso eventual de una operación asíncrona. Representa un valor que puede estar disponible ahora, en el futuro o nunca. const promise = f(); promise.then(exitoCallback).catch(errorCallback); function f(){ return (new Promise((resolve, reject) => { var ok = Math.round(Math.random()); if(ok){ var foo = "Todo ok"; resolve(foo); } else { reject(new Error("Ocurrio un error")); } }) )} const promise = f(); promise.then(foo => console.log(foo)).catch(error => console.log(error)); En esta promise que acabamos de ver si la promise se ejecuta bien nos devolvera "Todo ok" y si hay un error durante la ejecucion de la promise nos devolvera el Error. const promise = f(); promise .then(function(response1){ //código }) .then(function(response2){ //código }) .then(function(response3){ //código }) .then(function(responseN){ //código }) .catch(errorCallback); Const Puede recibir un valor en el momento de la declaración. Luego no puede ser modificada. const pi = 3.14; pi = 3.141592635; //Error!! COMO DIJE, NO SE PUEDE MODIFICAR PARA ESO SE USAN VARAIBLES NO CONSTANTES. Y ahora practiquemos con promises... asi que... Hora de la practica a. Modificar el ejercicio anterior para manejar el código asíncrono con promesas. b. Instalar la librería Axios y utilizarlo para peticiones HTTP del ejercicio anterior. Y bueno para ir terminando la clase de hoy y no hacerlo mas extenso veremos axios y damos por finalizada esta clase. AXIOS AXIOS AXIOS es una librería de Javascript para hacer pedidos asincrónicos HTTP (AJAX) a través de promesas npm install axios import Axios from 'axios'; Ya voy asumiendo donde van cada comando, y cada cosa, por eso ya no lo nombre, si siguen atentamente las clases y repasan o realizan las practicas, no hara falta explciarles que el import va en el componente que crearon y que necesitan que usea axios o lo que sea. AXIOS - GET Axios.get(url) .then(callbackSuccess) .catch(callbackFail); Por ejemplo, usaremos la api de pokemon con la que estuvimos practicando: Axios.get('[Hidden Content]') .then((response)=>console.log(response)) .catch((error)=>console.log(error)); AXIOS - POST Axios.post(url, data) .then(callbackSuccess) .catch(callbackFail); Por ejemplo asi se realiza un post dentro de nuestra api: Axios.post('/user', {name:'Pepe', age:'18'}) .then((response)=>console.log(response)) .catch((error)=>console.log(error)); Y con esto terminamos la clase de hoy, fue mucho mas rapida y consisa que la anterior, y cada vez nos vamos mentiendo mas a fondo de lo que trata esta hermosa libreria. Veremos como desarrollare la proxima clase no puedo decirles que veremos la proxima, por que la verdad aun no la pense.... en la semana les dire como proseguiremos, les deseo mucha suerte, buen desarrollo y los espero es Slack para despejar dudas y compartir codigo entre todos!
  14. Gracias @Agustin Lombardo en estos dias redacto la segunda clase, que tengas un buen desarrollo! Exitos.
×
×
  • Create New...