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


Páginas: [1] 2 3 4 5 6 7 8 9 10
 1 
 en: Hoy a las 02:33 
Iniciado por El_Andaluz - Último mensaje por El_Andaluz


A principios de esta semana salió a la luz que el Departamento de Energía de Estados Unidos (DOE) está dispuesto a gastarte cientos de millones de dólares en un nuevo supercomputador. Esta organización gestiona el Laboratorio Nacional Oak Ridge (ORNL), que es el hogar del supercomputador más potente del mundo en la actualidad y que debería ser superado por la máquina que pronto estará en camino en algún momento entre 2027 y 2028.

Cuando hablamos de los supercomputadores más potentes solemos tener en cuenta la prestigiosa lista TOP 500 que, como sugiere su nombre, reúne a las 500 máquinas más destacadas del planeta. Ahora bien, las cosas están cambiando y puede que la mencionada lista no sea un fiel reflejo de la realidad. En este contexto entra en juego China, que ha dejado de participar de TOP 500, y que es evidente que la supercomputación le importa, y demasiado.



 2 
 en: Hoy a las 02:11 
Iniciado por Tachikomaia - Último mensaje por Tachikomaia
Algo de Mercado Libre Argentina o España, soy de Uruguay.

Alguien me dijo que muchas ofertas son estafas para obtener datos de uno y luego usar eso para sacar préstamos o comprar cosas como si hubiera sido yo. Que hay muchas denuncias pero lo siguen haciendo. O que si compras una pelota de tenis por ejemplo y te mandan una de ping pong nada puedes hacer.

No entiendo por qué es tan complicado:
- El vendedor da su objeto al intermediario, quien le da una constancia de que lo recibió.
- El intermediario le muestra el objeto al comprador.
- El comprador dice si es lo que pidió o no.
- Si es lo que pidió, le da el dinero al intermediario, recibe una constancia de haber pagado, y el intermediario se queda con una copia de eso. Si no es lo que pidió, el intermediario deberá discutirlo con el vendedor, es problema suyo, el comprador sólo perdió tiempo.
- El intermediario muestra al vendedor la constancia de pago y le da el dinero acorde. Si el vendedor dice que el precio era otro, de nuevo es un problema entre ellos, pues el comprador pagó lo que el intermediario le dijo que pague.

¿Cómo van a robar datos así? ¿los intermediarios? Con ese criterio nunca te harías una tarjeta ni socio de algún lugar porque los de la empresa que tienen tus datos (para saber a quién reclamar si no pagas) va a usar tus datos para cualquier cosa.

Otra persona me dijo que incluso te pueden matar  :o

 3 
 en: Hoy a las 01:57 
Iniciado por Meta - Último mensaje por EdePC
Concuerdo con EdePC. La explicación está muy bien, pero desde el inicio parece lógico y claro que no es necesario poner un if con una condición sobre cuando acabar el while, si dicha condición se puede poner en la condición misma del while.

Creo que lo ideal sería que el programa no esté mirando a cada milisegundo si se tocó Enter o no, sino que quede detenido hasta que se presione Enter, pero eso parece imposible. Por ejemplo, el sistema de una linterna, supongo, no es que esté chequeando a cada milisegundo si se está presionando un botón o no, nada hace, pero cuando se apreta eso activa algo. Pero un programa creo que no funciona así...

Código
  1. while (Console.ReadKey(true).Key != ConsoleKey.Enter);

Console.ReadKey detiene la ejecución del programa y espera a que el usuario presione una tecla, solo cuando el usuario presiona la tecla esta se comprueba si es Enter, si no es, el bucle se vuelve a repetir, pero en todo momento siempre se queda pausado esperando que el usuario teclee algo.

Si otro fuera el caso si que hay que poner una pequeña pausa para no saturar al sistema con un bucle pesado.

 4 
 en: Hoy a las 01:50 
Iniciado por Meta - Último mensaje por Tachikomaia
Concuerdo con EdePC. La explicación está muy bien, pero desde el inicio parece lógico y claro que no es necesario poner un if con una condición sobre cuando acabar el while, si dicha condición se puede poner en la condición misma del while.

Creo que lo ideal sería que el programa no esté mirando a cada milisegundo si se tocó Enter o no, sino que quede detenido hasta que se presione Enter, pero eso parece imposible. Por ejemplo, el sistema de una linterna, supongo, no es que esté chequeando a cada milisegundo si se está presionando un botón o no, nada hace, pero cuando se apreta eso activa algo. Pero un programa creo que no funciona así...

 5 
 en: Hoy a las 00:51 
Iniciado por B€T€B€ - Último mensaje por Danielㅤ
Hola, yo en su momento también quise saber cuál marca de pasta térmica comprar y me recomendaron las siguientes:

Artic Silver
Artic Cooling
Cooler Master

Pero en mi país Argentina me fue imposible encontrarlas ya que directamente ni conocen esas marcas, las personas que me recomendaron son de España y ayudan en un foro de informática, puede ser que en su país si sean fáciles de conseguir.

La que tuve que comprar es una marca muy conocida al menos en mi país y en todas las casas de informática se las consigue, la marca es DELTA y según me comentaron y he leído comentarios que es de buena calidad, y mi opinión es que es así, no será la mejor pero es buena.


Saludos

 6 
 en: Hoy a las 00:26 
Iniciado por B€T€B€ - Último mensaje por B€T€B€


Buenas noches.


Abro este tema a modo de encuesta para ver que pasta térmica utilizáis; pronto tendré que comprar.

 7 
 en: Ayer a las 22:08 
Iniciado por GerBermudez1982 - Último mensaje por B€T€B€



> https://foro.elhacker.net/redes-b4.0/

 8 
 en: Ayer a las 18:38 
Iniciado por Meta - Último mensaje por Danielㅤ
Otra forma más corta usando el código de **Aincrad** puede ser ésta:

Código
  1. private static bool Menu()
  2.    {
  3.        if (Console.ReadKey(true).Key != ConsoleKey.Enter)  {
  4.            return Menu();
  5.        }
  6.    }

Otra forma de salir del bucle es usar 0 para indicar al programa que finalizó sin errores:

Código
  1. private static bool Menu()
  2.    {
  3.        if (Console.ReadKey(true).Key == ConsoleKey.Enter)  {
  4.            return 0;
  5.        }    else  {
  6.            return Menu();
  7.        }
  8.    }

 9 
 en: Ayer a las 16:20 
Iniciado por Meta - Último mensaje por EdePC
Eres libre de usar la forma que veas por conveniente, pero a simple vista para tu caso sencillo donde quieres que no se salga del programa hasta que se presione Enter debería bastar con:

Código
  1. while (Console.ReadKey(true).Key != ConsoleKey.Enter);

Lo que dice Daniel es cierto cuando el  bucle es infinito por diseño: while(true), Así que ahí dependes del cuerpo del while para salir del bucle.

Si nos vamos a las entrañas de una aplicación en .net descompilándolo a IL tenemos:

Caso 1:
Código
  1. while (Console.ReadKey(true).Key != ConsoleKey.Enter);

Código
  1. .method private hidebysig static void  Main() cil managed
  2. {
  3.  .entrypoint
  4.  // Code size       29 (0x1d)
  5.  .maxstack  2
  6.  .locals init ([0] valuetype [mscorlib]System.ConsoleKeyInfo CS$0$0000,
  7.           [1] bool CS$4$0001)
  8.  IL_0000:  nop
  9.  IL_0001:  br.s       IL_0003
  10.  IL_0003:  ldc.i4.1
  11.  IL_0004:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey(bool)
  12.  IL_0009:  stloc.0
  13.  IL_000a:  ldloca.s   CS$0$0000
  14.  IL_000c:  call       instance valuetype [mscorlib]System.ConsoleKey [mscorlib]System.ConsoleKeyInfo::get_Key()
  15.  IL_0011:  ldc.i4.s   13
  16.  IL_0013:  ceq
  17.  IL_0015:  ldc.i4.0
  18.  IL_0016:  ceq
  19.  IL_0018:  stloc.1
  20.  IL_0019:  ldloc.1
  21.  IL_001a:  brtrue.s   IL_0003
  22.  IL_001c:  ret
  23. } // end of method Program::Main

Caso 2:

Código
  1. while (true) {
  2.  if (Console.ReadKey(true).Key == ConsoleKey.Enter) { break; }
  3. }

Código
  1. .method private hidebysig static void  Main() cil managed
  2. {
  3.  .entrypoint
  4.  // Code size       38 (0x26)
  5.  .maxstack  2
  6.  .locals init ([0] valuetype [mscorlib]System.ConsoleKeyInfo CS$0$0000,
  7.           [1] bool CS$4$0001)
  8.  IL_0000:  nop
  9.  IL_0001:  br.s       IL_0021
  10.  IL_0003:  nop
  11.  IL_0004:  ldc.i4.1
  12.  IL_0005:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey(bool)
  13.  IL_000a:  stloc.0
  14.  IL_000b:  ldloca.s   CS$0$0000
  15.  IL_000d:  call       instance valuetype [mscorlib]System.ConsoleKey [mscorlib]System.ConsoleKeyInfo::get_Key()
  16.  IL_0012:  ldc.i4.s   13
  17.  IL_0014:  ceq
  18.  IL_0016:  ldc.i4.0
  19.  IL_0017:  ceq
  20.  IL_0019:  stloc.1
  21.  IL_001a:  ldloc.1
  22.  IL_001b:  brtrue.s   IL_0020
  23.  IL_001d:  nop
  24.  IL_001e:  br.s       IL_0025
  25.  IL_0020:  nop
  26.  IL_0021:  ldc.i4.1
  27.  IL_0022:  stloc.1
  28.  IL_0023:  br.s       IL_0003
  29.  IL_0025:  ret
  30. } // end of method Program::Main
  31.  

- He resaltado la parte que es idéntica en ambos casos (los nop se ignoran porque no hacen nada (NOP = No Operation)), solo queda analizar que hace la parte no resaltada del segundo caso:

En la línea 21 del primer caso y 22 del segundo caso hacen el salto si la tecla presionada es Enter, es decir, eso debería de hacer que se salga del bucle

- En el primer caso salta a IL_0003 que es el inicio del bucle así que es muy sencillo entender que el bucle se volverá a ejecutar, si no salta, simplemente hace un RET para salir del bucle

- En el segundo caso salta a IL_0020 que es un NOP, este no hace nada, así que pasamos a la siguiente instrucción IL_0021,  IL_0022 y IL_0023 donde ponen en la memoria (stack) 1, luego recuperan ese 1, y finalmente saltan incondicionalmente (si o si porque no comprueban nada) a IL_003 que es el inicio del bucle.

-- Si la tecla no fue Enter ejecutamos IL_001d que nuevamente es un NOP así que pasamos a IL_001e el cual es un salto incondicional a IL_0025, ahora bien, en IL_0025 está el RET para salir del bucle

Conclusión: El caso 1 es exactamente igual al caso dos, el caso dos es lo mismo salvo que hace otras otras inútiles, como NOP, poner valores en el stack, recuperarlas pero no hace absolutamente nada con ellas, salta a otros sitios que tampoco hacen nada, es decir, solo tiene código extra de relleno.

Por cierto he utilizado ildasm.exe para abrir el .exe generado y obtener su código IL que es al final lo que interpreta .NET, en mi caso lo tengo en C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe

Si todo lo anterior resulta un poquito complicado de entender se puede usar una herramienta más amigable para obtener el código IL que va a interpretar finalmente .NET, por ejemplo ILSpy: https://github.com/icsharpcode/ILSpy para mi siguiente ejemplo usaré una versión más viejita: https://github.com/icsharpcode/ILSpy/releases/download/v7.2.1/ILSpy_binaries_7.2.1.6856.zip que es compatible con .NET 4.7, las nuevas versiones requieren .NET 8

Los siguientes casos son como interpreta ILSpy el .exe generado, para estos casos obviare el IL puro porque ya lo expliqué antes, solo me centraré a la decompilación C# que obtiene ILSpy:

Caso 1 por ILSpy:

Código
  1. // cprb.Program
  2. using System;
  3.  
  4. private static void Main()
  5. {
  6. while (Console.ReadKey(intercept: true).Key != ConsoleKey.Enter)
  7. {
  8. }
  9. }
  10.  

Caso 2 por ILSpy:

Código
  1. // cprb.Program
  2. using System;
  3.  
  4. private static void Main()
  5. {
  6. do
  7. {
  8. bool flag = true;
  9. }
  10. while (Console.ReadKey(intercept: true).Key != ConsoleKey.Enter);
  11. }
  12.  

- Bueno, es obvio que el primer caso se parece más al ejemplo que entrega Microsoft con las {} al final, aunque el código original del caso uno no los tiene y en su lugar le puse ;

- El segundo caso, se interpreta como un do while, PERO el cuerpo de este no hace nada, es decir, crea una variable flag que pone a true pero no hace nada con ella, luego está la condicional del do while que es exáctamente igual al Caso 1.

---
Como extra también pongo las instrucciones finales C# interpretado y IL para el aporte que acaba de por Aincrad:

Original:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace cprb {
  7.  class Program {
  8.    static void Main() {
  9.      Menu();
  10.    }
  11.  
  12.    private static bool Menu() {
  13.      if (Console.ReadKey(true).Key == ConsoleKey.Enter) {
  14.        return true;
  15.      } else {
  16.        return Menu();
  17.      }
  18.    }
  19.  
  20.  }
  21. }
  22.  

Interpretación C# por ILSpy:

Código
  1. using System;
  2.  
  3. internal class Program
  4. {
  5. private static void Main()
  6. {
  7. Menu();
  8. }
  9.  
  10. private static bool Menu()
  11. {
  12. if (Console.ReadKey(intercept: true).Key == ConsoleKey.Enter)
  13. {
  14. return true;
  15. }
  16. return Menu();
  17. }
  18. }
  19.  

Decompilación IL por ILSpy:

Código
  1. .class private auto ansi beforefieldinit cprb.Program
  2. extends [mscorlib]System.Object
  3. {
  4. // Methods
  5. .method private hidebysig static
  6. void Main () cil managed
  7. {
  8. // Method begins at RVA 0x2050
  9. // Header size: 1
  10. // Code size: 8 (0x8)
  11. .maxstack 8
  12. .entrypoint
  13.  
  14. IL_0000: nop
  15. IL_0001: call bool cprb.Program::Menu()
  16. IL_0006: pop
  17. IL_0007: ret
  18. } // end of method Program::Main
  19.  
  20. .method private hidebysig static
  21. bool Menu () cil managed
  22. {
  23. // Method begins at RVA 0x205c
  24. // Header size: 12
  25. // Code size: 42 (0x2a)
  26. .maxstack 2
  27. .locals init (
  28. [0] bool,
  29. [1] valuetype [mscorlib]System.ConsoleKeyInfo,
  30. [2] bool
  31. )
  32.  
  33. IL_0000: nop
  34. IL_0001: ldc.i4.1
  35. IL_0002: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey(bool)
  36. IL_0007: stloc.1
  37. IL_0008: ldloca.s 1
  38. IL_000a: call instance valuetype [mscorlib]System.ConsoleKey [mscorlib]System.ConsoleKeyInfo::get_Key()
  39. IL_000f: ldc.i4.s 13
  40. IL_0011: ceq
  41. IL_0013: ldc.i4.0
  42. IL_0014: ceq
  43. IL_0016: stloc.2
  44. IL_0017: ldloc.2
  45. IL_0018: brtrue.s IL_001f
  46.  
  47. IL_001a: nop
  48. IL_001b: ldc.i4.1
  49. IL_001c: stloc.0
  50. IL_001d: br.s IL_0028
  51.  
  52. IL_001f: nop
  53. IL_0020: call bool cprb.Program::Menu()
  54. IL_0025: stloc.0
  55. IL_0026: br.s IL_0028
  56.  
  57. IL_0028: ldloc.0
  58. IL_0029: ret
  59. } // end of method Program::Menu
  60.  
  61. .method public hidebysig specialname rtspecialname
  62. instance void .ctor () cil managed
  63. {
  64. // Method begins at RVA 0x2092
  65. // Header size: 1
  66. // Code size: 7 (0x7)
  67. .maxstack 8
  68.  
  69. IL_0000: ldarg.0
  70. IL_0001: call instance void [mscorlib]System.Object::.ctor()
  71. IL_0006: ret
  72. } // end of method Program::.ctor
  73.  
  74. } // end of class cprb.Program

---
Una vez Tachikomaia preguntó sobre la optimización de su código o porque no le funcionaban bien algunas instrucciones que requieren redondeo, en su caso el usa Flash 5 y yo comenté que podría usar JPEXS Free Flash Decompiler https://github.com/jindrapetrik/jpexs-decompiler para obtener el código final interpretado y el P-Code de sus .swf, esto es lo mismo que usar ILSpy para los .exe de .NET, con estos programas se puede ver que es lo que se ejecuta finalmente

 10 
 en: Ayer a las 15:38 
Iniciado por Meta - Último mensaje por **Aincrad**
tambien podrias hacer una funcion booleana recursiva  ;) .

Código
  1.  
  2. // bool SelectMenu = Menu();
  3.  
  4.  private static bool Menu()
  5.    {
  6.        if (Console.ReadKey(true).Key == ConsoleKey.Enter)  {
  7.            return true;
  8.        }    else  {
  9.            return Menu();
  10.        }
  11.    }
  12.  

Páginas: [1] 2 3 4 5 6 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines