elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ... 430
631  Programación / Programación Visual Basic / Re: busqueda automática mientras se escribe en: 21 Octubre 2021, 02:39 am
En principio el problema es saber 'cuando el usuario deja de escribir', precisamente para eso se usa un botón 'aceptar'. Así el usuario indica explícitamente que ha temrinado con la entrada de datos.

No obstante siendo es la opción obvia hay otras cuando se quiere alguna otra cosa como es tu caso.
Una de ellas es usar el evento validating, no el de change...
El evento validating, sucede cuando se pulsa otro control, es decir cuando el foco del cursor se intenta dirigir a otra parte, antes de que se abandone el foco de dicho objeto (al caso supongo un textbox), salta dicho evento...  requiere eso sí que el usuario realice alguna acción de pulsar en otra parte, si simplemente no hace nada, pues el evento no salta.
Pero en realidad el evento validating, suele usar para garantizar que los datos introducidos reúnen el formato requerido (cuando es el caso).

Es entonces cuando tiene sentido usar un timer...
El timer lo activas en primer lugar cuando el control gana el foco, y lo actualizas (reset el timer a 0) cada vez que sucede un evento change (sucede con cada carácter añadido o eliminado), entonces si tras reactivarse el timer, el lapso se consume (pongamos 1-2sg. es cuando resulta pertienente hacer la búsqueda con los caracteres que contiene el textbox...


Básicamente es este pseudocódigo.
Código:
sub form_load ...
   timer.interval = 1500   ' debes probar con varios valores de intéralo, hasta que estés satisfecho con la espera.
   timer.enabled = false   ' salvo que sea el único control en el form que entonces ganará el foco sí o si.
fin sub

sub textbox_gotfocus ...
    timer.enabled = true
fin sub

sub textbox_change ...
   timer.enabled = true
fin sub

Sub timer_Tick() ...
    timer.Enabled = False
    call BuscarLoQueSea
fin sub
632  Programación / Programación General / Re: Windows reduce velocidad de ejecucion. en: 20 Octubre 2021, 16:21 pm
Es 'raro' eso de que cargue 20 mb. de tamaño de un fichero en memoria en más de 40 minutos, debería ser inmediato (hoy día 20 mb. es poca cosa).

Puede suceder una de las siguientes cosas (así, sin más detalles).
- No queda memoria libre suficiente, o está muy fragmentada. Tu mismo podrás comprobar si es el caso y de ser necesario activa la escritura de RAM a disco (si no se cambió por defecto el S.O. suele ootorgarle algo así como un mínimo de 512Mb.). Por su parte cuando hay mucha memoria en el sistema, e spreferible desactivarlo, porque su uso ralentiza al S.O. que a pesar de la gran cantidad de mmemoria en el equipo, pueda empeñarse en tirar de páginas a disco.
Otra opción más sencilla si se entiende que ya está configurado adecuadamente, es cerrar aplicaciones que no se precisan, para liberar memoria.

- Que haya algún sector dañado en el disco duro. Puede abortar la operación o puede intentr 'rumiar' intentando leer el contenido y avanzar muy lentamente.
en tal caso o ante la duda conviene hacer un chequeo dle disco completo (buscando por secotres dañados y que queden marcados como tal y que recupere los que no estén dañados).

- Adicionalmente la presencia de algún virus podría tener suspendido algún proceso... o manipulado algún driver.

- Algo mucho menos frecuente  (depende del S.O. de tu equipo), es que dado ciertas fallas (generalmente por daños en disco), es que le haya cambiado el modo de tranferencia (de DMA a PIO). Esto podía ser frencuente a finales de los 90 y comienzos de siglo, pero no he escuchado desde entonces que esto siga sucediendo hoy (por eso digo que depende dle S.O. con el que estés haciendo tus pruebas).

Y sin más detalles no se me courren más razones...
633  Seguridad Informática / Hacking / Re: me hackearon y necesito ayuda en: 20 Octubre 2021, 16:04 pm
Si cambiaron tu numero de telefono y no el email (porque no lo diste), entonce spodrás recuperar tu cuenta, porque tu puedes demostrar que ese númerod e teléfono, está asociado a tu nombre y quien haya asociado tu cuenta a su email, no podrá demostrar que se llama como tú ni aportar documentación que demuestre que ese número de teléfono es suyo.

Ahora bien, ten en cuenta, que muchas acciones de usurpación ya prevén esa situación y lo que hacen es que antes de usuarpar tu cuenta es lograr acceso a tu correo o a tu teléfono, para poder confirmar el cambio como si fueras tú.
Por ello es adecuado (con cuentas de correos), tener cuentas designadas secundarias que puedan recuperar tu cuenta.

No tengo twitter, no conozco el mecanismo exacto que tiene para recuperar cuentas usurpadas, pero asumo (y más como aseveran los otros compañeros), que el método es más o menos exhaustivo. De ser el caso, si hay opción, no solicites un SMS, que pudiera estar intervenido, en todo caso una llamada telefónica.
Repasa los permisos en tu teléfono para ver qué aplicaciones tiene acceso a los SMS, y elimina ese permiso de todas las aplicaicones que no tengan razón de ser.
634  Foros Generales / Foro Libre / Re: Piden permisos para rescatar en dron a los animales aislados por la lava en La Palma en: 20 Octubre 2021, 15:54 pm
A mi me llegó una petición de Change.org, para lo mismo (el rescate de animales con dorn), aunque no recuerdo cual de las dos iniciativas surgió antes, o si son la misma o han acabado derivando en la misma.
635  Seguridad Informática / Seguridad / Re: Compra online con tarjeta y pin en: 20 Octubre 2021, 15:51 pm
No. Nadie excepto tu sabe ni tiene que saber ni tu pin, ni ninguno de dichos dígitos de tu tarjeta. Ni el banco tiene por qué saberlo. de hecho si no lo recuerdas, debes ir al bqanco a reclamarlo y el cajero técnicamente solicita un nuevo pin que se imprime y que el cajero no tiene por qué verlo.

Tu pin es solo tuyo y absolutamente nadie, puede reclamarte que introduzcas ninguno de sus dígitos, para ningún otro propósito que verificar la transacción de compra en el uso de la tarjeta.

Otra cosa es que te hayan pedido los 3 dígitos de control de la tarjeta (que a vces, sobre todo antes) venían al dorso y no forman parte de la numeración. ...aunque desde luego no se suman.

Me temo, que es un intento de acceder a tu pin... hoy te piden sumar el primero y úlimo, otro día te piden otros 2 y al final se deduce tu pin. Me entran dudas de que realmente estuvieres accediendo a través de una web legal... quizás fuera una página falsificando a otra, etc...

Para la próxima haz una captura o foto de dicho formulario.

...por seguridad yo te recomendaría que vayas a un cajero lo antes posible y cambies el pin de tu tarjeta por otro.
636  Programación / Programación General / Re: ¿Existe algún algoritmo para escribir las pemutaciones de n elementos sin almacenar las de n-1 elementos? en: 19 Octubre 2021, 01:58 am
Por eso me he preguntado si existiría un algoritmo que no necesitase almacenar las permutaciones de n-1 elementos, sino que solo mediante bucles fuese capaz de escribir las permutaciones directamente.

Yo le he dado algunas vueltas al asunto y creo que no, que no es posible tal algoritmo, y que cualquier algoritmo pasa por tener almacenadas las permutaciones
Las permutaciones, son bases numéricas con condicionantes algo 'caprichosos'.
Del mismo modo que puedes escribir 78 directamente en sistema decimal, sin necesidad de tener todas las permutaciones de 2 dígitos previas (00-77), igual pasa con cualquier otra base numérica.

Todo lo que necesitas saber de antemano es cuantos elementos contiene (el numero mayor para x dígitos), o dicho de otra manera que número de secuencia supone la última secuencia buscada (con dos dígitos es 99, luego son 100 permutaciones).
Después de eso, es exactamente lo mismo que operar con cualquier base numérica.

Intenta pasar el numero 78 de la base decimal a una base 12, 17 o 44... cuando te suene familiar, te será más fácil entenderlo y resolverlo.
637  Foros Generales / Sugerencias y dudas sobre el Foro / Re: Posibilidad de incluir la fecha del primer mensaje de un hilo en la información previa del mismo en: 13 Octubre 2021, 16:51 pm
Si, pero cuando te avisa ya has entrado al hilo y además le has dado a "Responder". Yo lo que busco es evitarme entrar porque otro forero sí que haya contestado a un mensaje antiguo, pero yo no puedo saberlo de antemano. Precisamentepor eso lo que propongo es que en el tablón del foro se vea al lado del mensaje de un hilo la fecha de cuando se inició Si veo un hilo con dos páginas de mensajes y fecha de inicio 2010, pues igual ni siquiera entro a leer.

Si esto pasa a veces, pero vamos, yo no diría que cada día me pase 300 veces, como para ver en ello una imperiosa necesidad. Al fianl que son 10 clicks adicionales al día?. Creo que se puede vivir con ello.

Personalmente no veo 'nada malo', en que si un hilo data de hace 5 años y se trató pongamos por ejemplo como solucionar cierto problema, algoritmo, etc... que alguien con el mismo problema pero tras leer no termine de entender pregunte en un hilo que justamente trata ese mismo tema. Que cree un nuevo hilo con el mismo tema, no veo que solucione ningún problema, como tampoco veo que se genere algún problema por segir escribiendo en el viejo hilo.
En mi opinión, creo que se aplica mal, los hilos a no resucitar son esos donde alguien dejó un enlace de descarga y alguien 5 años después reclama que el 'enlace no funciona, que se lo vuelvan a subir', pues es de considerar que el usuario que lo subió ya ni aparezca por el foro, o bien que el contenido específico al que se hacía referencia ya no lo tenga en posesión...

Sería un problema si uno tuviera que leer obligatoriamente en secuencia cada mensaje antes de poder acceder al último, pero no es el caso, Tampoco creo que haya sobrecarga en la base de datos por seguir escribiendo en un hilo viejo. Supongo que el único problema real sería el de que en caso de querer purgar hilos viejos, el no actualizar viejos hilos, facilita la cantidad d ehilos viejos que puedna purgarse, por otro lado que un viejo hilo se actualice es indicativo de que el tema sigue siendo de interés.
638  Seguridad Informática / Seguridad / Re: Scam(Estafa) en: 13 Octubre 2021, 15:48 pm
Cuando compras productos de escaso valor (pongamos 5-15 euros), puede que logres estafar alegando que no te llegó, cuando el envío no tiene ningún tipo de seguimiento y la plataforma tolera la devolución.

Cuando el producto es caro, ten por seguro que ningún vendedor va a enviar ningún artículo sin que quede registrado por la compañía de paquetería que el destinatario recibió el envío.

De hecho hay vendedores que lo primero que ponen en sus detalles como vendedor es que si eliges la opción de envío más barato que no incluye seguimiento del paquete, no se hacen responsables por pérdida-extravío. Por supuesto cada plataforma de venta tiene sus normas.

En cualquier caso, muchos vendedores miran el historial de votos (positivos-negativos) del comprador o si lleva poco tiempo registrado en la plataforma antes de aceptar cierto tipo de compras.

Si estás pensando en intentar ganar dinero a base de estafas con compras, puede que alguna te salga bien, pero a medio-largo plazo tendrás denuncias y posiblemente condena.
639  Seguridad Informática / Hacking / Re: Fallos de seguridad en la página del ministerio de industria de Paraguay (ayuda) en: 12 Octubre 2021, 01:47 am
Si no te cogen el teléfono, acude a la comisaría y señala allí el caso personalmente (imagino que resides en el propio Paraguay), es de suponer que ya ellos contactarán con alguien capacitado para tomar decisiones y hacer las indagaciones pertinentes.

Si ninguno te hace caso, entonces habla con algún periodista para que publique el titular: "Hallan fallos en la web de... y no hacen caso del aviso".
Pero sin explicitar como has encontrado y cuales son (en detalle) los fallos, para no dar más pistas al público avispado de lo preciso. El periodista seguramente quiera una demostración, para asegurarse que no le tomas el pelo... Ya cuando todo el mundo se haga eco y el ministerio sea un hazmereir, a lo mejor te prestan atención.
640  Programación / Programación General / Re: Problema del viajante de comercio - Branch and Bound en: 11 Octubre 2021, 19:48 pm
Ordenando carpetas, me encontré otra carpeta mal renombrada (y por tanto fuera de orden) donde tengo otro algoritmo que hice a comienzo de los 90, emplea una heurística muy diferente pero muy simple del que tiene como virtud los pocos nodos que precisa visitar. Es decir consigue un resultado muy rápidamente, por ejemplo para 20 nodos, apenas tarda 0'05-0'09sg. y visita solo unos cientos de nodos. Para 100 nodos apenas 0'3sg. y para 1000nodos solo 45sg. (en mi equipo que es viejo y no muy potente).

Ayer me puse a repasarlo para asegurarme que lo tenía completo y funcionaba bien, pues no dejé comentarios al respecto, y mientras lo migraba NET  (lo tenía en un viejo lenguaje) y para hacerlo más útil, lo fijé para usar un mapa finito (un área de 512x512), para crear los puntos aleatoriamente y poder dibujarlos (opcionalmente) en el mismo mapa sobre la marcha, a medida que encuentra rutas más óptimas.

Lo interesante de este algoritmo, es que puede ser usado como un primer paso para obtener una respuesta rápida, desde la cual partir con otro algoritmo más 'sesudo' (y más lento o consumidor de recursos), que es más adecuado para alcanzar un valor mucho más óptimo (repito cuando el número de nodos es mayor de unas pocas decenas).

La descripción de esta heurística es muy simple, se trata de ver si el intercambio entre dos nodos genera una ruta más óptima, en tal caso, se realiza el cambio.
Hay que proceder sistemáticamente no al azar, para que alcance en algún momento un punto de 'bloqueo' donde ya no se localizan mejoras con intercambios, momento en que  el algoritmo finaliza.
Un medio de optimizar las comparaciones es precalcular la ruta inicial (en general si no se ordenan 'geográficamente', el orden es el que subyace en el listado.
Así la idea de comparar el intercambio entre dos nodos asume la siguiente noción:

Código:
suma = recorridoinicial
...
...
...
buleano = Funcion CompararBY(entero A, entero distancia, inout entero suma, inout entero B, inout entero Y)
    suma1 = ABC + XYZ
    suma2 = AYC + XBZ

    Si (suma2 < suma1)
        suma = (suma - suma1 + suma2) //actualizar suma
        devolver TRUE  //al retorno se hace el intercambio cuando devuelve true.
    fin si
fin funcion
Nota que los nodos que se comparan son B e Y, así ABC es la ruta 'A a B' + 'B a C'.
Nota también que los intercambis, para ser exhaustivos, deben empezar a una distancia (entre B e Y) de numnodos/2, cuando a esa distancia no haya intercambios, se reduce la distancia hasta 2.

El intercambio de distancia 1, es muy similar, pero requiere aplicarse aparte, ya que si XYZ solapan en parte ABC (lo que sucede con distancia 1) BC y XY están tomando una distancia que ahora existe pero que de intercambiarse se rompe... luego no es adecuado hacer una comparación de sumas con solape de nodos. Puede resolverse a base de complicar el algoritmo con cada nodo a visitar, que lo hace subóptimo, en cambio si tratamos la distancia 1 en un bucle aparte, no hay esa pérdida de rendimiento en lógica extra ni hay que complicarse en resolver esa lógica extra.
El algoritmo principal sería:
Código:
//Heuristica de Intercambios de dos nodos:
suma = recorridoinicial  //ABCDEFGH...

Hacer
    intercambios = false
    bucle para distancia desde (numnodos/2) hasta 2 retrocediendo de 1 en 1        
        Hacer
            cambios = false
            bucle para k desde 0 a numNodos-1          
                Si CompararBY(k, distancia, suma, B, Y)= true
                    intercambiar B con Y
                    cambios = true
                    numIntercambios +=1
                    evento Reportar(ruta.tostring, suma, numIntercambios)
                fin si
                numVisitados +=1
            siguiente
            intercambios  = (intercambios or cambios)
        Repetir mientras cambios=True
    siguiente  

    // aquí el bucle para distancia =1            
        Hacer
            cambios = false
            bucle para k desde 0 a numNodos-1          
                Si CompararBC(k, suma, B, C)= true
                    intercambiar B con C
                    cambios = true
                    numIntercambios +=1
                    evento Reportar(ruta.tostring, suma, numIntercambios)
                fin si
                numVisitados +=1
            siguiente
            intercambios  = (intercambios or cambios)
        Repetir mientras cambios=True
Repetir mientras intercambios=TRUE
La función CompararBY es ligeramente diferente de CompararBC, esta última impide solapes entre los nodos que falsifiquen la suma de las distancia.

Código:
// Distancia=1, es preciso mantenerse aparte para evitar solapes en la suma de distancias (sin complicar el algoritmo y que ello redunde en lentitud).
buleano = Funcion CompararBC(entero A, inout entero suma, inout entero B, inout entero Y)
    suma1 = AB + CD   // BC = CB (si es el problema del TSP simétrico).
    suma2 = AC + BD   // luego, la suma de estos está retirado

    Si (suma2 < suma1)
        suma = (suma - suma1 + suma2) //actualizar suma
        devolver TRUE  //al retorno se hace el intercambio cuando devuelve true.
    fin si
fin funcion

Las variables, A,B,C, X, Y, Z,  K,D refieren al indice que ocupan en un array, y dichos índices son el indice del array de nodos. Yo uso una (clase) pila (más que nada porque se comparte entre todos los otros algoritmos), para éste, al caso se le ha añadido una propiedad Test (además de Push y Pop), para lectura y escritura no secuencial (algo como Peek y Poke) y con ello permitir el intercambio de índices cuando es aceptado. Ese array contiene pues los índices de la ruta a seguir, luego 'ruta.ToString' es tomar cada indice en el array separado por lo que prefieras una coma, un guión, etc... Si se busca más velocidad, el evento no es requerido, basta enviarlo cuando salga del bucle principal. Igualmente cuando se qiere revisar tiempos, se desactiva el dibujado, aunque el inicial y el final corren dentro del crono (al gusto pueden dejarse fuera).

Dos cuestiones a tener en cuenta son:
- Que el recorrido en el bucle debe ser circular, ya que si hay 20 nodos y A es el 19ª, B tendrá que ser el 0º y C el 1º, y si hay una distancia a aplicar de 8, entonces X será el 7º, Y el 8º y Z el 9º. Es decir el cálculo de índices debe recurrir al módulo de forma constante.
- Que puede hacerse un cálculo mucho más veloz si se mantiene en memoria una tabla con el mapa de las distancias, pero que solo es asequible cuando el número de nodos es tolerable.
Si se operara por ejemplo con 1 millón de nodos, entonces dicha tabla ocuparía en memoria los bytes que ocupen los datos de 1 billón. En tal caso en vez de mantener dicha tabla en memoria es preferible calcular cada vez la distancia ABC y XYZ, que al requerir potencias y raíz cuadrada (operando con la distancia de Euler), contínuamente hacen decaer la velocidad del algoritmo notablemente pero a cambio pueden abordarse problemas de varios miles de nodos (al pasarlo a NET sigue este modelo, en tanto que la versión que tenía en origen mantenía la tabla, pués lo tenía limitado a 100 nodos máximo).

Cuando se opera con una cantidad media de nodos (pongamos 100), lo que se observa es que opera bastante bien todos los nodos que están en el 'extraradio' del mapa, cometiendo en cambio 'torpezas' severas con nodos internos. La razón de esto es que solo ataca el intercambio de 2 nodos (esto es, la ruta de un nodo con sus 2 adyacentes), si el intercambio fuera comparando la distancia de 2 o más nodos (comparar dos nodos serían ABCD y WXYZ), se seguirían consiguiendo mejores resultados, tanto más necesario, cuando el número de nodos es mayor.
Se desprende (observando el mapa con los resultados) que este algoritmo apoyado por otro (tras éste) que operara mejor los nodos próximos entre sí lograría resultados muy óptimos en un tiempo muy rápido.

Es decir, lo más interesante de este algoritmo es que al ser tan rápido, puede ser la primera fase de otro más eficaz en el resultado. Llegar a cierto resultado óptimo, prontamente satisface la posibilidad para otro algoritmo más lento que opere a partir de donde éste lo deja.
De hecho es intuitivo que la programación dinámica puede asumirse como un intento de optimizar este tipo de situaciones.
Tu que sigues el esquema de programación dimámica ya te habrá quedado claro que si para algo como 20 nodos empleas (pongamos por ejemplo), 1-4Gb. de RAM, para uno de 30 nodos, seguramente te subas a 15 o 30Gb. y probablemente no puedas asumir problemas con más de 50 nodos sin sacrificar por algún lado, porque la RAM precisa será inasumible....
Este algoritmo al ser tan simple, el costo en RAM es pecata minuta, básicamente son unos pocos MB. que dependen de la cantidad de nodos y las estructuras asociadas, pués la parte principal como ya te de dicho es un simple array que mantiene los indices de los nodos que amntienen la ruta vigente.

A la noche me edito repaso el escrito y pongo imágenes...

Con pocos nodos (incluso con 20), suele encontrar la solución óptima o muy próxima, cuanto mayor es el número de nodos esa tendencia se pierde.
A la vista (tras dibujar el mapa), es observable que (cuando no consigue la ruta óptima), puede mejorarse fácilmente. Los humanos somos buenos visualmente para lograr heurísticas (difíciles de programar), pero con resultados muy cercanos al óptimo.

En la imagen adjunta, se observa como es mejorable la ruta si fuera del nodo 12 al nodo 2 y del nodo 13 al nodo 16.

El algoritmo de intercambio, se presta a muchas variaciones una que haré el próximo fin de semana, se explica muy bien justamente en la imagen de este ejemplo.
Se tendrá en cuenta para el intercambio, solo la distancia del segmento entre 2 nodos (en vez de los dos segmentos entre 3 nodos. Esto hace que la cantidad de cálculos sea menor, si bien la cantidad de nodos a visitar seguramente sea mucho más numeroso. Es importante implementarlo bien de otro modo se estaría operando con un algoritmo de fuerza bruta.
Al término incluso podría hacerse operar un algoritmo al término del otro, para determinar eficiencia y eficacia.

Cuando el número de nodos crece (por ejemplo, 100), es prácticamente imposible que arroje el resultado óptimo, como puede verse en esta imagen.


Aquí un ejemplo para 1000 nodos, la imagen inicial con un costo total de 261.867, es reducida al final a solo 35.909, y para ello necesita visitar 9.105.000 nodos y realiza 5.506 intercambios.
La ruta inicial: 0,1,2,3,4,5,6 ... 997,998,999,0


...y el resultado al finalizar el algoritmo. Se ve como hay cruces largos entre puntos distantes, cruzando líneas, pero ha logrado reducirse notablemente de una forma muy simple y veloz.


En esta sin recortar se muestra además los datos del resultado:

Para 1000 nodos todavía es asequible usar una tabla de distancias (1 millón de elementos * 4 bytes = aprox. 4Mb.), así cada distancia se calcula una sola vez y se almacena, en un array bidimensional, con ello el algoritmo sería aún mucho más rápido que esos 45 segundos.
En cambio para 1 millon de nodos, requeriría aprox. 4Gb. y exigiría un PC con buena cantidad de memoria para encontrar ese espacio disponible contiguo (o ceñirse a otra estructura de datos no contigua).

Dibujando cada una d elas 5506 soluciones + la 'ruta.ToString', correspondientes, el tiempo se dispara a 458segundos. 10 veces más, es decir el tiempo se consume en el trazado más que en el cálculo, aunque es interesante verlo trabajar.



Páginas: 1 ... 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ... 430
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines