AlfredoSC 11-08-2021, 20:48
Planteo un proyecto:

Tengo la idea de hacer una aplicación con Gambas3, la cual contendrá un navegador WEB. Cada vez que cargue una página, la convertirá en un archivo de texto plano. Buscará las cadenas que comiencen con <script> y terminen con </script> y la borrará, guardando el documento final, con la misma extensión que traía al bajar de la web. Así la mostrará en nuestro navegador con Gambas3 y libre de los molestos y odiosos anuncios comerciales y otros no tan comerciales, sino peligrosos.

Por cierto que eso ya debería existir y realmente ser una opción de los navegadores mas convencionales: Chrome. Firefox, Opera, Chromium, Edge, Safari, etc.

Que opinan??

Saludos..
Grandamakulo 10-08-2021, 10:03
Edito para: Incluir la elegante solución de @cogier y para mostrar una comparativa de tiempos de cada uno de los métodos. El C está ausente por lo dicho al final del hilo —vamos, que no funciona—:
Código:
 
FacilCript.Main.36: A:24,84229375
FacilCript.Main.43: B:16,3204024537037
FacilCript.Main.57: D:29,4344163310185
FacilCript.Main.64: X:31,245717650463

Pues a raíz de otro comentario me puse a brujulear por la página Rosetta Code, que me encanta, pero hacía un tiempo que no me pasaba por ahí, cuando vi que el algoritmo de Rot13 no estaba implementado para Gambas3.
El algoritmo Rot13, para los pocos que no lo sepan, es una manera de casi encriptar, de encriptar por diversión con un sistema bastante débil, mensajes en foros y antiguas listas de correos por el cifrado de César con un desplazamiento de 13 sobre 26 letras —es decir, la letra 1, la "A", se sustituye por la 14, "N", la "B" por la "O"... la "M" por la "A"—. Sí, justo un desplazamiento que es la mitad del abecedario anglosajón, por eso es reversible, es decir, al aplicar dos veces el algoritmo se obtiene el texto original.
Pues me puse a implementarlo de las dos maneras habituales: por sustitución directa o por rotación, y eso es lo que os traigo: Rot13_a y Rot13_b.
—Oiga, pero bueno, si hay una Rot13_c que no funciona. ¿Qué timo es éste?
Sí, ustedes disculpen. He estado intentando hacer la sustitución directa tal cual se hace en otro lenguajes, por ejemplo con el «tr» de Linux —vaaaale, podría haber empleado «shell» o «exec», pero me parecía que lo fundamental es emplear el propio Gambas3—, pero las funciones Gambas3 no tienen el mismo modo de funcionamiento. De todas maneras, si a alguien se le ocurre cómo, que chille.
—Venga, aceptamos pulpo, etc. Pero, ¿qué c.ñ. es eso de CriptoXOR?
Mire usté, ya puestos me lie y, recordando esos juegos que tenían encriptados archivos con las características de las armas, coches o puntuaciones de forma poco, er, fuerte, y con un sistema sencillo y reversible, pues codifiqué algo parecido a lo que yo empleaba para conseguir el mejor tanque de un juego de los 90: A=((A XOR B) XOR B).
En fin, me voy a almorzar —ahora se llama brunch—. Os dejo con el código.
—Pero bueno, ¿todo este rollo para una chorrada? Pero no se vaya, oiga..., oiga...

Código:
' Gambas module file

Public Sub Main()

  Dim Textos As New String[]
  Dim Texto As String
  Dim Clave As Byte = 13
  
  Dim i As Integer
  Dim Max As Integer = 1000000
  Dim Tic, Tac As Date
  
  Textos.Add("En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890")
  Textos.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
  Textos.Add("Cthulhu R'lyeh Ph'nglui mglw'nafh wgah'nagl fhtagn")
  
  Texto = Textos[0]
  
  Debug "   "; Texto
  Debug "A: "; Rot13_a(Texto)
  Debug "   "; Rot13_a(Rot13_a(Texto))
  Debug "B: "; Rot13_b(Texto)
  Debug "   "; Rot13_b(Rot13_b(Texto))
  Debug "C: "; Rot13_c(Texto)
  Debug "   "; Rot13_c(Rot13_c(Texto))
  Debug "D: "; Rot13_d(Texto)
  Debug "   "; Rot13_d(Rot13_d(Texto))
  Debug "X: "; CriptoXOR(Texto, Clave)
  Debug "   "; CriptoXOR(CriptoXOR(Texto, Clave), Clave)

  Tic = Timer
  For i = 1 To Max
    Rot13_a(Texto)  
  Next
  Tac = Timer
  Debug "A:"; Tac - Tic
  
  Tic = Timer
  For i = 1 To Max
    Rot13_b(Texto)  
  Next
  Tac = Timer
  Debug "B:"; Tac - Tic
  
  ' Tic = Timer
  ' For i = 1 To Max
  '   Rot13_c(Texto)  
  ' Next
  ' Tac = Timer
  ' Debug "C:"; Tac - Tic
  
  Tic = Timer
  For i = 1 To Max
    Rot13_d(Texto)  
  Next
  Tac = Timer
  Debug "D:"; Tac - Tic
  
  Tic = Timer
  For i = 1 To Max
    CriptoXOR(Texto, Clave)  
  Next
  Tac = Timer
  Debug "X:"; Tac - Tic
    
End

Private Function CriptoXOR(Texto As String, Clave As Byte) As String
  Dim Parte As New String[]
  Dim Total As String
  Dim i As Integer

  For i = 0 To Len(Texto) - 1
    Parte.Add(String.Chr(String.Code(Texto, i + 1) Xor Clave))
  Next
  Total = Parte.Join("")
  Return Total
End

Public Function Rot13_a(Texto As String) As String
    Dim i, d As Integer
    Dim Total As String
    
    For i = 0 To Len(Texto) - 1
        d = Asc(Texto[i, 1])
        If d >= 65 And d <= 90 Then
            d += 13
            If d > 90 Then d -= 26
        End If
        If d >= 97 And d <= 122 Then
            d += 13
            If d > 122 Then d -= 26
        End If
        Total = Total & Chr(d)
    Next
    Return Total
End Function

Public Function Rot13_b(Texto As String) As String
  Dim a As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  Dim b As String = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
  Dim Total As String = Texto
  Dim c As String
  Dim i As Integer
  
  For i = 0 To Len(Total) - 1
    c = Total[i, 1]
    If InStr(a, c) Then Mid(Total, i + 1, 1) = b[InStr(a, c) - 1, 1]
  Next
  Return Total
End

Public Function Rot13_c(Texto As String) As String
  Dim Total As String 
  
  Exec ["tr", "a-zA-Z", "n-za-mN-ZA-M", "<<<" & Shell$(Texto)] Wait To Total
  Return Total
End

Private Function Rot13_d(Texto As String) As String 'Cogier
  Dim sChars As String = "abcdefghijklmnopqrstuvwxyzabcdefghijklm"
  Dim iLoop As Integer
  Dim bUCase As Boolean
  Dim sWork As String
  Dim Label As String
  Label = ""
 
  For iLoop = 1 To Len(Texto)
    sWork = Texto[iLoop - 1]
    bUCase = IsUpper(sWork)
    If InStr(sChars, LCase(sWork)) > 0 Then sWork = sChars[InStr(sChars, LCase(sWork)) + 12]
    If bUCase Then sWork = UCase(sWork)
    Label &= sWork
  Next
  Return Label
End

Salidas:
Código:
FacilCript.Main.19:    En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.20: A: Ra ha yhtne qr Yn Znapun pba gvyqrf: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.21:    En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.22: B: Ra ha yhtne qr Yn Znapun pba gvyqrf: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.23:    En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.24: C: 
FacilCript.Main.25:    
FacilCript.Main.26: D: Ra ha yhtne qr Yn Znapun pba gvyqrf: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.27:    En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.28: X: Hc-xc-axjl-ih-Al-@lcnel-nbc-ydaih~7-ìäàþ÷ÌÄÀÞ×ñÑüܬ,<?>98;:54=
FacilCript.Main.29:    En un lugar de La Mancha con tildes: áéíóúÁÉÍÓÚüÜñÑ¡!1234567890
FacilCript.Main.36: A:24,84229375
FacilCript.Main.43: B:16,3204024537037
FacilCript.Main.57: D:29,4344163310185
FacilCript.Main.64: X:31,245717650463

PS.—Si alguien encuentra cómo simplificar los algoritmos, que chille, me hace el favor. Y ya puestos, que lo suba a Rosetta, que a mí me da pereza  Tongue Tongue Tongue Tongue
tincho 09-08-2021, 12:08
Hola amigos.
Este programa es un sencillo gestor de libros epub y permite buscar los libros por autor.
De momento no usa una base de datos pero tal vez mas adelante si lo haga (hay un .sql que pueden investigar por si les sirve).
Luego usa algunas cosas como:
  • La clase JSON
  • La clase Config.class (desarrollada para GauchoCAD por TercoIDE y yo) que permite hacer lo mismo que settings pero sin perder las variables si tienen valor nulo.
  • Es un buen ejemplo para ver en acción la extensión de las clases String, File y JSON.
Si alguien lo usa y si además devuelve comentarios me pondré muy contento. Smile

Agregando algo de ayuda

Notas:
  • Este programa no intenta ser un reemplazo para calibre, solo permite buscar algún libro en un directorio de forma rápida.
  • Trabaja con una estructura de directorios concreta (la de calibre) donde el directorio seleccionado, por ejemplo: /home/tux/Biblioteca, contiene un subdirectorio para cada autor y ese subdirectorio sera el que se cargue a la lista.
Leyenda:
  1. Hay que seleccionar un directorio que contengo los libros epub.
  2. Refrescar la colección de autores
  3. Seleccionar algún autor de la lista, así se listan sus obras.
  4. Se puede reiniciar la base de datos de autores tantas veces como sea necesario, por ejemplo cuando se agreguen autores al directorio.
[Imagen: ihMCGUm.png]
Referencias: Código fuente: Commits to gitlab:
2021.08.12 - Correcciones varias + feedback de Shordi.


Saludos.
Páginas (553):    1 396 397 398 399 400 553   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 280
Último miembro: herbert
Temas del foro: 1,704
Mensajes del foro: 8,843
Últimos temas
Error de sistema "Demasia...
Foro: General
Último mensaje por: chescobar, Hace 8 horas
Respuestas: 0 - Vistas: 30
controlar el Activado/Des...
Foro: General
Último mensaje por: atakito, Ayer, 17:18
Respuestas: 0 - Vistas: 21
Conexión Bluetooth: RFCOM...
Foro: Hardware & IoT
Último mensaje por: jguardon, 06-05-2025, 16:57
Respuestas: 5 - Vistas: 161
gb.db2: columnas calculad...
Foro: Bases de Datos
Último mensaje por: guizans, 04-05-2025, 21:02
Respuestas: 14 - Vistas: 536
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.