Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - @XSStringManolo

#2721
Que cojones tienen no forzando una actualizacion automatica. Tienes que ir a la play store xD
#2722
Desarrollo Web / Re: ¿Como salgo?
18 Mayo 2019, 02:28 AM
A ver calamidad xD. Le das 200.000 vueltas a lo mismo. Te dije que te viene toda la información necesaria en el link que te pasé:

Código (none) [Seleccionar]

Step 1, Make a DNS record in your FreeDNS account.

   Make your account -> freedns.afraid.org -> Signup
   Make a dns record (subdomains -> add -> save)
   (You'll see your entry appear in the 'subdomains' page)


Step 2, Router stuff

All you need is your update key from FreeDNS, so lets get that.

   Navigate to FreeDNS -> 'Dynamic DNS'.
   Copy the 'Direct URL' link.

You want the 'update key', which is the part after the '?' in the URL.

Next, in your router's admin interface [Screenshot Here]:

   Navigate to : Setup tab -> DDNS subtab ...

Select 'freedns.afraid.org' in the drop down menu, then enter:

   Username: guest
   Password: guest
   Hostname: dns_name,update_key
   (Example: zeus.afraid.org,AFFEEFFFCCDDEEEFFFCC==)

The router just ignores the username and password fields, so do not worry about those. The 'dns_name', and 'update key', and its placement after the comma are the most important thing.

Hit Save, then Apply changes. Within 30 seconds or so it will come back up, automatically do an update, then display the update log to you on the same page.

Congratulations! You're done. Thats it!

Additional Tips: If you change your password, or you delete your DNS within FreeDNS, your key WILL change, and you will have to put your new 'update key' in your router.


Esto es para que el router informe del cambio de ip. Es una opción en el caso de que tu router lo soporte. Que ya sabemos que si.





Otra opción sin tocar nada en el router es crear un subdominio, le pones el nombre que quieras, seleccionas el dominio publico al que formará parte tu subdominio (esto da un poco igual si luego vas a usar un dominio.tk, pero lo necesitas para configurar el DDNS para tener una ip estatica que de ka cara por ti en lugar de tu ip dinamica.

Si vas a usar directamente un subdominio Pincha en resgistry para seleccionar el dominio a partir dek cual crearas tu subdominio.

Despues de crear tu subdominio vas a Dynamic DNS, en esta pagina te apareceran todos los dominios que hayas creado. Copia el link con click derecho de Direct URL. Pega el link en cualquier sitio y pilla solo las letras a partir del ? Guarda esas letras en el portapapeles.

Crea un script de la siguiente manera:
sudo nano /etc/cron.d/freedns_update.sh

Pega este script dentro:

#!/bin/sh # freedns_update.sh: Update the public IP on freedns.afraid.org only if it has changed. ## Place this script in the cron's job directory /etc/cron.d and assign the proper permissions ## and owner ## sudo chmod 500 /etc/cron.d/freedns_update.sh ## sudo chown root:root /etc/cron.d/freedns_update.sh ## Add to /etc/crontab to execute on reboot and every 5 minutes ## Edit /etc/crontab and append these two lines: ## @reboot root /etc/cron.d/freedns_update.sh >/dev/null ## */5 * * * * root /etc/cron.d/freedns_update.sh >/dev/null #Use your own values DOMAIN=raspberry.liar.info.tm HASHKEY=c29Q2s1Ml9df604bba2b1359ff62MTEyMT185e7= UPDATE_URL="http://freedns.afraid.org/dynamic/update.php?${HASHKEY}" current_ip=$(wget -q --output-document - http://checkip.dyndns.org | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}') registered_ip=$(ping -qn -c 1 $DOMAIN | head -n 1 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}') if [ "${current_ip}" != "${registered_ip}" ]; then wget -q --read-timeout=0.0 --waitretry=5 --tries=400 --output-document /dev/null $UPDATE_URL if [ $? -eq 0 ]; then echo "$(date +"%b %_d %T") $(hostname) $0: IP address updated on freedns.afraid.org: new IP '${current_ip}', old IP '${registered_ip}'" >> /var/log/messages else echo "$(date +"%b %_d %T") $(hostname) $0: ERROR IP address could not be updated on freedns.afraid.org: current IP '${current_ip}', registered IP '${registered_ip}'" >> /var/log/messages fi fi

Cambia  DOMAIN= y HASHKEY= Por tu dominio y y el hasg que te venia a partir del interrogante en Direct URL.

Dale control+o para guardar el archivo y control+X para salir del archivo abierto por Nano. Te pedira confirmación.

Escribe otra vez en la terminal:
sudo chmod 500 /etc/cron.d/freedns_update.sh
sudo chown root:root /etc/cron.d/freedns_update.sh
para darle permisos a la carpeta.

Despues abres el crontab para programar una tarea:
sudo nano /etc/crontab

En el final del archivo añades 2 nuevas lineas:
@reboot root /etc/cron.d/freedns_update.sh >/dev/null */5 * * * * root
/etc/cron.d/freedns_update.sh >/dev/null

Guardas con control +o y cierras con control+x
Por ultimo reinicia cron con el comando:
sudo /etc/init.d/cron restart
#2724
Lo que almacenas en la direccion de memoria es un char, que ocupa 1byte.
No se te imprime el texto entero por arte de magia al tener la direccióm de memoria del primer char.

Digamos que tu texto es "hola" el puntero apunta a 0xff0033 en esa direccion de memoria esta la letra h
Entonces para imprimir la letra o, lo que se hace es una operación, direccion de memoria del puntero + 1byte es decir 0xff0033 + 8bits. Que vendria a ser 0xff003A. Como las cadenas de caracteres se guardan en direcciones de memoria contiguas, podemos imprimir todos los chars de la cadena con una operación sencilla. Sería algo así internamente:
Imprimir en pantalla el char dentro de la direccion de memoria a la que apunta el puntero, direccion de memoria del puntero + 8 bits, direccion de memoria del puntero + 16 bits, dirección de memoria del puntero +24 bits.
La dirección de puntero contiene h, la direccion del puntero + 8 bits contiene o, la direccion del puntero +16 bits contiene l, la dirección del pumtero + 24 bits contiene a.

Por si no te queda claro sería algo así:
Imprimir contenido de la dirección de memoria del puntero.
Imprimir contenido de la dirección de memoria +1byte del puntero
Imprimir contenido de la dirección de memoria +2bytes del puntero.
Imprimir contenido de la dirección de memoria+3bytes del puntero.

Como ves es el mismo puntero todo el rato. Con este unico puntero hacemos operaciones con la memoria a la que apunta para acceder al siguiente caracter.
El caracter está en binario, este caracter en binario se transforma en decimal. Y de decimal se transforma en letra. Busca en google tabla ascii y podras ver que valor decimal corresponde a cada letra/caracter. Ese valor al transformarse en binario ocupa los 8 bits.
Puedes incluso poner char miletra =valorDecimal; y se transformara en la letra correspondienteen la tabla ascii. Saber esto sirve para codificar en otras bases. Por ejemplo base64 que se usa mucho.
Busca en google como transformar un string a base64 y veras como tienes que transformar cada caracter en binario y una vez todos en binario se pillan los bits de 6 en 6 en vez de 8 en 8 para conseguir el string en base64.
Podrias hacer un programa que te convierta un texto a base64 para ver como funciona todo y recordarlo.

Recuerda que 1 byte es lo mismo que 8 bits. Estas operaciones podrías realizarlas tu manualmemte con un puntero apuntando al primer caracter de una cadena y sumarle los bits a la direccion de memoria para obtener todo el string con solo un puntero, no es nada complejo. Las funciones, metodos e incluso el compilador realizan muchas de estas tareas por nosotros para facilitarnos el codigo. Espero que me entendieses. Si no, pregunta.
#2725
Estos progres siempre abusando de sus derechos... Qué será lo próximo? Pedir una baja médica por un accidente? Qué asco de socialistas...
#2726
Orientate por mi funcion Potencia, si no te fias de si funciona correctamente compruebalo de la siguiente manera.
resultado = pow(base, exponente);
cout << resultado;
resultado = Potencia(base, exponente);
cout <<endl << resultado;

#2727
Para protegerte de la vulnerabilidad desactiva el TRACE en el servidor web. Se utiliza solo para debug y analisis.
Da igual que metas protecciones concretas contra por ejemplo XSS, denegando Active Scripts, se puede explotar con Java, Flash, vbscript, shockwave....

No te voy a indicar como explotarla sin más dandote un par de scripts, te voy a explicar como se realiza para que entiendas como funciona la vulnerabilidad, nada más.

TRACE es un metodo de peticiones. Basicamente responde a las peticiones que le hagas por el protocolo http.
Estas peticiones son enviadas a un servidor web que tenga TRACE disponible. El servidor entonces contesta a tu petición con la información que le mandes. Aquí tienes un ejemplo de una petición sencilla, fijate que el servidor me responde con la info que le mandé:

$ telnet ipdemiapache 80
Trying 127.0.0.1...
Connected to dominiodemiweb.bar
Escape character is '^]'.
TRACE / HTTP/1.1
Host: dominiodemiserver.bar
X-Header: holaxD
HTTP/1.1 200 OK
Date: Fri, 17 May 2019 17:15:47 GMT
Server: Apache/2.4.39 (Unix)
Content-Type: message/http
TRACE / HTTP/1.1
Host: dominiodemiserver.bar
X-Header: holaxD

Si la opción httponly está activa, no se permite insertar scripts para por ejemplo hacer ataques XSS al objeto document.cookie

Si intentas acceder al objeto con scripts se te devuelve el string vacio. Por lo que no puedes ver el contenido del string. Como no podemos sacar el string del objeto con scripts, podemos abusar de peticiones TRACE para buscar el string en sí.
Para esto necesitas editar las cabeceras con por ejemplo un proxy que intercepte tus peticiones para poder editar las cabeceras antes de ser enviadas al servidor web. En estas peticiones mandas un script con una funcion que abra TRACE en el target, y otra que abra el archivo que contiene el string usando por ejemplo ActiveX. El servidor te respondera con las cookies. Y ya nos saltamos la protección de httpOnly.  
Los navegadores suelen incluir una politica de protección de dominio para proteger de ataques XSS que te tienes que saltar. Asique tienes que buscar una vulnerabilidad en tu navegador o uno que no tenga estas politicas. Es muy sencillo en muchos casos.
Es repetir el proceso de antes explotando la vulnerabilidad del navegador en una peticion en la cual pidas las credenciales  mediante TRACE para que el servidor web te las mande.

#2728
La formula que está en main es la que saqué de wikipedia. Tenia un problema con los resultados que no coincidian, concretamente a partir del 3 numero primo que me daba 9 y en wikipedia me salia que era 31 cambie mi función Potencia por pow en el main para ver si implementara mal la funcion y todos los resultados coincidian, primos y perfectos. Entonces arreglé mi función Potencia y los resultados eran los mismos que con pow.
#2729
+O sea estos trabajos que te ayudan a pensar de forma lógica y a saber implementar las ideas que tienes en la cabeza son un coñazo y leerte un libro de 1000 páginas que ya adelantas ser "el asco teórico más grande" es mejor para alguien que está empezando?? Será buena idea si lo que quieres es que abandone la programación por parecerle "un coñazo".

-Sacar formulas de wikipedia no es implementar ideas que tienes en la cabeza. Hacer programas que se te ocurran tras leer un trozo pequeño de un libro teorico escrito por el creador de C++ sí. Asco de extenso, no asco de aburrido. Le recomendé uno más ameno de 296 paginas que explica absolutamente todo lo necesario para empezar mientras programas un videojuego. Quizás si lo primero que haces es crear un juego con una muy buena orientación le pilles más cariño al lenguaje que formulas matemáticas que de momento no te interesan para nada.

+En esa función <Potencia()> si tomas el caso de que exponente valga 0 de forma aislada (y no es un error eso) no tienes que inicializar <potencia> a 1 sino a <base> (es más puedes usar la propia variable base que no está pasada por referencia ni es constante para ahorrarte una variable y una iteración). Tal y como está implementado ahí, el bucle funciona también para el exponente 0 por lo que no es necesario tratarlo de forma aislada.

-Me refería a que el return 1 era para finalizar la funcion como un error. Aunque no sea eso lo que haga. No tenía ganas de incluir más codigo, ya que el programa imprime correctamente el resultado. Lo deje ahí como un complemento para si alguiem quiere tratar ese caso en específico de forma diferente a la implementada en el else.

+La función <esPrimo()> aparte de hacer iteraciones de más de forma innecesaria usa una variable para guardar true/false antes de retornar cuando se puede retornar el valor directamente. Y el <else> tampoco es necesario.

-Lo puse así para que entienda mejor el codigo.

+Ese programa no calcula los primos de Mersenne, calcula los números de Mersenne (no aseguras en ninguna parte que sean primos, es más, no lo son) por lo que los resultados no son correctos tampoco.

-Por lo que entendí de la formula en wikipedia, cualquier numero primo al que se le aplique la formula pasa a ser automáticamente un numero primo de Mersenne sin necesidad de nada mas. De no ser así con volver a llamar a la función EsPrimo ya estaría el problema solucionado. Pero consulte la salida de los valores de la variable que almacena los numeros primos de Mersenne y coincidian con los que encontre en google. Estás seguro de que son incorrectos? Porque también comprobé los 10 numeros perfectos en google y eran los mismos que me da la salida de mi programa.

+Y el uso correcto del <do while> es para bloques que deben ejecutarse una vez antes de comprobar la condición siempre, lo cual no es el caso. Para este caso por convención se emplea un <while>.

-Siempre uso el do while por si quiero meter en algún momento algún trozo de codigo que itere en caso de que no se cumpla la condición. Malos habitos.

+Al final los trabajos "coñazo" van a servir para ver los fallos que comete uno.

-Y los que no son coñazo tambien. Yo pico código palante, me da igual que no esté perfecto en uso de recursos. No trabajo ni voy a trabajar nunca para una empresa. Trabajo para mi y mis proyectos nunca van a requerir tanta eficiencia. Con que lo que salga en pantalla sea lo que quiero ver me vale.
#2730
Vaia coñazo de trabajos os mandan hacer. No tengo ni zorra de mates, pero es solo seguir las pautas del ejercicio y preguntarle las formulas a wikipedia. Haciendo estos ejercicios no aprendes nada. Buscate un libro teorico de C++. Te recomiendo Apress Learn C++ Game Development 2014. Cuando lo acabes pasate por la web https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list y pilla el libro de 1000 hojas que es el asco teorico más grande. Ve haciendo programas que se te ocurran mientras vas asimilando conceptos.

No hagas copia y pega que si tu profesor busca en google el codigo le saldra este post xD
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

unsigned long long Potencia (unsigned int Base, unsigned int Exponente)
{
unsigned long long potencia = 1;
int i;
if (Exponente==0) return 1; //Error.
else
{
for(i=0;i<Exponente;++i)
{
potencia*=Base;
}
}
return potencia;
}

bool EsPrimo (unsigned long long Numero)
{
int Contador = 0;
bool esPrimo = false;
for (int i=1;i<(Numero+1); ++i)
{
if(Numero%i==0)
{
++Contador;
}
}
if(Contador!=2)
{
//Mete un cout por aqui de Numero si quieres para ver el numero que no es primo.
return esPrimo;
}
else
{
esPrimo = true; //Mete un cout por aqui de Numero si quieres, para ver el numero que si es primo.
return esPrimo;
}
}

int main()
{
unsigned int Numero = 1; //Numero a comprobar si es primo.
unsigned int Contador = 1; //Contador para bucle do while.
unsigned long long NumeroPrimoM;
unsigned long long NumeroPerfecto;
do {
   if ( EsPrimo(Numero) ) //Funcion EsPrimo retorna true si el valor de Numero es primo.
   {
   NumeroPrimoM = Potencia(2,Numero) -1; //Formula para sacar primo de Mersenne.
//Mete un cout aqui de NumeroPrimoM si quieres conocer a los primos de Mersenne.
   NumeroPerfecto = (NumeroPrimoM*(NumeroPrimoM +1))/2; //Formula para sacar numero perfecto utilizando numero primo de Mersenne.
   cout << Contador << " - Numero Perfecto: " << NumeroPerfecto << endl;
   ++Contador; //Para el bucle while y seguir calculando hasta 10.
   ++Numero;//Probemos si el siguiente numero es primo.
       }

   else
   {
   ++Numero; //Si el valor en Numero no es primo, prueba el siguiente.
   }

} while (Contador != 11);
return 0;
}

Si no entiendes algo pregunta.